😃

Assistants APIをVS codeから実行してみよう!

2023/11/08に公開

注)Assistants APIは執筆時点(2023年11月)でbeta版です。今後、仕様が変わる可能性があります。

先日(11/7)にOpenAIの開発者会議がありましたね。
その中の目玉の1個として発表されていたのがAssistants APIです!
Assistants APIとは、RAG(文書を参照して答えてくれるAI)やAgent(拡張版ChatGPTみたいな?)といった事がこれ一つで出来るようになる、とにかくすごい機能になっています!!

動画をチェックされていない方はぜひ!英語の字幕付いてあるので見やすいです

https://www.youtube.com/watch?v=U9mJuUkhUzk

Assistants APIとは

コードに行く前にAssistants APIを理解する上で4つの大事な概念をサクッと見ていきましょう!

  • Assistant
  • Thread
  • Run
  • Message

Assistant

Assistantは、ユーザーからのメッセージに応じて応答するための設定です。具体的には、以下のような要素でカスタマイズが可能です!

指示: Assistantやモデルがどのように振る舞うか、または応答するかを定義します。
モデル: GPT-3.5やGPT-4のモデル、ならびにファインチューニングされたモデルを指定できます。
ツール: OpenAIが提供するcode-interpretrやRAGなどのAPI対応ツールが利用可能です。自身で定義することも出来ます。

Thread

Threadは会話を表すものです。Threadには、ユーザー固有の文脈、文章やファイルをメッセージとして追加できます。

Run

Runを実行することで、AssistantはThreadを読み込み、ツールを呼び出すか、モデルだけを使ってユーザーの入力に最適な答えを見つけるかを判断します。Runが完了すると、アシスタントは「role="assistant"」としてThreadにメッセージを追加します。

Message

そのまんまMessageです。

MessageをThreadにしてRunすることでAssistantからの応答を得られるってイメージですね!

実行用コード

以下のイントロダクションを参考にVS codeで実行できるようにしたものです。
https://platform.openai.com/docs/assistants/overview
Assistantは数学の家庭教師を設定、数学の問題をcode-interpreterを使って解いてもらおうという内容です。

from openai import OpenAI
import time

client = OpenAI()

# 新しいアシスタントを作成
assistant = client.beta.assistants.create(
    name="Math Tutor",
    instructions="You are a personal math tutor. Write and run code to answer math questions.",
    tools=[{"type": "code_interpreter"}],
    model="gpt-4-1106-preview"
)

# 特定のアシスタントを取得する場合
# assistant = client.beta.assistants.retrieve("Assistant_ID")

# 新しいスレッドを作成
thread = client.beta.threads.create()

# スレッドにメッセージを作成
message = client.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="I need to solve the equation `3x + 11 = 14`. Can you help me?"
)

# アシスタントを実行してユーザーの質問に応答するRunを作成
run = client.beta.threads.runs.create(
  thread_id=thread.id,
  assistant_id=assistant.id,
)

# Runのステータスが「completed」になるまで繰り返し確認
while not run.status == "completed":
  run = client.beta.threads.runs.retrieve(
    thread_id=thread.id,
    run_id=run.id
  )
  time.sleep(0.1)  # 0.1秒待機
  print(run.status)  # 現在のステータスを表示

# スレッドに追加されたメッセージ全てを取得
messages = client.beta.threads.messages.list(
  thread_id=thread.id
)

role_value = []

# 各メッセージのroleとcontentを取得
for thread_message in messages.data:
    role = thread_message.role
    for content in thread_message.content:
        content = content.text.value
        role_value.append((role, content))

# reverseメソッドでリストの順番を逆にする
role_value.reverse()

# メッセージの内容を表示
for role, value in role_value:
    print(f"{role} : {value}")

実行にはopenaiのapi keyが必要です!
未取得の方は他の方の記事を参考にapi keyを取得、設定して下さい。

大事なとこは説明しますね!

Assistant

assistant = client.beta.assistants.create(
    name="Math Tutor",
    instructions="You are a personal math tutor. Write and run code to answer math questions.",
    tools=[{"type": "code_interpreter"}],
    model="gpt-4-1106-preview"
)

ここではAssistantの設定を行っています。この例では「Math Tutor」と名付けられた数学の家庭教師として設定しています。このアシスタントは数学の問題に答えるためのコードを書き、実行するよう指示されています。使用されているのは「code_interpreter」というツールと「gpt-4-1106-preview」というモデルです。

Thread

thread = client.beta.threads.create()

新しいThreadを作成しています。既存のThreadを読み込むことも可能です。

message = client.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="I need to solve the equation `3x + 11 = 14`. Can you help me?"
)

ここで、先ほど作成したThreadにユーザーとしてのメッセージを追加しています。「3x + 11 = 14」という方程式を解く手助けを求めています。

Run

run = client.beta.threads.runs.create(
  thread_id=thread.id,
  assistant_id=assistant.id,
)

Runを実行することで、AssistantがThreadを読み込み、ユーザーの問い合わせに対する応答を準備します。

while not run.status == "completed":
  run = client.beta.threads.runs.retrieve(
    thread_id=thread.id,
    run_id=run.id
  )
  time.sleep(0.1)  # 0.1秒待機
  print(run.status)  # 現在のステータスを表示

このループでは、Runのステータスが「completed」になるまで状態を監視しています。Code Interpreterの使用には通常の言語モデルよりも時間がかかる可能性があります。完了すると、Runのステータスは「completed」と表示されます。

Runの完了前に次のステップへ進めてしまうとAssistantからの応答が得られないままとなってしまいます。

Message

messages = client.beta.threads.messages.list(
  thread_id=thread.id
)

threadにあるmessageを全て取り出してくれます。

APIの詳細をもっと知りたい方は、以下の公式ドキュメントを参照して下さい!
https://platform.openai.com/docs/api-reference/assistants

最後に

如何でしたか?この記事を通じて、Assistants APIの基本的な概念や実際の使い方についてご紹介しました。Assistantの作成から、Threadの初期化、ユーザーメッセージの追加、Runの実行、そして最終的なメッセージの取得まで、一連の流れを理解していただけたことと思います。

このAPIは、単に質問に答えるだけでなく、より複雑なタスクを実行し、ユーザーとの対話を深めるための強力なツールです。Code Interpreterの使用からカスタム機能の実装に至るまで、さまざまな方法で応用することが可能です。また、Assistantの応答をカスタマイズすることにより、ユーザーに合わせた個別の体験を提供することもできます。

これは、Assistants APIが提供する無限の可能性の序章に過ぎません。今後もこの技術の進化と、それがもたらす新たな応用例にご期待ください。Assistants APIを活用して、ユーザーにとって価値のある体験を創出しましょう。この記事が皆さんの開発旅路の一助となれば幸いです。Happy coding!

Discussion