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 Just Landed in Claude Code
The Zilliz Cloud Plugin brings the full power of Zilliz Cloud directly into your Claude Code terminal as natural-language conversations.

3 Easiest Ways to Use Claude Code on Your Mobile Phone
Run Claude Code from your phone with Remote Control, Happy Coder, or SSH + Tailscale. Comparison table, setup steps, and tools for typing, memory, and parallel tasks.

How to Improve Retrieval Quality for Japanese Text with Sudachi, Milvus/Zilliz, and AWS Bedrock
Learn how Sudachi normalization and Milvus/Zilliz hybrid search improve Japanese RAG accuracy with BM25 + vector fusion, AWS Bedrock embeddings, and practical code examples.



