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:
Читать далее

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.

3 Easiest Ways to Use Claude Code on Your Mobile Phone
Run Claude Code from your phone with Remote Control, Happy Coder, or SSH + Tailscale. Comparison table, setup steps, and tools for typing, memory, and parallel tasks.

Proactive Monitoring for Vector Database: Zilliz Cloud Integrates with Datadog
we're excited to announce Zilliz Cloud's integration with Datadog, enabling comprehensive monitoring and observability for your vectorDB deployments.



