TL;DR Régression de Milvus dans LangChain v0.1.5
PR soumise pour corriger l’intégration de Milvus avec LangChain 0.1.5 : https://github.com/langchain-ai/langchain/pull/17021
Le problème
Vous rencontrez une erreur "KeyError: 'pk'" lors de l’utilisation de Langchain v0.1.5 pour vous connecter à Milvus. Cette erreur est due à une régression récente de Milvus qui ne génère pas automatiquement les valeurs du champ "pk" (clé primaire). Milvus nécessite un champ de clé primaire pour chaque document, mais votre séparateur de texte LangChain ne l’inclut pas, donc la méthode insert() de Milvus lèvera l’erreur "KeyError: 'pk'" indiquant qu’il est manquant.
Solution temporaire (rétrogradation) :
Rétrogradez vers la version de Langchain <= v0.1.4 jusqu’à ce que le correctif soit officiellement fusionné.
Solution permanente (correctif) :
Attendez le correctif officiel, qui mettra à jour l’intégration Langchain-Milvus afin de gérer les cas où "pk" n’est pas présent lors de insert().
Détails techniques :
Milvus nécessite un champ de clé primaire pour chaque document.
Le schéma "MilvusVectorstore" de LangChain utilise le champ "pk" comme clé primaire.
text_splitter.split_documents()de LangChain n’ajoute pas de champ "pk" par défaut.L’utilisation des chaînes LangChain par défaut avec LangChain v0.1.5 et Milvus lèvera une erreur indiquant que "pk" est introuvable lors de son appel à la méthode
insert()de Milvus.La rétrogradation de Langchain <= v0.1.4 évite temporairement le conflit.
Un correctif à venir dans Langchain v0.1.5 résoudra ce problème de manière permanente.
Contexte :
Récemment, Milvus a introduit une régression dans son intégration avec LangChain v0.1.5, qui a ajouté un nouveau paramètre "auto_id" pour le MilvusVectorstore avec une valeur par défaut = "False". Comme auto_id est False, l’utilisateur doit fournir une valeur de clé primaire pour chaque appel à la méthode insert(). Dans LangChain, le schéma par défaut définit "pk" comme clé primaire ; cependant, les documents générés par text_splitter.split_documents() ne disposent pas du champ "pk" nécessaire à l’insertion.
Jusqu’à ce que la PR de correctif soit fusionnée, vous pouvez contourner le problème en rétrogradant la version de langchain à <=v0.1.4, afin d’éviter temporairement le conflit.
Un correctif à venir dans Langchain v0.1.5 résoudra ce problème de manière permanente, afin de garantir que le champ "pk" soit généré automatiquement s’il n’est pas trouvé dans les données à insérer.
Jusqu’au correctif, avec Langchain >= 0.1.5, vous pouvez voir des erreurs telles que :
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'
L’exemple de code ci-dessous montre comment Langchain interagit avec Milvus pour intégrer et enregistrer des documents texte :
# 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)
Notes supplémentaires :
La méthode Milvus.from_documents() de LangChain fait deux choses :
Appelle une méthode d’intégration pour convertir le texte en embedding.
Appelle la méthode collection.insert() de Milvus pour insérer les données dans milvus, y compris les champs pk, vector et metadata du document.
Milvus.from_documents() est une méthode de la classe VectorStore de 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,
)
Tous les adaptateurs de bases de données vectorielles (y compris Milvus) sont dérivés de cette classe et implémentent cette méthode.
"Embeddings" est une classe abstraite permettant d’unifier les interfaces des modèles d’embedding : 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."""
Si vous souhaitez encapsuler un modèle d’embedding personnalisé, vous pouvez déclarer une classe qui implémente ces deux méthodes.
Lire davantage d’articles sur l’intégration de Milvus avec LangChain :
Continuer à lire

The Real Bottlenecks in Autonomous Driving — And How AI Infrastructure Can Solve Them
Autonomous driving faces a data bottleneck. Learn how AI-native vector databases like Zilliz solve scale, cost, and insight challenges across AV pipelines.

Announcing VDBBench 1.0: Open-Source VectorDB Benchmarking with Your Real-World Production Workloads
Discover VDBBench 1.0, an open-source tool for benchmarking vector databases with real-world production data, streaming ingestion, and concurrent workloads.

What Exactly Are AI Agents? Why OpenAI and LangChain Are Fighting Over Their Definition?
AI agents are software programs powered by AI that can perceive their environment, make decisions, and take actions to achieve a goal—often autonomously.



