Integrazione della funzione di inclusione del testo di Milvus con LangChain

Open In Colab GitHub Repository

Questa guida mostra come utilizzare la funzione di incorporazione del testo di Milvus 2.6 (nota anche come Data In Data Out) con LangChain. Questa funzione consente al server Milvus di convertire automaticamente il testo grezzo in incorporazioni vettoriali, semplificando il codice lato client e centralizzando la gestione delle chiavi API.

Milvus è il database vettoriale open-source più avanzato al mondo, costruito specificamente per supportare la ricerca di similarità di incorporamento e le applicazioni di intelligenza artificiale. LangChain è un framework per lo sviluppo di applicazioni basate su modelli linguistici di grandi dimensioni (LLM). Integrando la funzione di incorporazione del testo di Milvus, è possibile ottenere una soluzione di ricerca vettoriale più semplice ed efficiente nelle applicazioni LangChain.

Prerequisiti

Prima di eseguire questa esercitazione, assicuratevi di aver installato le seguenti dipendenze:

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

Se si utilizza Google Colab, per abilitare le dipendenze appena installate potrebbe essere necessario riavviare il runtime (fare clic sul menu "Runtime" nella parte superiore dello schermo e selezionare "Riavvia sessione" dal menu a discesa).

Configurazione del server Milvus

Importante: la funzione di incorporazione del testo (Data In Data Out) è disponibile solo in Milvus Server. Milvus Lite non supporta questa funzione. È necessario utilizzare un server Milvus distribuito con Docker/Kubernetes.

Prima di utilizzare la funzione di incorporazione del testo, è necessario configurare le credenziali per i fornitori di servizi di incorporazione sul server Milvus.

Dichiarare le chiavi sotto credenziali:

Si possono elencare una o più chiavi API, dando a ciascuna un'etichetta inventata e a cui si farà riferimento in seguito.

# milvus.yaml

credential:
  apikey_dev:
    apikey: <YOUR_OPENAI_API_KEY>

Indicare a Milvus quale chiave utilizzare per le chiamate a OpenAI

Nello stesso file, indicare al provider OpenAI l'etichetta che si desidera utilizzare.

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

Per ulteriori metodi di configurazione, consultare la documentazione di Milvus Embedding Function.

Avvio del servizio Milvus

Assicurarsi che Milvus Server sia in esecuzione e che la funzione di incorporamento sia abilitata. È possibile distribuire il server Milvus utilizzando Docker o Kubernetes. Nota: Milvus Lite non supporta la funzione di incorporamento del testo.

Comprendere l'incorporazione: Lato client e lato server

Prima di immergerci nell'uso, cerchiamo di capire le differenze tra i due approcci di incorporamento.

Incorporare usando la classe Embeddings di LangChain (lato client)

Nell'approccio tradizionale di LangChain, la generazione dell'incorporamento avviene sul lato client, utilizzando la classeEmbeddings . L'applicazione deve utilizzare il metodo embed_query della classe per chiamare l'API di incorporamento, quindi memorizzare i vettori generati in 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",
)

Diagramma di sequenza:

Caratteristiche:

  • Il client chiama direttamente l'API di incorporamento
  • Necessità di gestire le chiavi API sul lato client
  • Flusso di dati: Testo → Cliente → API di incorporamento → Vettore → Milvus

Funzione di incorporamento del testo di Milvus (Dati in entrata Dati in uscita lato server)

La funzione di incorporamento del testo di Milvus 2.6 (Data In Data Out) consente al server Milvus di convertire automaticamente il testo grezzo in incorporazioni vettoriali. Il cliente deve solo fornire il testo e Milvus si occuperà automaticamente della generazione delle incorporazioni.

Diagramma di sequenza:

Caratteristiche:

  • Il server Milvus chiama l'API di incorporazione
  • Le chiavi API sono gestite centralmente sul lato server.
  • Flusso di dati: Testo → Milvus → API di incorporamento → Vettore (memorizzato in Milvus)

Confronto tra i due metodi

CaratteristicaIncorporamento LangChain (lato client)Funzione di incorporamento del testo Milvus (lato server)
Posizione di elaborazioneApplicazione clientServer Milvus
Chiamate APIIl client chiama direttamente l'API di incorporamentoIl server Milvus chiama l'API di integrazione
Gestione delle chiavi APINecessità di gestione sul lato clientGestione centralizzata sul lato server, più sicura
Complessità del codiceNecessità di gestire le chiavi API e le chiamate sul lato clientÈ sufficiente configurare una sola volta nella configurazione di Milvus
Casi d'uso- Necessità di controllare il processo di incorporazione dal lato client
- Necessità di memorizzare nella cache i risultati dell'incorporazione sul lato client
- Necessità di supportare la commutazione di più modelli di incorporazione
- Semplificare il codice lato client
- Gestione centralizzata delle chiavi API sul lato server
- Necessità di elaborare in batch grandi volumi di documenti
- Ridurre le interazioni lato client con API esterne
- Necessità di combinarsi con le funzioni integrate di Milvus come BM25
Requisiti della versione di MilvusTutte le versioni (compresa Milvus Lite)Milvus Lite non è supportato

Questo tutorial introduce principalmente il metodo Text Embedding Function (Data In Data Out) di Milvus lato server, una nuova funzionalità introdotta in Milvus 2.6 che può semplificare notevolmente il codice lato client e migliorare la sicurezza.

Uso della funzione di incorporamento del testo

Esempio 1: solo incorporazione lato server

Questo è il caso d'uso più semplice, che si affida completamente al server Milvus per generare le incorporazioni. Il client non ha bisogno di alcuna funzione di incorporamento.

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
)

Per connection_args:

  • Deve utilizzare Milvus Server: La funzione di incorporazione del testo è disponibile solo in Milvus Server, Milvus Lite non è supportato.
  • Utilizzare l'uri del server, ad esempio http://localhost:19530 (distribuzione Docker locale) o http://your-server:19530 (server remoto).
  • Se si utilizza Zilliz Cloud, utilizzare l'endpoint pubblico come uri e impostare il parametro token.

Quando si aggiungono documenti, è sufficiente fornire il testo, non è necessario precompilare i vettori. Milvus chiamerà automaticamente l'API OpenAI per generare le incorporazioni.

# 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 ricerca, utilizzare direttamente le query di testo e Milvus convertirà automaticamente il testo della query in vettori per la ricerca.

# 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 combinazione di ricerca semantica (Text Embedding) e ricerca per parole chiave (BM25) consente di ottenere capacità di ricerca ibride più potenti. La ricerca semantica eccelle nella comprensione dell'intento della query, mentre la ricerca per parole chiave eccelle nella corrispondenza esatta.

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]

Utilizzare WeightedRanker per controllare i pesi della ricerca semantica e della ricerca per parole chiave. Quando il peso denso è più alto, i risultati sono più orientati verso la somiglianza semantica; quando il peso rado è più alto, i risultati sono più orientati verso la corrispondenza con le parole chiave.

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

Sintesi

Congratulazioni! Avete imparato a usare la funzione di incorporazione del testo (Data In Data Out) di Milvus con LangChain. Spostando la generazione di incorporazioni sul lato server, è possibile semplificare il codice lato client, gestire centralmente le chiavi API e implementare facilmente la ricerca ibrida. In combinazione con Text Embedding Function e BM25, Milvus offre potenti capacità di ricerca vettoriale.