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.
- Preparare i prerequisiti per la distribuzione del modello di fondazione personalizzato
- Distribuire il modello
- Preparare i dati di messa a terra
- Preparare i dati di valutazione
- Eseguire l'esperimento
- Esaminare i modelli e selezionare il migliore
Passo 1: Preparare i prerequisiti per la distribuzione del modello di fondazione personalizzato
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)
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>)
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)
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).
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)]
input_data_references
supporta fino a 20 istanze di DataConnection
.
Fase 4: preparazione dei dati di valutazione
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)
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)
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
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
efm_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)
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.
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.
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