Integrieren Sie Milvus mit WhyHow
Dieser Leitfaden zeigt, wie man whyhow.ai und Milvus Lite zur Durchführung von regelbasiertem Retrieval verwendet.
Überblick
WhyHow ist eine Plattform, die Entwicklern die Bausteine zur Verfügung stellt, die sie benötigen, um unstrukturierte Daten zu organisieren, zu kontextualisieren und zuverlässig abzurufen, um komplexe RAG durchzuführen. Das Rule-based Retrieval-Paket ist ein von WhyHow entwickeltes Python-Paket, das die Erstellung und Verwaltung von Retrieval Augmented Generation (RAG)-Anwendungen mit erweiterten Filterfunktionen ermöglicht.
Installation
Bevor Sie beginnen, installieren Sie bitte alle notwendigen Python-Pakete für die spätere Verwendung.
pip install --upgrade pymilvus, whyhow_rbr
Als nächstes müssen wir den Milvus-Client initialisieren, um das regelbasierte Retrieval mit Milvus Lite zu implementieren.
from pymilvus import MilvusClient
# Milvus Lite local path
path="./milvus_demo.db" # random name for local milvus lite db path
# Initialize the ClientMilvus
milvus_client = ClientMilvus(path)
Sie können den Milvus-Client auch über Milvus Cloud initialisieren
from pymilvus import MilvusClient
# Milvus Cloud credentials
YOUR_MILVUS_CLOUD_END_POINT = "YOUR_MILVUS_CLOUD_END_POINT"
YOUR_MILVUS_CLOUD_TOKEN = "YOUR_MILVUS_CLOUD_TOKEN"
# Initialize the ClientMilvus
milvus_client = ClientMilvus(
milvus_uri=YOUR_MILVUS_CLOUD_END_POINT,
milvus_token=YOUR_MILVUS_CLOUD_TOKEN,
)
Sammlung erstellen
Definieren der notwendigen Variablen
# Define collection name
COLLECTION_NAME="YOUR_COLLECTION_NAME" # take your own collection name
# Define vector dimension size
DIMENSION=1536 # decide by the model you use
Schema hinzufügen
Bevor wir Daten in die Milvus Lite Datenbank einfügen, müssen wir zuerst das Datenfeld definieren, das hier Schema genannt wird. Durch das Erstellen eines Objekts CollectionSchema
und das Hinzufügen eines Datenfelds über add_field()
können wir unseren Datentyp und seine Eigenschaften kontrollieren. Dieser Schritt ist obligatorisch, bevor Daten in Milvus eingefügt werden.
schema = milvus_client.create_schema(auto_id=True) # Enable id matching
schema = milvus_client.add_field(schema=schema, field_name="id", datatype=DataType.INT64, is_primary=True)
schema = milvus_client.add_field(schema=schema, field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)
Index erstellen
Für jedes Schema ist es besser, einen Index zu haben, damit die Abfrage viel effizienter wird. Um einen Index zu erstellen, benötigen wir zunächst ein index_params
und fügen später weitere Indexdaten zu diesem IndexParams
Objekt hinzu.
# Start to indexing data field
index_params = milvus_client.prepare_index_params()
index_params = milvus_client.add_index(
index_params=index_params, # pass in index_params object
field_name="embedding",
index_type="AUTOINDEX", # use autoindex instead of other complex indexing method
metric_type="COSINE", # L2, COSINE, or IP
)
Diese Methode ist ein dünner Wrapper um die offizielle Milvus-Implementierung(offizielle Dokumente).
Sammlung erstellen
Nachdem wir alle Datenfelder definiert und indexiert haben, müssen wir nun unsere Datenbanksammlung erstellen, damit wir schnell und präzise auf unsere Daten zugreifen können. Zu erwähnen ist, dass wir die enable_dynamic_field
auf true initialisiert haben, so dass Sie alle Daten frei hochladen können. Der Preis dafür ist, dass die Datenabfrage ineffizient sein könnte.
# Create Collection
milvus_client.create_collection(
collection_name=COLLECTION_NAME,
schema=schema,
index_params=index_params
)
Dokumente hochladen
Nachdem wir eine Sammlung erstellt haben, können wir sie mit Dokumenten füllen. In whyhow_rbr
geschieht dies mit der Methode upload_documents
der MilvusClient
. Sie führt unter der Haube die folgenden Schritte aus:
- Vorverarbeitung: Einlesen und Aufteilen der bereitgestellten PDF-Dateien in Teile (Chunks)
- Einbetten: Einbetten aller Chunks mit Hilfe eines OpenAI-Modells
- Einfügen: Hochladen sowohl der Einbettungen als auch der Metadaten zu Milvus Lite
# get pdfs
pdfs = ["harry-potter.pdf", "game-of-thrones.pdf"] # replace to your pdfs path
# Uploading the PDF document
milvus_client.upload_documents(
collection_name=COLLECTION_NAME,
documents=pdfs
)
Beantwortung von Fragen
Nun können wir endlich zur Retrieval-erweiterten Generierung übergehen.
# Search data and implement RAG!
res = milvus_client.search(
question='What food does Harry Potter like to eat?',
collection_name=COLLECTION_NAME,
anns_field='embedding',
output_fields='text'
)
print(res['answer'])
print(res['matches'])
Regeln
Im vorherigen Beispiel wurde jedes einzelne Dokument in unserem Index berücksichtigt. Manchmal kann es jedoch von Vorteil sein, nur Dokumente abzurufen, die einige vordefinierte Bedingungen erfüllen (z. B. filename=harry-potter.pdf
). In whyhow_rbr
kann dies über Milvus Lite durch die Anpassung von Suchparametern erreicht werden.
Eine Regel kann die folgenden Metadatenattribute steuern
filename
Name der Dateipage_numbers
Liste der Ganzzahlen, die den Seitenzahlen entsprechen (0-Indexierung)id
eindeutiger Bezeichner eines Chunks (dies ist der "extremste" Filter)- Andere Regeln, die auf booleschen Ausdrücken basieren
# RULES(search on book harry-potter on page 8):
PARTITION_NAME='harry-potter' # search on books
page_number='page_number == 8'
# first create a partitions to store the book and later search on this specific partition:
milvus_client.crate_partition(
collection_name=COLLECTION_NAME,
partition_name=PARTITION_NAME # separate base on your pdfs type
)
# search with rules
res = milvus_client.search(
question='Tell me about the greedy method',
collection_name=COLLECTION_NAME,
partition_names=PARTITION_NAME,
filter=page_number, # append any rules follow the Boolean Expression Rule
anns_field='embedding',
output_fields='text'
)
print(res['answer'])
print(res['matches'])
In diesem Beispiel erstellen wir zunächst eine Partition, in der PDF-Dateien mit Harry-Potter-Bezug gespeichert werden, und durch die Suche in dieser Partition können wir die direktesten Informationen erhalten. Außerdem wenden wir Seitenzahlen als Filter an, um die genaue Seite zu bestimmen, nach der wir suchen wollen. Denken Sie daran, dass der Parameter filer der booleschen Regel folgen muss.
Aufräumen
Nachdem Sie alle Anweisungen ausgeführt haben, können Sie die Datenbank durch den Aufruf von drop_collection()
bereinigen.
# Clean up
milvus_client.drop_collection(
collection_name=COLLECTION_NAME
)