Milvus
Zilliz
Home
  • Integrações
  • Home
  • Docs
  • Integrações

  • Orquestração

  • LangChain

  • Incorporação de texto

Integração da função de incorporação de texto do Milvus com a LangChain

Open In Colab GitHub Repository

Este guia demonstra como usar a função de incorporação de texto do Milvus 2.6 (também conhecida como Data In Data Out) com LangChain. Esta funcionalidade permite que o servidor Milvus converta automaticamente texto em bruto em embeddings vectoriais, simplificando o código do lado do cliente e centralizando a gestão de chaves API.

O Milvus é o banco de dados vetorial de código aberto mais avançado do mundo, criado especificamente para oferecer suporte à pesquisa de similaridade de incorporação e aplicativos de IA. LangChain é uma estrutura para o desenvolvimento de aplicações alimentadas por modelos de linguagem de grande dimensão (LLMs). Ao integrar a função de incorporação de texto do Milvus, pode obter uma solução de pesquisa vetorial mais simples e eficiente nas suas aplicações LangChain.

Pré-requisitos

Antes de executar este tutorial, certifique-se de que instalou as seguintes dependências:

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

Se estiver a utilizar o Google Colab, para ativar as dependências acabadas de instalar, poderá ter de reiniciar o tempo de execução (clique no menu "Tempo de execução" na parte superior do ecrã e selecione "Reiniciar sessão" no menu pendente).

Configurar o servidor Milvus

Importante: A função de incorporação de texto (Data In Data Out) só está disponível no Milvus Server. O Milvus Lite não suporta esta funcionalidade. É necessário usar um servidor Milvus implantado com Docker/Kubernetes.

Antes de utilizar a função de incorporação de texto, é necessário configurar as credenciais para incorporar os fornecedores de serviços no servidor Milvus.

Declare as suas chaves em credencial:

Pode listar uma ou várias chaves API - dê a cada uma delas uma etiqueta que invente e que referenciará mais tarde.

# milvus.yaml

credential:
  apikey_dev:
    apikey: <YOUR_OPENAI_API_KEY>

Diga ao Milvus qual a chave a utilizar para as chamadas OpenAI

No mesmo ficheiro, aponte o fornecedor OpenAI para a etiqueta que pretende utilizar.

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

Para mais métodos de configuração, consulte a documentação da Milvus Embedding Function.

Iniciar o serviço Milvus

Certifique-se de que o Milvus Server está a funcionar e que a função de incorporação está activada. Pode implementar o servidor Milvus utilizando o Docker ou o Kubernetes. Nota: Milvus Lite não suporta a função de incorporação de texto.

Entendendo a incorporação: Lado do cliente vs lado do servidor

Antes de mergulhar no uso, vamos primeiro entender as diferenças entre as duas abordagens de incorporação.

Incorporação usando a classe Embeddings da LangChain (lado do cliente)

Na abordagem tradicional da LangChain, a geração de incorporação acontece no lado do cliente, usando a classeEmbeddings . A sua aplicação tem de utilizar o método embed_query da classe para chamar a API de incorporação e, em seguida, armazenar os vectores gerados em 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",
)

Diagrama de sequência:

Caraterísticas:

  • O cliente chama diretamente a API de incorporação
  • Necessidade de gerir as chaves da API no lado do cliente
  • Fluxo de dados: Texto → Cliente → API de incorporação → Vetor → Milvus

Função de incorporação de texto Milvus (Entrada de dados do lado do servidor Saída de dados)

A função de incorporação de texto do Milvus 2.6 (Data In Data Out) permite ao servidor Milvus converter automaticamente texto em bruto em incorporação vetorial. O cliente só precisa de fornecer o texto, e o Milvus tratará automaticamente da geração da incorporação.

Diagrama de sequência:

Caraterísticas:

  • O servidor Milvus chama a API de incorporação
  • As chaves da API são geridas centralmente no lado do servidor
  • Fluxo de dados: Texto → Milvus → API de incorporação → Vetor (armazenado no Milvus)

Comparação dos dois métodos

FuncionalidadeIncorporação LangChain (do lado do cliente)Função de incorporação de texto do Milvus (do lado do servidor)
Local de processamentoAplicação clienteServidor Milvus
Chamadas APIO cliente chama diretamente a API de incorporaçãoO servidor Milvus chama a API de incorporação
Gestão da chave da APINecessidade de gestão do lado do clienteGestão centralizada no lado do servidor, mais segura
Complexidade do códigoNecessidade de gerir chaves e chamadas API no lado do clienteSó é necessário configurar uma vez na configuração do Milvus
Casos de utilização- Necessidade de controlo do lado do cliente sobre o processo de incorporação
- Necessidade de guardar em cache os resultados da incorporação no lado do cliente
- Necessidade de suportar a mudança de vários modelos de incorporação
- Simplificar o código do lado do cliente
- Gerir centralmente as chaves da API no lado do servidor
- Necessidade de processar em lote grandes volumes de documentos
- Pretende reduzir as interações do lado do cliente com APIs externas
- Necessidade de combinar com as funcionalidades incorporadas no Milvus, como o BM25
Requisitos da versão do MilvusTodas as versões (incluindo Milvus Lite)Milvus Lite não é suportado

Este tutorial apresenta principalmente o método Função de incorporação de texto do lado do servidor do Milvus (Data In Data Out), que é um novo recurso introduzido no Milvus 2.6 que pode simplificar significativamente o código do lado do cliente e melhorar a segurança.

Utilizar a função de incorporação de texto

Exemplo 1: Apenas incorporação do lado do servidor

Este é o caso de utilização mais simples, confiando completamente no servidor Milvus para gerar as incorporações. O cliente não necessita de qualquer função de incorporação.

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
)

Para connection_args:

  • Deve usar o servidor Milvus: A função de incorporação de texto só está disponível no Milvus Server, o Milvus Lite não é suportado.
  • Utilize o uri do servidor, como http://localhost:19530 (implementação local do Docker) ou http://your-server:19530 (servidor remoto).
  • Se utilizar o Zilliz Cloud, utilize o Public Endpoint como uri e defina o parâmetro token.

Ao adicionar documentos, só precisa de fornecer texto, não é necessário pré-computar vectores. O Milvus chamará automaticamente a API do OpenAI para gerar os embeddings.

# 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]

Durante a pesquisa, utilize diretamente consultas de texto e o Milvus converterá automaticamente o texto da consulta em vectores para pesquisa.

# 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}

A combinação da pesquisa semântica (Text Embedding) e da pesquisa por palavra-chave (BM25) permite capacidades de pesquisa híbrida mais poderosas. A pesquisa semântica é excelente na compreensão da intenção da consulta, enquanto a pesquisa por palavra-chave é excelente na correspondência exacta.

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]

Utilize WeightedRanker para controlar os pesos da pesquisa semântica e da pesquisa por palavra-chave. Quando o peso denso é mais elevado, os resultados são mais tendenciosos para a semelhança semântica; quando o peso esparso é mais elevado, os resultados são mais tendenciosos para a correspondência de palavras-chave.

# 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')]

Resumo

Parabéns! Aprendeu a utilizar a funcionalidade Função de incorporação de texto (Data In Data Out) do Milvus com a LangChain. Ao mover a geração de incorporação para o lado do servidor, pode simplificar o código do lado do cliente, gerir centralmente as chaves da API e implementar facilmente a pesquisa híbrida. Combinado com a Função de incorporação de texto e o BM25, o Milvus fornece-lhe poderosas capacidades de pesquisa vetorial.