Codificación de un experimento AutoAI RAG con un almacén de vectores Chroma
Revise las directrices y ejemplos de código para aprender a codificar un experimento AutoAI RAG utilizando la base de datos Chroma en memoria por defecto como almacén de vectores.
Almacenamiento de contenidos vectorizados en una base de datos Chroma
Cuando configuras tu experimento AutoAI RAG y no especificas una conexión a un almacén de vectores, el contenido vectorizado se guarda en la base de datos Chroma predeterminada, en memoria. El contenido no persiste más allá del experimento, por lo que no es un método de producción viable para desplegar un patrón RAG. Sin embargo, proporciona una vía rápida para crear un patrón RAG.
Las siguientes secciones amplían el código de ejemplo anotado que se proporciona con el cuaderno Automatización del patrón RAG con la base de datos Chroma.
El cuaderno utiliza la watsonx.ai Python biblioteca cliente (versión 1.1.11 o posterior).
Siga estos pasos para codificar un experimento AutoAI RAG para su caso de uso.
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ñade 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.
Utilícelos 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 Buscar el ID del proyecto.
Establece un proyecto o espacio por defecto:
client.set.default_project("<Project ID>")
client.set.default_space("<Space GUID>")
Documentos de puesta a tierra
Prepare y conecte a tierra los documentos que utilizará para realizar el experimento RAG. Para obtener más información, consulte Obtención y preparación de datos en un proyecto.
- Formatos admitidos: PDF, HTML, DOCX, Markdown, texto sin formato
- Conéctese a los datos de un Cloud Object Storage bucket, 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
from ibm_watsonx_ai.helpers import DataConnection
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)
asset_id
input_data_references = [DataConnection(data_asset_id=asset_id)]
input_data_references
admite hasta 20 DataConnection
instancias.
Datos de evaluación
- Los datos de evaluación deben estar en formato JSON con un esquema fijo con estos campos:
question
,correct_answer
,correct_answer_document_ids
Por ejemplo:
[
{
"question": "What is the purpose of get_token()?",
"correct_answer": "get_token() is used to retrieve an authentication token for secure API access.",
"correct_answer_document_ids": [
"core_api.html"
]
},
{
"question": "How does the delete_model() function operate?",
"correct_answer": "delete_model() method allows users to delete models they've created or managed.",
"correct_answer_document_ids": [
"core_api.html"
]
}
]
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/blob/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: 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 relevanteswindow recupera y clasifica un número fijo de documentos relevantes |
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 3: Ejecutar el experimento
Ejecute el optimizador para crear los patrones RAG utilizando las opciones de configuración especificadas. En este ejemplo de código para ejecutar un experimento Chroma, la tarea se ejecuta en modo interactivo. Puedes ejecutar la tarea en segundo plano cambiando el background_mode
a True.
run_details = rag_optimizer.run(
input_data_references=input_data_references,
test_data_references=test_data_references,
background_mode=False
)
Paso 4: Revisar los patrones y seleccionar el mejor
Una vez finalizado con éxito el experimento RAG AutoAI, 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 un Pandas DataFrame para que pueda revisar los patrones, clasificados según su rendimiento frente 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 ido mal. Los resultados de los experimentos y los registros se almacenan en la instancia predeterminada 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 para cada pregunta de referencia. - El
indexing_inference_notebook.ipynb
contiene el código python para construir el índice de la 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()
por vector_store.add_documents_async()
.
Obtener cuaderno de inferencia e indexación
Para descargar un cuaderno de inferencia específico, utilice 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')
Tema principal: Automatización de un patrón RAG con el SDK AutoAI