Integración de la función de incrustación de texto de Milvus con LangChain
Esta guía muestra cómo utilizar la función de incrustación de texto de Milvus 2.6 (también conocida como Data In Data Out) con LangChain. Esta función permite al servidor Milvus convertir automáticamente texto sin formato en incrustaciones vectoriales, simplificando el código del lado del cliente y centralizando la gestión de claves API.
Milvus es la base de datos vectorial de código abierto más avanzada del mundo, construida específicamente para soportar aplicaciones de búsqueda de similitud de incrustación y de IA. LangChain es un marco para el desarrollo de aplicaciones basadas en grandes modelos lingüísticos (LLM). Al integrar la función de incrustación de texto de Milvus, puede conseguir una solución de búsqueda vectorial más sencilla y eficaz en sus aplicaciones LangChain.
Requisitos previos
Antes de ejecutar este tutorial, asegúrese de haber instalado las siguientes dependencias:
! pip install --upgrade langchain-milvus langchain-core langchain-openai
Si está utilizando Google Colab, para habilitar las dependencias recién instaladas, es posible que tenga que reiniciar el tiempo de ejecución (haga clic en el menú "Tiempo de ejecución" en la parte superior de la pantalla, y seleccione "Reiniciar sesión" en el menú desplegable).
Configuración del servidor Milvus
Importante: La función de incrustación de texto (entrada y salida de datos) sólo está disponible en Milvus Server. Milvus Lite no admite esta función. Necesita utilizar un servidor Milvus desplegado con Docker/Kubernetes.
Antes de utilizar la función de incrustación de texto, debe configurar las credenciales para los proveedores de servicios de incrustación en el servidor Milvus.
Declare sus claves en credenciales:
Usted puede listar una o muchas claves API - déle a cada una una etiqueta que usted invente y a la que hará referencia más tarde.
# milvus.yaml
credential:
apikey_dev:
apikey: <YOUR_OPENAI_API_KEY>
Dígale a Milvus qué clave utilizar para las llamadas OpenAI
En el mismo archivo, indique al proveedor de OpenAI la etiqueta que desea que utilice.
function:
textEmbedding:
providers:
openai:
credential: apikey_dev
# url: https://api.openai.com/v1/embeddings # (optional) custom url
Para más métodos de configuración, consulte la documentación de Milvus Embedding Function.
Iniciando el Servicio Milvus
Asegúrese de que Milvus Server se está ejecutando y que la función de incrustación está activada. Puede desplegar el servidor Milvus utilizando Docker o Kubernetes. Nota: Milvus Lite no es compatible con la función de incrustación de texto.
Entendiendo la incrustación: Del lado del cliente vs del lado del servidor
Antes de sumergirnos en el uso, entendamos primero las diferencias entre los dos enfoques de incrustación.
Incrustación utilizando la clase Embeddings de LangChain (del lado del cliente)
En el enfoque tradicional de LangChain, la generación de la incrustación se realiza en el lado del cliente utilizando la claseEmbeddings . Su aplicación necesita utilizar el método embed_query de la clase para llamar a la API de incrustación, luego almacenar los vectores generados en 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 secuencia:
Características:
- El cliente llama directamente a la API de incrustación
- Necesidad de gestionar las claves API en el lado del cliente
- Flujo de datos: Texto → Cliente → API de incrustación → Vector → Milvus
Función de incrustación de texto de Milvus (datos de entrada datos de salida del lado del servidor)
La función de incrustación de texto (entrada y salida de datos) de Milvus 2.6 permite al servidor de Milvus convertir automáticamente texto en bruto en incrustaciones vectoriales. El cliente sólo tiene que proporcionar el texto, y Milvus se encargará automáticamente de la generación de la incrustación.
Diagrama de secuencia:
Características:
- El servidor Milvus llama a la API de incrustación
- Las claves de la API se gestionan de forma centralizada en el servidor.
- Flujo de datos: Texto → Milvus → API de incrustación → Vector (almacenado en Milvus)
Comparación de los dos métodos
| Característica | Incrustación LangChain (del lado del cliente) | Función de incrustación de texto de Milvus (del lado del servidor) |
|---|---|---|
| Lugar de procesamiento | Aplicación cliente | Servidor Milvus |
| Llamadas a la API | El cliente llama directamente a la API de incrustación | El servidor Milvus llama a la API de incrustación |
| Gestión de claves API | Necesidad de gestión en el lado del cliente | Gestión centralizada en el servidor, más segura |
| Complejidad del código | Necesidad de gestionar claves y llamadas API en el lado del cliente | Sólo es necesario configurarlo una vez en la configuración de Milvus |
| Casos de uso | - Necesidad de control del cliente sobre el proceso de incrustación - Necesidad de almacenar en caché los resultados de la incrustación en el lado del cliente - Necesidad de soportar múltiples cambios de modelo de incrustación | - Simplificar el código del lado del cliente - Gestión centralizada de las claves API en el servidor - Necesidad de procesar por lotes grandes volúmenes de documentos - Necesidad de reducir las interacciones del cliente con API externas - Necesidad de combinar con las funciones integradas de Milvus como BM25 |
| Requisitos de la versión de Milvus | Todas las versiones (incluida Milvus Lite) | Milvus Lite no es compatible |
Este tutorial presenta principalmente el método Milvus Text Embedding Function (Data In Data Out) del lado del servidor, que es una nueva característica introducida en Milvus 2.6 que puede simplificar significativamente el código del lado del cliente y mejorar la seguridad.
Uso de la función de incrustación de texto
Ejemplo 1: Sólo incrustación en el servidor
Este es el caso de uso más simple, dependiendo completamente del servidor Milvus para generar incrustaciones. El cliente no necesita ninguna función de incrustación.
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:
- Debe utilizar Milvus Server: La función de incrustación de texto sólo está disponible en Milvus Server, Milvus Lite no es compatible.
- Utilice la uri del servidor, como
http://localhost:19530(despliegue Docker local) ohttp://your-server:19530(servidor remoto). - Si utiliza Zilliz Cloud, utilice el Public Endpoint como
uriy establezca el parámetrotoken.
Al añadir documentos, sólo necesita proporcionar texto, no es necesario precalcular vectores. Milvus llamará automáticamente a la API de OpenAI para generar incrustaciones.
# 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 la búsqueda, utilice directamente consultas de texto, y Milvus convertirá automáticamente el texto de la consulta en vectores para la búsqueda.
# 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}
Ejemplo 2: Combinación de incrustación de texto y BM25 (búsqueda híbrida)
La combinación de la búsqueda semántica (Text Embedding) y la búsqueda por palabras clave (BM25) permite realizar búsquedas híbridas más potentes. La búsqueda semántica permite comprender mejor la intención de la consulta, mientras que la búsqueda por palabras clave permite obtener una correspondencia 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]
Utilice WeightedRanker para controlar el peso de la búsqueda semántica y de la búsqueda por palabras clave. Cuando la ponderación densa es mayor, los resultados están más sesgados hacia la similitud semántica; cuando la ponderación dispersa es mayor, los resultados están más sesgados hacia la coincidencia de palabras clave.
# 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')]
Resumen
Enhorabuena. Ha aprendido a utilizar la función de incrustación de texto (Data In Data Out) de Milvus con LangChain. Al mover la generación de incrustaciones al lado del servidor, puede simplificar el código del lado del cliente, gestionar de forma centralizada las claves API e implementar fácilmente la búsqueda híbrida. Combinado con Text Embedding Function y BM25, Milvus le proporciona potentes capacidades de búsqueda vectorial.