Utilizzare Milvus come archivio vettoriale
Milvus è un database che memorizza, indicizza e gestisce vettori di incorporazione massiva generati da reti neurali profonde e altri modelli di apprendimento automatico (ML).
Questo quaderno mostra come utilizzare le funzionalità relative al database vettoriale Milvus.
Installazione
Per utilizzare questa integrazione è necessario installare langchain-milvus
con pip install -qU langchain-milvus
.
%pip install -qU langchain_milvus
L'ultima versione di pymilvus viene fornita con un database vettoriale locale Milvus Lite, ottimo per la prototipazione. Se si dispone di dati su larga scala, come più di un milione di documenti, si consiglia di impostare un server Milvus più performante su docker o kubernetes.
Credenziali
Non sono necessarie credenziali per utilizzare l'archivio vettoriale Milvus
.
Inizializzazione
import EmbeddingTabs from "@theme/EmbeddingTabs";
<EmbeddingTabs/>
# | output: false
# | echo: false
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
from langchain_milvus import Milvus
# The easiest way is to use Milvus Lite where everything is stored in a local file.
# If you have a Milvus server you can use the server URI such as "http://localhost:19530".
URI = "./milvus_example.db"
vector_store = Milvus(
embedding_function=embeddings,
connection_args={"uri": URI},
)
Compartimentare i dati con le collezioni Milvus
È possibile memorizzare documenti diversi e non correlati in collezioni diverse all'interno della stessa istanza Milvus per mantenere il contesto.
Ecco come si può creare una nuova collezione
from langchain_core.documents import Document
vector_store_saved = Milvus.from_documents(
[Document(page_content="foo!")],
embeddings,
collection_name="langchain_example",
connection_args={"uri": URI},
)
Ed ecco come si recupera la raccolta memorizzata
vector_store_loaded = Milvus(
embeddings,
connection_args={"uri": URI},
collection_name="langchain_example",
)
Gestire l'archivio vettoriale
Una volta creato l'archivio vettoriale, possiamo interagire con esso aggiungendo e cancellando diversi elementi.
Aggiungere elementi al negozio vettoriale
Possiamo aggiungere elementi al nostro archivio vettoriale utilizzando la funzione add_documents
.
from uuid import uuid4
from langchain_core.documents import Document
document_1 = Document(
page_content="I had chocalate chip pancakes and scrambled eggs for breakfast this morning.",
metadata={"source": "tweet"},
)
document_2 = Document(
page_content="The weather forecast for tomorrow is cloudy and overcast, with a high of 62 degrees.",
metadata={"source": "news"},
)
document_3 = Document(
page_content="Building an exciting new project with LangChain - come check it out!",
metadata={"source": "tweet"},
)
document_4 = Document(
page_content="Robbers broke into the city bank and stole $1 million in cash.",
metadata={"source": "news"},
)
document_5 = Document(
page_content="Wow! That was an amazing movie. I can't wait to see it again.",
metadata={"source": "tweet"},
)
document_6 = Document(
page_content="Is the new iPhone worth the price? Read this review to find out.",
metadata={"source": "website"},
)
document_7 = Document(
page_content="The top 10 soccer players in the world right now.",
metadata={"source": "website"},
)
document_8 = Document(
page_content="LangGraph is the best framework for building stateful, agentic applications!",
metadata={"source": "tweet"},
)
document_9 = Document(
page_content="The stock market is down 500 points today due to fears of a recession.",
metadata={"source": "news"},
)
document_10 = Document(
page_content="I have a bad feeling I am going to get deleted :(",
metadata={"source": "tweet"},
)
documents = [
document_1,
document_2,
document_3,
document_4,
document_5,
document_6,
document_7,
document_8,
document_9,
document_10,
]
uuids = [str(uuid4()) for _ in range(len(documents))]
vector_store.add_documents(documents=documents, ids=uuids)
['b0248595-2a41-4f6b-9c25-3a24c1278bb3',
'fa642726-5329-4495-a072-187e948dd71f',
'9905001c-a4a3-455e-ab94-72d0ed11b476',
'eacc7256-d7fa-4036-b1f7-83d7a4bee0c5',
'7508f7ff-c0c9-49ea-8189-634f8a0244d8',
'2e179609-3ff7-4c6a-9e05-08978903fe26',
'fab1f2ac-43e1-45f9-b81b-fc5d334c6508',
'1206d237-ee3a-484f-baf2-b5ac38eeb314',
'd43cbf9a-a772-4c40-993b-9439065fec01',
'25e667bb-6f09-4574-a368-661069301906']
Eliminare elementi dal negozio vettoriale
vector_store.delete(ids=[uuids[-1]])
(insert count: 0, delete count: 1, upsert count: 0, timestamp: 0, success count: 0, err count: 0, cost: 0)
Interrogare il negozio vettoriale
Una volta creato l'archivio vettoriale e aggiunti i documenti pertinenti, è probabile che si desideri interrogarlo durante l'esecuzione della catena o dell'agente.
Interrogazione diretta
Ricerca per similarità
L'esecuzione di una semplice ricerca di similarità con filtro sui metadati può essere eseguita come segue:
results = vector_store.similarity_search(
"LangChain provides abstractions to make working with LLMs easy",
k=2,
filter={"source": "tweet"},
)
for res in results:
print(f"* {res.page_content} [{res.metadata}]")
* Building an exciting new project with LangChain - come check it out! [{'pk': '9905001c-a4a3-455e-ab94-72d0ed11b476', 'source': 'tweet'}]
* LangGraph is the best framework for building stateful, agentic applications! [{'pk': '1206d237-ee3a-484f-baf2-b5ac38eeb314', 'source': 'tweet'}]
Ricerca per similarità con punteggio
È possibile effettuare la ricerca anche con il punteggio:
results = vector_store.similarity_search_with_score(
"Will it be hot tomorrow?", k=1, filter={"source": "news"}
)
for res, score in results:
print(f"* [SIM={score:3f}] {res.page_content} [{res.metadata}]")
* [SIM=21192.628906] bar [{'pk': '2', 'source': 'https://example.com'}]
Per un elenco completo di tutte le opzioni di ricerca disponibili quando si utilizza l'archivio vettoriale Milvus
, è possibile visitare il riferimento API.
Interrogazione tramite trasformazione in retriever
È anche possibile trasformare l'archivio vettoriale in un retriever per facilitarne l'uso nelle catene.
retriever = vector_store.as_retriever(search_type="mmr", search_kwargs={"k": 1})
retriever.invoke("Stealing from the bank is a crime", filter={"source": "news"})
[Document(metadata={'pk': 'eacc7256-d7fa-4036-b1f7-83d7a4bee0c5', 'source': 'news'}, page_content='Robbers broke into the city bank and stole $1 million in cash.')]
Uso per la generazione aumentata del recupero
Per le guide su come utilizzare questo archivio vettoriale per la generazione aumentata dal reperimento (RAG), vedere le sezioni seguenti:
- Tutorial: lavorare con la conoscenza esterna
- Come fare: Domande e risposte con RAG
- Documenti concettuali sul reperimento
Recupero per utente
Quando si costruisce un'applicazione di recupero, spesso si deve pensare a più utenti. Ciò significa che si possono memorizzare dati non solo per un utente, ma per molti utenti diversi, che non devono essere in grado di vedere i dati degli altri.
Milvus consiglia di utilizzare partition_key per implementare la multi-tenancy; ecco un esempio.
La funzione della chiave di partizione non è ora disponibile in Milvus Lite; se si desidera utilizzarla, è necessario avviare il server Milvus da docker o kubernetes.
from langchain_core.documents import Document
docs = [
Document(page_content="i worked at kensho", metadata={"namespace": "harrison"}),
Document(page_content="i worked at facebook", metadata={"namespace": "ankush"}),
]
vectorstore = Milvus.from_documents(
docs,
embeddings,
connection_args={"uri": URI},
drop_old=True,
partition_key_field="namespace", # Use the "namespace" field as the partition key
)
Per effettuare una ricerca utilizzando la chiave di partizione, è necessario includere uno dei seguenti elementi nell'espressione booleana della richiesta di ricerca:
search_kwargs={"expr": '<partition_key> == "xxxx"'}
search_kwargs={"expr": '<partition_key> == in ["xxx", "xxx"]'}
Sostituire <partition_key>
con il nome del campo designato come chiave di partizione.
Milvus passa a una partizione basata sulla chiave di partizione specificata, filtra le entità in base alla chiave di partizione e cerca tra le entità filtrate.
# This will only get documents for Ankush
vectorstore.as_retriever(search_kwargs={"expr": 'namespace == "ankush"'}).invoke(
"where did i work?"
)
[Document(page_content='i worked at facebook', metadata={'namespace': 'ankush'})]
# This will only get documents for Harrison
vectorstore.as_retriever(search_kwargs={"expr": 'namespace == "harrison"'}).invoke(
"where did i work?"
)
[Document(page_content='i worked at kensho', metadata={'namespace': 'harrison'})]
Riferimento API
Per una documentazione dettagliata di tutte le funzioni e le configurazioni di __ModuleName__VectorStore, consultare il riferimento API: https://api.python.langchain.com/en/latest/vectorstores/langchain_milvus.vectorstores.milvus.Milvus.html