Milvus
Zilliz
Home
  • Integraciones
  • Home
  • Docs
  • Integraciones

  • Orquestación

  • Cadena LangChain

  • Incrustación de texto

Integración de la función de incrustación de texto de Milvus con LangChain

Open In Colab GitHub Repository

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ísticaIncrustación LangChain (del lado del cliente)Función de incrustación de texto de Milvus (del lado del servidor)
Lugar de procesamientoAplicación clienteServidor Milvus
Llamadas a la APIEl cliente llama directamente a la API de incrustaciónEl servidor Milvus llama a la API de incrustación
Gestión de claves APINecesidad de gestión en el lado del clienteGestión centralizada en el servidor, más segura
Complejidad del códigoNecesidad de gestionar claves y llamadas API en el lado del clienteSó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 MilvusTodas 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) o http://your-server:19530 (servidor remoto).
  • Si utiliza Zilliz Cloud, utilice el Public Endpoint como uri y establezca el parámetro token.

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}

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.