Intégrer Milvus à WhyHow
Ce guide montre comment utiliser whyhow.ai et Milvus Lite pour effectuer une recherche basée sur des règles.
Vue d'ensemble
WhyHow est une plateforme qui fournit aux développeurs les blocs de construction dont ils ont besoin pour organiser, contextualiser et récupérer de manière fiable des données non structurées afin d'effectuer des RAG complexes. Le package Rule-based Retrieval est un package Python développé par WhyHow qui permet de créer et de gérer des applications RAG (Retrieval Augmented Generation) avec des capacités de filtrage avancées.
Installation de la solution
Avant de commencer, veuillez installer tous les paquets Python nécessaires pour une utilisation ultérieure.
pip install --upgrade pymilvus, whyhow_rbr
Ensuite, nous devons initialiser le client Milvus pour mettre en œuvre la recherche basée sur des règles à l'aide de Milvus Lite.
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)
Vous pouvez également initialiser le client Milvus via Milvus Cloud.
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,
)
Créer une collection
Définir les variables nécessaires
# 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
Ajouter un schéma
Avant d'insérer des données dans la base de données Milvus Lite, nous devons d'abord définir le champ de données, appelé ici schéma. En créant l'objet CollectionSchema
et en ajoutant le champ de données via add_field()
, nous pouvons contrôler notre type de données et leurs caractéristiques. Cette étape est obligatoire avant d'insérer des données dans Milvus.
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)
Créer un index
Pour chaque schéma, il est préférable d'avoir un index afin que l'interrogation soit beaucoup plus efficace. Pour créer un index, nous avons d'abord besoin d'un objet index_params
et nous ajoutons ensuite des données d'index sur cet objet IndexParams
.
# 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
)
Cette méthode est une fine enveloppe autour de l'implémentation officielle de Milvus(docs officielles).
Créer une collection
Après avoir défini tous les champs de données et les avoir indexés, nous devons maintenant créer notre collection de base de données afin de pouvoir accéder à nos données rapidement et précisément. Ce qu'il faut mentionner, c'est que nous avons initialisé enable_dynamic_field
à true pour que vous puissiez télécharger librement n'importe quelle donnée. Le coût est que l'interrogation des données peut être inefficace.
# Create Collection
milvus_client.create_collection(
collection_name=COLLECTION_NAME,
schema=schema,
index_params=index_params
)
Téléchargement de documents
Après avoir créé une collection, nous sommes prêts à la remplir de documents. Dans whyhow_rbr
, cette opération s'effectue à l'aide de la méthode upload_documents
de MilvusClient
, qui exécute les étapes suivantes sous le capot :
- Prétraitement: Lecture et division des fichiers PDF fournis en morceaux
- Intégration: Intégration de tous les morceaux à l'aide d'un modèle OpenAI
- Insertion: Téléchargement des encastrements et des métadonnées vers 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
)
Réponse aux questions
Nous pouvons maintenant passer à la génération augmentée de recherche.
# 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'])
Règles
Dans l'exemple précédent, chaque document de notre index a été pris en compte. Cependant, il peut parfois être avantageux de ne récupérer que les documents satisfaisant à certaines conditions prédéfinies (par exemple, filename=harry-potter.pdf
). Dans whyhow_rbr
via Milvus Lite, il est possible de le faire en ajustant les paramètres de recherche.
Une règle peut contrôler les attributs de métadonnées suivants
filename
nom du fichierpage_numbers
liste d'entiers correspondant aux numéros de page (indexation 0)id
identifiant unique d'un morceau (c'est le filtre le plus "extrême")- Autres règles basées sur des expressions booléennes
# 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'])
Dans cet exemple, nous créons d'abord une partition qui stocke les fichiers PDF relatifs à Harry Potter, et en effectuant une recherche dans cette partition, nous pouvons obtenir les informations les plus directes. Nous appliquons également des numéros de page comme filtre pour spécifier la page exacte sur laquelle nous souhaitons effectuer une recherche. N'oubliez pas que le paramètre filer doit suivre la règle booléenne.
Nettoyage
Enfin, après avoir mis en œuvre toutes les instructions, vous pouvez nettoyer la base de données en appelant drop_collection()
.
# Clean up
milvus_client.drop_collection(
collection_name=COLLECTION_NAME
)