46.5kデモを予約するログイン無料で始める

LangChainが自己クエリを実装する方法

Nov 16, 20231 min read

LangChainは、LLMオーケストレーションのための超人気オープンソースライブラリだ。最近、彼らは "Self Query "レトリバーを追加した。Self Query "リトリーバを使うと、MilvusのようにLangChainを使ってベクトルデータベースに問い合わせることができます。このセルフクエリーリトリーバがどのように実装されているか見てみましょう。self-queryフォルダにあるbase.pyファイルの189行目から233行目までを扱います。この記事では唯一のクラスメソッドである from_llm も扱います。

この投稿では

  • Self Query クラスメソッドの定義
  • セルフクエリパラメータの解析
  • LLMチェーンの作成
  • セルフ・クエリー・リトリーバーを返す

セルフ・クエリー・クラスのメソッド定義

セルフクエリ基底クラスのクラスメソッドは from_llm だけである。8つのパラメータと、キーワード引数(kwargs)を渡すためのパラメータがある。クラスの最初の「パラメータ」が cls であることにお気づきだろうか。Python の正式なトレーニングを受けていない場合、cls と self の違い は PEP8 によると、単にスタイルと使い方の問題である。

self クエリクラスを作成するために必要なパラメータは 4 つあります:llm、vectorstore、document_contents、metadata_field_info` である。

  • llm`は言語モデルを渡すためのものである。
  • vectorstore` は Milvus のようなベクトルストアを渡すために使用する。
  • document_contents` パラメータの名前は少し誤解を招きやすい。これは保存されたドキュメントの実際の内容を指しているのではなく、ドキュメントの短い説明を指している。
  • metadata_field_infoはAttributeInfo` オブジェクトの列で、ベクターデータベースのデータに関する情報を含む辞書である。

必須パラメータの後にオプションパラメータが来る。これも4つある:structured_query_translator、chain_kwargs、enable_limit、use_original_queryである。最初の2つのデフォルトはNoneで、2つ目はFalse` である。

structured_query_translatorパラメータにはトランスレータを渡すことができる。トランスレータは式を各ベクタデータベースのフィルタ文に変換する。これらのフィルタ文は、その用途に応じて "allowed_comparators" または "allowed_operators" としてchain_kwargs` に渡される。各ベクトルストアは固有のコンパレータと演算子を持っています。例えば、Milvus で許可される真偽値表現 です。

enable_limitパラメータを使うと、リミット演算子を有効にするかどうかを決めることができる。この演算子はLangChainのネイティブ機能で、検索する文書の数を制限します。最後のパラメータはuse_original_query` で、オリジナルのクエリを使うか、LLMが生成したクエリを使うかを決める。

       クラスメソッド
       def from_llm(
           cls、
           llm:BaseLanguageModel、
           vectorstore:VectorStore、
           document_contents: str、
           metadata_field_info:Sequence[Union[AttributeInfo, dict]]、
           structured_query_translator:Optional[Visitor] = なし、
           chain_kwargs:Optional[Dict] = なし、
           enable_limit: bool = False、
           use_original_query: bool = False、
           **kwargs:任意、
       )-> "SelfQueryRetriever":

自己クエリパラメータを解析する

パラメータをどのように処理するかを説明しよう。渡されたパラメータに基づいて、一連の if ステートメントを使用して、何をすべきかを決定します。

まず、すでに定義されている構造化クエリトランスレータがあるかどうかをチェックします。なければ、定義されているベクターストアの組み込みトランスレータを使用します。

次に、チェーンキーワード引数をチェックします。引数を渡された値に設定するか、空の辞書のままにします。引き続き、次の2つの if ステートメントでこれらの引数をチェックします。私たちが探す2つのキーは、許可された比較演算子と演算子です。これらのキーによって、フィルター式の書き方が決まります。

           structured_query_translator が None の場合:
               structured_query_translator = _get_builtin_translator(vectorstore)
           chain_kwargs = chain_kwargs or {} もし(
           if (
               「allowed_comparators" が chain_kwargs にない場合
               かつ structured_query_translator.allowed_comparators が None でない場合
           ):
               chain_kwargs[
                   "allowed_comparators"
               ] = structured_query_translator.allowed_comparators
           if (
               "allowed_operators" が chain_kwargs になく
               かつ structured_query_translator.allowed_operators が None でない場合
           ):
               chain_kwargs[
                   "allowed_operators"
               ] = structured_query_translator.allowed_operators

LLM チェーンの作成

すべての定義が終わったので、クエリのコンストラクタを作成します。このステップでは、クエリコンストラクタから load_query_constructor_runnable 関数を呼び出します。このステップについては、別の記事で詳しく説明します。

LLM、ドキュメント内容の説明、メタデータフィールド、制限を有効にするかどうか、そしてチェインに渡すキーワード引数を渡す必要があります。これらの要素をすべて定義すると、関数は Runnable オブジェクトを返し、指定したスクリプトを実行できるようになる。

           query_constructor = load_query_constructor_runnable(
               llm、
               document_contents、
               metadata_field_info、
               enable_limit=enable_limit、
               **chain_kwargs、
           )

自己クエリー・リトリーバーを返す

このクラスメソッドの最後に、セルフクエリーリトリーバーを返す必要がある。このメソッドは self クエリクラスのインスタンスを返します。先ほど定義したクエリコンストラクタと、渡されたベクトルストア、オリジナルのクエリを使用するかどうか、トランスレータ、キーワード引数のリストを渡します。

           return cls(
               query_constructor=query_constructor、
               vectorstore=vectorstore、
               use_original_query=use_original_query、
               structured_query_translator=structured_query_translator、
               **kwargs、
           )

LangChainが自己クエリを実装する方法のまとめ

この記事では、LangChainが "self-querying "というコンセプトをどのように実装しているかを紹介しました。これはシンプルなretrieval augmented generation (RAG) アプリケーションを構築する方法です。LLM、ベクトル・データベース、そしてLLMとのインタフェースのためのプロンプトです。

セルフクエリはLangChainでは非常に大きなコードブロックですが、この記事では特にクラスメソッド from_llm を取り上げます。このメソッドでは4つの必須フィールドを渡すだけでRAGアプリを作成することができます。LLM、ベクターデータベース、ドキュメントの説明、そしてメタデータ情報です。LLMとベクターデータベースについてもっと知りたいですか?Discord](https://discord.gg/8uyFbECzPX)で私たちとチャットしましょう。

Updated on Jul 09, 2026