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

Announcing the General Availability of Single Sign-On (SSO) on Zilliz Cloud
SSO is GA on Zilliz Cloud, delivering the enterprise-grade identity management capabilities your teams need to deploy vectorDB with confidence.

Why Not All VectorDBs Are Agent-Ready
Explore why choosing the right vector database is critical for scaling AI agents, and why traditional solutions fall short in production.

Build for the Boom: Why AI Agent Startups Should Build Scalable Infrastructure Early
Explore strategies for developing AI agents that can handle rapid growth. Don't let inadequate systems undermine your success during critical breakthrough moments.



