ChatGPTに自前のドキュメントを読んでもらって回答してもらう方法
この記事の概要
最近、ChatGPT に自前のドキュメントを読み込ませる方法を調べて、実際にコードを書いたりしてみたので、その中で得られた知識をまとめた記事になります。 自分用のメモとして、雑多に書いていますので悪しからず。
2つの方法がある
Fine Turning と Prompt Design の2つの方法があります。
Fine Turning
- 自前のドキュメントを、モデルに追加で学習させる方法
- OpenAI が Fine Turning ができる CLI ツールと、Fine Turning したモデルを使えるように API を用意しているため、それを利用して Fine Turning ができる
メリット
- Prompt Design 与えられる学習量が多いため、うまく学習ができたら、Prompt Design よりも、望んだ回答が得られやすい
(実際に試してないけど)デメリット
- 以下のような教師データを作成する必要があり、学習させるデータを作成するのにコストがかかる(そのまま自前のドキュメントを読み込ませればよいわけではなく、教師データの形に加工する必要がある。以下がフォーマット。)
{"prompt": "<prompt text>", "completion": "<ideal generated text>"} ...
- Fine Turning に使えるモデルが GPT-3 ベースのもの
- 2023/06/03現在、OpenAI が提供している API では Fine Turning に使用できるモデルは GPT-3 ベースのもの
- Fine Turning をさせた GPT-3 と Prompt Design をした GPT-3.5-turbo or GPT-4 だったら、どっちが意図した結果が出やすいのかという問題はある
- Fine Turning だと、学習された後に出てきた情報を読み込ませることはできない
- プロンプトを投げた時点での最新のデータを参照できない
Prompt Design
- プロンプトを工夫する方法
- 例えば、以下のようにプロンプトに自前のドキュメントを読み込ませて ChatGPT に回答させるイメージ
以下の文章を読んだ上で、次の質問に答えてください。 # 読み込む文章 koheitakahashi の信念は「選択と集中」である。 # 質問 koheitakahashi の信念は?
> koheitakahashi の信念は「選択と集中」です。
メリット
- プロンプトを投げた時点の最新のデータを読み込ませることができる
デメリット
- 一度に読み込ませられるドキュメントの量に限りがある
- GPT3.5 turbo だと、4096トークン
- GPT4 だと、最大16k
- この制限を回避するために、一度に読み込ませるドキュメントを選定するというステップが必要
Prompt Design におけるトークン量の制約を緩和するための方法
自前のドキュメントを予め Embedding API を用いてベクトル化しておき、そのベクトルをもとに、与えられたプロンプトと類似するチャンクを抽出して、それをプロンプトに加えるという方法がある。
Embedding API を使った流れ
雑な図だが、以下のような流れになる。
ちなみに、チャンクとプロンプトの距離の計算はコサイン類似度を使って求めることが OpenAI のドキュメントでは推奨されているが、距離の計算方法の違いによる影響はほとんどないらしい。
We recommend cosine similarity. The choice of distance function typically doesn’t matter much. https://platform.openai.com/docs/guides/embeddings/which-distance-function-should-i-use
考えなければならないこと
- チャンク化する単位
- チャンクに対して、ベクトルを返してもらう都合上、同じドキュメントでもチャンク化する単位により返されるベクトルの値が異なるため、適切なチャンクの単位を見定める必要がある
- 読み込ませるドキュメントの量に応じて、チャンクとプロンプトの距離の計算量が線形に増えていく
- ここについては、ベクトルデータベースを使えば早くなるらしい