Интеграция функции встраивания текста Milvus с LangChain

Open In Colab GitHub Repository

Это руководство демонстрирует, как использовать функцию встраивания текста Milvus 2.6 (также известную как Data In Data Out) с LangChain. Эта функция позволяет серверу Milvus автоматически преобразовывать необработанный текст в векторные вкрапления, упрощая код на стороне клиента и централизуя управление ключами API.

Milvus - самая передовая в мире база векторных данных с открытым исходным кодом, созданная специально для поддержки поиска сходства встраивания и приложений искусственного интеллекта. LangChain - это фреймворк для разработки приложений на основе больших языковых моделей (LLM). Интегрировав функцию встраивания текста Milvus, вы сможете добиться более простого и эффективного решения для векторного поиска в своих приложениях LangChain.

Предварительные условия

Перед выполнением этого руководства убедитесь, что у вас установлены следующие зависимости:

! pip install --upgrade langchain-milvus langchain-core langchain-openai

Если вы используете Google Colab, для включения только что установленных зависимостей вам может потребоваться перезапустить среду выполнения (нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

Настройка сервера Milvus

Важно: Функция встраивания текста (Data In Data Out) доступна только в Milvus Server. Milvus Lite не поддерживает эту функцию. Вам необходимо использовать сервер Milvus, развернутый с помощью Docker/Kubernetes.

Перед использованием функции встраивания текста необходимо настроить учетные данные для поставщиков услуг встраивания на сервере Milvus.

Объявите свои ключи в разделе credential:

Вы можете перечислить один или несколько ключей API - дайте каждому из них ярлык, который вы придумаете и на который будете ссылаться позже.

# milvus.yaml

credential:
  apikey_dev:
    apikey: <YOUR_OPENAI_API_KEY>

Укажите Milvus, какой ключ использовать для вызовов OpenAI

В том же файле укажите провайдеру OpenAI на метку, которую вы хотите использовать.

function:
  textEmbedding:
    providers:
      openai:
        credential: apikey_dev
        # url: https://api.openai.com/v1/embeddings   # (optional) custom url

Дополнительные способы настройки см. в документации Milvus Embedding Function.

Запуск службы Milvus

Убедитесь, что сервер Milvus запущен и функция встраивания включена. Вы можете развернуть сервер Milvus с помощью Docker или Kubernetes. Примечание: Milvus Lite не поддерживает функцию встраивания текста.

Понимание функции встраивания: Клиентская сторона и серверная сторона

Прежде чем перейти к использованию, давайте сначала разберемся в различиях между двумя подходами к встраиванию.

Встраивание с помощью класса LangChain Embeddings (на стороне клиента)

В традиционном подходе LangChain генерация встраивания происходит на стороне клиента с помощью классаEmbeddings . Ваше приложение должно использовать метод embed_query этого класса для вызова API встраивания, а затем сохранить сгенерированные векторы в Milvus.

from langchain_openai import OpenAIEmbeddings
from langchain_milvus import Milvus

# Generate embedding on client side
embeddings = OpenAIEmbeddings()
vector = embeddings.embed_query("Hello, world!")
# [0.123, -0.456, ...] A vector of floats

vector_store = Milvus(
    embedding_function=embeddings,
    connection_args={"uri": "http://localhost:19530"},
    collection_name="traditional_approach_collection",
)

Диаграмма последовательности:

Характеристики:

  • Клиент напрямую вызывает API для встраивания
  • Необходимость управления ключами API на стороне клиента
  • Поток данных: Текст → Клиент → API встраивания → Вектор → Milvus

Функция встраивания текста Milvus (данные на стороне сервера, входящие данные, исходящие данные)

Функция встраивания текста Milvus 2.6 (Data In Data Out) позволяет серверу Milvus автоматически преобразовывать необработанный текст в векторные вкрапления. Клиенту нужно только предоставить текст, а Milvus автоматически справится с генерацией вкраплений.

Диаграмма последовательности:

Характеристики:

  • Сервер Milvus вызывает API для встраивания
  • Ключи API централизованно управляются на стороне сервера
  • Поток данных: Текст → Milvus → Embedding API → Вектор (хранится в Milvus)

Сравнение двух методов

ХарактеристикаLangChain Embedding (на стороне клиента)Функция встраивания текста Milvus (на стороне сервера)
Место обработкиКлиентское приложениеСервер Milvus
Вызовы APIКлиент напрямую вызывает API для встраиванияСервер Milvus вызывает API для встраивания
Управление ключами APIНеобходимость управления на стороне клиентаЦентрализованное управление на стороне сервера, более безопасно
Сложность кодаНеобходимость управления API-ключами и вызовами на стороне клиентаНастраивать нужно только один раз в конфигурации Milvus
Примеры использования- Необходим контроль над процессом встраивания на стороне клиента
- Необходимость кэширования результатов встраивания на стороне клиента
- Необходимость поддержки переключения нескольких моделей встраивания
- Упростить код на стороне клиента
- Централизованное управление ключами API на стороне сервера
- Необходимость пакетной обработки больших объемов документов
- Сократить количество взаимодействий с внешними API на стороне клиента
- Необходимость совмещения со встроенными функциями Milvus, такими как BM25
Требования к версии MilvusВсе версии (включая Milvus Lite)Milvus Lite не поддерживается

В этом руководстве рассказывается о методе Milvus Text Embedding Function (Data In Data Out) на стороне сервера, который является новой функцией, представленной в Milvus 2.6 и позволяющей значительно упростить код на стороне клиента и повысить безопасность.

Использование функции встраивания текста

Пример 1: Встраивание только на стороне сервера

Это самый простой вариант использования, в котором генерация вкраплений полностью возлагается на сервер Milvus. Клиенту не нужна никакая функция встраивания.

from langchain_milvus import Milvus
from langchain_milvus.function import TextEmbeddingBuiltInFunction
from langchain_core.documents import Document

# Create Text Embedding Function
text_embedding_func = TextEmbeddingBuiltInFunction(
    input_field_names="text",  # Input field name (field containing text)
    output_field_names="vector",  # Output field name (field storing vectors)
    dim=1536,  # Vector dimension (must specify)
    params={
        "provider": "openai",  # Service provider
        "model_name": "text-embedding-3-small",  # Model name
        "credential": "apikey_dev",    # Optional: use credential label configured in milvus.yaml
    },
)

# Create Milvus vector store
# Note: embedding_function=None, because embedding is done on server side
vector_store = Milvus(
    embedding_function=None,  # Do not use client-side embedding
    builtin_function=text_embedding_func,
    connection_args={"uri": "http://localhost:19530"},
    collection_name="my_collection",
    # consistency_level="Strong",    # Strong consistency level, default is "Session"
    auto_id=True,
    # drop_old=True,  # If you want to drop old collection and create a new one
)

Для connection_args:

  • Должен использоваться сервер Milvus: Функция встраивания текста доступна только в Milvus Server, Milvus Lite не поддерживается.
  • Используйте uri сервера, например http://localhost:19530 (локальное развертывание Docker) или http://your-server:19530 (удаленный сервер).
  • Если используется Zilliz Cloud, используйте Public Endpoint как uri и установите параметр token.

При добавлении документов вам нужно предоставить только текст, не нужно предварительно вычислять векторы. Milvus автоматически вызовет API OpenAI для генерации вкраплений.

# Add documents (only need to provide text, no need to pre-compute vectors)
documents = [
    Document(page_content="Milvus simplifies semantic search through embeddings."),
    Document(
        page_content="Vector embeddings convert text into searchable numeric data."
    ),
    Document(
        page_content="Semantic search helps users find relevant information quickly."
    ),
]

vector_store.add_documents(documents)
[462726375729313252, 462726375729313253, 462726375729313254]

При поиске используйте непосредственно текстовые запросы, и Milvus автоматически преобразует текст запроса в векторы для поиска.

# Search (directly use text query)
results = vector_store.similarity_search(
    query="How does Milvus handle semantic search?", k=2
)

for doc in results:
    print(f"Content: {doc.page_content}")
    print(f"Metadata: {doc.metadata}\n")
WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
I0000 00:00:1765186679.227345 12227536 fork_posix.cc:71] Other threads are currently calling into gRPC, skipping fork() handlers


Content: Milvus simplifies semantic search through embeddings.
Metadata: {'pk': 462726375729313252}

Content: Semantic search helps users find relevant information quickly.
Metadata: {'pk': 462726375729313254}

Сочетание семантического поиска (Text Embedding) и поиска по ключевым словам (BM25) обеспечивает более мощные возможности гибридного поиска. Семантический поиск отлично справляется с пониманием намерения запроса, а поиск по ключевым словам - с точным подбором.

from langchain_milvus import Milvus
from langchain_milvus.function import TextEmbeddingBuiltInFunction, BM25BuiltInFunction

# Text Embedding Function (semantic search)
text_embedding_func = TextEmbeddingBuiltInFunction(
    input_field_names="text",
    output_field_names="vector_dense",
    dim=1536,
    params={
        "provider": "openai",
        "model_name": "text-embedding-3-small",
    },
)

# BM25 Function (keyword search)
bm25_func = BM25BuiltInFunction(
    input_field_names="text",
    output_field_names="vector_sparse",
)

# Create Milvus vector store
vector_store = Milvus(
    embedding_function=None,
    builtin_function=[text_embedding_func, bm25_func],
    connection_args={"uri": "http://localhost:19530"},
    vector_field=["vector_dense", "vector_sparse"],
    collection_name="hybrid_search_collection",
    # consistency_level="Strong",    # Strong consistency level, default is "Session"
    auto_id=True,
    # drop_old=True,  # If you want to drop old collection and create a new one
)

# Add documents
documents = [
    Document(page_content="Machine learning and artificial intelligence"),
    Document(page_content="The cat sat on the mat"),
]

vector_store.add_documents(documents)
[462726375729313255, 462726375729313256]

Используйте WeightedRanker для управления весами семантического поиска и поиска по ключевым словам. Если вес плотного поиска выше, результаты больше ориентированы на семантическое сходство; если вес разреженного поиска выше, результаты больше ориентированы на совпадение ключевых слов.

# Hybrid search, use WeightedRanker to control weights
# 70% semantic search, 30% keyword search
results = vector_store.similarity_search(
    query="AI technology",
    k=2,
    ranker_type="weighted",
    ranker_params={"weights": [0.7, 0.3]},
)

# If you want to be more biased towards keyword matching, you can adjust weights
# 30% semantic search, 70% keyword search
results_keyword_focused = vector_store.similarity_search(
    query="cat mat",
    k=2,
    ranker_type="weighted",
    ranker_params={"weights": [0.3, 0.7]},
)
results
[Document(metadata={'pk': 462726375729313255}, page_content='Machine learning and artificial intelligence'),
 Document(metadata={'pk': 462726375729313256}, page_content='The cat sat on the mat')]
results_keyword_focused
[Document(metadata={'pk': 462726375729313256}, page_content='The cat sat on the mat'),
 Document(metadata={'pk': 462726375729313255}, page_content='Machine learning and artificial intelligence')]

Резюме

Поздравляем! Вы узнали, как использовать функцию встраивания текста Milvus (Data In Data Out) с LangChain. Перенеся генерацию встраивания на серверную сторону, вы можете упростить код на стороне клиента, централизованно управлять ключами API и легко реализовать гибридный поиск. В сочетании с функцией встраивания текста и BM25 Milvus предоставляет вам мощные возможности векторного поиска.