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

Expanding Our Global Reach: Zilliz Cloud Launches in Azure Central India
Zilliz Cloud expands to Azure Central India. This new region helps customers meet compliance, reduce latency, and optimize cloud costs when building AI applications.

Introducing DeepSearcher: A Local Open Source Deep Research
In contrast to OpenAI’s Deep Research, this example ran locally, using only open-source models and tools like Milvus and LangChain.

DeepRAG: Thinking to Retrieval Step by Step for Large Language Models
Discover DeepRAG, an advanced retrieval-augmented generation (RAG) model that improves LLM accuracy by retrieving only essential data through step-by-step reasoning.



