IA generativa (GenAI)

Criação de aplicativos RAG de ponta a ponta com o Couchbase Vector Search

Modelos de idiomas grandesA tecnologia de inteligência artificial, popularmente conhecida como LLMs, é um dos tópicos mais debatidos no setor de IA. Todos nós estamos cientes das possibilidades e dos recursos do ChatGPT da OpenAI. Eventualmente, o uso desses LLMs em nosso benefício descobre muitas novas possibilidades usando os dados.

Mas não se pode esperar tudo dos LLMs devido às limitações de seu projeto e a muitos outros fatores. Mas usando o conceito de Pesquisa de vetores nos oferece um novo tipo de aplicativo chamado Aplicativos RAG (Retrieval Augmented Generation). Então, vamos ver o que são aplicativos RAG, como eles podem ser usados para resolver novos problemas, como podem ser desenvolvidos usando o Couchbase e ter uma visão geral detalhada de como o Vector Search ajuda a criar esses aplicativos.

Antes de entrarmos no histórico do aplicativo, aqui está um diagrama arquitetônico do que estamos construindo e como o LangChain está ligado a ele:

Geração aumentada de recuperação (RAG)

O RAG fornece uma maneira de aumentar o resultado de um LLM com informações direcionadas sem modificar o modelo subjacente em si, de modo que as informações direcionadas podem ser mais atualizadas do que o LLM, bem como específicas para uma determinada organização e setor. Isso significa que o IA generativa O sistema pode fornecer respostas contextualmente mais adequadas aos prompts, além de basear essas respostas em dados extremamente atuais. Vamos entender esse conceito usando um exemplo da vida real.

Digamos que você pertença à organização X, que tem uma tonelada de dados armazenados em seu banco de dados, e esteja encarregado de desenvolver um aplicativo que solicite a entrada do usuário e forneça a saída com base nos dados presentes em seu banco de dados.

Inicialmente, você pode pensar que isso parece fácil, certo? Se você conhece os LLMs e sabe como aproveitá-los de acordo com suas necessidades, então é uma tarefa simples. Basta escolher os LLMs da OpenAI ou os modelos Llama e Mistral, se quiser ser econômico, e simplesmente enviar as perguntas dos usuários para o LLM e obter os resultados. 

Mas há um grande problema aqui...

Por exemplo, vamos supor que você esteja usando o Llama 2 LLM 8B tipo.

Agora, esse modelo é treinado com quase todos os dados presentes na Internet pública. Você faz qualquer pergunta, até mesmo perguntas sobre sua organização X, e ele lhe dá a resposta correta mais próxima.

Agora vamos fazer uma pequena alteração na declaração de seu problema. A tonelada de dados que está presente em seu banco de dados não é mais pública, mas privada. Isso significa que o Llama 2 não tem conhecimento dos seus dados e você não dará mais as respostas corretas.

Tendo o cenário acima em mente, considere a pergunta do usuário, "Quais são as atualizações do componente C na organização X?"

Então, como resolver isso?

Você pode pensar: por que não passamos os dados completos presentes no banco de dados, juntamente com o prompt, para que o LLM possa usar os dados como contexto e responder à pergunta? Mas aqui está o grande problema: todos os LLMs têm uma restrição chamada limite de token. Sem entrar em detalhes sobre o que são tokens, etc., por enquanto considere 1 token == 1 palavra. 

Infelizmente, o limite de tamanho de token do Llama 2 é de 4096 tokens (palavras). Suponha que todos os dados presentes em seu banco de dados tenham 10 milhões de palavras, então será impossível passar todos os dados para fins de contexto. 

A solução para o problema acima é chamada de RAG. No RAG, selecionamos uma proporção de dados presentes no seu banco de dados que está intimamente relacionada à consulta do usuário. O tamanho da proporção é tal que:

Tamanho da proporção < limite de token

Agora, passamos os dados extraídos como contexto junto com a consulta e obtemos bons resultados. Isso é o RAG. Mas como obtemos a proporção de dados que está intimamente relacionada à consulta do usuário e, ao mesmo tempo, o tamanho não excede o tamanho do token? Isso é resolvido usando o conceito de Pesquisa de vetores.

O que é pesquisa vetorial?

A pesquisa vetorial aproveita o aprendizado de máquina (ML) para capturar o significado e o contexto de dados não estruturados, incluindo texto e imagens, transformando-os em uma representação numérica. Frequentemente usada para pesquisa semântica, a pesquisa vetorial encontra dados semelhantes usando algoritmos de vizinho mais próximo aproximado (ANN). 

O Couchbase versão 7.6.0 e superior vem com isso Recurso de pesquisa de vetores. O importante aqui é que não são necessárias bibliotecas, módulos e configurações externas. Basta ter pelo menos 1 pesquisa O nó faz o trabalho.

O Couchbase usa internamente o Estrutura FAISS fornecido pelo Facebook para realizar a pesquisa de vetores.

Criação de um aplicativo RAG

Agora vamos ao que realmente interessa: desenvolver um aplicativo RAG de ponta a ponta usando o Funcionalidade de pesquisa vetorial do Couchbase.

Neste passo a passo, vamos desenvolver um converse com seus PDFs aplicação.

Antes de prosseguir, há várias maneiras de criar o aplicativo. Uma dessas maneiras é usar a estrutura LangChain, que usaremos para desenvolver o aplicativo RAG.

Aplicativo 1: construção usando a estrutura LangChain

Etapa 1: Configuração de um banco de dados Couchbase 

Você pode configurar o servidor Couchbase no EC2, na máquina virtual, em sua máquina local, etc.

Siga este link para configurar o cluster do Couchbase. Certifique-se de que esses serviços estejam ativados; os outros são opcionais:

    • Dados
    • Pesquisa

Observação: Certifique-se de instalar Servidor Couchbase versão 7.6.0 ou superior para realizar a pesquisa vetorial. Além disso, desenvolveremos esse aplicativo usando Python no ambiente Mac OS.

Quando o cluster estiver em funcionamento, crie um novo projeto <project_name> e criar uma nova chamada de arquivo Python app.py.

Agora, no terminal do projeto, execute o comando abaixo:

Agora, vá para a interface do usuário e crie um bucket chamado projeto. Para este passo a passo, usaremos o padrão escopo e coleção.

Agora, há diferentes maneiras de gerar embeddings vetoriais. A mais popular delas é a OpenAI, que usaremos para gerar embeddings de vetores.

Copie o código abaixo para app.py:

Se você hospedou o Couchbase em uma VM, certifique-se de substituir a palavra localhost para o ip público da VM.

Etapa 2: Importar o índice de pesquisa

O recurso de pesquisa vetorial no Couchbase requer um índice de pesquisa para ser executado. Há várias maneiras de criar o índice, mas para facilitar e agilizar as coisas, abaixo está o JSON do índice. Copie o código abaixo e cole-o:

  • IU > Pesquisa > Adicionar índice (canto superior direito) > Importação

Index.json

Etapa 3: Carregando os dados

Agora é hora de armazenar todos os dados dos PDFs como partes, juntamente com suas incorporações vetoriais no banco de dados.


Observação: Leia isto blog detalhado sobre fragmentação, coleta de dados, etc.. É altamente recomendável ler o blog para ter uma compreensão clara do que será abordado nas etapas posteriores.


Há bibliotecas para diferentes tipos de documentos que você deseja carregar. Por exemplo, se seus dados de origem estiverem em .txt e, em seguida, adicione o seguinte código ao seu formato app.py:

Mas suponha que seu tipo de fonte seja PDF:

O LangChain oferece suporte não apenas para PDFs, mas também para vários tipos, como, por exemplo, PDFs: 

    • CSV
    • HTML
    • JSON
    • Markdown e muito mais

Saiba mais sobre Carregadores de documentos Langchain.

Etapa 4: Inferindo resultados

Agora estamos prontos para enviar consultas ao nosso aplicativo:

Aplicativo 2: Criando o aplicativo do zero

Antes de começar, conforme descrito na seção anterior, gire o cluster com um bucket chamado projeto. Além disso, siga a Etapa 2 da seção anterior, certificando-se de importar o índice de pesquisa.

Etapa 1: Configuração do Couchbase

Se você estiver usando os padrões, então seu app.py deve ter a seguinte aparência:

Agora que os links da coleção do Couchbase e o índice de pesquisa estão prontos, vamos passar para a parte de carregamento de dados.

Etapa 2: Carregamento de dados

Para manter as coisas modularizadas, crie um novo arquivo Python chamado load.py.

Há várias maneiras de extrair dados de PDFs. Para facilitar, vamos usar o pypdf do pacote Langchain:

load.py

Agora isso páginas é uma lista de blocos de texto extraídos do pdf. Vamos mesclar todo o conteúdo em uma única variável:

Antes de fazer o chunking, precisamos configurar o modelo de incorporação. Neste caso, vamos usar o modelo sentence-transformers/paraphrase-distilroberta-base-v1 de abraçar o rosto.

Esse modelo fornece incorporação de vetores de 768 dimensões.

load.py

Agora nosso modelo está pronto. Vamos enviar os documentos. Podemos usar o pacote divisor de texto de caracteres recursivo de Langchain.

Esse pacote fornece pedaços do tamanho fornecido e, em seguida, encontraremos a incorporação do vetor para cada pedaço usando o modelo acima e enviaremos o documento para o banco de dados.

Portanto, o documento terá dois campos:

load.py

Agora que nossos blocos estão prontos, podemos encontrar os embeddings para cada bloco e enviá-los para o banco de dados.

load.py

Onde será que o cb_coll veio? É o conector de coleção que criamos em app.py. Para passar, vamos embrulhar tudo isso em load.py para uma função que aceita cb_coll como parâmetro.

Então, finalmente, seu load.py deve ter a seguinte aparência:

Agora vamos para app.pyImporte isso e chame o load_data função.

app.py

Isso enviará os documentos no formato necessário e nosso índice de pesquisa também sofrerá alterações. Agora é hora de fazer a pesquisa vetorial.

Etapa 3: Pesquisa de vetores

No Couchbase, você tem várias maneiras de fazer isso, sendo uma delas o método Curl.

O resultado.stdout contém o k mais próximo IDs de documentos. Você pode estender o script para executar uma solicitação get em todos os IDs retornados e combinar os resultados para obter o contexto final. Em seguida, passamos esse contexto junto com o prompt para o LLM para obter os resultados desejados.

Referências

Receba atualizações do blog do Couchbase em sua caixa de entrada
Esse campo é obrigatório.

Autor

Postado por Sanjivani Patra - Engenheiro de software

Um comentário

Deixe um comentário