TL;DR Регрессия Milvus в LangChain v0.1.5
PR отправлен для исправления интеграции Milvus с LangChain 0.1.5: https://github.com/langchain-ai/langchain/pull/17021
Проблема
Вы сталкиваетесь с ошибкой "KeyError: 'pk'" при использовании Langchain v0.1.5 для подключения к Milvus. Эта ошибка связана с недавней регрессией Milvus, из-за которой значения поля "pk" (первичный ключ) не генерируются автоматически. Milvus требует поле первичного ключа для каждого документа, но ваш текстовый сплиттер LangChain его не включает, поэтому метод Milvus insert() выдаст ошибку "KeyError: 'pk'" отсутствует.
Временное решение (понижение версии):
Понизьте версию Langchain до <= v0.1.4, пока исправление не будет официально объединено.
Постоянное решение (исправление):
Дождитесь официального исправления, которое обновит интеграцию Langchain-Milvus, чтобы она обрабатывала случаи, когда "pk" отсутствует во время insert().
Технические детали:
Milvus требует поле первичного ключа для каждого документа.
Схема LangChain "MilvusVectorstore" использует поле "pk" в качестве первичного ключа.
LangChain’s
text_splitter.split_documents()по умолчанию не добавляет поле "pk".Использование стандартных цепочек LangChain с LangChain v0.1.5 и Milvus приведет к ошибке "pk" не найден во время вызова метода Milvus
insert().Понижение версии Langchain до <= v0.1.4 временно позволяет избежать конфликта.
Предстоящее исправление в Langchain v0.1.5 устранит эту проблему окончательно.
Предыстория:
Недавно Milvus внес регрессию в свою интеграцию с LangChain v0.1.5, добавив новый параметр "auto_id" для MilvusVectorstore со значением по умолчанию = "False". Поскольку auto_id равно False, пользователь должен предоставлять значение первичного ключа при каждом вызове метода insert(). В LangChain стандартная схема определяет "pk" как первичный ключ; однако документы, сгенерированные text_splitter.split_documents(), не содержат необходимого поля "pk" для вставки.
Пока PR с исправлением не будет объединен, вы можете обойти проблему, понизив версию langchain до <=v0.1.4, чтобы временно избежать конфликта.
Предстоящее исправление в Langchain v0.1.5 устранит эту проблему окончательно, гарантируя, что поле "pk" будет генерироваться автоматически, если оно не найдено в данных, которые нужно вставить.
До выхода исправления с Langchain >= 0.1.5 вы можете видеть ошибки, такие как:
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'
Пример кода ниже демонстрирует, как Langchain взаимодействует с Milvus для создания эмбеддингов и сохранения текстовых документов:
# 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)
Дополнительные примечания:
Метод LangChain’s Milvus.from_documents() выполняет две задачи:
Вызывает метод эмбеддинга для преобразования текста в эмбеддинг.
Вызывает метод Milvus collection.insert() для вставки данных в milvus, включая поля pk, vector и metadata документа.
Milvus.from_documents() — это метод класса VectorStore из 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,
)
Все адаптеры векторных баз данных (включая Milvus) наследуются от этого класса и реализуют этот метод.
"Embeddings" — это абстрактный класс для унификации интерфейсов 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."""
Если вы хотите обернуть пользовательскую embedding-модель, вы можете объявить класс, который реализует эти два метода.
Читайте больше статей об интеграции Milvus с LangChain:
Читать далее

The AWS Outage Was a Wake-Up Call for Vector Database Cross-Region Disaster Recovery
Zilliz Cloud Had the Answer Before the Crisis. Zilliz Cloud is the world's first vector database with native cross-region disaster recovery.

My Wife Wanted Dior. I Spent $600 on Claude Code to Vibe-Code a 2M-Line Database Instead.
Write tests, not code reviews. How a test-first workflow with 6 parallel Claude Code sessions turns a 2M-line C++ codebase into a daily shipping pipeline.

Vector Databases vs. Graph Databases
Use a vector database for AI-powered similarity search; use a graph database for complex relationship-based queries and network analysis.



