TL;DR Milvus-Regression in LangChain v0.1.5

Feb 13, 20243 min read

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:

  1. Ruft eine Embedding-Methode auf, um Text in ein Embedding umzuwandeln.

  2. 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:

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

Aktualisiert am Jul 09, 2026