TL;DR Regressão do Milvus no LangChain v0.1.5
PR enviado para corrigir a integração do Milvus com LangChain 0.1.5: https://github.com/langchain-ai/langchain/pull/17021
O Problema
Você está encontrando um erro "KeyError: 'pk'" ao usar o Langchain v0.1.5 para se conectar ao Milvus. Esse erro ocorre devido a uma regressão recente do Milvus que não gera automaticamente valores para o campo "pk" (chave primária). O Milvus exige um campo de chave primária para cada documento, mas o seu divisor de texto do LangChain não o inclui, portanto o método insert() do Milvus gerará o erro "KeyError: 'pk'" está ausente.
Solução Temporária (Downgrade):
Faça downgrade para a versão do Langchain <= v0.1.4 até que a correção seja oficialmente mesclada.
Solução Permanente (Correção):
Aguarde a correção oficial, que atualizará a integração Langchain-Milvus para lidar com casos em que "pk" não esteja presente durante insert().
Detalhes Técnicos:
O Milvus exige um campo de chave primária para cada documento.
O esquema "MilvusVectorstore" do LangChain usa o campo "pk" como chave primária.
O
text_splitter.split_documents()do LangChain não adiciona um campo "pk" por padrão.Usar as chains padrão do LangChain com LangChain v0.1.5 e Milvus gerará um erro "pk" não encontrado durante sua chamada ao método
insert()do Milvus.Fazer downgrade do Langchain <= v0.1.4 evita temporariamente o conflito.
Uma correção futura no Langchain v0.1.5 resolverá esse problema permanentemente.
Contexto:
Recentemente, o Milvus introduziu uma regressão em sua integração com o LangChain v0.1.5, que adicionou um novo parâmetro "auto_id" para o MilvusVectorstore com valor padrão = "False". Como auto_id é False, o usuário deve fornecer um valor de chave primária para cada chamada ao método insert(). No LangChain, o esquema padrão define "pk" como a chave primária; no entanto, documentos gerados por text_splitter.split_documents() não têm o campo "pk" necessário para inserção.
Até que o PR de correção seja mesclado, você pode contornar o problema fazendo downgrade da versão do langchain para <=v0.1.4, para evitar temporariamente o conflito.
Uma correção futura no Langchain v0.1.5 resolverá esse problema permanentemente, para garantir que o campo "pk" seja gerado automaticamente caso não seja encontrado nos dados a serem inseridos.
Até a correção, com Langchain >= 0.1.5 você poderá ver erros 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'
O exemplo de código abaixo demonstra como o Langchain interage com o Milvus para criar embeddings e salvar 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)
Observações Adicionais:
O método Milvus.from_documents() do LangChain faz duas coisas:
Chama um método de embedding para converter texto em embedding.
Chama o método Milvus collection.insert() para inserir dados no milvus, incluindo os campos pk, vetor e metadados do documento.
Milvus.from_documents() é um método da classe VectorStore do 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 os adaptadores de bancos de dados vetoriais (incluindo Milvus) são derivados desta classe e implementam este método.
O "Embeddings" é uma classe abstrata para unificar as interfaces dos modelos de 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."""
Se você quiser encapsular um modelo de embedding personalizado, pode declarar uma classe que implemente esses dois métodos.
Leia mais artigos sobre a integração do Milvus com o LangChain:
Continue lendo

A Few Notes from Databricks Data + AI Summit 2026: Why the Data Layer Matters Again
James Luan shares notes from Databricks Data + AI Summit 2026 on why production AI is pushing the data layer back to the center of infrastructure.

Optimizing Embedding Model Selection with TDA Clustering: A Strategic Guide for Vector Databases
Discover how Topological Data Analysis (TDA) reveals hidden embedding model weaknesses and helps optimize vector database performance.

Why Deepseek is Waking up AI Giants Like OpenAI And Why You Should Care
Discover how DeepSeek R1's open-source AI model with superior reasoning capabilities and lower costs is disrupting the AI landscape and challenging tech giants like OpenAI.



