0 / 0

Codificación de un experimento RAG AutoAI con un modelo de base personalizado

Última actualización: 06 may 2025
Codificación de un experimento RAG AutoAI con un modelo de base personalizado

Revise las directrices y los ejemplos de código para aprender a codificar un experimento RAG en AutoAI y a utilizar modelos de base personalizados.

El despliegue de modelos personalizados utiliza la biblioteca cliente watsonx.ai Python (versión 1.3.12 o posterior).

Siga estos pasos para utilizar un modelo de cimentación personalizado en su experimento RAG de AutoAI.

  1. Preparar los requisitos previos para la implantación del modelo de cimentación personalizado
  2. Despliegue el modelo
  3. Preparar los datos de puesta a tierra
  4. Preparar los datos de evaluación
  5. Ejecute el experimento
  6. Revise los patrones y seleccione el mejor

Paso 1: Preparar los requisitos previos para la implantación del modelo de cimentación personalizado

  1. Descargue la instantánea del modelo.

    from pathlib import Path
    from huggingface_hub import snapshot_download
    
    byom_cache_dir = Path("your", "model", "cache", "dir")
    
    if not byom_cache_dir.exists():
        raise FileExistsError("Please use the path which exists.")
    
    if byom_cache_dir.is_file():
        raise NotADirectoryError("Please use the path which points to a directory.")
    
    snapshot_download(HUGGING_FACE_MODEL_REPOSITORY, cache_dir=byom_cache_dir)
    
  2. Cree una conexión con Cloud Object Storage.

    from ibm_watsonx_ai import APIClient, Credentials
    
    credentials = Credentials(
                    api_key=<API_KEY>,
                    url=<WML_ENDPOINT>
                )
    
    client = APIClient(credentials=credentials,  project_id=<PROJECT_ID>)
    
  3. Conéctese a su S3Bucket.

    from ibm_watsonx_ai.helpers.connections import DataConnection, S3Location
    
    location = S3Location(bucket=BUCKET_NAME, path=BUCKET_MODEL_DIR_NAME)
    data_connection = DataConnection(location=location, connection_asset_id=DATASOURCE_CONNECTION_ASSET_ID)
    data_connection.set_client(api_client=client)
    
  4. Cargue los archivos del modelo en su sitio S3Bucket.

    model_files = byom_cache_dir / "model_dir_name" / "snapshots" / "snapshot_id"
    
    if not model_files.exists():
        raise FileExistsError("Please use the snapshot path which exists.")
    
    if model_files.is_file():
        raise NotADirectoryError("Please use the snapshot path which points to a directory.")
    
    for model_file in model_files.iterdir():
        
        # avoid uploading unnecessary files
        if model_file.name.startswith("."):
            continue
    
        data_connection.write(data=str(model_file), remote_name=model_file.name)
    

Paso 2: Desplegar el modelo

Para desplegar su modelo de base personalizado, siga los pasos indicados en la documentación Modelos personalizados.

Paso 3: Preparar los datos de conexión a tierra

Prepare y conecte a tierra los documentos que utilizará para realizar el experimento RAG. Para más detalles, véase Obtención y preparación de datos en un proyecto.

  • Formatos compatibles: PDF, HTML, DOCX, Markdown, texto sin formato
  • Conéctese a los datos de un bucket de Cloud Object Storage, a una carpeta de un bucket o especifique hasta 20 archivos.
  • AutoAI utiliza una muestra de documentos para realizar el experimento

Por ejemplo, para crear una conexión de datos cuando los documentos se almacenan en un bucket Cloud Object Storage :

from ibm_watsonx_ai.helpers import DataConnection, S3Location

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)

input_data_references = [DataConnection(
    connection_asset_id=cos_connection_id,
    location=S3Location(
        bucket=<BACKET_NAME>,
        path=<BACKET_PATH>
    )
)]

El siguiente ejemplo muestra cómo utilizar el activo de datos creado en el proyecto (o promovido al espacio).

Nota:

core_api.html es un ejemplo de archivo de documento de base utilizado en los cuadernos de muestra.

import os, wget

input_data_filename = "core_api.html"
input_data_path = f"https://ibm.github.io/watsonx-ai-python-sdk/{input_data_filename}"

if not os.path.isfile(input_data_filename): 
    wget.download(input_data_path, out=input_data_filename)
    
asset_details = client.data_assets.create(input_data_filename, input_data_filename)
asset_id = client.data_assets.get_id(asset_details)

input_data_references = [DataConnection(data_asset_id=asset_id)]
Consejo:

input_data_references admite hasta 20 instancias de DataConnection .

Paso 4: Preparar los datos de evaluación

  1. Descargue el documento granite_code_models.pdf .

    import wget
    
    data_url = "https://arxiv.org/pdf/2405.04324"
    byom_input_filename = "granite_code_models.pdf"
    wget.download(data_url, byom_input_filename)
    
  2. Preparar los datos de la evaluación.

    En correct_answer_document_ids, indique el nombre del archivo descargado.

    import json 
    
    local_benchmark_json_filename = "benchmark.json"
    
    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": [byom_input_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": [byom_input_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": [byom_input_filename]
        },
    ]
    
    with open(local_benchmark_json_filename, mode="w", encoding="utf-8") as fp:
        json.dump(benchmarking_data, fp, indent=4)
    
  3. Suba los archivos de evaluación a su cubo Cloud Object Storage.

    documents_dir_location = S3Location(bucket=BUCKET_NAME, path=byom_input_filename)
    documents_dir_data_connection = DataConnection(location=documents_dir_location, connection_asset_id=DATASOURCE_CONNECTION_ASSET_ID)
    documents_dir_data_connection.set_client(api_client=client)
    documents_dir_data_connection.write(data=byom_input_filename, remote_name=byom_input_filename)
    
    benchmark_file_location = S3Location(bucket=BUCKET_NAME, path=BUCKET_BENCHMARK_JSON_FILE_PATH)
    benchmark_file_data_connection = DataConnection(location=benchmark_file_location, connection_asset_id=DATASOURCE_CONNECTION_ASSET_ID)
    benchmark_file_data_connection.set_client(api_client=client)
    benchmark_file_data_connection.write(data=local_benchmark_json_filename)
    

Paso 5: Ejecutar el experimento RAG AutoAI con el modelo de cimentación personalizado

Ejecute el experimento con Python SDK. Para deployment_id, proporcione el ID de su modelo de base personalizado desplegado.

from ibm_watsonx_ai import Credentials
from ibm_watsonx_ai.experiment import AutoAI
from ibm_watsonx_ai.helpers.connections import ContainerLocation
from ibm_watsonx_ai.foundation_models.schema import (
        AutoAIRAGCustomModelConfig,
        AutoAIRAGModelParams
)

credentials = Credentials(
                api_key=<API_KEY>,
                url=<WML_ENDPOINT>
)

experiment = AutoAI(credentials, project_id=<PROJECT_ID>)

deployment_id = <DEPLOYMENT_ID> # custom foundation model deployment id 
deployment_project_id = <DEPLOYMENT_PROJECT_ID> # project ID where your custom foundation model has been deployed
custom_prompt_template_text = "Answer my question {question} related to these documents {reference_documents}."
custom_context_template_text = "My document {document}"

parameters = AutoAIRAGModelParams(max_sequence_length=32_000)
custom_foundation_model_config = AutoAIRAGCustomModelConfig(
    deployment_id=deployment_id,
    project_id=deployment_project_id, 
    prompt_template_text=custom_prompt_template_text, 
    context_template_text=custom_context_template_text, 
    parameters=parameters
)

rag_optimizer = experiment.rag_optimizer(
    name='AutoAI RAG - Custom foundation model experiment',
    description = "AutoAI RAG experiment with custom foundation model.",
    max_number_of_rag_patterns=4,
    optimization_metrics=['faithfulness'],
    foundation_models=[custom_foundation_model_config],
) 

container_data_location = DataConnection(
        type="container",
        location=ContainerLocation(
           path="autorag/results"
        ),
)

container_data_location.set_client(api_client=client)

rag_optimizer.run(
    test_data_references=[benchmark_file_data_connection],
    input_data_references=[documents_dir_data_connection],
    results_reference=container_data_location,
)

Para obtener los detalles del trabajo, utilice:

rag_optimizer.get_details()

Una vez completado el estado, puede pasar al siguiente paso.

Paso 6: Revisar los patrones y seleccionar el mejor

Una vez finalizado con éxito el experimento AutoAI RAG, puede revisar los patrones. Utilice el método summary para listar los patrones completados y la información de las métricas de evaluación en forma de Pandas DataFrame para que pueda revisar los patrones, clasificados según su rendimiento respecto a la métrica optimizada.

summary = rag_optimizer.summary()
summary

Por ejemplo, los resultados del patrón se muestran así:

Patrón media_corrección_respuesta fidelidad_media media_correccion_contexto chunking.chunk_size embeddings.model_id vector_store.distance_metric retrieval.method retrieval.number_of_chunks generation.deployment_id
Pattern1 0.6802 0.5407 1.0000 512 ibm/slate-125m-english-rtrvr euclidiano ventana 5 38aeef16-c69c-4858-ba69-42f97d965abc
Pattern2 0.7172 0.5950 1.0000 1024 intfloat/multilingual-e5-large euclidiano ventana 5 38aeef16-c69c-4858-ba69-42f97d965abc
Pattern3 0.6543 0.5144 1.0000 1024 intfloat/multilingual-e5-large euclidiano sencillo 5 38aeef16-c69c-4858-ba69-42f97d965abc
Pattern4 0.6216 0.5030 1.0000 1024 intfloat/multilingual-e5-large coseno ventana 5 38aeef16-c69c-4858-ba69-42f97d965abc
Pattern5 0.7369 0.5630 1.0000 1024 intfloat/multilingual-e5-large coseno ventana 3 38aeef16-c69c-4858-ba69-42f97d965abc

Seleccione un patrón para probarlo localmente

  1. Vuelva a crear el índice de documentos antes de poder seleccionar un patrón y probarlo localmente.

    Consejo:

    En el siguiente ejemplo de código, el índice se construye con los documentos core_api.html y fm_embeddings.html.

    from langchain_community.document_loaders import WebBaseLoader
    
    best_pattern = rag_optimizer.get_pattern()
    
    urls = [
        "https://ibm.github.io/watsonx-ai-python-sdk/core_api.html",
        "https://ibm.github.io/watsonx-ai-python-sdk/fm_embeddings.html",
    ]
    docs_list = WebBaseLoader(urls).load()
    doc_splits = best_pattern.chunker.split_documents(docs_list)
    best_pattern.indexing_function(doc_splits)
    
  2. Consulta el patrón RAG localmente.

    payload = {
        client.deployments.ScoringMetaNames.INPUT_DATA: [
            {
                "values": ["How to use new approach of providing credentials to APIClient?"],
            }
        ]
    }
    
    best_pattern.query(payload)
    

La respuesta del modelo es la siguiente:

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

Para recuperar un patrón específico, pase el número de patrón a rag_optimizer.get_pattern().

Revisión de los resultados de los experimentos en Cloud Object Storage

Si el estado final del experimento es fallido o error, utilice rag_optimizer.get_logs() o consulte los resultados del experimento para saber qué ha fallado. Los resultados de los experimentos y los registros se almacenan en la instancia predeterminada de Cloud Object Storage vinculada a su cuenta. Por defecto, los resultados se guardan en el directorio default_autoai_rag_out .

Los resultados se organizan por patrones. Por ejemplo:

|-- Pattern1
|      | -- evaluation_results.json
|      | -- indexing_inference_notebook.ipynb (Chroma)
|-- Pattern2
|    ...
|-- training_status.json

Cada patrón contiene estos resultados:

  • El archivo evaluation_results.json contiene los resultados de la evaluación de cada pregunta de referencia.
  • indexing_inference_notebook.ipynb contiene el código python para construir el índice de la base de datos vectorial, así como la función de recuperación y generación. El cuaderno presenta comandos para recuperar datos, crear fragmentos e incrustaciones, así como para recuperar fragmentos, crear preguntas y generar respuestas.
Nota:

El cuaderno de resultados indexing_notebook.ipynb contiene el código para incrustar e indexar los documentos. Puede acelerar la tarea de indexación de documentos cambiando vector_store.add_documents() a vector_store.add_documents_async().

Obtener cuaderno de inferencia e indexación

Para descargar un cuaderno de inferencia específico, utilice la dirección get_inference_notebook(). Si deja pattern_name vacío, el método descarga el cuaderno del mejor patrón calculado.

rag_optimizer.get_inference_notebook(pattern_name='Pattern3')

Para obtener más información y ejemplos de código, consulte el cuaderno Utilización de AutoAI RAG con un modelo de base personalizado.

Tema principal: Automatización de un patrón RAG con el SDK AutoAI