はじめに
LangChainやLlamaIndexを利用したり、フレームワークを利用せずにRAGをしている方も多いと思いますが、「RAGの精度向上のためにできること(+Llamaindexでできること)」に続いて、LangChainでできることについて、Templatesや、cookbookを参考にしながら、気になったトピックスをピックアップしていきます。進化の早い領域ですので、継続して更新していきたいと思います。
RAGとは
RAGとは、「Retrieval Augmented Generation」の略で、情報検索と言語モデル(LLM)を組み合わせた手法のことです。検索結果をLLMのプロンプトに含めるというアプローチが一般的です。
RAGを使ったソースコード解析
LangChainでRAGを使ったソースコード解析が紹介されています。
(引用元:LangChain)
やりたいことは
- コードがどのように機能するかを理解するためのQ&A
- リファクタリングや改善提案
- コードの文書化
コンテキストを認識したコード分割
まだ、Python と JavaScriptだけのようですが便利なコンテキストを認識したコード分割もできるようです。
- コード内の各トップレベル関数とクラスは別々のドキュメントにロード
- 残りは別の文書にまとめる
- 各分割の出所に関するメタデータを保持
RAGの精度向上にむけて利用できそうなもの
全体的なものについてはこちらに整理しました。ここでは、LangChainで利用できるものをピックアップしていきます。
[データのロード]
- 60以上のVectorStoreから、データのタイプ(テキスト、画像、音声など)やタスクに適したものを選択する。
- 適切なインデックスを作成できるよう、適切なチャンクサイズに変更する。
- 大量のドキュメントを取得する場合、ドキュメント圧縮 (冗長性の削減)する。
[クエリ変換]
ユーザーからの質問や入力を受け取り、関連する情報を検索するためのクエリに変換する。
-
HyDE(Hypothetical Document Embeddings)(paper):
与えられたクエリに対して仮説的なドキュメントを生成し、そのドキュメントの埋め込みを使用して意味的検索を行う。 -
Rewrite-Retrieve-Read(Paper):
LLMを使ってユーザークエリを書き換える。 -
Step back prompting(Paper):
抽象化を促す「ステップバック」質問を生成し、その質問と元の質問の両方に関連するドキュメントを取得する。 -
RAG-fusion(ブログ):
複数のクエリを生成し、取得したドキュメントを逆順位融合を使用して再ランクする。 -
Multi Query Retrieval:
LLMを使用して複数のクエリを生成し、すべてのクエリに対するドキュメントを取得する。
まとめ
LangChainにはいろいろと使える機能がありそうです。詳しく見ながら、試しながら記事を追加していきたいと思います。
参考
https://blog.langchain.dev/applying-openai-rag/
https://blog.langchain.dev/query-transformations/
https://blog.langchain.dev/query-construction/
https://python.langchain.com/docs/modules/data_connection/retrievers/MultiQueryRetriever