#Descomplicando a IA

Bee Smart – RAG demo com watsonx.ai e watson.data

Compartilhe:

Esta demonstração usa a API (application programming interface) de serviços de embeddings watsonx disponível para implementar um fluxo de RAG. Os modelos de embeddings disponíveis em watsonx.ai (veja mais sobre watsonx.ai aqui) criam embeddings de texto que capturam o significado de frases ou passagens para uso em seus aplicativos de IA generativa.

A conversão de texto em embeddings ajuda na comparação de documentos, na resposta a perguntas e em tarefas de geração aumentada de recuperação (RAGRetrieval Augmented Generation), onde você precisa recuperar conteúdo relevante rapidamente.

O que são embeddings?

Um embedding é uma representação numérica – ou vetorial – de uma frase ou passagem. Ao converter sentenças em vetores, as operações em sentenças tornam-se mais parecidas com operações matemáticas, algo que os computadores podem fazer rapidamente e bem.

Um modelo de embeddings cria uma representação vetorial de uma frase atribuindo valores numéricos que capturam o significado semântico da frase. O modelo também posiciona o vetor em um espaço multidimensional com base nos valores atribuídos. Embora o tamanho deste espaço dimensional varie conforme o modelo, todos os modelos posicionam os vetores de forma que as sentenças com significados semelhantes fiquem mais próximas umas das outras no espaço.

Alguns passos são necessários para esse processo:

  1. Tokenização: a frase é dividida em palavras individuais ou unidades de subpalavras (como morfemas) chamdas tokens em inglês.
  2. Embeddings de palavras: cada token é convertido em uma representação numérica de baixa dimensão chamada embedding em inglês.
  3. Agregação: várias técnicas, como cálculo de média, agrupamento ou uso de transformadores, são usadas para combinar embeddings de palavras em um embeddings de frase único. Essa incorporação reflete o significado e as relações combinadas dentro da frase.
  4. Normalização: o vetor resultante é geralmente normalizado para um comprimento específico, garantindo uma comparação uniforme entre diferentes sentenças.

O que é RAG?

O RAG é um padrão que surgiu com esse artigo, onde os autores mostram formas de incluir contexto adicional aos prompts para que as respostas dos grandes modelos de linguagem sejam mais condizentes com o domínio em questão. Isso é feito através de documentos que contém informações relevantes que são comparados com o que se deseja gerar como resposta. RAG é uma técnica que aumenta a precisão e a confiabilidade dos modelos de IA com fatos obtidos de fontes externas, diminuindo problemas como alucinação. Além disso, permite incorporar dados mais recentes do que os incluídos no treinamento do modelo na resposta.

Uma abordagem comum com RAG é criar representações vetoriais densas, embeddings, de seus dados, a fim de calcular a semelhança semântica com uma determinada consulta do usuário. A API do IBM Embeddings permite então pegar seus dados, integrá-los usando um modelo de incorporação, carregar os dados em um banco de dados vetorial e, em seguida, consultar esses dados.

Na demonstração presente nesse repositório, usamos os modelos de embeddings presentes no watsonx.ai, o banco de dados vetorial Milvus, presente no watsonx.data, e o modelo de linguagem granite, também presente no watsonx.ai para construir uma aplicação RAG.

A seguir o passo a passo para reproduzir essa demonstração tanto com o notebook presente no repositório, quando no prompt lab, disponível no watsonx.ai.

Pré requisitos para esse tutorial

Você vai precisar de uma conta no IBM Cloud que tenha acesso ao watsonx.ai com um projeto já criado. Veja como criar seu projeto no watsonx aqui. Para rodar o notebook dos passos a seguir, você vai precisar ter Python instalado na sua máquina. É recomendado o uso de virtualenvs para isolar as dependências de cada um projetos diferentes que você possa ter no seu ambiente local.

Criar a chave IAM API Key

Primeiro passo é pegar seu IAM token – vamos precisar dele tanto para a inferência dos modelos quanto para a autenticação no banco de vetores.

https://cloud.ibm.com/iam/apikeys

Crie uma chave nova, e salve em algum lugar o valor que é mostrado. Importante: você não vai conseguir ver novamente essa chave, então guarde-a em algum lugar seguro que você consiga consultar depois.

Instanciar watsonx.data

Depois vamos criar nossa instância de watsonx.data pelo IBM Cloud, o pacote lite permite o uso da instância de 2000 Resource Units.

Siga as telas de configuração, para esse tutorial, usei os valores padrão, por fim, clique em finish and go. Uma vez que criado, levará alguns minutos para concluir o provisionamento do watsonx.data.

Quando concluído, você poderá abrir um console com todos os serviços disponíveis no watsonx.data:

Vá em Infrastructure Manager e selecione add component; procure por Milvus na barra de busca. Clique em Milvus e create.

Criar o serviço Milvus no watsonx.data

Depois, insira um nome para o serviço. Nessa tela é possível escolher o tamanho do seu serviço, de acordo com a necessidade da sua aplicação. Para essa demo, escolhi o pacote inicial, com os menores valores de tamanho de index.

Levará alguns minutos até o serviço do Milvus ser provisionado.

Uma vez criado, você conseguirá ver os detalhes do serviço. Para essa demo, precisaremos do host e da porta GRPC.

RAG através do Jupyter Notebook

Para rodar esse notebook você vai precisar clonar o repositório na sua máquina local, através do comando:

git clone https://github.com/flaviabeo/wx-rag-demo.git

No repositório você vai encontrar um notebook em português e outro em inglês. Usei o modelo granite-20b-multilingual, obtendo respostas para os prompts em ambas as línguas.

Depois, inclua na célula do topo, logo após os imports seu IAM API key que geramos anteriormente, e seu project_id do watsonx;

Configurar o notebook com o projeto

Para conseguir seu project_id, vá em “Projects” que pode ser encontrado na página inicial do watsonx.

Depois, selecione a aba “Manage” e você verá seu project_id, que vai precisar incluir no notebook.

Escolha seu modelo

Nas células logo abaixo de onde você vai colar seu token e seu project_id, você verá que o modelo de embeddings está sendo instanciado. Para esse exemplo usei o slate-125m-english-rtrvr, mas existem outros modelos disponíveis que você pode consultar aqui.

Inclua o contexto desejado

Em seguida, vamos incluir o contexto que queremos. Nesse exemplo estou usando um urlreader da biblioteca langchain, nele podemos passar links com as informações que queremos que nosso modelo responda sobre. Também com langchain, é possível quebrar o texto em partes, de forma a não perder o sentido do que cada parte está dizendo, antes de envia-las ao modelo de embeddings.

Nessa próxima célula, quebramos o texto, como mencionado acima, e usamos o modelo de embeddings instanciado anteriormente para transformar as partes de texto em representações de vetores.

Em seguida, vamos salvar esses vetores no nosso banco que criamos no watsonx.data. Passando nos parâmetros host e port os valores que conseguimos ver nas configurações de nossa instância do Milvus.

Criando o prompt template

Depois disso, criamos o template de prompt que receberá o contexto para ser enviado ao modelo de linguagem que vai gerar nossas respostas.

Nele, passamos as instruções de como o modelo deve interpretar o contexto e a pergunta que será feita logo após. Nas células seguintes, o método vai receber como parâmetro a pergunta que o usuário quer fazer, transformar essa pergunta em embeddings, e fazer uma busca no banco de dados vetorial pelos documentos que estiverem mais próximos do vetor que representa a pergunta no espaço vetorial. Os vetores retornados serão as representações dos textos que contém as informações mais relevantes em relação ao que foi perguntado, e estes textos serão incluídos no prompt para serem enviado ao modelo granite, para que ele gere o texto de resposta.

O método qa faz a busca dos embeddings mais próximos, e os inclui no prompt. Depois envia o prompt ao modelo, e retorna a resposta baseada nas instruções, na pergunta e no contexto.

RAG através do prompt lab

No prompt lab, você verá um ícone de upload, ao lado da barra para digitar no chat.

Aqui, podemos criar a base de contexto que queremos que o modelo tenha para responder o que for perguntado.

Vamos criar uma conexão com o Milvus que instânciamos anteriormente.

Criar uma conexão com Milvus pelo prompt lab

Use as credenciais criadas anteriormente para conectar com seu serviço Milvus no watsonx.data.

Escolha seu modelo

Crie um banco para os seus embeddings de documentos

Aqui você pode fazer o upload dos documentos que fazem parte do domínio do contexto que você quer que o modelo conheça a fim de responder perguntas.

Após isso, clique em create.

Seus documentos estarão disponíveis para consulta de contexto antes do modelo responder o que é pedido.

Você também verá de qual documento, se você forneceu mais de um, o modelo usou as referências para gerar as respostas.

Com esses passos, você terá duas formas de incluir seus documentos como contexto dos seus prompts para os modelos de linguagem. Baixe o notebook, teste através do prompt lab e comece já a criar suas aplicações com RAG

=) Até o próximo tutorial!

WatsonX Platform Engineer | Research Software Engineer

Leia mais sobre

Bee Smart – RAG demo com watsonx.ai e watson.data

Esta demonstração usa a API (application programming interface) de serviços de embeddings watsonx disponível para implementar um fluxo de RAG. Os modelos de embeddings disponíveis em watsonx.ai (veja mais sobre watsonx.ai aqui) criam embeddings de texto que capturam o significado de frases ou passagens para uso em seus aplicativos de IA generativa. A conversão de […]

Como o Autoscaling do IBM Kubernetes Pode Impedir a Interrupções das suas Aplicações.

Confrontados com o desafio de aplicações sendo encerradas inesperadamente, muitas organizações se deparam com a realidade de que seus ambientes de Kubernetes não estão preparados para lidar eficazmente com uma demanda inesperada. A causa raiz frequentemente aponta para uma falta crítica de recursos, onde nós (worker nodes) trabalhadores físicos ou virtuais estão sobrecarregados ou subutilizados, […]

Do Ataque à Recuperação de Grandes Incidentes

Replay de nosso evento online para você que não teve a oportunidade de acompanhar ao vivo e agora pode assistir o que rolou sobre Disaster Recovery e Backup em Nuvem – Descubra como as soluções IBM Cloud podem te ajudar a enfrentar os desafios da segurança cibernética e garantir a recuperação rápida após incidentes. Caso […]