Milvus als Vektorspeicher verwenden
Milvus ist eine Datenbank, die massive Einbettungsvektoren speichert, indiziert und verwaltet, die von tiefen neuronalen Netzen und anderen Modellen des maschinellen Lernens (ML) erzeugt werden.
Dieses Notizbuch zeigt, wie Sie die Funktionen der Milvus-Vektordatenbank nutzen können.
Einrichten von
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 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.
Berechtigungsnachweise
Für die Verwendung des Milvus
Vektorspeichers sind keine Anmeldeinformationen erforderlich.
Initialisierung
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},
)
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
So können Sie eine neue Sammlung erstellen
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 die gespeicherte Sammlung abrufen
vector_store_loaded = Milvus(
embeddings,
connection_args={"uri": URI},
collection_name="langchain_example",
)
Vektorspeicher verwalten
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
Mit der Funktion add_documents
können wir Elemente zu unserem Vektorspeicher hinzufügen.
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,
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'}]
Ä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, 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'}]
Eine vollständige Liste aller Suchoptionen, die bei der 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 abruferweiterte Erzeugung
Anleitungen zur Verwendung dieses Vektorspeichers für die abfragegestützte Generierung (RAG) finden Sie in den folgenden Abschnitten:
- Tutorials: Arbeiten mit externem Wissen
- How-to: Fragen und Antworten mit RAG
- Konzeptuelle Dokumente zum Abruf
Pro-Benutzer-Retrieval
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=True,
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://api.python.langchain.com/en/latest/vectorstores/langchain_milvus.vectorstores.milvus.Milvus.html