アプリケーション開発ポータルサイト
ServerNote.NET
Amazon.co.jpでPC関連商品タイムセール開催中!
カテゴリー【OpenAI/ChatGPTPython
OpenAI Assistants APIメモ【3】GPT-3.5およびGPT-4のアシスタントが質問に回答する
POSTED BY
2024-03-12

OpenAI Assistants APIメモ【1】ファイルのアップロードとIDの取得
OpenAI Assistants APIメモ【2】GPT-3.5およびGPT-4のアシスタントを作成

続きです。作成済みのアシスタントに、ヒント・ファイルをもとに質問に答えてもらいます。

https://platform.openai.com/docs/api-reference/assistants

Pythonopenai_api_chat_with_assistants.pyGitHub Source
import os
import time
from openai import OpenAI

class Assistant:
  def __init__(self, assistant_id: str) -> None:
    self.client = OpenAI()
    self.assistant = self.client.beta.assistants.retrieve(assistant_id)
    self.thread = self.client.beta.threads.create()

  def send_message(self, message: str) -> str:
    print("user :", message)
    self.client.beta.threads.messages.create(
      thread_id=self.thread.id,
      role="user",
      content=message,
    )
    self.client.beta.threads.runs.create(
      thread_id=self.thread.id,
      assistant_id=self.assistant.id,
    )
    self._wait()
    self.show_message(num=1)

  def _wait(self) -> None:
    status = "queued"
    while status != "completed":
      time.sleep(0.5)
      run = self.client.beta.threads.runs.list(
        thread_id=self.thread.id,
      )
      for r in run:
        status = r.status
        break

  def show_message(self, num: int = 5) -> None:
    messages = self.client.beta.threads.messages.list(
      thread_id=self.thread.id,
    )
    messages_list = [message for message in messages]
    for message in (messages_list[:num]):
      print(message.role, ":", message.content[0].text.value)

if __name__ == "__main__":

  messages = [
    "まずおおまかに概要を教えてください。",
    "この会社はフレックスタイム制でしょうか?",
    "その場合、コアタイムはいつですか?",
  ]

  print("Assistant API Test with GPT-3.5")
  assistant = Assistant("asst_111111112222222233333333") #GPT-3.5
  for message in messages:
    assistant.send_message(message)

  print("Assistant API Test with GPT-4")
  assistant = Assistant("asst_444444445555555566666666") #GPT-4
  for message in messages:
    assistant.send_message(message)

機能をAssistantクラスにまとめて、初期化時にアシスタントIDからロード、使いまわすスレッドを1つ作成しています。
一連の会話はこのスレッドを通すので、前回の発言の続きなどを行えます。

statusがcompletedにならないと回答を取り出せないのでwaitで待って、最新の回答だけを取り出して表示します。

実行結果

python3 openai_api_chat_with_assistants.py

Assistant API Test with GPT-3.5

user : まずおおまかに概要を教えてください。

assistant : この文書は「マイカンパニールール」というタイトルで、以下の主要なセクションに情報が分類されています:

...

user : この会社はフレックスタイム制でしょうか?

assistant : はい、この会社はフレックスタイム制を採用しています。フレックスタイム制では、始業・終業時刻が自主的に決定され、以下の時間帯の中で勤務時間を設定することができます

user : その場合、コアタイムはいつですか?

assistant : この会社のコアタイムは~から~までです。

Assistant API Test with GPT-4

user : まずおおまかに概要を教えてください。

assistant : 提供された資料は、"マイカンパニールール"というテーマに基づいた文書で、以下のような内容を含んでいます。

...

user : この会社はフレックスタイム制でしょうか?

assistant : はい、この会社ではフレックスタイム制を採用しています。フレックスタイム制に関する具体的な規定や、その適用の範囲および条件については文書内の関連セクションで詳述されている可能性があります。

user : その場合、コアタイムはいつですか?

assistant : 文書には、フレックスタイム制におけるコアタイムが「~から~」と記載されています。したがって、この期間は従業員が必ず職場にいなければならない時間帯であると理解できます。

...どちらも細かい数字規定が微妙に間違っていて、このあたりを正確に制御させるにはおそらく工夫が必要そうです。

注意しなければならないのは、同一スレッド内で前後会話を繰り返していると、隠れた「履歴トークン」が入力トークンに積み重なり、かなり膨大なトークン数になるということです。おそらく、Assistants APIは、GPTに質問を投げる前に情報ファイルのベクトルデータなりをヒントデータとしてプロンプトにくっつけて送信しているものと思われます。表示には見えないけれど、その費用も当然ながらこちらの負担になるということです。

※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【WEBMASTER/管理人】
自営業プログラマーです。お仕事ください!
ご連絡は以下アドレスまでお願いします★

☆ServerNote.NETショッピング↓
ShoppingNote / Amazon.co.jp
☆お仲間ブログ↓
一人社長の不動産業務日誌
【キーワード検索】