Open2
RAGについて勉強する
まずはChatGPTで勉強していく
- Retrieval-Augmented Generation (検索拡張生成)
- LLMは学習時点の知識までしか持っていないため、独自のナレッジを入れるには外部データベースとLLMを連携させる必要がある
- 仕組み: ユーザから受け取った質問やプロンプトを入力として、外部データベースから関連する情報をベクトル検索で取り出し、取り出した文書 + ユーザの質問をLLMに渡して、より正確で文脈にあった回答を生成する
- メリット
- 知識の拡張
- ハルシネーションの軽減
- カスタマイズ性
- 注意点
- 検索精度が低いと回答も悪くなる
- 検索結果が多すぎてもLLMが混乱する
- 検索文書のフォーマットや前処理が重要
気になったこと
- LLMにはコンテキストウィンドウがあるため、一度に渡せる情報には限りがあるのではないか?
- メリットにハルシネーションの軽減があったが、具体的な情報をプロンプトで渡せばハルシネーションが軽減するものなのか?正しい情報を与えながら嘘をつくケースはないのか?
- 質問文やプロンプトをそのままベクトル検索して、適切な文書が出てくるものなのか?それとも別途適切なクエリを作成するものなのか?
- MCPとRAGの関係性について。MCPサーバで外部情報を取得することもRAGと言えるのか?(検索拡張生成と聞くと内包されていそう)
- どのように検索文書のフォーマットや前処理を行うのか?
LLMにはコンテキストウィンドウがあるため、一度に渡せる情報には限りがあるのではないか?どういった工夫をするのか?
- ベクトル検索によって情報を絞り込む (上位3件だけをLLMに渡すなど)
- 10件程度の文書を計算し、BERTなどで意味的な距離を再計算し、上位3~5件に絞り込む
- ドキュメントをチャンクに分けてから検索。大きい文書には「マルチステージRAG」を適用
- チャンク単位で検索
- 必要に応じて要約
- 要約結果をLLMに渡す
- セッションコンテキスト管理、過去の会話履歴で重要な発話を抽出する
- 情報の構造化とフィルタリング、メタデータを使って検索対象を先に絞る
- langchainには「Contextual Compression Retriever」というretrievers+compressorを組み合わせた仕組みがあったり、LlamaIndexには「Retriever Synthesizer Patter」という複数文書を統合してまとめる方式も人気がある
気になったこと
- ベクトル検索によって絞り込み過ぎてしまうと、実は重要だった情報を見逃してしまう気がする。その辺りのテクニックはあるのか?例えば、全て読み込んで少しずつ要約していって、それらをまとめて読み込むなど。← RAG with Compression
- マルチステージRAGについて詳しく知りたい
- チャンクに分ける理由はドキュメントが大きすぎて一度にLLMに渡せないからかという認識であっているか?
- チャンク分割の手法が重要な気がしているので詳しく知りたい
- 最近の100万トークンのコンテキストウィンドウを持つLLMが出てきたが、それらとRAGの関係性について知りたい。今後は全て渡せばいいという話になるのかなど