🐈

langchainのVectorStoreで効果的な検索:as_retriever()メソッドを理解する

2023/08/31に公開

langchainのVectorStoreで効果的な検索:as_retriever()メソッドを理解する

langchainのVectorStoreは、高度な検索機能を提供するための強力なツールです。その中でも、as_retriever()メソッドは異なる検索方法やパラメータを活用して、効果的な検索を実現するための鍵となります。この記事では、as_retriever()メソッドを詳しく解説し、検索方法とパラメータの使い方を理解する手助けをします。

as_retriever()で設定できるsearch_type

as_retriever()メソッドを使用する際に設定できるsearch_typeは、以下の3つの検索方法を選択できます。

1. similarity

デフォルトで設定されている検索方法で、類似検索が行われます。この方法では、類似する上位4件のDocumentsオブジェクトが返されます。必要に応じて、後述するsearch_kwargsのtop_kで返す件数を調整できます。

# similarityの使用例
retriver = vector_store.as_retriever()
docs = retriever.get_relevant_documents("検索query")

# top_kを指定する場合
retriver = vector_store.as_retriever(search_kwargs={"k": 4})
docs = retriever.get_relevant_documents("検索query")

2. similarity_score_threshold

この方法は、類似度のスコアと閾値を設定して、閾値以上の類似度を持つDocumentsオブジェクトを返します。

# similarity_score_thresholdの使用例
retriver = vector_store.as_retriever(search_type="similarity_score_threshold", search_kwargs={"score_threshold": 0.8})
docs = retriever.get_relevant_documents("検索query")

3. mmr

mmrは、Maximum Marginal Relevanceという手法を使用した検索方法です。Vector Storeがサポートしている場合に使用できます。

Copy code
# mmrの使用例
retriver = vector_store.as_retriever(search_type="mmr")
docs = retriever.get_relevant_documents("検索query")

Maximum Marginal Relevanceの詳細については、こちらのブログで原論文を翻訳されていますので、参考にしてください。

https://hazm.at/mox/machine-learning/natural-language-processing/summarization/mmr/index.html

as_retriver()で設定できるsearch_kwargs

search_kwargsは、Vector Storeに応じて検索方法に関するパラメータを辞書型で設定するためのものです。以下、その詳細を見ていきましょう。

1. top_kの調整

top_kパラメータは、類似検索時に返すDocumentsオブジェクトの数を制御します。デフォルトでは4件が設定されていますが、検索結果の質や量に応じて調整しましょう。

# top_kの設定方法
retriver = vector_store.as_retriever(search_kwargs={"k": 4})

2. メタデータでのフィルタリング

filterパラメータを使用して、metadataの条件に基づいて結果をフィルタリングできます。例えば、特定の言語の結果のみを抽出することが可能です。

# metadataのlangが'en'のDocumentsオブジェクトのみを抽出
retriever = vector_store.as_retriever(search_kwargs={"filter": {"lang": "en"}})

3. 類似度スコアの閾値設定

類似検索にsimilarity_score_thresholdモデルを使用する場合には、類似度の閾値をscore_thresholdパラメータで設定します。

# 類似度スコアの閾値を0.8に設定
retriver = vector_store.as_retriever(search_type="similarity_score_threshold", search_kwargs={"score_threshold": 0.8})

4. namespaceの設定

pineconeなどのVector Storeでは、Index内のVectorの集合をnamespace(名前空間)で分けて管理することができます。
namespaceを指定することで、特定のnamespace内のVectorのみを検索対象とすることができます。

# namespaceの設定方法
retriver = vector_store.as_retriever(search_kwargs={"namespace": "namespace_name"})

Vector storeによって、設定できるsearch_kwargsは変わってくるため、なにが設定できるかVector storeのドキュメントを参照してみてください。

まとめ

VectorStoreのas_retriever()メソッドを使いこなすことで、langchainユーザーは豊富な検索オプションを活用し、効率的な情報発見を実現できます。必要な情報を正確に取得するために、さまざまな検索方法とパラメータの活用を検討しましょう。

株式会社piponでは定期的に技術勉強会を開催しています。
ChatGPT・AI・データサイエンスについてご興味がある方は是非、ご参加ください。
https://chatgptllm.connpass.com/
株式会社piponではChatGPT・AI・データサイエンスについて業界ごとの事例を紹介しています。ご興味ある方はこちらのオウンドメディアをご覧ください。
https://bigdata-tools.com/

参考

https://python.langchain.com/docs/modules/data_connection/retrievers/vectorstore

https://book.st-hakky.com/docs/indexes-of-langchain/

https://yolo-kiyoshi.com/2020/05/08/post-1781/

https://dev.classmethod.jp/articles/pinecone-overview/

株式会社piponのテックブログ

Discussion