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

Build Multimodal Search for 3D Assets with Tripo and Zilliz Cloud
Generate 3D assets with Tripo, then search them by text, image, and metadata with multimodal embeddings and Zilliz Cloud.

A Developer's Guide to Exploring Milvus 2.6 Features on Zilliz Cloud
Milvus 2.6 marks a shift from “vector search + glue code” to a more advanced retrieval engine, and it is now Generally Available (GA) on Zilliz Cloud (a managed Milvus service).

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.



