LangChainが自己クエリを実装する方法
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)で私たちとチャットしましょう。
読み続けて

Introducing Customer-Managed Encryption Keys (CMEK) on Zilliz Cloud
We're announcing the general availability of Customer-Managed Encryption Keys (CMEK) on Zilliz Cloud.

Our Journey to 35K+ GitHub Stars: The Real Story of Building Milvus from Scratch
Join us in celebrating Milvus, the vector database that hit 35.5K stars on GitHub. Discover our story and how we’re making AI solutions easier for developers.

Proactive Monitoring for Vector Database: Zilliz Cloud Integrates with Datadog
we're excited to announce Zilliz Cloud's integration with Datadog, enabling comprehensive monitoring and observability for your vectorDB deployments.
