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.

  1. Préparer les conditions préalables à la préparation des données et mettre en place l'expérience
  2. Traiter les documents d'entrée avec l'extraction de texte
  3. Configurer l'optimiseur RAG
  4. Réaliser l'expérience
  5. 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
  1. Installer et importer les modules et dépendances nécessaires. Par exemple :

    pip install 'ibm-watsonx-ai[rag]>=1.3.17'
    
  2. 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-mail username et votre mot de passe api_key.

    username = 'PASTE YOUR USERNAME HERE'
    api_key = 'PASTE YOUR API_KEY HERE'
    url = 'PASTE THE PLATFORM URL HERE'
    
  3. 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 username et password pour authentifier les services Watson Machine Learning.

    credentials = Credentials(
        username=***,
        password=***,
        url=***,
        instance_id="openshift"
    )
    
    client = APIClient(credentials)
    
  4. Créez un espace pour votre travail. Voir Créer un espace.

  5. Définir un espace par défaut. Par exemple :

    client.set.default_space("<Space GUID>")
    
  6. Préparer les documents de base.

  7. 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.

  1. 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)
    
  2. 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_ids doit 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

  1. Initialiser le service d'extraction de texte.

    from ibm_watsonx_ai.foundation_models.extractions import TextExtractionsV2
    
    extraction = TextExtractionsV2(api_client=client)
    
  2. 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']
    
  3. Obtenir les détails de l'emploi.

    extraction.get_job_details(job_id)
    
  4. 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]
)
Conseil : Vous pouvez modifier la configuration en utilisant les valeurs prises en charge fournies dans [Configuration parameters for experiment settings]( autoai-rag-settings.html #parameters).

É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.
Astuce :

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 ).