Milvus als LangChain-Vektorspeicher verwenden
Dieses Notizbuch zeigt, wie man die Funktionalität des Milvus als LangChain-Vektorspeicher nutzen kann.
einrichten
Um diese Integration zu nutzen, müssen Sie langchain-milvus mit pip install -qU langchain-milvus installieren.
$ pip install -qU langchain_milvus
Die neueste Version von pymilvus wird mit einer lokalen Vektordatenbank Milvus Lite ausgeliefert, die sich gut für die Erstellung von Prototypen eignet. Wenn Sie große Datenmengen haben, z. B. mehr als eine Million Dokumente, empfehlen wir, einen leistungsfähigeren Milvus-Server auf Docker oder Kubernetes einzurichten.
Initialisierung
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},
)
Kompartimentierung der Daten mit Milvus Collections
Sie können verschiedene, nicht zusammenhängende Dokumente in verschiedenen Sammlungen innerhalb derselben Milvus-Instanz speichern, um den Kontext zu erhalten
Hier sehen Sie, wie Sie eine neue Vektorspeichersammlung aus Dokumenten erstellen können:
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},
)
Und hier sehen Sie, wie Sie diese gespeicherte Sammlung abrufen
vector_store_loaded = Milvus(
embeddings,
connection_args={"uri": URI},
collection_name="langchain_example",
)
Verwalten des Vektorspeichers
Sobald Sie Ihren Vektorspeicher erstellt haben, können wir mit ihm interagieren, indem wir verschiedene Elemente hinzufügen und löschen.
Elemente zum Vektorspeicher hinzufügen
Wir können unserem Vektorspeicher Elemente hinzufügen, indem wir die Funktion add_documents verwenden.
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']
Elemente aus dem Vektorspeicher löschen
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)
Abfrage des Vektorspeichers
Sobald Ihr Vektorspeicher erstellt wurde und die relevanten Dokumente hinzugefügt wurden, werden Sie ihn wahrscheinlich während der Ausführung Ihrer Kette oder Ihres Agenten abfragen wollen.
Direkt abfragen
Ähnlichkeitssuche
Eine einfache Ähnlichkeitssuche mit Filterung nach Metadaten kann wie folgt durchgeführt werden:
results = vector_store.similarity_search(
"LangChain provides abstractions to make working with LLMs easy",
k=2,
expr='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'}]
Ähnlichkeitssuche mit Punktzahl
Sie können auch mit der Punktzahl suchen:
results = vector_store.similarity_search_with_score(
"Will it be hot tomorrow?", k=1, expr='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'}]
Eine vollständige Liste aller Suchoptionen, die bei Verwendung des Milvus Vektorspeichers zur Verfügung stehen, finden Sie in der API-Referenz.
Abfrage durch Umwandlung in Retriever
Sie können den Vektorspeicher auch in einen Retriever umwandeln, um ihn einfacher in Ihren Ketten zu verwenden.
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.')]
Verwendung für Retrieval-Augmented Generation
Eine Anleitung zur Verwendung dieses Vektorspeichers für die abruferweiterte Generierung (RAG) finden Sie in diesem RAG-Leitfaden.
Pro-Benutzer-Abruf
Wenn Sie eine Retrieval-Applikation entwickeln, müssen Sie sie oft mit Blick auf mehrere Benutzer erstellen. Das bedeutet, dass Sie möglicherweise nicht nur Daten für einen Benutzer, sondern für viele verschiedene Benutzer speichern, und diese sollten nicht in der Lage sein, die Daten des jeweils anderen zu sehen.
Milvus empfiehlt die Verwendung von partition_key, um Multi-Tenancy zu implementieren, hier ist ein Beispiel.
Die Funktion des Partitionsschlüssels ist jetzt nicht in Milvus Lite verfügbar, wenn Sie sie nutzen wollen, müssen Sie den Milvus-Server von Docker oder Kubernetes aus starten.
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=False,
partition_key_field="namespace", # Use the "namespace" field as the partition key
)
Um eine Suche mit dem Partitionsschlüssel durchzuführen, sollten Sie einen der folgenden Punkte in den booleschen Ausdruck der Suchanfrage aufnehmen:
search_kwargs={"expr": '<partition_key> == "xxxx"'}
search_kwargs={"expr": '<partition_key> == in ["xxx", "xxx"]'}
Ersetzen Sie <partition_key> durch den Namen des Feldes, das als Partitionsschlüssel bezeichnet wird.
Milvus wechselt zu einer Partition, die auf dem angegebenen Partitionsschlüssel basiert, filtert Entitäten gemäß dem Partitionsschlüssel und sucht in den gefilterten Entitäten.
# 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'})]
API-Referenz
Eine detaillierte Dokumentation aller __Modulname__VectorStore-Funktionen und -Konfigurationen finden Sie in der API-Referenz: https://python.langchain.com/api_reference/milvus/vectorstores/langchain_milvus.vectorstores.milvus.Milvus.html