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.
- Preparar los requisitos previos para la implantación del modelo de cimentación personalizado
- Despliegue el modelo
- Preparar los datos de puesta a tierra
- Preparar los datos de evaluación
- Ejecute el experimento
- Revise los patrones y seleccione el mejor
Paso 1: Preparar los requisitos previos para la implantación del modelo de cimentación personalizado
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)
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>)
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)
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).
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)]
input_data_references
admite hasta 20 instancias de DataConnection
.
Paso 4: Preparar los datos de evaluación
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)
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)
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
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
yfm_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)
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.
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.
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