Um Agente Conversacional capaz de auxiliar novos funcionários na empresa Tech4Humans durante o processo de integração.
O agente utiliza de ferramentas de LLMs e RAG, fornecendo funcionalidades para descrever com precisão informações internas da empresa, como a divisão de times, produtos, valores, visão e missão, utilizando de uma base documental, além de fornecer tutoriais e explicações sobre ferramentas internas e gerenciamento de eventos, através de pesquisas em tempo real e integração com sistema de calendário.
Minha solução utilizou como framework principal o LangGraph🦜🕸, uma ferramenta construida em cima do Langchain que permite criar agentes com um alto nível de controle sobre seus estados, memoria, interrupção, ações e se baseia na arquitetura em grafos.
A criação do agente se deve pela implementação das ferramentas auxiliares ao LLM e a criação do grafo que gerencia como o agente irá gerar cada subresposta e resposta final.
Com essa arquitetura cada nó performa uma ação, e criamos o controle de fluxo com suas arestas de conexão. Podemos controlar o estado do agente em cada parte e como atuar sobre ele, com diferentes ferramentas e diluindo as tarefas em sub objetivos e planos de caminho.
Para uma melhor organização, os componentes do grafo foi dividido em dois diretórios principais, chains e nodes. Chains são uma abstrtação que o LangCahin fornece para sequencias de chamadas com um LLM, tools ou processamento de dados, assim cada chain define o prompt para o llm, a chamada de alguma ferramenta, e a estrutura de mensagem de saída do llm, padronizando a forma de operação. Os nós utilizarão de seus rescpectivos chains para invokar a sequencia de chamadas, obter o resultados e tomar alguma ação sobre eles.
O conceito de Geração Aumentada de Recuperação (RAG) aprimora os resultados de um LLM ao integrar informações específicas e atualizadas, usando recuperação de dados de uma determinada base de conhecimento
No contexto do desafio a técninca de RAG foi necessaria para integrar ao LLM informações sobre a documentação da empresa que foi disponiblizada, pesquisa na web para obter respostas atualizadas das ferramentas externas e integração com o sistema de calendário.
Em meu desenvolvimento criei um agente que utiliza das ideias de
- Adaptive-RAG. Um "roteador", direciona a pergunta para diferentes abordagens de recuperação.
- Corrective-RAG. Mecanismo de fallback, plano alternativo para quando o contexto recuperado é irrelevante para solucionar a pergunta.
- Self-RAG. Um processo de avaliação, em que se classifica a resposta do agente como alucinação ou fora de contexto, e corrige a resposta.
A primeira etapa do agente com a entrada do usuário, é interpretar a questão com o llm principal e direcionar o fluxo do processo para determinado nó. Com a ideia do Adaptive-RAG, é possivel escolher a melhor ferramenta de recuperação para cada tipo e tarefa especifica.
Para o LLM conseguir utilizar as informações disponibilizadas sobre a empresa foi realizado as técnicas de Embedding junto a busca de similaridade em banco de vetores. Onde o texto do documento é dividido em multiplos tokens, diluindo o texto em pacotes menores, e estes recebem uma representação vetorial, os vetores são persistidos em um banco, e posteriormente, através de métricas de similaridade é possivel recuperar informações mais correlacionadas com o contexto.
-
O Embedding, foi utilizado o modelo embed-multilingual-v3.0, que cria embeddings de 1024 dimensões com um contexto com o máximo de 512 tokens.
-
Para o banco de vetores, foi utilizado o MongoDB Atlas, que fornece uma ferramenta de pesquisa vetorial em campos indexados. Vector Search
Além disso, na ideia do Corrective-RAG, após o nó de "retriever" extrair os melhores chunks dos documentos associados a questão, estes documentos são avaliados em um outro nó, julgando-os um a um se são relevantes no contexto ou não. Assim, a recuperação não se garante apenas pela busca por similaridade, mas ainda mais uma etapa de interpretação do LLM. Caso a recuperação se deu como totalmente irrelevante, o agente é direcionado ao web search, caso contrário ele se direciona para a geração da resposta final.
A integração com as pesquisas na web em tempo real se deu pela ferramenta Travily, que já possui integração com o framework do LangChain.
Para otimizar o processo, antes de chamar a api de busca, um nó de planejamento usa do LLM para através da questão do usário criar 3 melhores sentenças para pesquisar. Isso permite direcionar de forma precisa a pesquisa, introduzindo a interpretabilidade da questão pelo LLM. Assim a api realiza 3 melhores buscas e retorna em documentos a url da fonte junto com seu conteúdo relevante.
Para integração com sistema de calendário foi utilizado a api do google clound, que permite acessar e realizar ações com o Google Calendar. Criei uma interface que permite listar um determinado número de eventos a partir do dia atual, criar eventos e acessar informações básicas do usuário.
O nó responsável pelas ações de agenda, eventos, usa do LLM junto com uma pré coleta de informação, com os próximos 5 eventos e informações do usuario, para assim decidir entre as ações de listar, criar eventos ou somente informar algo. Com a decisão tomada, também gera os parâmetros necessários para a função escolhida, por exemplo, se foi decidido criar um evento ele cria todos os parâmetros necessários para usar o metodos de criação que a ferramenta fornece.
O nó final do agente é responsável por gerar a resposta final com o LLM e as informações de contexto recuperadas anteriormente, junto ao histórico de conversas.
Porém, na ideia do Self-RAG, a resposta final passa por uma avaliação, verificando se a resposta é realmente útil para o útil para a entrada do usuário. Caso seja, vá para o estado final, caso contrário é retornado para o nó de pesquisa.
A implementação está simplificada, para maior segurança e consistência, poderia haver um contador que inibisse do agente entrar em loop infinito, caso saia muito do contexto e não alcance uma boa respsota. Além disso, o escape para a pesquisa foi uma escolha rápida, por o nó ter uma boa probabilidade de obter informações, que pelo menos, parecem úteis.
A construção do agente final pode ser encontrado em agent
-
Instalação
Primeiramente clone o repositorio:
git clone https://github.com/samuellimabraz/Agent4ai.git
-
Dependências
É necessario um abiente com Python 3.10+ e realizar a instalação das dependencias que se encontra no arquivo de requerimentos:
pip install -r requirements.txt
-
Chaves de API
O projeto utiliza diferentes ferramentas que requerem de tokens de validação para acessa-lás.
- Groq: Plataforma que oferece a inferência rápida em nuvem com LPUs do LLM principal.
- Cohere: Fornece o modelo de Embedding utilizado para ferramenta de retriever.
- Tavily: Ferramenta de web search otimizada para RAG
- MongoDB: Banco de dados utilizado para consulta de vetores e armazenamento do histórico de conversa.
- Google Clound: Para ter acesso as funcionalidades do Google Calendar, mas também o ID da conta é utilizado para o gerenciamento de memória da conversa. Para simplificação, esse credenciamento é obrigatorio para inicialização do agente. Siga as intruções do link para configurar a conta.
Ao final, crie um arquivo
.env
com as chaves obtidas, ficará semelhante a isso:GROQ_API_KEY=... COHERE_API_KEY=... TAVILY_API_KEY=.. MONGODB_CONNECTION_STRING=...
-
Vá para o diretório principal:
cd Agent4ai
-
O agente foi disponibilizado através de uma API, com uso da FastAPI e uma interace gráfica com Gradio.
Para executar o projeto, utilize:
uvicorn app:app
Assim incializará a API, que fornece operações de POST para envio da mensagem de requisição e operação para limpeza do histórico de conversa. A documentação é disponibilizada com Swagger, que pode ser acessada em /docs
-
Para inciar a interface gráfica use:
python .\interface\gui.py
Demo: