Codage d'une expérience RAG AutoAI avec extraction de texte
Consultez les directives et les exemples de code pour apprendre à coder une expérience RAG AutoAI en utilisant l'extraction de texte watsonx pour traiter les documents d'entrée.
Vous pouvez utiliser l'extraction de texte pour traiter les documents d'entrée d'une expérience RAG AutoAI. L'extraction de texte permet de transformer des documents commerciaux de haute qualité contenant des tableaux, des images et des diagrammes en format markdown. Les fichiers markdown résultants peuvent ensuite être utilisés dans une expérience RAG à l'adresse AutoAI pour améliorer la qualité des modèles générés.
Le service d'extraction de texte utilise la bibliothèque client watsonx.ai Python (version 1.3.17 ou ultérieure). Pour plus d'informations sur l'utilisation de l'extraction de texte à partir de watsonx.ai Python SDK, voir Extractions de texte.
Suivez ces étapes pour utiliser l'extraction de texte dans votre expérience AutoAI RAG.
- Préparer les conditions préalables à la préparation des données et mettre en place l'expérience
- Traiter les documents d'entrée avec l'extraction de texte
- Configurer l'optimiseur RAG
- Réaliser l'expérience
- Examiner les modèles et sélectionner le meilleur
Étape 1 : Préparer les conditions préalables à la préparation des données et mettre en place l'expérience
Préparer les conditions préalables à l'expérience.
Avant d'utiliser l'exemple de code, vous devez effectuer la tâche de configuration suivante :
- Contactez votre administrateur Cloud Pak for Data et demandez-lui vos identifiants de compte
Installer et importer les modules et dépendances nécessaires. Par exemple :
pip install 'ibm-watsonx-ai[rag]>=1.3.17'Se connecter à Watson Machine Learning.
Authentifiez le service Watson Machine Learning sur IBM Cloud Pak for Data. Vous devez fournir l'adresse de la plateforme
url, votre adresse e-mailusernameet votre mot de passeapi_key.username = 'PASTE YOUR USERNAME HERE' api_key = 'PASTE YOUR API_KEY HERE' url = 'PASTE THE PLATFORM URL HERE'Utilisez-les pour initialiser le client. Par exemple :
from ibm_watsonx_ai import APIClient, Credentials credentials = Credentials( username = "username", api_key = "***********", url = "url", instance_id = "openshift" ) client = APIClient(credentials)Vous pouvez également utiliser vos
usernameetpasswordpour authentifier les services Watson Machine Learning.credentials = Credentials( username=***, password=***, url=***, instance_id="openshift" ) client = APIClient(credentials)Créez un espace pour votre travail. Voir Créer un espace.
Définir un espace par défaut. Par exemple :
client.set.default_space("<Space GUID>")Préparer les documents de base.
Préparer les données d'évaluation.
Documents de référence
Préparez et connectez les documents de mise à la terre que vous utiliserez pour réaliser l'expérience AutoAI RAG avec le service d'extraction de texte.
Créez une connexion à Cloud Object Storage et récupérez l'ID.
datasource_name = 'bluemixcloudobjectstorage' conn_meta_props= { client.connections.ConfigurationMetaNames.NAME: f"Connection to input data - {datasource_name} ", client.connections.ConfigurationMetaNames.DATASOURCE_TYPE: client.connections.get_datasource_type_id_by_name(datasource_name), client.connections.ConfigurationMetaNames.DESCRIPTION: "ibm-watsonx-ai SDK documentation", client.connections.ConfigurationMetaNames.PROPERTIES: { 'bucket': <BUCKET_NAME>, 'access_key': <ACCESS_KEY>, 'secret_key': <SECRET_ACCESS_KEY>, 'iam_url': 'https://iam.cloud.ibm.com/identity/token', 'url': <ENDPOINT_URL> } } conn_details = client.connections.create(meta_props=conn_meta_props) cos_connection_id = client.connections.get_id(conn_details)Préparez deux actifs de connexion, l'un pour l'entrée et l'autre pour la sortie du service d'extraction de texte.
text_extraction_input_filename = <TEXT EXTRACTION INPUT FILENAME> text_extraction_result_filename = <TEXT EXTRACTION RESULT FILENAME>from ibm_watsonx_ai.helpers import DataConnection, S3Location input_data_reference = DataConnection( connection_asset_id=cos_connection_id, location=S3Location( bucket=<BUCKET_NAME>, path=text_extraction_input_filename ), ) input_data_reference.set_client(client) result_data_reference = DataConnection( connection_asset_id=cos_connection_id, location=S3Location( bucket=<BUCKET_NAME>, path=text_extraction_result_filename ) ) result_data_reference.set_client(client)
Données d'évaluation
Pour l'entrée des données d'évaluation :
- Les données doivent être au format JSON avec un schéma fixe comprenant les champs suivants :
question,correct_answer,correct_answer_document_ids correct_answer_document_idsdoit faire référence au fichier de sortie du service d'extraction de texte
benchmarking_data = [
{
"question": "What are the two main variants of Granite Code models?",
"correct_answer": "The two main variants are Granite Code Base and Granite Code Instruct.",
"correct_answer_document_ids": [text_extraction_result_filename],
},
{
"question": "What is the purpose of Granite Code Instruct models?",
"correct_answer": "Granite Code Instruct models are finetuned for instruction-following tasks using datasets like CommitPack, OASST, HelpSteer, and synthetic code instruction datasets, aiming to improve reasoning and instruction-following capabilities.",
"correct_answer_document_ids": [text_extraction_result_filename],
},
{
"question": "What is the licensing model for Granite Code models?",
"correct_answer": "Granite Code models are released under the Apache 2.0 license, ensuring permissive and enterprise-friendly usage.",
"correct_answer_document_ids": [text_extraction_result_filename],
},
]
import os, json
test_filename = "benchmark.json"
if not os.path.isfile(test_filename):
with open(test_filename, "w") as json_file:
json.dump(benchmarking_data, json_file, indent=4)
test_data_reference = DataConnection(
connection_asset_id=cos_connection_id,
location=S3Location(bucket=<BUCKET_NAME>, path=test_filename),
)
test_data_reference.set_client(client)
# Upload file to the COS bucket
test_data_reference.write(test_filename)
test_data_references = [test_data_reference]
Étape 2 : Traitement des documents d'entrée par extraction de texte
Initialiser le service d'extraction de texte.
from ibm_watsonx_ai.foundation_models.extractions import TextExtractionsV2 extraction = TextExtractionsV2(api_client=client)Exécutez la tâche d'extraction de texte.
from ibm_watsonx_ai.metanames import TextExtractionsV2ParametersMetaNames from ibm_watsonx_ai.foundation_models.extractions import TextExtractionsV2ResultFormats response = extraction.run_job( document_reference=input_data_reference, results_reference=result_data_reference, parameters={ TextExtractionsV2ParametersMetaNames.OCR_MODE: "enabled", TextExtractionsV2ParametersMetaNames.LANGUAGES: ["en"] }, result_formats=TextExtractionsV2ResultFormats.MARKDOWN, ) job_id = response['metadata']['id']Obtenir les détails de l'emploi.
extraction.get_job_details(job_id)Si le statut est
completed, passez à l'étape suivante.
Étape 3 : Configuration de l'optimiseur RAG
L'objet rag_optimizer fournit un ensemble de méthodes pour travailler avec l'expérience RAG AutoAI. Dans cette étape, entrez les détails pour définir l'expérience. Pour les options de configuration disponibles, voir Paramètres de configuration pour les réglages de l'expérience.
Cet exemple de code montre les options de configuration pour exécuter l'expérience avec la documentation ibm- watsonx -ai SDK :
from ibm_watsonx_ai.experiment import AutoAI
experiment = AutoAI(credentials, project_id=project_id)
rag_optimizer = experiment.rag_optimizer(
name='DEMO - AutoAI RAG ibm-watsonx-ai SDK documentation',
description="AutoAI RAG experiment grounded with the ibm-watsonx-ai SDK documentation",
max_number_of_rag_patterns=5,
optimization_metrics=[AutoAI.RAGMetrics.ANSWER_CORRECTNESS]
)
Étape 4 : Exécuter l'expérience
Lancer l'optimiseur pour créer les modèles RAG en utilisant les options de configuration spécifiées. Utilisez le résultat de l'extraction de texte comme entrée dans votre expérience AutoAI RAG.
Dans cet exemple de code pour l'exécution d'une expérience Chroma, la tâche est exécutée en mode interactif. Vous pouvez exécuter la tâche en arrière-plan en remplaçant background_mode par True.
input_data_references = [result_data_reference]
rag_optimizer.run(
input_data_references=input_data_references,
test_data_references=test_data_references,
background_mode=False
)
Étape 5 : Examiner les modèles et sélectionner le meilleur
Une fois que l'expérience AutoAI RAG s'est achevée avec succès, vous pouvez passer en revue les modèles. Utilisez la méthode summary pour répertorier les modèles terminés et les informations sur les métriques d'évaluation sous la forme d'un site Pandas DataFrame afin de pouvoir examiner les modèles, classés en fonction de leur performance par rapport à la métrique optimisée.
summary = rag_optimizer.summary()
summary
Par exemple, les résultats du modèle s'affichent comme suit :
| Schéma | moyenne_des_réponses_correctes | fidélité moyenne | exactitude_du_contexte_moyen | chunking.chunk_size | embeddings.model_id | vector_store.distance_metric | retrieval.method | retrieval.number_of_chunks | generation.model_id |
|---|---|---|---|---|---|---|---|---|---|
| Pattern1 | 0.6802 | 0.5407 | 1.0000 | 512 | ibm/slate-125m-english-rtrvr | euclidienne | fenêtre | 5 | meta-llama/llama-3-70b-instruct |
| Pattern2 | 0.7172 | 0.5950 | 1.0000 | 1024 | intfloat/multilingual-e5-large | euclidienne | fenêtre | 5 | ibm/granite-13b-chat-v2 |
| Pattern3 | 0.6543 | 0.5144 | 1.0000 | 1024 | intfloat/multilingual-e5-large | euclidienne | simple | 5 | ibm/granite-13b-chat-v2 |
| Pattern4 | 0.6216 | 0.5030 | 1.0000 | 1024 | intfloat/multilingual-e5-large | cosinus | fenêtre | 5 | meta-llama/llama-3-70b-instruct |
| Pattern5 | 0.7369 | 0.5630 | 1.0000 | 1024 | intfloat/multilingual-e5-large | cosinus | fenêtre | 3 | mistralai/mixtral-8x7b-instruct-v01 |
Sélectionner un modèle à tester localement
L'étape suivante consiste à sélectionner un modèle et à le tester localement.
best_pattern = rag_optimizer.get_pattern()
Interroger le modèle RAG localement.
from ibm_watsonx_ai.deployments import RuntimeContext
runtime_context = RuntimeContext(api_client=client)
inference_service_function = best_pattern.inference_service(runtime_context)[0]
question = "How to use new approach of providing credentials to APIClient?"
context = RuntimeContext(
api_client=client,
request_payload_json={"messages": [{"role": "user", "content": question}]},
)
print(inference_service_function(context)["body"]["choices"][0]["message"]["content"])
La réponse du modèle se présente comme suit :
According to the document, the new approach to provide credentials to APIClient is by using the Credentials class. Here's an example:
from ibm_watsonx_ai import APIClient
from ibm_watsonx_ai import Credentials
credentials = Credentials(
url = "https://us-south.ml.cloud.ibm.com",
token = "***********",
)
client = APIClient(credentials)
This replaces the old approach of passing a dictionary with credentials to the APIClient constructor.
Pour récupérer un motif spécifique, transmettez le numéro du motif à rag_optimizer.get_pattern().
Obtenir un carnet d'inférence et d'indexation
Pour télécharger un cahier d'inférence spécifique, utilisez la fonction get_inference_notebook(). Si vous laissez pattern_name vide, la méthode télécharge le carnet du meilleur modèle calculé.
rag_optimizer.get_inference_notebook(pattern_name='Pattern3')
Pour plus d'informations et des exemples de code, reportez-vous au cahier de service RAG ( AutoAI ) avec le service d'extraction de texte ( watsonx ).