ドキュメント検索の最適化

LangChainで学ぶ検索拡張生成(RAG)

Meri Nova

Machine Learning Engineer

RAGの検索プロセス

ベクトルデータベースからドキュメントを取得し、アプリに返して応答を生成する様子。

LangChainで学ぶ検索拡張生成(RAG)

密検索(デンスリトリーバル)

チャンクをゼロ以外の値を持つ1つのベクトルに変換する

ベクトル空間で、類似した用語がグループ化されている様子: LLM、AI、機械学習。

メリット: 意味的な内容を捉えられる

LangChainで学ぶ検索拡張生成(RAG)

密検索(デンスリトリーバル)

チャンクをゼロ以外の値を持つ1つのベクトルに変換する

意味的に類似した用語が近くに配置されたベクトル空間内のエンベディングされた用語。

メリット: 意味的な内容を捉えられる デメリット: 計算コストが高い

疎検索(スパースリトリーバル)

主にゼロの値を含む、単語の一致による変換

特定の用語が含まれるドキュメント。最も頻出する単語がハイライトされたドキュメントが表示されている。

メリット: 正確、説明可能、あまり使われない単語も処理できる

LangChainで学ぶ検索拡張生成(RAG)

疎検索手法

TF-IDF: ドキュメントを、そのドキュメントを特徴づける単語でエンコードする

特定の用語が含まれるドキュメント。最も多くの用語がハイライトされたドキュメントが表示されている。

BM25: エンコードで高頻度の単語が過度に強調されるのを防ぐ

LangChainで学ぶ検索拡張生成(RAG)

BM25検索

from langchain_community.retrievers import BM25Retriever

chunks = [ "Python was created by Guido van Rossum and released in 1991.", "Python is a popular language for machine learning (ML).", "The PyTorch library is a popular Python library for AI and ML." ]
bm25_retriever = BM25Retriever.from_texts(chunks, k=3)
LangChainで学ぶ検索拡張生成(RAG)

BM25検索

results = bm25_retriever.invoke("When was Python created?")
print("Most Relevant Document:")
print(results[0].page_content)
Most Relevant Document:
Python was created by Guido van Rossum and released in 1991.
  • Python was created by Guido van Rossum and released in 1991."
  • "Python is a popular language for machine learning (ML)."
  • "The PyTorch library is a popular Python library for AI/ML."
LangChainで学ぶ検索拡張生成(RAG)

RAGにおけるBM25

retriever = BM25Retriever.from_documents(
    documents=chunks, 
    k=5
)

chain = ({"context": retriever, "question": RunnablePassthrough()} | prompt | llm | StrOutputParser() )
1 https://www.datacamp.com/blog/what-is-retrieval-augmented-generation-rag
LangChainで学ぶ検索拡張生成(RAG)

RAGにおけるBM25

print(chain.invoke("How can LLM hallucination impact a RAG application?"))
The RAG application may generate responses that are off-topic or inaccurate.
LangChainで学ぶ検索拡張生成(RAG)

お疲れさまでした!

LangChainで学ぶ検索拡張生成(RAG)

Preparing Video For Download...