Langchainの検索:ドキュメントへの効率的かつ柔軟なアクセス
Langchainフレームワークの検索者は重要な役割を果たし、構造化されていないクエリに基づいてドキュメントを返すための柔軟なインターフェイスを提供します。 Vectorデータベースとは異なり、検索者はドキュメントを保存する必要はありません。ベクトルデータベースはレットリアの基礎として機能することができますが、さまざまなタイプのレットリアがあり、それぞれが特定のユースケースにカスタマイズ可能です。
学習目標
目次
Langchainの検索者
検索者は、入力として文字列クエリを受信し、ドキュメントオブジェクトのリストを出力します。このメカニズムにより、アプリケーションは関連情報を効率的に取得し、大規模なデータセットまたは知識ベースとの高度な相互作用を可能にします。
ベクトルデータベースレトリバーは、ベクトル表現を利用してドキュメントを効率的に取得します。ベクトルストレージクラスの軽量ラッパーとして機能し、検索者インターフェイスに準拠し、類似性検索や最大周辺相関(MMR)などの方法を使用します。
ベクトルデータベースから取得者を作成するには、 .as_retriever
メソッドを使用します。たとえば、顧客レビューに基づいたPinecone Vectorデータベースの場合、次のように設定できます。
langchain_community.document_loadersからcsvloaderをインポートします langchain_community.vectorstoresからインポートPineconeから langchain_openaiからOpenAiembedingsをインポートします langchain_text_splittersからImport charateTextSplitter Loader = csvloader( "customer_reviews.csv") documents = roader.load() text_splitter = charateTextSplitter(chunk_size = 500、chunk_overlap = 50) texts = text_splitter.split_documents(documents) 埋め込み= openAiembedings() vectorStore = pinecone.from_documents(テキスト、埋め込み) retriever = vectorStore.as_retriever()
この検索者を使用して関連するコメントを照会できるようになりました。
docs = retriever.invoke(「顧客はバッテリー寿命についてどう思いますか?」)
デフォルトでは、検索者は類似性検索を使用しますが、検索タイプとしてMMRを指定できます。
retriever = vectorStore.as_retriever(search_type = "mmr")
さらに、類似性スコアのしきい値などのパラメーターを渡すか、TOP-Kを使用して結果の数を制限できます。
retriever = vectorStore.AS_RETRIEVER(search_kwargs = {"k":2、 "score_threshold":0.6})
出力:
Vectorデータベースを検索者として使用すると、関連情報への効率的なアクセスを保証することにより、ドキュメントの取得を強化できます。
Multiquerretrieverは、クエリの言葉遣いや次の埋め込みの変更などの一般的な制限に対処することにより、距離ベースのベクターデータベースの検索を強化します。大規模な言語モデル(LLM)自動化プロンプト調整を使用して、異なる角度からの特定のユーザー入力に対して複数のクエリを生成できます。このプロセスにより、各クエリに関連するドキュメントの検索が可能になり、結果を組み合わせて潜在的なドキュメントのより豊富なセットを作成します。
MultiquerreTrieverを実証するには、CSVファイルから製品の説明を使用してベクターストアを作成しましょう。
langchain_community.document_loadersからcsvloaderをインポートします langchain_community.vectorstoresからImport faissから langchain_openaiからOpenAiembedingsをインポートします langchain_text_splittersからImport charateTextSplitter #製品の説明loader = csvloader( "product_descriptions.csv") data = roader.load() #テキストをブロックに分割したtext_splitter = charateTextSplitter(chunk_size = 300、chunk_overlap = 50) documents = text_splitter.split_documents(data) #ベクトルストレージ埋め込み= openAiembeddings()を作成します vectordb = faiss.from_documents(documents、embeddeds)
MultiquerreTrieverを使用するには、クエリ生成に使用されるLLMを指定します。
langchain.retrievers.multi_queryからImport multiquerretrieverから langchain_openaiからChatopenaiをインポートします 質問= "顧客はスマートフォンでどのような機能を大切にしていますか?」 LLM = Chatopenai(温度= 0) retriever_from_llm = multiqueryretriever.from_llm( retriever = vectordb.as_retriever()、llm = llm )) anible_docs = retriever_from_llm.invoke(question) len(sinque_docs)#取得した一意のドキュメントの数
出力:
Multiquerretrieverは複数のクエリを生成し、検索されたドキュメントの多様性と関連性を高めます。
生成されたクエリを調整するには、カスタムプロンプトテンプレートと出力パーサーを作成できます。
langchain_core.output_parsersからImport BaseOutputParserから langchain_core.promptsからImport PromptTemplateから インポートリストの入力から #カスタム出力パーサークラスlinElistOutputPuparser(baseOutputPurser [list [str]]): def parse(self、text:str) - > list [str]: return list(filter(none、text.strip()。split( "\ n"))) output_parser = lineListOutputParser() #query生成query_prompt = prompttemplateのカスタムプロンプト input_variables = ["question"]、 template = "" "質問の5つの異なるバージョンを生成:{question}" "" )) llm_chain = query_prompt | #Retriver Retrieverを初期化= MultiqueryRetriever( retriever = vectordb.as_retriever()、llm_chain = llm_chain、parser_key = "lines" )) anible_docs = retriever.invoke( "顧客はスマートフォンでどのような機能を大切にしていますか?") len(sinque_docs)#取得した一意のドキュメントの数
出力
MultiquerreTrieverを使用すると、より効率的な検索プロセスを実現し、ユーザークエリに基づいて多様で包括的な結果を確保できます。
特に、ユーザーが行う特定のクエリについてデータの摂取がわからない場合、ドキュメントの大規模なコレクションから関連情報を取得することは困難です。多くの場合、貴重な洞察は長い文書に隠されており、その結果、言語モデル(LLM)への非効率的で費用のかかる呼び出しが行われ、理想よりも応答性が低くなります。コンテキスト圧縮は、検索プロセスを改善し、関連情報がユーザーのクエリに基づいてのみ返されるようにすることにより、この問題を解決します。この圧縮には、単一のドキュメントの内容を減らし、無関係なドキュメントを除外することが含まれます。
コンテキスト圧縮検索者は、基本的な検索者をドキュメントコンプレッサーと統合することにより実行されます。この方法では、ドキュメント全体を返すものではありませんが、クエリによって提供されるコンテキストに基づいてドキュメントを圧縮します。この圧縮には、単一のドキュメントの内容を減らし、無関係なドキュメントを除外することが含まれます。
langchain_community.document_loadersからtextloaderをインポートします langchain_community.vectorstoresからImport faissから langchain_openaiからOpenAiembedingsをインポートします langchain_text_splittersからImport charateTextSplitter #記事をロードして分割しますdocuments = textloader( "climate_change_policy.txt")。load() text_splitter = charateTextSplitter(chunk_size = 1000、chunk_overlap = 0) texts = text_splitter.split_documents(documents) #ベクターストレージレトリバーレトリバー= faiss.from_documents(texts、openaiembeddings())。as_retriever()を初期化する
docs = retriever.invoke(「気候変動と戦うためにどのような行動が提案されていますか?」)
langchain.retrieversからContextCompressionretrieverをインポートします langchain.retrievers.document_compressorsからllmchainextractorをインポートします langchain_openaiインポートOpenaiから llm = openai(温度= 0) Compressor = llmchainextractor.from_llm(LLM) compression_retriever = contextualCompressionretriever( base_compressor = compressor、base_retriever = retriever )) #compressed_docs = compression_retriever.invokeを実行する( "気候変動と戦うためにどのような行動が提案されているのか?")
圧縮結果を表示する: ContextualCompressionRretrieverの最初のドキュメントを処理し、クエリに関連する関連情報のみを抽出し、それにより応答を最適化します。
多くのLLMアプリケーションで検索が不可欠です。そのタスクは、ユーザークエリに基づいて関連するドキュメントを取得することです。これらのドキュメントはLLMプロンプトとしてフォーマットされており、適切な応答を生成できるようにします。
カスタムレトリバーを作成するには、BaseReTrieverクラスを拡張し、以下を実装してください。
方法 | 説明する | 必須/オプション |
---|---|---|
_get_relevant_documents |
クエリに関連するドキュメントを検索します。 | 必須 |
_aget_relevant_documents |
ネイティブサポートのための非同期実装。 | オプション |
BaseReTrieverから継承されたものは、レトリバーに標準の実行可能な機能を提供します。
これが簡単なレトリバーの例です。
インポートリストの入力から langchain_core.documentsからインポートドキュメントから langchain_core.retrieversからImport Baseretrieverから クラスToyretriever(Baseretriever): "" "ユーザーのクエリを含む最初のkドキュメントを返すシンプルなレトリバー" "" " ドキュメント:リスト[ドキュメント] K:int def _get_relevant_documents(self、query:str) - > list [document]: matching_documents = [self.documentsのdoc for doc for self.documents query.lower()in doc.page_content.lower()] return matching_documents [:self.k] #例の使用文書= [ document( "犬は素晴らしい会社です。"、{"Type": "dog"})、 document( "猫は独立したペットです。"、{"タイプ": "cat"})、 ] retriever = toyretriever(documents = documents、k = 1) result = retriever.invoke( "dog") print(result [0] .page_content)
出力
この実装は、ユーザー入力に基づいてドキュメントを取得する簡単な方法を提供し、Langchainのカスタム検索者のコア機能を示しています。
Langchainフレームワークでは、検索者は、さまざまなドキュメントタイプとユースケースで関連情報に効果的にアクセスできる強力なツールです。さまざまな検索者タイプ(ベクトルストレージレトリバー、マルチクリーレットリリーバー、コンテキスト圧縮リトリーバーなど)を理解および実装することにより、開発者はアプリケーションの特定のニーズに基づいてドキュメント取得をカスタマイズできます。
各レトリバータイプには、マルチクリーレットリリーバーの使用からコンテキスト圧縮の使用まで、応答を最適化することまで、独自の利点があります。さらに、カスタム検索者を作成すると、組み込みのオプションが満たされない可能性のある特別な要件に対応するための柔軟性が高まります。これらの検索手法を習得することで、開発者は言語モデルと大規模なデータセットの可能性を活用するより効率的で応答性の高いアプリケーションを構築できます。
Q1。 A1検索者の主な機能は、クエリに基づいて関連するドキュメントを取得することです。これにより、ドキュメント自体を保存せずに、アプリケーションが大規模なデータセットで必要な情報に効果的にアクセスできます。
Q2。 A2は、類似性ベースの検索を可能にする方法でドキュメントを保存するために使用されます。ベクトルデータベースは検索者の一部になりますが、検索者のタスクは関連情報の取得に焦点を当てています。
Q3。 A3言語モデルを使用して複数のクエリのバリエーションを作成することにより、MultiquerreTrieverが検索結果を改善します。この方法は、さまざまな文言の問題に関連する可能性のあるより広い範囲のドキュメントをキャプチャし、それにより検索情報の豊かさを高めます。
Q4。 A4コンテキストは、ドキュメントのコンテンツを関連する部品のみに削減し、無関係な情報を除外することにより、検索結果を最適化します。これは、完全なドキュメントには無関係な詳細が含まれており、リソースを節約し、より集中化された応答を提供する可能性があるため、大規模なコレクションで特に役立ちます。
Q5。 a5マルチクリーレットレバーをセットアップするには、ドキュメントストレージのためのベクトルデータベース、複数のクエリの視点を生成するための言語モデル(LLM)、およびクエリ生成をさらに最適化するためのオプションのカスタムプロンプトテンプレートが必要です。
以上がラングチェーンのレトリーバーのための3つの高度な戦略の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。