Codificación de un experimento RAG AutoAI con extracción de texto
Revise las directrices y los ejemplos de código para aprender a codificar un experimento RAG AutoAI utilizando la extracción de texto watsonx para procesar los documentos de entrada.
Puede utilizar la extracción de texto para procesar documentos de entrada para un experimento RAG de AutoAI. La extracción de texto transforma documentos empresariales de alta calidad con tablas, imágenes y diagramas en formato markdown. Los archivos markdown resultantes pueden utilizarse en un experimento RAG de AutoAI para mejorar la calidad de los patrones generados.
El servicio de extracción de texto utiliza la biblioteca cliente watsonx.ai Python (versión 1.1.11 o posterior). Para obtener más información sobre el uso de la extracción de texto de watsonx.ai Python SDK, consulte Extracciones de texto.
Siga estos pasos para utilizar la extracción de texto en su experimento RAG de AutoAI.
- Preparar los requisitos previos para preparar los datos y poner en marcha el experimento
- Procesar documentos de entrada con extracción de texto
- Configurar el optimizador RAG
- Ejecute el experimento
- Revise los patrones y seleccione el mejor
Paso 1: Preparar los requisitos previos para preparar los datos y poner en marcha el experimento
Prepare los requisitos previos para el experimento.
Instale e importe los módulos y dependencias necesarios. Por ejemplo:
pip install 'ibm-watsonx-ai[rag]>=1.1.11' pip install langchain-community==0.2.4
- Añadir credenciales de tareas. Véase Añadir credenciales de tarea.
- Añada el servicio watsonx.ai Runtime. Véase Creación de servicios.
- Introduzca su clave API. Véase Gestión de la clave API de usuario.
Utilice sus credenciales para inicializar el cliente. Por ejemplo:
from ibm_watsonx_ai import APIClient, Credentials credentials = Credentials( url = "https://us-south.ml.cloud.mydomain.com", api_key = "***********" ) client = APIClient(credentials)
Crea un proyecto o espacio para tu trabajo. Véase Crear un proyecto o Crear un espacio.
Obtiene el ID del proyecto o espacio. Véase Encontrar el ID del proyecto.
Establece un proyecto o espacio por defecto:
client.set.default_project("<Project ID>")
client.set.default_space("<Space GUID>")
- Preparar los documentos de puesta a tierra
- Preparar los datos de evaluación
Documentos de puesta a tierra
Prepare y conéctese a los documentos de base que utilizará para ejecutar el experimento AutoAI RAG con el servicio de extracción de texto.
Cree una conexión con Cloud Object Storage y obtenga el ID.
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)
Prepare dos activos de conexión, uno para la entrada y otro para la salida del servicio de extracción de texto.
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 OUTPUT FILENAME> ) ) result_data_reference.set_client(client)
Datos de evaluación
Para la introducción de datos de evaluación:
- Los datos deben estar en formato JSON con un esquema fijo con estos campos:
question
,correct_answer
,correct_answer_document_ids
correct_answer_document_ids
debe hacer referencia al archivo de salida del servicio de extracción de texto
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 OUTPUT 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 OUTPUT 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 OUTPUT FILENAME>
},
]
Preparar los datos de la evaluación:
import os, wget
from ibm_watsonx_ai.helpers import DataConnection
test_data_filename = "benchmarking_data_core_api.json"
test_data_path = f"https://github.com/IBM/watsonx-ai-samples/tree/master/cloud/data/autoai_rag{test_data_filename}"
if not os.path.isfile(test_data_filename):
wget.download(test_data_path, out=test_data_filename)
test_asset_details = client.data_assets.create(name=test_data_filename, file_path=test_data_filename)
test_asset_id = client.data_assets.get_id(test_asset_details)
test_data_references = [DataConnection(data_asset_id=test_asset_id)]
Paso 2: Procesar los documentos de entrada con extracción de texto
Inicializar el servicio de extracción de texto.
from ibm_watsonx_ai.foundation_models.extractions import TextExtractions extraction = TextExtractions( credentials=credentials, space_id=<Space GUID>, )
Ejecute el trabajo de extracción de texto.
from ibm_watsonx_ai.metanames import TextExtractionsMetaNames response = extraction.run_job( document_reference=input_data_reference, results_reference=result_data_reference, steps={ TextExtractionsMetaNames.OCR: { "process_image": True, "languages_list": ["en"], }, TextExtractionsMetaNames.TABLE_PROCESSING: {"enabled": True}, }, results_format="markdown", ) job_id = response['metadata']['id']
Obtenga detalles del trabajo.
extraction.get_job_details(job_id)
Cuando el estado sea
completed
, pase al paso siguiente.
Paso 3: Configurar el optimizador RAG
El objeto rag_optimizer
proporciona un conjunto de métodos para trabajar con el experimento AutoAI RAG. En este paso, introduzca los detalles para definir el experimento. Estas son las opciones de configuración disponibles:
Parámetro | Descripción | Valores |
---|---|---|
nombre | Especifique un nombre válido | Nombre de experimento |
descripción | Descripción del experimento | Si lo desea, describa el experimento |
modelos_de_incrustación | Modelos para probar | ibm/slate-125m-english-rtrvr intfloat/multilingual-e5-large |
métodos_de_recuperación | Métodos de recuperación a utilizar | simple recupera y clasifica todos los documentos pertinentes window recupera y clasifica un número fijo de documentos pertinentes |
modelos_de_fundación | Modelos de fundaciones para probar | Ver los modelos de la Fundación por tareas |
max_number_of_rag_patterns | Número máximo de patrones RAG a crear | 4-20 |
métricas_de_optimización | Nombre(s) de la(s) métrica(s) a utilizar para la optimización | faithfulness answer_correctness |
Este código de ejemplo muestra las opciones de configuración para ejecutar el experimento con la documentación 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]
)
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",
embedding_models=["ibm/slate-125m-english-rtrvr"],
foundation_models=["ibm/granite-13b-chat-v2","mistralai/mixtral-8x7b-instruct-v01"],
max_number_of_rag_patterns=5,
optimization_metrics=[AutoAI.RAGMetrics.ANSWER_CORRECTNESS]
)
Paso 4: Realice el experimento
Ejecute el optimizador para crear los patrones RAG utilizando las opciones de configuración especificadas. Utilice el resultado de la extracción de texto como entrada en su experimento RAG de AutoAI.
En este ejemplo de código para ejecutar un experimento Chroma, la tarea se ejecuta en modo interactivo. Puede ejecutar la tarea en segundo plano cambiando background_mode
a 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
)
Paso 5: 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.model_id |
---|---|---|---|---|---|---|---|---|---|
Pattern1 | 0.6802 | 0.5407 | 1.0000 | 512 | ibm/slate-125m-english-rtrvr | euclidiano | ventana | 5 | meta-llama/llama-3-70b-instruct |
Pattern2 | 0.7172 | 0.5950 | 1.0000 | 1024 | intfloat/multilingual-e5-large | euclidiano | ventana | 5 | ibm/granite-13b-chat-v2 |
Pattern3 | 0.6543 | 0.5144 | 1.0000 | 1024 | intfloat/multilingual-e5-large | euclidiano | sencillo | 5 | ibm/granite-13b-chat-v2 |
Pattern4 | 0.6216 | 0.5030 | 1.0000 | 1024 | intfloat/multilingual-e5-large | coseno | ventana | 5 | meta-llama/llama-3-70b-instruct |
Pattern5 | 0.7369 | 0.5630 | 1.0000 | 1024 | intfloat/multilingual-e5-large | coseno | ventana | 3 | mistralai/mixtral-8x7b-instruct-v01 |
Seleccione un patrón para probarlo localmente
El siguiente paso es seleccionar un patrón y probarlo localmente. Como Chroma está en memoria, debes volver a crear el índice del documento.
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)
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 comprender 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. - La página
indexing_inference_notebook.ipynb
contiene el código Python para construir un índice de base de datos vectorial, así como para construir 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 un 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 más información y ejemplos de código, consulte el cuaderno de servicio AutoAI RAG with watsonx Text Extraction.
Tema principal: Automatizar la búsqueda de un patrón RAG