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統合に関する他の記事を読む:
読み続けて

What Is a Vector Lakebase?
A Vector Lakebase is a unified, lake-native data architecture for AI that combines vector-database-grade serving with open lake storage, reusable lake-level indexes, and a shared semantic layer.

Why and How to Migrate from Self-Hosted Milvus to Zilliz Cloud
A simple, step-by-step guide to migrating from Milvus to Zilliz Cloud. Learn both endpoint and backup methods for a smooth, scalable vector database migration.

How to Build an Enterprise-Ready RAG Pipeline on AWS with Bedrock, Zilliz Cloud, and LangChain
Build production-ready enterprise RAG with AWS Bedrock, Nova models, Zilliz Cloud, and LangChain. Complete tutorial with deployable code.



