milvus-logo
LFAI
Home
  • Intégrations

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éation d'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 rapidement et précisément à nos données. 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 prix à payer 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 est réalisée à l'aide de la méthode upload_documents de MilvusClient. Cette méthode 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 intéressant 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 fichier
  • page_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
)

Traduit parDeepLogo

Try Managed Milvus for Free

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

Get Started
Feedback

Cette page a-t - elle été utile ?