Open2

RAGについて勉強する

kawayamakawayama

まずはChatGPTで勉強していく

  • Retrieval-Augmented Generation (検索拡張生成)
  • LLMは学習時点の知識までしか持っていないため、独自のナレッジを入れるには外部データベースとLLMを連携させる必要がある
  • 仕組み: ユーザから受け取った質問やプロンプトを入力として、外部データベースから関連する情報をベクトル検索で取り出し、取り出した文書 + ユーザの質問をLLMに渡して、より正確で文脈にあった回答を生成する
  • メリット
    • 知識の拡張
    • ハルシネーションの軽減
    • カスタマイズ性
  • 注意点
    • 検索精度が低いと回答も悪くなる
    • 検索結果が多すぎてもLLMが混乱する
    • 検索文書のフォーマットや前処理が重要

気になったこと

  • LLMにはコンテキストウィンドウがあるため、一度に渡せる情報には限りがあるのではないか?
  • メリットにハルシネーションの軽減があったが、具体的な情報をプロンプトで渡せばハルシネーションが軽減するものなのか?正しい情報を与えながら嘘をつくケースはないのか?
  • 質問文やプロンプトをそのままベクトル検索して、適切な文書が出てくるものなのか?それとも別途適切なクエリを作成するものなのか?
  • MCPとRAGの関係性について。MCPサーバで外部情報を取得することもRAGと言えるのか?(検索拡張生成と聞くと内包されていそう)
  • どのように検索文書のフォーマットや前処理を行うのか?
kawayamakawayama

LLMにはコンテキストウィンドウがあるため、一度に渡せる情報には限りがあるのではないか?どういった工夫をするのか?

  • ベクトル検索によって情報を絞り込む (上位3件だけをLLMに渡すなど)
  • 10件程度の文書を計算し、BERTなどで意味的な距離を再計算し、上位3~5件に絞り込む
  • ドキュメントをチャンクに分けてから検索。大きい文書には「マルチステージRAG」を適用
    1. チャンク単位で検索
    2. 必要に応じて要約
    3. 要約結果をLLMに渡す
  • セッションコンテキスト管理、過去の会話履歴で重要な発話を抽出する
  • 情報の構造化とフィルタリング、メタデータを使って検索対象を先に絞る
  • langchainには「Contextual Compression Retriever」というretrievers+compressorを組み合わせた仕組みがあったり、LlamaIndexには「Retriever Synthesizer Patter」という複数文書を統合してまとめる方式も人気がある

気になったこと

  • ベクトル検索によって絞り込み過ぎてしまうと、実は重要だった情報を見逃してしまう気がする。その辺りのテクニックはあるのか?例えば、全て読み込んで少しずつ要約していって、それらをまとめて読み込むなど。← RAG with Compression
  • マルチステージRAGについて詳しく知りたい
  • チャンクに分ける理由はドキュメントが大きすぎて一度にLLMに渡せないからかという認識であっているか?
  • チャンク分割の手法が重要な気がしているので詳しく知りたい
  • 最近の100万トークンのコンテキストウィンドウを持つLLMが出てきたが、それらとRAGの関係性について知りたい。今後は全て渡せばいいという話になるのかなど