0 / 0

Codifica di un esperimento RAG AutoAI con un modello di fondazione personalizzato

Ultimo aggiornamento: 06 mag 2025
Codifica di un esperimento RAG AutoAI con un modello di fondazione personalizzato

Esaminate le linee guida e gli esempi di codice per imparare a codificare un esperimento RAG AutoAI e a usare modelli di fondazione personalizzati.

La distribuzione del modello personalizzato utilizza la libreria client watsonx.ai Python (versione 1.3.12 o successiva).

Seguire questi passaggi per utilizzare un modello di fondazione personalizzato nell'esperimento AutoAI RAG.

  1. Preparare i prerequisiti per la distribuzione del modello di fondazione personalizzato
  2. Distribuire il modello
  3. Preparare i dati di messa a terra
  4. Preparare i dati di valutazione
  5. Eseguire l'esperimento
  6. Esaminare i modelli e selezionare il migliore

Passo 1: Preparare i prerequisiti per la distribuzione del modello di fondazione personalizzato

  1. Scaricate l'istantanea del modello.

    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. Creare una connessione a 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. Collegarsi al sito 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. Caricare i file del modello sul sito 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)
    

Fase 2: Distribuzione del modello

Per distribuire il modello di base personalizzato, seguire i passaggi descritti nella documentazione sui modelli personalizzati.

Fase 3: preparazione dei dati di messa a terra

Preparare e collegare i documenti di messa a terra che verranno utilizzati per eseguire l'esperimento RAG. Per ulteriori informazioni, vedere Ottenere e preparare i dati in un progetto.

  • Formati supportati: PDF, HTML, DOCX, Markdown, testo normale
  • Collegatevi ai dati di un bucket Cloud Object Storage, a una cartella di un bucket o specificate fino a 20 file.
  • AutoAI utilizza un campione di documenti per l'esecuzione dell'esperimento

Ad esempio, per creare una connessione dati quando i documenti sono archiviati in 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>
    )
)]

L'esempio seguente mostra come utilizzare la risorsa dati creata nel progetto (o promossa nello spazio).

Nota:

core_api.html è un esempio di file di documento di messa a terra utilizzato nei quaderni di esempio.

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)]
Suggerimento:

input_data_references supporta fino a 20 istanze di DataConnection .

Fase 4: preparazione dei dati di valutazione

  1. Scaricate il 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. Preparare i dati di valutazione.

    Per correct_answer_document_ids, indicare il nome del file scaricato.

    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. Caricare i file di valutazione nel proprio bucket 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)
    

Fase 5: Esecuzione dell'esperimento AutoAI RAG con il modello di fondazione personalizzato

Eseguire l'esperimento con Python SDK. Per deployment_id, fornire l'ID del modello di fondazione personalizzato distribuito.

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

Per ottenere i dettagli del lavoro utilizzare:

rag_optimizer.get_details()

Una volta completato lo stato, si può passare alla fase successiva.

Fase 6: Esaminare i modelli e selezionare il migliore

Dopo che l'esperimento AutoAI RAG è stato completato con successo, è possibile rivedere i modelli. Utilizzate il metodo summary per elencare i modelli completati e le informazioni sulle metriche di valutazione sotto forma di Pandas DataFrame, in modo da poter esaminare i modelli, classificati in base alle prestazioni rispetto alla metrica ottimizzata.

summary = rag_optimizer.summary()
summary

Ad esempio, i risultati dei modelli vengono visualizzati in questo modo:

Modello correttezza_media_delle_risposte media_fedeltà correttezza_del_contesto 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 euclideo finestra 5 38aeef16-c69c-4858-ba69-42f97d965abc
Pattern2 0.7172 0.5950 1.0000 1024 intfloat/multilingual-e5-large euclideo finestra 5 38aeef16-c69c-4858-ba69-42f97d965abc
Pattern3 0.6543 0.5144 1.0000 1024 intfloat/multilingual-e5-large euclideo semplice 5 38aeef16-c69c-4858-ba69-42f97d965abc
Pattern4 0.6216 0.5030 1.0000 1024 intfloat/multilingual-e5-large coseno finestra 5 38aeef16-c69c-4858-ba69-42f97d965abc
Pattern5 0.7369 0.5630 1.0000 1024 intfloat/multilingual-e5-large coseno finestra 3 38aeef16-c69c-4858-ba69-42f97d965abc

Selezionare un modello da testare localmente

  1. Ricreare l'indice del documento prima di poter selezionare un modello e testarlo localmente.

    Suggerimento:

    Nel seguente esempio di codice, l'indice viene costruito con i documenti core_api.html e 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. Interrogare il modello RAG a livello locale.

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

La risposta del modello è la seguente:

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

Per recuperare un modello specifico, passare il numero del modello a rag_optimizer.get_pattern().

Esaminare i risultati degli esperimenti in Cloud Object Storage

Se lo stato finale dell'esperimento è fallito o errato, utilizzare rag_optimizer.get_logs() o fare riferimento ai risultati dell'esperimento per capire cosa è andato storto. I risultati degli esperimenti e i registri vengono memorizzati nell'istanza predefinita di Cloud Object Storage collegata al vostro account. Per impostazione predefinita, i risultati vengono salvati nella directory default_autoai_rag_out .

I risultati sono organizzati per modello. Ad esempio:

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

Ogni schema contiene questi risultati:

  • Il file evaluation_results.json contiene i risultati della valutazione per ogni domanda di benchmark.
  • Il sito indexing_inference_notebook.ipynb contiene il codice python per la costruzione dell'indice del database vettoriale e della funzione di recupero e generazione. Il quaderno introduce i comandi per il recupero dei dati, il chunking e la creazione di embeddings, nonché per il recupero di chunks, la costruzione di prompt e la generazione di risposte.
Nota:

Il notebook dei risultati indexing_notebook.ipynb contiene il codice per l'incorporazione e l'indicizzazione dei documenti. È possibile accelerare l'attività di indicizzazione dei documenti cambiando vector_store.add_documents() in vector_store.add_documents_async().

Ottenere il quaderno di inferenza e indicizzazione

Per scaricare un quaderno di inferenza specifico, utilizzare il comando get_inference_notebook(). Se si lascia vuoto pattern_name , il metodo scarica il blocco note del miglior modello calcolato.

rag_optimizer.get_inference_notebook(pattern_name='Pattern3')

Per ulteriori informazioni ed esempi di codice, consultare il notebook Utilizzo di AutoAI RAG con modelli di fondazione personalizzati.

Argomento principale: Automatizzazione di un modello RAG con l'SDK AutoAI