TL;DR Regresión de Milvus en LangChain v0.1.5
PR enviada para corregir la integración de Milvus con LangChain 0.1.5: https://github.com/langchain-ai/langchain/pull/17021
El problema
Estás encontrando un error "KeyError: 'pk'" al usar Langchain v0.1.5 para conectarte a Milvus. Este error se debe a una regresión reciente de Milvus que no genera automáticamente los valores del campo "pk" (clave primaria). Milvus requiere un campo de clave primaria para cada documento, pero tu divisor de texto de LangChain no lo incluye, por lo que el método insert() de Milvus generará "KeyError: 'pk'" si falta.
Solución temporal (degradar versión):
Degrada a la versión de Langchain <= v0.1.4 hasta que la corrección se fusione oficialmente.
Solución permanente (corrección):
Espera la corrección oficial, que actualizará la integración Langchain-Milvus para manejar casos en los que "pk" no esté presente durante insert().
Detalles técnicos:
Milvus requiere un campo de clave primaria para cada documento.
El esquema "MilvusVectorstore" de LangChain usa el campo "pk" como clave primaria.
text_splitter.split_documents()de LangChain no agrega un campo "pk" de forma predeterminada.Usar las cadenas predeterminadas de LangChain con LangChain v0.1.5 y Milvus generará un error "pk" no encontrado durante su llamada al método
insert()de Milvus.Degradar Langchain <= v0.1.4 evita temporalmente el conflicto.
Una próxima corrección en Langchain v0.1.5 abordará este problema de forma permanente.
Antecedentes:
Recientemente, Milvus introdujo una regresión en su integración con LangChain v0.1.5, que agregó un nuevo parámetro "auto_id" para MilvusVectorstore con valor predeterminado = "False". Dado que auto_id es False, el usuario debe proporcionar un valor de clave primaria para cada llamada al método insert(). En LangChain, el esquema predeterminado define "pk" como la clave primaria; sin embargo, los documentos generados por text_splitter.split_documents() carecen del campo "pk" necesario para la inserción.
Hasta que la PR de corrección se fusione, puedes solucionarlo degradando la versión de langchain a <=v0.1.4, para evitar temporalmente el conflicto.
Una próxima corrección en Langchain v0.1.5 abordará este problema de forma permanente, para garantizar que el campo "pk" se genere automáticamente en caso de que no se encuentre en los datos que se van a insertar.
Hasta la corrección, con Langchain >= 0.1.5 puedes ver errores como:
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'
El ejemplo de código a continuación demuestra cómo Langchain interactúa con Milvus para incrustar y guardar documentos de texto:
# 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)
Notas adicionales:
El método Milvus.from_documents() de LangChain hace dos cosas:
Llama a un método de incrustación para convertir texto en incrustación.
Llama al método collection.insert() de Milvus para insertar datos en milvus, incluidos los campos pk, vector y metadata del documento.
Milvus.from_documents() es un método de la clase 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,
)
Todos los adaptadores de bases de datos vectoriales (incluido Milvus) derivan de esta clase e implementan este método.
"Embeddings" es una clase abstracta para unificar las interfaces de los modelos de embeddings: 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 quieres envolver un modelo de embeddings personalizado, puedes declarar una clase que implemente esos dos métodos.
Lee más artículos sobre la integración de Milvus con LangChain:
Sigue leyendo

Zilliz Cloud BYOC Now Available Across AWS, GCP, and Azure
Zilliz Cloud BYOC is now generally available on all three major clouds. Deploy fully managed vector search in your own AWS, GCP, or Azure account — your data never leaves your VPC.

How Zilliz Saw the Future of Vector Databases—and Built for Production
An inside look at how Zilliz built vector databases for real-world use, focusing on scalability, stability, and running them reliably at scale.

What is the K-Nearest Neighbors (KNN) Algorithm in Machine Learning?
KNN is a supervised machine learning technique and algorithm for classification and regression. This post is the ultimate guide to KNN.



