見出し画像

ChatGPTのコンテキストを英語要約の文書ベクトルで作る

先日こちらの記事を書いたのですが、コンテキストのウィンドウが4096トークンしかない問題があり、あまり良い結果が得られませんでした。

そこで改善策として、次の点を実施してみました。

  1. 記事を要約することで、コンテキストに詰め込める情報量を増やす。

  2. 英語に翻訳する。日本語に比べるとトークン数が半減する。また、英語の方が精度が上がる。

ドキュメントを要約&翻訳する

今回もライブドアニュースを使用します。

openai.ChatCompletion.create()を使用して要約します。出力は英語になります。

プロンプトは以下のようになります。要約後のトークンが4096になるようにします。

{"role": "system",
"content": '''summarize this document for me and keep the summary to around less than 4096 tokens. '''
}

注意点として、APIへの入力と出力の両方のトークン数が課金対象になります。私は処理の途中(4675ドキュメント)でクレジット枠を使い切ってしまいました。実際には7367ドキュメントあります。

ベクトル化する

今回は、openai.Embedding.create()を使用して要約した英語文章をベクトル化します。日本語の場合は、GiNZAを使用しましたが英語の場合はOpenAI APIで良いかと思います。コストが気になるのであれば、HuggingfaceのSentenceTransformerなどを使用すると良いでしょう。

ベクトル化のAPIのレスポンスは速いため、OpenAI APIのレートリミット(60rpm)に引っかかります。そのためスロットリングが必要になります。

プロットしてみる

生成されたベクトルをUMAPでプロットして確認してみましょう。

文書ベクトル

いい感じに分類できているようです。これは期待ができます。

コンテキストをプロンプトに差し込む

最終ステップです。ベクトル検索エンジンから取得したドキュメントをプロンプトに差し込みます。for url, body in docs: のところです。

また、なるべくrole: systemで差し込んだ情報をもとにして答えるように指示します。

Please answer the question as accurately as possible based on
the information provided in the text below.

さて、実行してみよう

2011年に発売された美容器具の取得

list ten beauty appliances released in 2011.

プロンプト
実行結果

パナソニックのヘアーアイロン、電動歯ブラシ、フェイススチーマー、マッサージ機、ヘッドスパ、日立のまつ毛カーラー、鼻毛切りなどが抽出されました。

篠田麻里子に関連したドキュメントの要約

list and summarize documents that Mariko Shinoda is involved in.

プロンプト
実行結果

前田敦子の容姿をいじったこと、第4回AKB総選挙でのスピーチ、ジャンケントーナメントのことが抽出されました。

CIAエージェントが登場する映画のリスト

list movie titles that CIA agents are involved in.

プロンプト
実行結果

このように、OpenAIのgpt-3.5 turboモデルに存在しない情報を、ベクトル検索エンジンを使用することで情報を補完できることを紹介しました。ただし、使用できるサイズに制限がある(4095トークン)のと、トークン数で課金されるなどの制約があることに注意してください。また、プロンプトで差し込んだ情報はOpenAI API側に飛びますので機密情報を投げないようにしてください。

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