Open6

独自のソースをもとにチャットボットに質問の回答を生成してもらう方法

kodekode

独自ソース(情報)をAIに学習してもらう処理

  1. まず情報源(websiteやpdf, DBなど)を渡す
  2. その情報をチャンクという小さくデータに分割する
  3. チャンクからembedding(ベクトル)を作成する
  4. 作成したembeddingと元のチャンクをベクトルストア(superbase, pinecone...etc)に保存する
kodekode

ユーザーの質問を解釈して、回答に使える情報を取得する処理

  1. ユーザーが質問をする
  2. その質問を別途会話メモリに保存する(LLMはステートレスなので、文脈を保った返事ももらうためには、以前の会話履歴を全て送る必要があるため、会話履歴保存用のメモリを使う)
  3. 質問文を既存のLLM(ex. openAI, Llama...など)に投げて、質問の意図を理解もらい簡単な質問文へ変換する
  4. 簡単になった質問文をopenAIを通してembedding(ベクトル)に変換する
  5. 4.で作成したembeddingに近いチャンクをベクトルストアから取得する
kodekode

ユーザーの質問に基づく回答を作成する処理

  1. 回答の生成に必要な以下3つのデータをLLM(ex. openAI, Llama...etc)へ渡す
  • ユーザーの質問文(簡単にする前の生のやつ)
  • ベクトルストアから取得したチャンク
  • 今までの会話履歴全て
  1. 1.によって生成された回答を、再度会話メモリに保存する
  2. 1.によって生成された回答をユーザーへレスポンスする
kodekode

[メモ]

例えばpdfの内容をもとにLLMに回答を生成してもらいたい場合、次のフローになるはず

  1. ベクトルDBの作成
    a. pdfのデータをチャンクに分割し、それぞれのチャンクからembeddingを作成する
    b. a.で作成したembeddingをベクトルDBに保存する
  2. 質問をopenAIに投げ、簡単な質問へ変換する
  3. 簡単な質問をチャンクにし、それらのembeddingを作成する
  4. 3.のembeddingを元に、ベクトルDBから近いembeddingを持つチャンクを取得する
  5. 3.で取得したチャンクと質問文(簡単にする前の生のやつ)と今までの会話履歴をLLMに投げて回答を生成してもらう
  6. 会話履歴に回答を保存しつつ、回答をユーザーにレスポンスする
kodekode

[メモ]

なお、上記の私の想像が合っているかchatGPTに聞いてみましたが、以下の追加ステップがある方が良いと指摘をもらいました

追加・明確化が必要なステップ:

・PDF解析の品質確認: PDFからテキストを抽出する際、フォーマットや図表の存在によって正確なテキスト抽出が難しい場合があるため、解析の品質確認が必要です。
・チャンクのサイズと内容のバランス: チャンクのサイズを適切に設定し、各チャンクが意味のある情報を含むようにすることが重要です。
・データセキュリティとプライバシーの考慮: 特に機密性の高いPDFの場合、データのセキュリティとプライバシーの保護に注意を払う必要があります。
・質問の文脈理解: LLMが質問の文脈を適切に理解するために、必要に応じて追加の文脈情報を提供することが有効です。
パフォーマンスの監視と最適化: プロセスの各ステップでパフォーマンスを監視し、必要に応じて最適化することが重要です。