Integração da função de incorporação de texto do Milvus com a LangChain
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
| Funcionalidade | Incorporação LangChain (do lado do cliente) | Função de incorporação de texto do Milvus (do lado do servidor) |
|---|---|---|
| Local de processamento | Aplicação cliente | Servidor Milvus |
| Chamadas API | O cliente chama diretamente a API de incorporação | O servidor Milvus chama a API de incorporação |
| Gestão da chave da API | Necessidade de gestão do lado do cliente | Gestão centralizada no lado do servidor, mais segura |
| Complexidade do código | Necessidade de gerir chaves e chamadas API no lado do cliente | Só é 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 Milvus | Todas 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) ouhttp://your-server:19530(servidor remoto). - Se utilizar o Zilliz Cloud, utilize o Public Endpoint como
urie defina o parâmetrotoken.
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}
Exemplo 2: Combinação de Text Embedding e BM25 (pesquisa híbrida)
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.