TL;DR LangChain v0.1.5でのMilvus回帰
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統合に関する他の記事を読む:
読み続けて

Zilliz Skills Breakdown: How AI Agents Master Vector Databases
Zilliz's Milvus Skill (pymilvus, 7 files) and Zilliz Cloud Skill (zilliz-cli, 14 modules) bring vector-DB dev and ops into one Claude Code session.

Why Context Engineering Is Becoming the Full Stack of AI Agents
Discover how context engineering unifies prompts, RAG, and tools to build smarter, production-ready AI agents powered by Milvus.

AI Agents Are Quietly Transforming E-Commerce — Here’s How
Discover how AI agents transform e-commerce with autonomous decision-making, enhanced product discovery, and vector search capabilities for today's retailers.
