とりあえずシュッと OpenAI DevDay の内容をまとめその3

の続き


今回は個人的に本命だった Assistants API についてよ(/・ω・)/
詳細はドキュメント読んでね(わかりにくいけど、、、)


これ、Beta ということもあってか結構ややこしいのよねぇ、、、( ・ω・)


Assistants APIを使用すると、独自のアプリケーション内にAIアシスタントを構築することができます。アシスタントは指示を持ち、モデル、ツール、知識を活用してユーザーの問い合わせに応答することができる。Assistants APIは現在、3種類のツールをサポートしています: コード・インタープリター、検索、関数呼び出しです。将来的には、より多くのOpenAI構築ツールをリリースし、私たちのプラットフォーム上で独自のツールを提供できるようにする予定です。

Assistantsプレイグラウンドを使用して、またはこのガイドで概説されているステップバイステップの統合を構築することによって、Assitants APIの機能を調べることができます。Assistants APIを使った一般的なインテグレーションは以下のような流れになります:

https://platform.openai.com/docs/assistants/overview

はい、ということでざっくりいうと、単純に LLM を使うだけじゃなくていろいろとやってくれる API ですな(/・ω・)/


簡単に流れを書くと

  1. Assistant を作る

  2. Thread を作る

  3. Message を作る

  4. Run して処理を走らせる

  5. 結果を出力する


でござる(/・ω・)/


Assistant? Thread? Message? ほぁ?( ・ω・)


となると思いんすが、まぁ言うてみれば

- Assistant は System Prompt みたいなもの
- Thread は Messages みたいなもの
- Message は User Prompt みたいなもの

な感じでやんす(/・ω・)/


ほいじゃあまぁコードを書きながら動きを見ていくぞーーーーい


と、その前に


今から作成する Assistant にはその知識として利用できる独自データを保持させることができるのだ(/・ω・)/


ので、シュッとファイルを用意する


from openai import OpenAI
client = OpenAI(api_key = "sk-")

# Wikipedia の本文
file_body = client.files.create(
  file=open("./陰の実力者になりたくて! 2nd season.txt", "rb"),
  purpose='assistants'
)
# Wikipedia の要約
file_summary = client.files.create(
  file=open("./summary.txt", "rb"),
  purpose='assistants'
)
# タイタニックデータセット
file_titanic = client.files.create(
  file=open("./titanic.csv", "rb"),
  purpose='assistants'
)


んで、Assistant ちゃんを作るその名も God Assistant 

god_assistant = client.beta.assistants.create(
  name="God Assistant",
  description="You can do anything when user ask anything to you. Data analysis, code writing, answer from your knowledge base...etc.",
  model="gpt-4-1106-preview",
  tools=[{"type": "code_interpreter"}, {"type": "retrieval"}, god_function],
  file_ids=[file_body.id, file_summary.id]
)

ポイントとしては

  • tools に利用するツール(そのままやんけ)を指定しているところ

  • file_ids で先ほど用意したファイルを指定しているところ


あれ?ファイルなんか足りなくね?( ・ω・)


と、気づいたあなたは慧眼の持ち主でござるな


そう、タイタニックデータセットの CSV がないのよ~(/・ω・)/


Upload できるファイルとしては CSV は対応している、、、



駄菓子菓子!!


tools として Retrieval を指定してるとうまく動かないのだ!


Retrieval を指定すると紐づけたファイルが Vector Database にシュッと格納されるのでござるが、エラーメッセージを見るにその処理に CSV が巻き込まれてエラーになるのである(/・ω・)/


なので今回はファイル作ったけど使わないの


そしてもう一つ tools の god_function の中身はこんな感じ

import wikipedia

def getInforFromWikipedia(title):

    # 使用する言語を設定
    wikipedia.set_lang("ja")

    # 検索したいページのタイトル
    page_title = title

    try:
        # ページの要約を取得
        summary = wikipedia.summary(page_title)
        print(summary)
        return summary
    except wikipedia.exceptions.PageError:
        print(f"{page_title} のページが見つかりません。")
        return ""
    except wikipedia.exceptions.DisambiguationError as e:
        print(f"{page_title} は曖昧さ回避のページです。以下の可能性があります:")
        for option in e.options:
            print(option)
        return ""

god_function = {
      "type": "function",
    "function": {
      "name": "getInforFromWikipedia",
      "description": "Get unknown information from wikipedia",
      "parameters": {
        "type": "object",
        "properties": {
          "unknown_word": {"type": "string", "description": "the word you don't know."},
        },
        "required": ["unknown_word"]
      }
    }
  }

わからん単語があったら Wikipedia から情報をとってくるだす(/・ω・)/



ちなみに使えるモデルは

  • gpt-3.5-turbo-1106

  • gpt-4-1106-preview

だけだぞ☆



はい、じゃあ次は Thred をつくりまぁ~す

god_thread = client.beta.threads.create()

ここにすべてのやり取りが入ってくるのでユーザー単位で Thread は作った方がよさげな感じでやんす



そして Message をつくりまぁ~す

god_message = client.beta.threads.messages.create(
    thread_id=god_thread_2.id,
    role="user",
    content="2023年10月以降の陰の実力者になりたくての情報を知っていますか?"
)

これはまぁいわゆるユーザーからの質問ですな



では処理を走らせまぁ~す

god_run_ = client.beta.threads.runs.create(
  thread_id=god_thread.id,
  assistant_id=god_assistant.id,
  instructions="Solve users request"
)

はい、ここにある Instructions がどういう処理をするかの内容ですな(/・ω・)/



で、こっからがちょっとめんどいのでござるが、これだけでは結果を取得することができないのでござる(/・ω・)/



run を走らせるとレスポンスはすぐ帰ってくるのだが処理は完了していないのである


print(god_run.status)

とかすると状況がわかりんす(/・ω・)/



んで、処理が完了したら結果を取得できるのじゃ

god_messags_ = client.beta.threads.messages.list(
  thread_id=god_thread.id
)


だがしかぁ~し

tools で function を指定していた場合は run.status が requires_action になるのだ(/・ω・)/


この状態だと処理が進まんので

run.required_action.submit_tool_outputs.tool_calls[0].id
arg = json.loads((run.required_action.submit_tool_outputs.tool_calls[0].function.arguments))
arg["key"]

god_run = client.beta.threads.runs.submit_tool_outputs(
  thread_id=god_thread.id,
  run_id="id",
  tool_outputs=[
      {
        "tool_call_id": "call_id",
        "output": "arg_value",
      }
    ]
)

ってしないといけないのだ(/・ω・)/


めんどくさいのだ(/・ω・)/


はい、で結果でやんすが

検索した結果、"Sidó Kagenō"(シドー・カゲノー)に関するウィキペディアに情報が見当たりませんでした。
これは、その名前が特定の架空のキャラクター、
または公的なデータベースに登録されていない個人である可能性があります。
もし「シドー・カゲノー」が「陰の実力者になりたくて」関連のキャラクターである場合は、
その情報はライトノベル、漫画、アニメの公式ソースを通じて得られる情報である可能性が高いです。
残念ながら、ウィキペディアには情報がないようです。

という感じで function がうまく聞いて Wikipedia から情報をとってこれたようである



で、おんなじ感じでメッセージを追加して実行して~を繰り返す

god_mesage_ = client.beta.threads.messages.create(
    thread_id=god_thread_2.id,
    role="user",
    content="あなたが保持しているファイル情報にのみ基づいて2023年10月以降に発売されたものがあるかを教えてください。それ以外の知識は使用しないでください"
)

tools で指定した Retrieval が機能して渡したファイルの情報を用いてカットオフ 2023/04 以降の知識も取得できてるのだ(/・ω・)/

はい、私が保持しているファイル情報に基づいて、20231026日に「陰の実力者になりたくて!」
の初版が発行されており、同日に発売されたことが分かります【24source】。


ファイル作成もお願いしちゃう

god_message_ = client.beta.threads.messages.create(
    thread_id=god_thread_2.id,
    role="user",
    content="登場人物に関する CSV ファイルを作成してください。"
)

tools で指定した Code Interpreter が機能してファイルを作ってくれたぞ☆

登場人物に関するCSVファイルを作成しました。以下のリンクからダウンロードできます:

[ダウンロード characters.csv]( [0])
[0] Click <here> to download /mnt/data/characters.csv


よーし、じゃあ中身をみるぞ~~

god_message = client.beta.threads.messages.create(
    thread_id=god_thread_2.id,
    role="user",
    content="作成した CSV の最初の5件を表示してください。"
)



ここでトラップ発動!!


先にも書いた通り、tools に Retrieval を指定していると CSV は扱えずエラーになるのだ!!


なんてこった( ゚д゚)



とまぁこんな感じである程度触ってみたわよという話



気になったポインツ

  • API リファレンスを見る限り Assistant ID からそれに紐づくリソースを削除できない、、、

  • 渡せるファイルに上限あり

    • > You can attach a maximum of 20 files per Assistant, and they can be at most 512 MB each. In addition, the size of all the files uploaded by your organization should not exceed 100GB.

  • Thread にメッセージが無限に追加されていってコストが爆発しそう、、、

    • Managing Threads and Messages|
      Threads and Messages represent a conversation session between an Assistant and a user. There is no limit to the number of Messages you can store in a Thread. Once the size of the Messages exceeds the context window of the model, the Thread smartly truncates them to fit. 128K の入力コンテキストだとえぐいことになりそう、、、

  • 料金がよーわからん、、、

Pricing



しかしまぁ面白い機能、かつ、まだ Beta 版なので今後に期待大(/・ω・)/



ということでおしまい。

この記事が気に入ったらサポートをしてみませんか?