milvus-logo
LFAI
Home
  • Integrationen

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

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:

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

Übersetzt vonDeepL

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

War diese Seite hilfreich?