TL;DR Regressão do Milvus no LangChain v0.1.5

Feb 13, 20243 min read

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:

  1. Chama um método de embedding para converter texto em embedding.

  2. 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:

https://milvus.io/docs/integrate_with_langchain.md

Atualizado em Jul 09, 2026