Codificação de um experimento AutoAI RAG com extração de texto

Analise as diretrizes e os exemplos de código para saber como codificar um experimento AutoAI RAG usando a extração de texto watsonx para processar documentos de entrada.

Você pode usar a extração de texto para processar documentos de entrada para um experimento AutoAI RAG. A extração de texto transforma documentos comerciais de alta qualidade com tabelas, imagens e diagramas em formato markdown. Os arquivos de marcação resultantes podem então ser usados em um experimento AutoAI RAG para melhorar a qualidade dos padrões gerados.

O serviço de extração de texto usa a biblioteca do cliente watsonx.ai Python (versão 1.3.17 ou posterior). Para obter mais informações sobre como usar a extração de texto do watsonx.ai Python SDK, consulte Extrações de texto.

Siga estas etapas para usar a extração de texto em seu experimento AutoAI RAG.

  1. Preparar os pré-requisitos para preparar os dados e montar o experimento
  2. Processar documentos de entrada com extração de texto
  3. Configurar o otimizador RAG
  4. Execute o experimento
  5. Analise os padrões e selecione o melhor

Etapa 1: Prepare os pré-requisitos para preparar os dados e configurar o experimento

Prepare os pré-requisitos para o experimento.

Antes de usar o código de amostra, você deve executar a seguinte tarefa de configuração:

  • Entre em contato com o administrador do site Cloud Pak for Data e solicite as credenciais da sua conta
  1. Instale e importe os módulos e dependências necessários. Por exemplo:

    pip install 'ibm-watsonx-ai[rag]>=1.3.17'
    
  2. Conecte-se a Watson Machine Learning.

    Autenticar o serviço Watson Machine Learning em IBM Cloud Pak for Data. Você precisa fornecer a plataforma url, seu username e seu api_key.

    username = 'PASTE YOUR USERNAME HERE'
    api_key = 'PASTE YOUR API_KEY HERE'
    url = 'PASTE THE PLATFORM URL HERE'
    
  3. Use-os para inicializar o cliente. Por exemplo:

    from ibm_watsonx_ai import APIClient, Credentials
    
    credentials = Credentials(
        username = "username",
        api_key = "***********",
        url = "url",
        instance_id = "openshift"
    )
    
    client = APIClient(credentials)
    

    Como alternativa, você pode usar seus endereços username e password para autenticar os serviços Watson Machine Learning.

    credentials = Credentials(
        username=***,
        password=***,
        url=***,
        instance_id="openshift"
    )
    
    client = APIClient(credentials)
    
  4. Crie um espaço para seu trabalho. Consulte Criação de um espaço.

  5. Defina um espaço padrão. Por exemplo:

    client.set.default_space("<Space GUID>")
    
  6. Prepare os documentos de aterramento.

  7. Preparar os dados de avaliação.

Documentos de base

Prepare e conecte-se aos documentos de aterramento que você usará para executar o experimento AutoAI RAG com o serviço de extração de texto.

  1. Crie uma conexão com Cloud Object Storage e obtenha o ID.

    datasource_name = 'bluemixcloudobjectstorage'
    
    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)
    
  2. Prepare dois ativos de conexão, um para a entrada e outro para a saída do serviço de extração de texto.

    text_extraction_input_filename = <TEXT EXTRACTION INPUT FILENAME>
    text_extraction_result_filename = <TEXT EXTRACTION RESULT FILENAME>
    
    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_result_filename
        )
    )
    result_data_reference.set_client(client)
    

Dados de avaliação

Para entrada de dados de avaliação:

  • Os dados devem estar no formato JSON com um esquema fixo com estes campos: question, correct_answer, correct_answer_document_ids
  • correct_answer_document_ids deve se referir ao arquivo de saída do serviço de extração 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_result_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_result_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_result_filename],
    },
]
import os, json

test_filename = "benchmark.json"

if not os.path.isfile(test_filename):
    with open(test_filename, "w") as json_file:
        json.dump(benchmarking_data, json_file, indent=4)

test_data_reference = DataConnection(
    connection_asset_id=cos_connection_id,
    location=S3Location(bucket=<BUCKET_NAME>, path=test_filename),
)
test_data_reference.set_client(client)

# Upload file to the COS bucket
test_data_reference.write(test_filename)

test_data_references = [test_data_reference]

Etapa 2: Processar documentos de entrada com extração de texto

  1. Inicialize o serviço de extração de texto.

    from ibm_watsonx_ai.foundation_models.extractions import TextExtractionsV2
    
    extraction = TextExtractionsV2(api_client=client)
    
  2. Execute o trabalho de extração de texto.

    from ibm_watsonx_ai.metanames import TextExtractionsV2ParametersMetaNames
    from ibm_watsonx_ai.foundation_models.extractions import TextExtractionsV2ResultFormats
    
    response = extraction.run_job(
        document_reference=input_data_reference,
        results_reference=result_data_reference,
        parameters={
            TextExtractionsV2ParametersMetaNames.OCR_MODE: "enabled",
            TextExtractionsV2ParametersMetaNames.LANGUAGES: ["en"]
        },
        result_formats=TextExtractionsV2ResultFormats.MARKDOWN,
    )
    
    job_id = response['metadata']['id']
    
  3. Obter detalhes do trabalho.

    extraction.get_job_details(job_id)
    
  4. Quando o status for completed, passe para a próxima etapa.

Etapa 3: Configurar o otimizador RAG

O objeto rag_optimizer fornece um conjunto de métodos para trabalhar com o experimento AutoAI RAG. Nessa etapa, insira os detalhes para definir o experimento. Para ver as opções de configuração disponíveis, consulte Parâmetros de configuração para as definições do experimento.

Este código de amostra mostra as opções de configuração para executar o experimento com a documentação do SDK do ibm- watsonx -ai:

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]
)
Dica: você pode modificar a configuração usando os valores compatíveis fornecidos em [Configuration parameters for experiment settings] ( autoai-rag-settings.html #parameters).

Etapa 4: Execute o experimento

Execute o otimizador para criar os padrões RAG usando as opções de configuração especificadas. Use o resultado da extração de texto como entrada em seu experimento AutoAI RAG.

Neste exemplo de código para executar um experimento Chroma, a tarefa é executada no modo interativo. Você pode executar a tarefa em segundo plano alterando o endereço background_mode para 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
)

Etapa 5: Analise os padrões e selecione o melhor

Após a conclusão bem-sucedida do experimento AutoAI RAG, você poderá analisar os padrões. Use o método summary para listar padrões concluídos e informações de métricas de avaliação na forma de um Pandas DataFrame para que você possa analisar os padrões, classificados de acordo com o desempenho em relação à métrica otimizada.

summary = rag_optimizer.summary()
summary

Por exemplo, os resultados do padrão são exibidos da seguinte forma:

Padrão correção_de_resposta_média fidelidade média correção_do_contexto_médio 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 janela 5 meta-llama/llama-3-70b-instruct
Pattern2 0.7172 0.5950 1.0000 1024 intfloat/multilingual-e5-large euclidiano janela 5 ibm/granite-13b-chat-v2
Pattern3 0.6543 0.5144 1.0000 1024 intfloat/multilingual-e5-large euclidiano simples 5 ibm/granite-13b-chat-v2
Pattern4 0.6216 0.5030 1.0000 1024 intfloat/multilingual-e5-large cosseno janela 5 meta-llama/llama-3-70b-instruct
Pattern5 0.7369 0.5630 1.0000 1024 intfloat/multilingual-e5-large cosseno janela 3 mistralai/mixtral-8x7b-instruct-v01

Selecione um padrão para testar localmente

A próxima etapa é selecionar um padrão e testá-lo localmente.

best_pattern = rag_optimizer.get_pattern()

Consultar o padrão RAG localmente.

from ibm_watsonx_ai.deployments import RuntimeContext

runtime_context = RuntimeContext(api_client=client)
inference_service_function = best_pattern.inference_service(runtime_context)[0]
question = "How to use new approach of providing credentials to APIClient?"

context = RuntimeContext(
    api_client=client,
    request_payload_json={"messages": [{"role": "user", "content": question}]},
)
print(inference_service_function(context)["body"]["choices"][0]["message"]["content"])

A resposta do modelo é semelhante a esta:

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

Para recuperar um padrão específico, passe o número do padrão para rag_optimizer.get_pattern().

Obter um notebook de inferência e indexação

Para fazer download de um notebook de inferência específico, use o endereço get_inference_notebook(). Se você deixar o endereço pattern_name vazio, o método fará o download do notebook do melhor padrão calculado.

rag_optimizer.get_inference_notebook(pattern_name='Pattern3')

Para obter mais informações e exemplos de código, consulte o notebook de serviço AutoAI RAG with watsonx Text Extraction.