TL;DR Milvus-Regression in LangChain v0.1.5
PR eingereicht, um die Milvus-Integration mit LangChain 0.1.5 zu beheben: https://github.com/langchain-ai/langchain/pull/17021
Das Problem
Sie stoßen auf einen Fehler "KeyError: 'pk'", wenn Sie Langchain v0.1.5 verwenden, um eine Verbindung zu Milvus herzustellen. Dieser Fehler ist auf eine kürzliche Milvus-Regression zurückzuführen, bei der "pk"-Feldwerte (Primärschlüssel) nicht automatisch generiert werden. Milvus benötigt für jedes Dokument ein Primärschlüsselfeld, aber Ihr LangChain-Text-Splitter enthält es nicht, daher löst die Milvus-Methode insert() die Fehlermeldung "KeyError: 'pk'" aus, weil es fehlt.
Temporäre Lösung (Downgrade):
Führen Sie ein Downgrade auf Langchain-Version <= v0.1.4 durch, bis der Fix offiziell gemergt ist.
Dauerhafte Lösung (Fix):
Warten Sie auf den offiziellen Fix, der die Langchain-Milvus-Integration aktualisieren wird, um Fälle zu behandeln, in denen "pk" während insert() nicht vorhanden ist.
Technische Details:
Milvus benötigt für jedes Dokument ein Primärschlüsselfeld.
Das Schema "MilvusVectorstore" von LangChain verwendet das Feld "pk" als Primärschlüssel.
LangChain’s
text_splitter.split_documents()fügt standardmäßig kein "pk"-Feld hinzu.Die Verwendung der standardmäßigen LangChain-Chains mit LangChain v0.1.5 und Milvus führt zu einem Fehler "pk" nicht gefunden während des Aufrufs der Milvus-Methode
insert().Ein Downgrade auf Langchain <= v0.1.4 vermeidet den Konflikt vorübergehend.
Ein bevorstehender Fix in Langchain v0.1.5 wird dieses Problem dauerhaft beheben.
Hintergrund:
Kürzlich führte Milvus eine Regression in seiner Integration mit LangChain v0.1.5 ein, die einen neuen Parameter "auto_id" für den MilvusVectorstore mit dem Standardwert = "False" hinzufügte. Da auto_id False ist, muss der Benutzer bei jedem Aufruf der Methode insert() einen Primärschlüsselwert bereitstellen. In LangChain definiert das Standardschema "pk" als Primärschlüssel; jedoch fehlt den von text_splitter.split_documents() generierten Dokumenten das für das Einfügen erforderliche "pk"-Feld.
Bis der Fix-PR gemergt wird, können Sie als Workaround die Langchain-Version auf <=v0.1.4 downgraden, um den Konflikt vorübergehend zu vermeiden.
Ein bevorstehender Fix in Langchain v0.1.5 wird dieses Problem dauerhaft beheben, um sicherzustellen, dass das "pk"-Feld automatisch generiert wird, falls es in den einzufügenden Daten nicht gefunden wird.
Bis zum Fix können bei Langchain >= 0.1.5 Fehler wie die folgenden auftreten:
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] KeyError: 'pk'
Das folgende Codebeispiel zeigt, wie Langchain mit Milvus für das Einbetten und Speichern von Textdokumenten interagiert:
# Load text data
loader = TextLoader("result.txt")
documents = loader.load()
# Split documents into chunks
text_splitter = CharacterTextSplitter(chunk_size=1024, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
# Create embeddings
embeddings = HuggingFaceEmbeddings()
# Connect to Milvus
connection_args = {
'uri': ZILLIZ_CLOUD_URI,
'token': ZILLIZ_CLOUD_API_KEY
}
vector_db = Milvus(
embedding_function=embeddings,
connection_args=connection_args,
collection_name='abc',
).from_documents(
docs,
embedding=embeddings,
collection_name='abc',
connection_args=connection_args,
)
# LangChain v0.1.5 code will fail before reaching this step.
# Perform a similarity search
query = "test"
docs2 = vector_db.similarity_search(query)
Zusätzliche Hinweise:
Die Methode Milvus.from_documents() von LangChain führt zwei Dinge aus:
Ruft eine Embedding-Methode auf, um Text in ein Embedding umzuwandeln.
Ruft die Milvus-Methode collection.insert() auf, um Daten in Milvus einzufügen, einschließlich der Felder pk, Vektor und Metadaten des Dokuments.
Milvus.from_documents() ist eine Methode der VectorStore-Klasse von Langchain: https://github.com/langchain-ai/langchain/blob/22d90800c86799a3a385b73ba09608c9b6565e0a/libs/core/langchain_core/vectorstores.py#L499
class VectorStore(ABC):
def from_documents(
cls: Type[VST],
documents: List[Document],
embedding: Embeddings,
**kwargs: Any,
)
Alle Vektordatenbank-Adapter (einschließlich Milvus) sind von dieser Klasse abgeleitet und implementieren diese Methode.
Die „Embeddings“ sind eine abstrakte Klasse zur Vereinheitlichung der Schnittstellen von Embedding-Modellen: https://github.com/langchain-ai/langchain/blob/master/libs/core/langchain_core/embeddings.py
class Embeddings(ABC):
"""Interface for embedding models."""
@abstractmethod
def embed_documents(self, texts: List[str]) -> List[List[float]]:
"""Embed search docs."""
@abstractmethod
def embed_query(self, text: str) -> List[float]:
"""Embed query text."""
Wenn Sie ein benutzerdefiniertes Embedding-Modell wrappen möchten, können Sie eine Klasse deklarieren, die diese beiden Methoden implementiert.
Lesen Sie weitere Artikel zur Milvus-LangChain-Integration:
Weiterlesen

How Zilliz Ended Up at the Center of NVIDIA’s Unstructured Data Story at GTC 2026
If unstructured data is the context of AI, then the ceiling of AI applications will be set not just by models, but by how mature the infrastructure for unstructured data becomes.

Zilliz Cloud Enterprise Vector Search Powers High-Performance AI on AWS
Zilliz Cloud on AWS powers secure, scalable, ultra-fast vector search for enterprise AI apps, with BYOC, sub-10ms latency, and zero-DevOps simplicity.

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.



