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

TL;DR LangChain v0.1.5でのMilvus回帰

Feb 13, 20241 min read

LangChain0.1.5とMilvusの統合を修正するPRを提出した: https://github.com/langchain-ai/langchain/pull/17021

問題

Langchain v0.1.5を使用してMilvusに接続する際、"KeyError: 'pk'"エラーが発生します。このエラーは最近のMilvusのリグレッションにより "pk "フィールド(主キー)の値が自動的に生成されないことが原因です。Milvusは各ドキュメントに主キーフィールドを要求しますが、LangChainテキストスプリッタはそれを含まないため、Milvusのinsert()メソッドは "KeyError: 'pk' is missing" を発生します。

暫定的な解決策 (ダウングレード):

修正が正式にマージされるまで、Langchainのバージョンを<= v0.1.4にダウングレードしてください。

恒久的な解決策 (修正):

Langchain](https://zilliz.com/product/integrations/langchain)-Milvus統合が更新され、insert()中に "pk "が存在しないケースを扱えるようになります。

技術的詳細:

  • Milvusは各ドキュメントに主キーフィールドを必要とする。

  • LangChainの "MilvusVectorstore "スキーマは "pk "フィールドを主キーとして使用します。

  • LangChainの text_splitter.split_documents() はデフォルトでは "pk" フィールドを追加しません。

  • デフォルトのLangChainチェーンをLangChain v0.1.5とMilvusで使用すると、Milvusの insert() メソッド呼び出し時に "pk" not found というエラーが発生します。

  • Langchain <= v0.1.4にダウングレードすると、一時的にコンフリクトが回避されます。

  • 今後Langchain v0.1.5で行われる修正により、この問題は恒久的に解決されます。

背景:

最近、MilvusはLangChain v0.1.5との統合でリグレッションを導入し、MilvusVectorstoreにデフォルト値="False "の新しいパラメータ "auto_id "を追加しました。 auto_idがFalseであるため、ユーザはinsert()メソッドを呼び出すたびに主キーの値を提供しなければならない。 しかし、text_splitter.split_documents()によって生成された文書には挿入に必要な "pk "フィールドがない。

修正PRがマージされるまで、一時的に競合を避けるためにlangchainのバージョンを<=v0.1.4にダウングレードすることで回避できます。

今後のLangchain v0.1.5での修正により、挿入するデータに "pk "フィールドが見つからない場合に自動的に "pk "フィールドが生成されるようになります。

修正されるまで、Langchain >= 0.1.5では以下のようなエラーが発生する可能性があります:

File "/Library/Python/3.9/site-packages/langchain_community/vectorstores/milvus.py", line 586, in <listcomp> insert_list = [insert_dict[x][i:end] for x in self.fields].キーエラー: 'pk'

以下のコードサンプルはLangchainがMilvusとどのように相互作用してテキストドキュメントを埋め込み、保存するかを示しています:

# テキストデータのロード
loader = TextLoader("result.txt")
ドキュメント = loader.load()

# ドキュメントをチャンクに分割
text_splitter = CharacterTextSplitter(chunk_size=1024, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

# エンベッディングを作成
embeddings = HuggingFaceEmbeddings()

# Milvusへの接続
connection_args = { {.
    'uri':zilliz_cloud_uri、
    'token':zilliz_cloud_api_key
}
vector_db = Milvus(
    embedding_function=embeddings、
    connection_args=connection_args、
    コレクション名='abc'、
).from_documents(
    docs、
    embedding=embeddings、
    コレクション名='abc'、
    connection_args=connection_args、
)

# LangChain v0.1.5のコードはこのステップに到達する前に失敗します。
# 類似検索を実行する
query = "test"
docs2 = vector_db.similarity_search(query)

追加メモ:

LangChainの Milvus.from_documents() メソッドは2つのことを行います:

1.テキストを埋め込みに変換する埋め込みメソッドを呼び出す。

2.2. Milvus collection.insert()メソッドを呼び出し、ドキュメントのpk、vector、metadataフィールドを含むデータをmilvusに挿入する。

Milvus.from_documents()`はLangchain: https://github.com/langchain-ai/langchain/blob/22d90800c86799a3a385b73ba09608c9b6565e0a/libs/core/langchain_core/vectorstores.py#L499 のVectorStoreクラスのメソッドです。

クラス VectorStore(ABC):
  def from_documents(
        cls:型[VST]、
        documents:List[Document]、
        embedding:エンベッディング、
        **kwargs:任意の、
    )

ベクトルデータベースアダプタ (Milvus を含む) はすべてこのクラスから派生し、このメソッドを実装しています。

Embeddings "は埋め込みモデルのインターフェイスを統一するための抽象クラスです: https://github.com/langchain-ai/langchain/blob/master/libs/core/langchain_core/embeddings.py

クラス Embeddings(ABC):
    """埋め込みモデルのインターフェース"""

    抽象メソッド
    def embed_documents(self, texts: List[str]) -> List[List[float]]:
        """検索ドキュメントを埋め込む"""

    抽象メソッド
    def embed_query(self, text: str) -> List[float]:
        """クエリテキストを埋め込む。"""

カスタム埋め込みモデルをラップしたい場合は、これら2つのメソッドを実装したクラスを宣言します。

MilvusのLangChain統合に関する他の記事を読む:

https://milvus.io/docs/integrate_with_langchain.md

Updated on Jul 09, 2026