Como criar um ChatBot com RAG usando OpenAI e LangChain

12.63k views3535 WordsCopy TextShare
Daniel Romero
Neste vídeo, vamos construir um chatbot usando Retrieval Augmented Generation (RAG) do zero. Usaremo...
Video Transcript:
retrieval met Generation rag nesse vídeo Vamos criar um chatbot do zero usando essa técnica Vou Assumir que você não tem conhecimento prévio sobre a construção de um chatbot e no final dessa são você vai ser capaz de criar um chatbot usando modelo GPT da Open bem como qualquer outro modelo com Framework L esse chatbot vai ser capaz de responder perguntas relacionadas qualquer document Inter de uma empresa por exemplo então para começar eu vou mostrar rapidamente o que vamos construir Vamos criar um pipeline rag que basicamente recupera informações ah utiliza essas informações como contexto e gera respostas geralmente aplicações mais simples fazem uma consulta Direta em um llm para obter a resposta isso funciona bem para conhecimento geral ou conhecimento que o llm e viu antes na fase de treino mas nem sempre funciona bem o problema é que muitos llms não viram informações suficientes ah sobre tópicos que gostaríamos de entender por exemplo se eu perguntar o que tem de tão especial no modelo Mistral 7B e Executar a maioria dos llms não vai apresentar uma boa resposta no momento dessa gravação o Mistral é um modelo de linguagem recente que não foi incluído nos dados de treino na maioria desses llms então podemos dizer que a maioria dos llms não possuem familiaridade alguma com o termo M 7B como a a gente pode ver aqui na resposta do GPT 3. 5 Turbo ele geralmente fornecem informações incorretas ou inventam algo quando perguntadas sobre isso e é aqui que entra o retrieve algum met Generation eh justamente para evitar esse tipo de comportamento é frustrante quando llms que deveriam ser conhecedores sobre programação não conseguem responder corretamente a perguntas de conhecimento geral Esse é um exemplo de quando lnms não tem ideia eh do que você tá falando então se eu perguntar o que é quadrante quadrant é um sistema de banco de dados que indexa e recupera dados vetoriais em Alta Dimensão No entanto quando eu pergunto ao GPT 4 no open ai playground O que é quadrant ele diz que não encontra informações sobre o termo e que eu posso ter errado a digitação talvez então para esse llm tanto GPT 3. 5 Turbo quanto pro GPT 4 esse termo quadro eh não é o termo reconhecido isso claramente indica que o modelo não tem ideia do que é quadrant isso ocorre porque o conhecimento de um llm é limitado ao que foi aprendido durante o treinamento e não tem acesso ao mundo exterior como resultado a resposta que recebemos foi uma Alucinação e sim o termo técnico para esse comportamento é Alucinação Ok Ah Para começar vamos construir um chatbot que tem uma limitação específica para fazer isso nós vamos seguir uma notebook que eu preparei previamente a o link para esse notebook tá na descrição para começar vamos instalar alguns pacotes necessários usando PIP eu vou deixar aqui documentado na no notebook Quais são os pacotes necessários nesse caso o nosso exemplo depende fortemente da biblioteca leng Shen para usar os modelos GPT 3.
5 ou 4 da Open basicamente que é essencialmente apenas uma interface de chat ou uma abstração no leng Shen pra api da openi vou executar essa célula do Import vai carregar as dependências vou carregar a Instância da nossa abstração para utilizar o modelo GPT 3. 5 Turbo bom Lenin é uma ferramenta para ajudar e facilitar no desenvolvimento de aplicações de Inteligência Artificial mais complexos embora você também possa utilizar api da openi para obter acesso a vários modelos Lenin fornece componentes adicionais que podem ser facilmente integrados à sua aplicação Ok para inicializar nosso modelo de chat formatamos alguns objetos na estrutura típica dos modelos de chat da Open então ao utilizar ap da openi o chatlog é representado como uma lista de dicionários cada dicionário contém uma role e o conteúdo do texto correspondente formato do lengen é ligeiramente diferente mas segue uma estrutura semelhante temos o System message o rma message o ai message E assim se repete a ho System corresponde a System message a ho user corresponde a Human message e a ho assistant corresponde a ai message vamos executar e passar tudo isso para o nosso chat Object da Open a Ok executado e agora podemos observar a resposta gerada Então vou imprimir aqui a resposta com chat invoke e nas instruções no System message ou System prompt eu tenho a descrição informando você é um assistente útil que responde a perguntas no hma Message ou seja na Inter do usuário tô simulando já uma interação do usuário eu tenho escrito Olá bot Como você está hoje depois eu simulo uma resposta do que poderia ser a resposta da própria opini estou bem obrigado como posso ajudar depois eu faço outra pergunta simulando o usuário outra vez gostaria de entender o que é machine learning então o retorno que eu tive aqui é o retorno do ai message que é basicamente a resposta da Open a conforme a o histórico dessa conversa então ele responde o que é machine learning de maneira ida e aqui eu posso imprimir somente o conteúdo da mensagem então vou dar um print no content e agora eu tenho apenas o texto impl text da resposta machine learning é um campo da Inteligência Artificial que se concentra no desenvolvimento de algoritmos e modelos que permitem yada yada yada ok então beleza aqui eu recebi uma resposta sobre machine learning que eu solicitei antes não sei se a resposta é completamente precisa mas eu vou assumir que sim Como dito antes essa resposta é uma ai message que pode ser adicionada ao l log do chat para continuar a conversa Então vou adicionar na lista de mensagens vou fazer uma append nessa lista se eu dar uma conferida nas mensagens agora ou no histórico de interação com o chat eu tenho o System message foi declarado inicialmente lá no topo tem o humman message o ai message outro humman message que foi o meu a minha solicitação informando que eu gostaria de entender o que é machine learning e agora eu adicionei como ai message a resposta da Open então agora eu vou criar um novo prompt que faz uma pergunta diferente não vou mencionar machine learning dessa vez em vez disso eu vou perguntar sobre a diferença entre os termos supervisionado e não supervisionado sem mencionar a palavra aprendizado Ok adicionei o meu prompt com rilma message perguntando qual a diferença entre supervisionado e não supervisionado vamos dar uma olhada agora na resposta ok nesse modelo de chat confiamos no histórico das conversas anteriores para guiar as nossas respostas é por isso que adicionamos as respostas às mensagens seguidas pelo novo prompt antes de enviar todas pro GPT 3. 5 aqui dá para notar que o modelo menciona a diferença entre aprendizado supervisionado e não supervisionado mostrando um bom histórico ah de conversação perfeito agora temos o chatbot e foi relativamente fácil de montar não tem nada de complicado acontecendo aqui agora vamos nos aprofundar nas alucinações e entender porque elas ocorrem bom el alucinam por vários motivos um dos principais é que esses modelos dependem exclusivamente do conhecimento ou informação aprendidas durante o processo de treino Isso significa que um llm só sabe Ou melhor só tem acesso a informações que estão em seus dados de Treinamento esse modelo não aprende explorando o mundo ou seja eh se algo não estiver em seus dados de treino ele não vai saber e mesmo que esteja pode não ser preciso levando a ambiguidades de forma resumida o propósito de um llm é comprimir as informações de dados de treino e em um modelo interno do mundo conforme existia naquele conjunto de dados mas essa abordagem tem limitações porque só tem acesso a dados de treino é aqui que entra o rag para tentar resolver esse problema Esse componente do meio pode ser um pipeline rag uma busca no Google ou talvez uma comunicação com uma fonte externa ah como um banco de dados SQL por exemplo ele só se conecta apenas a a um subconjunto do mundo externo não ao mundo inteiro o objetivo aqui é habilitar um recurso que nosso llm atual não possui Esse llm é treinado em um conjunto de dados específico e só entende as coisas com base nesses dados esse tipo de conhecimento é chamado de conhecimento paramétrico porque é armazenado nos parâmetros do modelo esses parâmetros não são alterados durante o treinamento ou são congelados depois ou seja o llm só usa conhecimento paramétrico o que significa significa que não pode aprender coisas novas ou se adaptar a novas situações mas com rag é possível adicionar um componente de memória que pode eh ser modificado e atualizado ou seja uma memória de longo prazo isso vai permitir que nosso sistema se adapte a novas situações além do que o modelo já aprendeu no caso do rag é comum o uso de um banco de dados vetorial como banco de dados de conhecimento externo ou memória externa banco de dados com input no ldm tem a vantagem de adicionar excluir e gerenciar a memória e o conhecimento de uma aplicação ldm isso É bem interessante porque é quase Como gerenciar ou atualizar ah informações no cérebro de uma pessoa claro que isso pode parecer bem distópico mesmo assim é uma boa analogia pro que queremos fazer com ldms ok Aqui estamos usando um método chamado source knowledge que é diferente do conhecimento paramétrico porque o conhecimento não é armazenado nos parâmetros do modelo em vez disso O S nol pode ser entendido como qualquer coisa que foi enviado ao modelo via prompt ou seja qualquer informação passada pelo prompt é considerada source knowledge eu prefiro chamar isso de injeção de contexto ok ao adicional o Source knowledge Nossa aplicação llm fica assim no topo do nosso prompt geralmente Temos alguma instrução na parte inferior temos a consulta do usuário que pode ser uma pergunta e no meio inserimos a informação externa ou source knowledge e essa informação pode ser chamada de contexto documento e muitas outras coisas mas aqui vamos nos referir a ela como contexto antes de implementar o pipeline para essa tarefa vamos inserir manualmente uma mensagem em nosso modelo e observar o resultado vou adicionar uma pergunta o que tem de tão especial no m 7B e analisar a saída do modelo mais uma vez podemos ver que o modelo não está familiarizado com essa referência específica do M 7B e ele faz uma confusão tremenda chamando mist 7B div vinho Vamos tentar outra vou perguntar sobre llm Shen no leng Shen vou Executar a célula imprimir a resposta e aqui temos outro caso onde o modelo teve que modificar a resposta porque não conseguiu encontrar nenhuma informação específica sobre llm Shen no leng Shen OK agora vamos tentar usar a abordagem do source knowledge eu copiei algumas informações sobre llm Shen Ah no site do leng Shin aqui dá para ver que a informação é bastante longa extrair alguns detalhes relevantes sobre leng Shin Shin e llm Shin A ideia é concatenar todas essas informações para formar a nossa base de conhecimento então eu posso usar o mesmo prompt estruturado de antes e ver o que acontece Ok vamos tentar temos o prompt as instruções e o contexto agora eu vou alimentar a consulta no nosso chatbot veremos o que acontece llm Shin no leng Shin É um tipo comum de Shin que consiste em um prty template um modelo ou seja um LM ou um chat Model e assim por diante é quase Idêntica a informação no site mais apresentada Em um formato mais legível e adaptada a nossa pergunta específica bom recebemos uma resposta muito boa ao adicionar um texto ao prompt mas fazer isso toda vez não é prático nosso objetivo agora é encontrar uma forma de automatizar esse processo aplicando a muitos documentos e aqui que entra o rag nesse momento o objetivo é focar no componente de retrieve que não é tão complicado e pode ser implementado facilmente então para configurar o pipeline primeiro precisamos obter os dados vamos utilizar um conjunto de dados do huging Face que pode ser acessado no site deles Esse dataset foi criado extraindo o conteúdo dos artigos do Mel 7B não é um dataset grande mas pode servir pro nosso exemplo usaremos os chunks de texto que extraí de lá para criar nossa base de conhecimento e para construir essa base de conhecimento vou usar um Vector Database nesse caso quadrant e vou fazer isso da forma mais prática possível executando localmente em memória bom vou carregar inicialmente o dataset vamos precisar inicializar localmente e criar uma Collection usando o modelo de in berings mais atual da openi nesse exemplo e nesse caso o tex embedding Tex embedding 3M esses modelos de embedding da openi Como já expliquei em outros vídeos e fornecem representações numéricas do significado desse conteúdo semelhante a como os humanos interpretam um texto o tamanho desses vetores é conhecido como eding Dimension que determina o tamanho dos vetores produzidos pelo modelo é uma boa prática garantir que a dimensão que vamos utilizar esteja alinhada com o modelo e que a métrica escolhida também embora a métrica de cosseno possa ser utilizada com a maioria dos modelos de ining existem alguns casos onde a distância euclidiana funciona melhor em vez do Cosseno ou o produto escalar podemos usar esse modelo por meio da api da Open ou inicializar através do leng Shin nesse caso Vamos com o leng Shin antes de prosseguir vou fazer uma demonstração rápida do modelo de berens por meio do leng Shin eu trato as informações e divido em partes menores os chunks e cada Chunk pode ser enviado pro modelo J beres Vamos criar duas in berens enviando os documentos que tem aqui nesse exemplo esses documentos são equivalentes aos contextos mencionados anteriormente nesse caso são essencialmente pedaços de texto que servirão como parte da nossa base de conhecimento temos dois desses documentos aqui ou contextos e quando os transformamos recebemos como output dois em berings cada um desses inbs tem um output de 1536 dimensões agora vamos fazer isso no nosso dataset completo O paper do Mistral 7B Isso vai nos ajudar a extrair informações essenciais sobre cada um dos registros para começar primeiro eu vou carregar os dados com os dados carregados agora eu posso converter o conjunto de dados em um dataframe do pandas que contém várias colunas então vou fazer aqui dataset to pandas nós temos aqui um dataset com várias colunas para esse exemplo só vamos precisar de duas colunas Chunk e source Então vou isolar essas duas colunas aqui depois de isolar as colunas relevantes usaremos o módulo Data Frame loader para carregar os registros no formato de documentos do leng Shen isso vai simplificar todo o processo Então vamos dar uma olhada nessa formatação Aqui nós temos um Chunk no formato de documento do leng Shen então eu posso imprimir somente o conteúdo de texto ou page content desse documento e ter acesso ao texto propriamente dito do Chunk a mesma coisa para metadata aonde eu recebo um dicionário cuja aqui a source e o value é o end Point ou a URL de onde foi extraído esse Chunk agora vamos adicionar tudo isso ao Vector Database então aqui temos um Import específico do lchin para Vector Stores e só precisamos importar o quadrant para enviar os chunks pra minha coleção eu utilizo a função front documents especificando os meus documentos ou seja os chunks Ah o modelo de embis que vai ser utilizado para transformar os chunks em vetores e o end Point do meu cluster nesse caso eu configurei para rodar local em memória e o nome da minha Collection no caso chatbot vou executar isso ok estamos quase terminando o projeto falta conectar a base de conhecimento ao nosso llm então podemos emos testar a comunicação com o Vector Database e executar uma consulta para ver as informações que serão recuperadas eu tenho uma consulta o que tem de tão especial no m 7B por meio da função similarity search eu passo essa consulta e o limite de respostas que eu quero obter no caso k ig a 3 retornou três chunks mais similares ao que eu perguntei vimos anteriormente porque você não podia responder isso mas agora é diferente nesse caso passamos a consulta para nosso banco de dados vetorial ou Vector Store e retornamos os três registros mais similares semanticamente como você pode ver estamos obtendo esses chunks do artigo do mistr 7B é bom mas um pouco difícil de ler para evitar isso vamos deixar o llm lidar com isso eu vou configurar uma função de prompt personalizada para recuperar os três itens mais relevantes do Vector Database e utilizá-los para criar Ah o nosso source knowledge vamos inserir essas informações em um prompt melhorado e depois fornecer o output vamos melhorar nossa consulta incorporando o contexto abaixo e respondendo a pergunta então nós temos esse contexto e a consulta Ou seja a pergunta o que tem de tão especial no m trou saav MB e aqui agora é a nossa consulta modificada que podemos inserir em nosso chatbot do System prompt Eu apenas informo para o llm utilizar o contexto abaixo para responder a pergunta vamos inserir essas informações em um prompt melhorado e depois fornecer o output vamos melhorar nossa consulta incorporando o texto abaixo Ah e respondendo a pergunta essa é a instrução que vai ser encaminhada para o llm o System prompt use o contexto abaixo para responder a pergunta esse é o contexto extraído ou recuperado do Vector Database e essa é a pergunta original do usuário que tem Ed tão especial no mro 7B vamos criar uma nova reala message antes adicionar esse prompt customizado ao nosso histórico de chat e executar E agora temos uma resposta que é baseada no conteúdo do paper mistr 7B é um modelo de linguagem com 7 bilhões de parâmetros projetado para oferecer desempenho superior e eficiência pelo menos ele não tá dizendo que agora é um vinho acho que deu para você perceber o impacto do rag em uma aplicação no entanto implementar o rag pode ser algo ingênuo assumindo que toda consulta Exige uma pergunta isso é o que eu chamo de rag padrão e nem sempre é necessário por exemplo se um usuário cumprimentar o chatbot dizendo Oi tudo bem como você está o chatbot não precisa necessariamente consultar uma base de conhecimento externa para responder Além disso o tempo de inferência pode ser lento dependendo do modelo e da api escolhida Então essa é uma das desvantagens de usar essa abordagem mas há muitos benefícios podemos alcançar um melhor desempenho de retrieval obter uma riqueza de informações para nos ajudar a responder perguntas com maior precisão e fornecer citações para as nossas Fontes esse método é mais rápido e eficiente do que outras abordagens alternativas como Agents Além disso podemos filtrar o número de tokens tornando cada vez mais conveniente bem pensando em uma aplicação real se pararmos para pensar sobre o uso da openi teremos dois problemas o custo que pode subir rapidamente é um problema e o tempo de inferência que às vezes pode ser crítico pensando nisso eu preparei outro exemplo para tentar uma alternativa com bem mais rápida capaz de gerar cerca de 800 tokens por segundo vamos testar o grock para essa demonstração só precisaremos da chave de api que atualmente é gratuita e instalar um pacote então vou deixar registrado aqui no notebook PIP install leng rock Além disso eu gerei a chave de api e salvei já no meu arquivo dmf mas antes de trabalhar com api vamos dar uma olhada rápida no playground você pode fornecer uma mensagem de sistema aqui vou copiar Nossa mensagem de prompt e contexto em seguida a entrada do usuário o que tem de tão especial no m 7B Então vou copiar aqui do nosso notebook o System prompt e o contexto e eu vou Inserir a pergunta no campo do user message ah e o modelo eu posso escolher vou botar o Lhama 3.
Related Videos
Run ALL Your AI Locally in Minutes (LLMs, RAG, and more)
20:19
Run ALL Your AI Locally in Minutes (LLMs, ...
Cole Medin
53,995 views
Intro to RAG for AI (Retrieval Augmented Generation)
14:31
Intro to RAG for AI (Retrieval Augmented G...
Matthew Berman
58,142 views
Introducing Lindy 2.0 - The FIRST True AI-First Automation Platform
27:17
Introducing Lindy 2.0 - The FIRST True AI-...
MattVidPro AI
62,100 views
Building a RAG application from scratch using Python, LangChain, and the OpenAI API
1:12:39
Building a RAG application from scratch us...
Underfitted
73,426 views
O Meu Segredo do Conteúdo Criado com IA: usando Perplexity AI para criar conteúdo para SEO
19:36
O Meu Segredo do Conteúdo Criado com IA: u...
Luis Ottoni SEO - Rankrup
3,195 views
Como CRIAR AGENTES de IA com CrewAI - com ANIMAÇÕES!
22:29
Como CRIAR AGENTES de IA com CrewAI - com ...
CANAL SANDECO
27,320 views
Como usar o GPT com seus próprios dados?
27:42
Como usar o GPT com seus próprios dados?
Asimov Academy
77,041 views
Tutorial básico de Langchain - RAG - Retrieval Augmented Generation  - Vídeo 2
35:21
Tutorial básico de Langchain - RAG - Retri...
Carreira Inteligência Artificial
6,101 views
Melhores ferramentas para criar Agentes de IA (sem programar)
23:31
Melhores ferramentas para criar Agentes de...
NoCode StartUp
21,720 views
Por que você não deveria CONFIAR em IAs
15:28
Por que você não deveria CONFIAR em IAs
Ciência Todo Dia
524,044 views
Se não aprender PROGRAMAÇÃO com esse video. - ̗̀ DESISTE ̖́- Lucas Montano Reagindo
13:35
Se não aprender PROGRAMAÇÃO com esse video...
Lucas Montano
239,161 views
Introduction to LlamaIndex with Python (2024)
39:57
Introduction to LlamaIndex with Python (2024)
Alejandro AO - Software & Ai
15,432 views
Build an AI RAG Application with LangChain & Next.js
33:34
Build an AI RAG Application with LangChain...
Dave Gray
22,306 views
Mapas Mentais e Fluxogramas no ChatGPT (RESULTADOS INSANOS!)
18:46
Mapas Mentais e Fluxogramas no ChatGPT (RE...
Tiago Lemos
88,627 views
Desenvolva seu ChatGPT com Python: Integrando OpenAI, Langchain e Streamlit - Com RAG!
1:19:55
Desenvolva seu ChatGPT com Python: Integra...
DataWay BR
2,784 views
Como utilizar OpenAI Embeddings e Pinecone para busca semântica
10:56
Como utilizar OpenAI Embeddings e Pinecone...
Daniel Romero
7,323 views
Chatbot from scratch with Next, AI SDK, OpenAI, and Shadcn/UI
36:08
Chatbot from scratch with Next, AI SDK, Op...
Rocketseat
46,718 views
Como Criar um Segundo Cérebro com a Inteligência Artificial do Elon Musk
12:55
Como Criar um Segundo Cérebro com a Inteli...
Alan Nicolas
17,248 views
What is RAG? (Retrieval Augmented Generation)
11:37
What is RAG? (Retrieval Augmented Generation)
Don Woodlock
142,947 views
API do Novo GPT-4o Mini da OpenAI é Excelente E Quase de Graça
6:43
API do Novo GPT-4o Mini da OpenAI é Excele...
Inteligência Mil Grau
5,539 views
Copyright © 2024. Made with ♥ in London by YTScribe.com