TL;DR Regressione di Milvus in LangChain v0.1.5
PR inviato per correggere l’integrazione di Milvus con LangChain 0.1.5: https://github.com/langchain-ai/langchain/pull/17021
Il problema
Stai riscontrando un errore "KeyError: 'pk'" quando usi Langchain v0.1.5 per connetterti a Milvus. Questo errore è dovuto a una recente regressione di Milvus che non genera automaticamente i valori del campo "pk" (chiave primaria). Milvus richiede un campo chiave primaria per ogni documento, ma il tuo text splitter di LangChain non lo include, quindi il metodo insert() di Milvus genererà "KeyError: 'pk'" perché è mancante.
Soluzione temporanea (downgrade):
Effettua il downgrade alla versione di Langchain <= v0.1.4 finché la correzione non sarà ufficialmente integrata.
Soluzione permanente (correzione):
Attendi la correzione ufficiale, che aggiornerà l’integrazione Langchain-Milvus per gestire i casi in cui "pk" non è presente durante insert().
Dettagli tecnici:
Milvus richiede un campo chiave primaria per ogni documento.
Lo schema "MilvusVectorstore" di LangChain usa il campo "pk" come chiave primaria.
text_splitter.split_documents()di LangChain non aggiunge un campo "pk" per impostazione predefinita.L’uso delle chain predefinite di LangChain con LangChain v0.1.5 e Milvus genererà un errore "pk" non trovato durante la chiamata al metodo
insert()di Milvus.Effettuare il downgrade a Langchain <= v0.1.4 evita temporaneamente il conflitto.
Una correzione imminente in Langchain v0.1.5 risolverà questo problema in modo permanente.
Contesto:
Di recente, Milvus ha introdotto una regressione nella sua integrazione con LangChain v0.1.5, che ha aggiunto un nuovo parametro "auto_id" per MilvusVectorstore con valore predefinito = "False". Poiché auto_id è False, l’utente deve fornire un valore di chiave primaria per ogni chiamata al metodo insert(). In LangChain, lo schema predefinito definisce "pk" come chiave primaria; tuttavia, i documenti generati da text_splitter.split_documents() non dispongono del campo "pk" necessario per l’inserimento.
Finché la PR di correzione non verrà integrata, puoi aggirare il problema effettuando il downgrade della versione di langchain a <=v0.1.4, per evitare temporaneamente il conflitto.
Una correzione imminente in Langchain v0.1.5 risolverà questo problema in modo permanente, per garantire che il campo "pk" venga generato automaticamente nel caso in cui non venga trovato nei dati da inserire.
Fino alla correzione, con Langchain >= 0.1.5 potresti vedere errori come:
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'
L’esempio di codice seguente mostra come Langchain interagisce con Milvus per l’embedding e il salvataggio di documenti di testo:
# 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)
Note aggiuntive:
Il metodo Milvus.from_documents() di LangChain fa due cose:
Chiama un metodo di embedding per convertire il testo in embedding.
Chiama il metodo collection.insert() di Milvus per inserire i dati in milvus, inclusi i campi pk, vector e metadata del documento.
Milvus.from_documents() è un metodo della classe VectorStore di 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,
)
Tutti gli adapter per database vettoriali (incluso Milvus) derivano da questa classe e implementano questo metodo.
"Embeddings" è una classe astratta per unificare le interfacce dei modelli di 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 vuoi incapsulare un modello di embedding personalizzato, puoi dichiarare una classe che implementi questi due metodi.
Leggi altri articoli sull’integrazione di Milvus con LangChain:
Continua a leggere

Zilliz Cloud On-Demand Compute: Pay Only for What You Use
The customer case behind Zilliz Cloud On-Demand: how a $10K vector search bill came down to under $500, and the engineering changes that made it possible.

Zilliz Cloud Now Available in AWS Europe (Ireland)
Zilliz Cloud launches in AWS eu-west-1 (Ireland) — bringing low-latency vector search, EU data residency, and full GDPR-ready infrastructure to European AI teams. Now live across 30 regions on five cloud providers.

Zilliz Cloud Delivers Better Performance and Lower Costs with Arm Neoverse-based AWS Graviton
Zilliz Cloud adopts Arm-based AWS Graviton3 CPUs to cut costs, speed up AI vector search, and power billion-scale RAG and semantic search workloads.



