OpenAIのアシスタントAIを使ってPDF資料を説明させてみた

現時点(2023年11月)でベータ版ではありますが、OpenAIがアシスタントAIを作成するためのAPIを公開したので、試してみました。

公式によるアシスタントAIの概要を引用します。

How Assistants work Beta

The Assistants API is designed to help developers build powerful AI assistants capable of performing a variety of tasks.

The Assistants API is in beta and we are actively working on adding more functionality. Share your feedback in our Developer Forum!

  1. Assistants can call OpenAI’s models with specific instructions to tune their personality and capabilities.
  2. Assistants can access multiple tools in parallel. These can be both OpenAI-hosted tools — like Code interpreter and Knowledge retrieval — or tools you build / host (via Function calling).
  3. Assistants can access persistent Threads. Threads simplify AI application development by storing message history and truncating it when the conversation gets too long for the model’s context length. You create a Thread once, and simply append Messages to it as your users reply.
  4. Assistants can access Files in several formats — either as part of their creation or as part of Threads between Assistants and users. When using tools, Assistants can also create files (e.g., images, spreadsheets, etc) and cite files they reference in the Messages they create.

Objects

Assistants object architecture diagram
OBJECTWHAT IT REPRESENTS
AssistantPurpose-built AI that uses OpenAI’s models and calls tools
ThreadA conversation session between an Assistant and a user. Threads store Messages and automatically handle truncation to fit content into a model’s context.
MessageA message created by an Assistant or a user. Messages can include text, images, and other files. Messages stored as a list on the Thread.
RunAn invocation of an Assistant on a Thread. The Assistant uses it’s configuration and the Thread’s Messages to perform tasks by calling models and tools. As part of a Run, the Assistant appends Messages to the Thread.
Run StepA detailed list of steps the Assistant took as part of a Run. An Assistant can call tools or create Messages during it’s run. Examining Run Steps allows you to introspect how the Assistant is getting to it’s final results.
https://platform.openai.com/docs/assistants/how-it-works/objects

threadオブジェクトにmessageオブジェクトを追加して、runオブジェクトに送るとassistantのメッセージを生成して、thread内のメッセージオブジェクトが追加される。と、いった感じでしょうか。

従来のAPIは文章を生成させるだけだったので、周辺の部分(会話スレッド管理とか、メッセージの保持、外部データの参照)なんかはアプリケーションで作り込む必要がありましたが、その辺がこれらのオブジェクトで簡単に実装できそうです。

今回は、pdfを読み込んでその内容を質問できるか試してみます。

サンプルコード

pdfを読み込んで検索するだけならプレイグラウンドでもお試しできますが、今回はGoogleColabを使います。

基本的なOpenAI APIの使い方はこちらも参照してみて下さい。

PDFファイル

今回対象とするpdfファイルですが、最新の情報、かつ、適当なサイズのpdfファイルということで、金融庁が発行している新型NISAのガイドブックを使います。

https://www.fsa.go.jp/policy/nisa2/about/nisa2024/guidebook_202307.pdf

こちらのファイルをダウンロードしてGoogle Driveに入れておきます。

OpenAIの準備

Open AIのAPIが使えるように準備します。

!pip install openai --upgrade

事前にOpenAIに登録して、organizationを取得し、api_keyを作成する必要があります。

from openai import OpenAI

client = OpenAI(
  api_key=<Your api key>,
  organization=<Your org key>,
)

assistant AI の生成 (Retreival)

PDFファイルをアップロードします。

アップロードしたファイルは、https://platform.openai.com/filesで確認できます。

# PDFファイルのアップロード

filename = "/content/drive/MyDrive/<your dir>/guidebook_202307.pdf"

files = client.files.create(
  file=open(filename, "rb"),
  purpose="assistants"
)

アシスタントを作成します。

作成されたアシスタントは、https://platform.openai.com/assistantsで管理できます。

#アシスタントの作成

assistant = client.beta.assistants.create(
    name="nagomi",                                                                                         #アシスタントの名前(なんでも)
    instructions="Documentに書いてあることを参照して質問に答えます.",    #アシスタントに対する指示 
    tools=[{"type": "retrieval"}],
    model="gpt-4-1106-preview",
    file_ids=[files.id]                  
)

会話の実行

会話のスレッドを作成します。

#スレッドの作成

thread = client.beta.threads.create()

次にuser roleからのメッセージを作成します。

#メッセージの作成

message = client.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="新型NISAの限度額について教えて下さい"
)

メッセージがセットされているかどうか、確認してみます。

# スレッドのメッセージリストの確認
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 : 新型NISAの限度額について教えて下さい

アシスタントidと、スレッドidとを指定して、実行します。

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

実行結果(アシスタントからのメッセージ)は、threadのmessages.listから見ることができます。

#結果(messages)の確認
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 : 新型NISAの限度額について教えて下さい
assistant : 新型NISAの年間投資枠は、以下のようになっています:
- つみたて投資枠:120万円
- 成長投資枠:240万円

非課税保有限度額(総枠)は1800万円ですが、これは簿価残高方式で管理されるため、売却した場合は枠の再利用が可能です【13†source】。

結果を見ると、assitantのメッセージとして、新型NISAの年間投資枠と限度額に関する説明がされています。

まとめ

pdfファイルを使って、Q&Aを作成したり、要約させたりすることが簡単にできそうな気がします。ただし、まだベータ版ですし、その結果の正確性については不明です。

エンドユーザに利用していただくためには、十分な検証が必要かと思います。