OpenAIが知識取得プロセスで言及していること
ポイント
ファイルがアップロードされてアシスタントに渡されると、OpenAIはドキュメントを自動的にチャンク化し、埋め込みをインデックス化して保存し、ベクトル検索を実装してユーザークエリに関連するコンテンツを取得する
アシスタントAPIは、2つの取得手法を自動的に選択する
短いドキュメントの場合はファイルの内容をプロンプトに渡す
長いドキュメントの場合はベクトル検索を実行する
取得は現在、関連するすべてのコンテンツをモデル呼び出しのコンテキストに追加することで、品質を最適化している
概要
Retrievalは、専有の製品情報やユーザーが提供するドキュメントなど、モデルの外部からの知識でアシスタントを拡張します。ファイルがアップロードされてアシスタントに渡されると、OpenAIは自動的にドキュメントをチャンク化し、埋め込みをインデックス化して保存し、ベクトル検索を実装して、ユーザーのクエリに関連するコンテンツを取得します。
Retrievalを有効にする
アシスタントのtoolsパラメータにretrievalを渡すと、リトリーバルが有効になります。
code:python
assistant = client.beta.assistants.create(
instructions="あなたはカスタマーサポートチャットボットです。ナレッジベースを使用して、顧客のクエリに最適に対応してください。",
model="gpt-4-turbo-preview",
)
特定のアシスタントに対してリトリーバルを有効にすると、添付されたすべてのファイルが自動的にインデックス化され、アシスタント1台あたり1日あたり0.20ドル/GBの料金が請求されます。Modify Assistantエンドポイントを使用して、リトリーバルを有効/無効にできます。
仕組み
次に、モデルは、ユーザーメッセージに基づいてコンテンツを取得するタイミングを決定します。Assistants APIは、次の2つの取得手法から自動的に選択します。
短いドキュメントの場合は、ファイルの内容をプロンプトに渡す
長いドキュメントの場合は、ベクトル検索を実行する
Retrievalは現在、関連するすべてのコンテンツをモデル呼び出しのコンテキストに追加することで、品質を最適化しています。リトリーバルの品質とモデルの使用コストのトレードオフを変更できるように、他のリトリーバル戦略を導入する予定です。
Retrieval用のファイルのアップロード
コードインタープリターと同様に、ファイルはアシスタントレベルまたは個々のメッセージレベルで渡すことができます。
code: python
# Upload a file with an "assistants" purpose
file = client.files.create(
file=open("knowledge.pdf", "rb"),
purpose='assistants'
)
# Add the file to the assistant
assistant = client.beta.assistants.create(
instructions="あなたはカスタマーサポートチャットボットです。ナレッジベースを使用して、顧客のクエリに最適に対応してください。",
model="gpt-4-turbo-preview",
)
ファイルがメッセージレベルで添付されている場合、そのファイルは、メッセージが添付されている特定のスレッド内でのみアクセスできます。ファイルをアップロードした後、メッセージを作成するときにこのファイルのIDを渡すことができます。Files APIを介してアップロードするファイルのサイズに基づいて課金されるのではなく、インデックスが作成される特定のアシスタントまたはメッセージに添付するファイルに基づいて課金されることに注意してください。
code:python
message = client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content="PDFマニュアルにこのデバイスの電源を切る方法が見当たりません",
)
最大ファイルサイズは512 MBで、トークン数は2,000,000を超えることはできません(ファイルを添付すると自動的に計算されます)。
リトリーバルは、.pdf、.md、.docxなど、さまざまなファイル形式をサポートしています。サポートされているファイル拡張子(およびそれに対応するMIMEタイプ)の詳細については、以下の「サポートされているファイル」セクションを参照してください。
Retrievalの価格設定
リトリーバルの価格は、アシスタント1台あたり1日あたり0.20ドル/GBです。単一のファイルIDを複数のアシスタントに添付すると、リトリーバルツールが有効になっているときに、アシスタントごとの1日あたりの料金が発生します。たとえば、リトリーバルツールが有効になっている2つの異なるアシスタント(顧客向けのアシスタント#1と社内従業員のアシスタント#2など)に同じ1 GBのファイルを添付する場合、このストレージ料金は2回請求されます(1日あたり2 * 0.20ドル)。この料金は、特定のアシスタントからナレッジを取得するエンドユーザーやスレッドの数によって変動することはありません。
さらに、メッセージに添付されたファイルは、メッセージがリトリーバルツールが有効になっている実行の一部である場合、アシスタントごとに課金されます。たとえば、リトリーバルが有効になっているアシスタントを、それぞれ1つの固有のファイル(合計10の固有のファイル)を持つ10のメッセージを含むスレッドで実行すると、10のファイルすべてに対して1日あたりのGB単位の料金が発生します(アシスタント自体に添付されているファイルに加えて)。
ファイルの削除
アシスタントからファイルを削除するには、アシスタントからファイルをデタッチします。
code:python
file_deletion_status = client.beta.assistants.files.delete(
assistant_id=assistant.id,
file_id=file.id
)
アシスタントからファイルをデタッチすると、リトリーバルインデックスからファイルが削除され、インデックス化されたファイルのストレージに対して課金されなくなります。
ファイルの引用
コードインタープリターがメッセージでファイルパスを出力する場合、annotationsフィールドを使用して、それらを対応するファイルダウンロードに変換できます。これを行う方法の例については、「アノテーション」セクションを参照してください。
code: python
{
"id": "msg_abc123",
"object": "thread.message",
"created_at": 1699073585,
"thread_id": "thread_abc123",
"role": "assistant",
"content": [
{
"type": "text",
"text": {
"value": "CSVファイルの行がシャッフルされ、新しいCSVファイルに保存されました。次のリンクからシャッフルされたCSVファイルをダウンロードできます:\n\n[シャッフルされたCSVファイルをダウンロード",
"annotations": [
{
"type": "file_path",
"text": "sandbox:/mnt/data/shuffled_file.csv",
"start_index": 167,
"end_index": 202,
"file_path": {
"file_id": "file-abc123"
}
}
]
}
}
],
"file_ids": [
"file-abc456"
],
...
},