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

Zilliz Cloud BYOC Now Available Across AWS, GCP, and Azure
Zilliz Cloud BYOC is now generally available on all three major clouds. Deploy fully managed vector search in your own AWS, GCP, or Azure account — your data never leaves your VPC.

Expanding Our Global Reach: Zilliz Cloud Launches in Azure Central India
Zilliz Cloud expands to Azure Central India. This new region helps customers meet compliance, reduce latency, and optimize cloud costs when building AI applications.

1 Table = 1000 Words? Foundation Models for Tabular Data
TableGPT2 automates tabular data insights, overcoming schema variability, while Milvus accelerates vector search for efficient, scalable decision-making.



