メインコンテンツへスキップ
見出し画像

Google Colab で OpenAI API の Retrieval を試す

    「Google Colab」で「OpenAI API」の「Retrieval」を試したので、まとめました。

    前回

    1. Retrieval

    「Assistant API」は、さまざまなタスクを実行できる強力な「AIアシスタント」を作成するためのAPIです。

    「Assistant API」は現在、次の3つのツールをサポートしています。

    ・Code Interpreter : Pythonコードを作成して実行
    ・Retrieval : モデル外部からの知識を取得
    ・Function Calling : 関数のレスポンスを取得

    今回は、「Retrieval」を使います。「Retrieval」は、製品情報やユーザーから提供されたドキュメントなど、モデル外部からの知識を取得して、アシスタントを強化します。ファイルをアップロードして「アシスタント」に渡すと、自動的にドキュメントをチャンク化し、埋め込みのインデックスを作成して保存し、ユーザーの質問に関連するコンテンツを取得するベクトル検索を提供します。

    2. セットアップ

    Colabでのセットアップ手順は、次のとおりです。

    (1) パッケージのインストール。

    # パッケージのインストール
    !pip install openai

    (2) 環境変数の準備。
    以下のコードの <OpenAI_APIキー> にはOpenAIのサイトで取得できるAPIキーを指定します。(有料)

    import os
    os.environ["OPENAI_API_KEY"] = "<OpenAI_APIキー>"

    (3) クライアントの準備。
    「クライアント」は「OpenAI API」にアクセスするインタフェースになります。

    from openai import OpenAI
    
    # クライアントの準備
    client = OpenAI()

    3. ドキュメントの準備

    (1) ドキュメントの準備。
    今回は、マンガペディアの「ぼっち・ざ・ろっく!」のドキュメントを用意しました。

    ・bocchi.txt

    画像

    (2) Colabにドキュメントを配置。
    左端のフォルダアイコンでファイル一覧を表示し、「bocchi.txt」を配置します。

    画像


    「Assistant API」でサポートされているファイル形式は、以下で確認できます。

    ・Tools - Supported files

    4. アシスタントの実行

    アシスタントの実行手順は、次のとおりです。

    (1) ファイルをOpenAIのサーバにアップロード。

    # ファイルをOpenAIのサーバにアップロード
    file = client.files.create(
        file=open("bocchi.txt", "rb"),
        purpose="assistants"
    )

    client.files.create() でファイルをアップロードします。

    ・file : Fileオブジェクト
    ・purpose : 目的 (fine-tune, assistants)
    ・戻り値 : Fileオブジェクト

    (2) アシスタントの作成。
    toolsに「Retrieval」、file_idsにファイルIDを指定します。

    # アシスタントの作成
    assistant = client.beta.assistants.create(
        instructions="あなたはQAチャットボットです。 ナレッジベースを使用して、ユーザーの質問に最大限に対応します。",
        model="gpt-4-1106-preview",
        tools=[{"type": "retrieval"}],
        file_ids=[file.id]
    )

    client.beta.assistants.create() でアシスタントの作成します。

    ・model : モデルID

    ・name : アシスタント名 (最大256文字)
    ・description : アシスタントの説明 (最大512文字)
    ・instructions : アシスタントのシステムメッセージ (32768文字)
    ・tools : ツールリスト (最大128個、code_interpreter / retrieval / function)
    ・file_ids : ファイルIDのリスト (最大20個)
    ・metadata : メタデータ (最大16個のキーと値のペア、キーの最大長64文字、値の最大長512文字)

    (3) スレッドの作成。
    会話するためスレッドを作成します。

    # スレッドの準備
    thread = client.beta.threads.create()

    client.beta.threads.create() でスレッドを作成します。

    ・messages : メッセージリストの初期状態

    (4) ユーザーメッセージの追加。

    # ユーザーメッセージの追加
    message = client.beta.threads.messages.create(
        thread_id=thread.id,
        role="user",
        content="ぼっちちゃんの得意な楽器は?"
    )

    client.beta.threads.messages.create() でユーザーメッセージを作成します。

    ・thread_id : スレッドID
    ・role : ロール (userのみ)
    ・content : メッセージ

    ・file_ids : ファイルIDのリスト (最大10個)
    ・metadata : メタデータ (最大16個のキーと値のペア、キーの最大長64文字、値の最大長512文字)

    (5) スレッドのメッセージリストの確認。
    ユーザーメッセージが1つ追加されています。

    # スレッドのメッセージリストの確認
    messages = client.beta.threads.messages.list(
        thread_id=thread.id,
        order="asc"
    )
    for message in messages:
        print(message.role, ":", message.content[0].text.value)
    user : ぼっちちゃんの得意な楽器は?

    client.beta.threads.messages.list() でメッセージリストを取得します。

    ・thread_id : スレッドID

    ・limit : 返すオブジェクト数 (デフォルト20、1〜100)
    ・order : created_atによる並べ順 (デフォルトdesc、desc / asc)
    ・after : 後続のオブジェクトの取得 (オブジェクトID)
    ・before : 以前のオブジェクトの取得 (オブジェクトID)

    (6) アシスタントにリクエスト。
    スレッド上でのアシスタントの呼び出します。アシスタントは、「アシスタント自身の設定」と「スレッドのメッセージ」を使用して、「モデル」と「ツール」を呼び出して、タスクを実行します。処理の1つとして、スレッドにアシスタントメッセージも追加します。

    # アシスタントにリクエスト
    run = client.beta.threads.runs.create(
        thread_id=thread.id,
        assistant_id=assistant.id,
    )

    client.beta.threads.runs.create()でアシスタントにリクエストを実行 (Run) します。

    ・thread_id : スレッドID
    ・assistant_id : アシスタントID

    ・model : モデルID
    ・instructions : アシスタントのシステムメッセージ (32768文字)
    ・tools : ツールリスト (最大128個、code_interpreter / retrieval / function)
    ・metadata : メタデータ (最大16個のキーと値のペア、キーの最大長64文字、値の最大長512文字)

    (7) アシスタントへのリクエストの実行状況の確認。
    以下を実行して、「in_progress」は実行中、「completed」は実行完了になります。

    # 実行状況の確認
    run = client.beta.threads.runs.retrieve(
        thread_id=thread.id,
        run_id=run.id
    )
    print(run.status)
    completed

    client.beta.threads.runs.retrieve() で「Run Step」を取得します。

    ・thread_id : スレッドID
    ・run_id : Run ID

    ・step_id : ステップID

    (8) スレッドのメッセージリストの確認。
    ステータス「completed」の場合は、メッセージリストにアシスタントメッセージが追加されています。

    # スレッドのメッセージリストの確認
    messages = client.beta.threads.messages.list(
        thread_id=thread.id,
        order="asc"
    )
    for message in messages:
        print(message.role, ":", message.content[0].text.value)
    user : ぼっちちゃんの得意な楽器は?
    assistant : ぼっちちゃん、正式には後藤ひとり、の得意な楽器はギターです。彼はギターヒーローとしてインターネット上でそこそこの人気を集めており、その腕前はかなりのものとなっています。

    (9) 別の質問も試す。
    「ライブハウス「STARRY」の店長は?」の質問に対しては、以下の回答が返されました。

    user : ぼっちちゃんの得意な楽器は?
    assistant : ぼっちちゃん、正式には後藤ひとり、の得意な楽器はギターです。彼はギターヒーローとしてインターネット上でそこそこの人気を集めており、その腕前はかなりのものとなっています。
    user : ライブハウス「STARRY」の店長は?
    assistant : ライブハウス「STARRY」の店長に関する情報は見つかりませんでした。文書の中をさらに検索してみる必要があります。もう少しお待ちください。
    assistant : ライブハウス「STARRY」の店長は伊地知星歌(いじちせいか)です。彼女は30歳になったばかりで、ぱっと見は真面目な清楚系に見えるが、かなりいい加減な性格の持ち主です。また、伊地知星歌は伊地知虹夏の姉であり、かわいいもの好きで乙女な一面も持っています。過去にはバンドでギターを担当しており、「御茶ノ水の魔王」と呼ばれていた経験もあるようです。

    最初失敗したのに、調査し続けて正解を探してきてくれました。

    5. Assistant Playground

    作成した「アシスタント」は、「Assistant Playground」でも動作確認できます。

    画像

    次回



     
     

    npaka

     
     
    プログラマー。iPhone / Android / Unity / ROS / AI / AR / VR / RasPi / ロボット / ガジェット。年2冊ペースで技術書を執筆。アニソン / カラオケ / ギター / 猫 twitter : @npaka123

    あなたへのおすすめ