Pular para conteúdo

ADR-007 — Agentic RAG como estratégia de recuperação de contexto no Chat de Atendimento

Status: 🟡 Proposto
Data: 2026-06-30

Contexto

O módulo AMS (Sustentação) prevê uma interface de chat no amIA Portal para que analistas e usuários finais obtenham respostas sobre chamados, procedimentos e base de conhecimento sem precisar navegar manualmente por documentos ou acionar um humano.

A arquitetura inicial considerada era um RAG tradicional com fluxo linear:

Portal → amIA Core → amIA Agents → amIA Ingest (busca vetorial) → LLM → resposta

Nesse modelo, a query do usuário é enviada diretamente ao amIA Ingest, que recupera chunks por similaridade semântica e os injeta no prompt do LLM para geração de resposta — sem qualquer avaliação de suficiência ou seleção dinâmica de fontes.

Limitações do RAG Tradicional identificadas

Limitação Impacto
Query enviada crua, sem enriquecimento Perguntas ambíguas ou incompletas geram recuperação ruim
Fonte única (Vector DB) Work Items, planos e dados estruturados do ADO não são consultados
Sem avaliação de qualidade Resposta gerada mesmo quando o contexto recuperado é insuficiente
Sem iteração Um único ciclo de recuperação — sem chance de refinamento

Alternativas avaliadas

# Opção Descrição
A RAG Tradicional Query → Ingest (pgvector) → LLM → resposta. Fluxo linear sem agente.
B Agentic RAG (escolhida) Agente orquestra: reescrita de query, seleção dinâmica de fonte, auto-avaliação de relevância e refinamento iterativo.
C Fine-tuning do modelo Treinar o LLM com dados do domínio. Descartado pelo custo, tempo e necessidade de retraining contínuo a cada atualização da base.

Decisão

Adotar Agentic RAG no amIA Agents como estratégia de recuperação de contexto para o chat de atendimento, implementando um loop agêntico com as etapas descritas abaixo.

Fluxo Adotado

flowchart TD
    U([👤 Usuário]) -->|mensagem| CHAT["amIA Portal\nInterface de Chat"]
    CHAT -->|POST /chat/message| CORE["amIA Core\nGateway de sessão"]
    CORE --> AGENTS

    subgraph AGENTS["amIA Agents — Loop Agêntico"]
        S1[Recebe query + histórico] --> S2
        S2["② Rewrite Query\nEnriquece com contexto da sessão"] --> S3
        S3{"④ Need More Details?\nContexto suficiente?"} -->|SIM| S5
        S3 -->|NÃO| S8
        S5{"⑤ Which Source?"} --> S8
        S8["⑧ LLM — Gera resposta"] --> S10
        S10{"⑩ Resposta relevante?"} -->|NÃO — refina| S2
        S10 -->|SIM| FINAL["⑪ Resposta Final"]
    end

    S5 -->|Vector DB| INGEST["amIA Ingest\npgvector · FAQs · Documents"]
    S5 -->|Tools & APIs| APIS["ADO Work Items\namIA Core API"]

    INGEST --> S8
    APIS --> S8
    FINAL --> CORE --> CHAT --> U

Etapas do loop agêntico

Etapa Responsável Descrição
① Query amIA Portal Mensagem do analista com histórico da sessão
② Rewrite Query amIA Agents (LLM) Reescreve e enriquece a query usando o histórico da conversa
④ Need More Details? amIA Agents Decide se o contexto disponível já é suficiente para responder
⑤ Which Source? amIA Agents Seleciona dinamicamente: Vector DB, Tools/APIs ou ambos
⑥ Sources amIA Ingest + ADO + amIA Core Busca semântica (FAQs, Documents) e dados estruturados (Work Items, Planos)
⑧ LLM amIA Agents Gera resposta com o contexto composto
⑩ Is the answer relevant? amIA Agents Auto-avalia a qualidade — se insuficiente, volta ao ②
⑪ Final Response amIA Core → amIA Portal Resposta validada entregue via streaming ao chat

Justificativa

Qualidade de recuperação adaptativa

A reescrita de query no passo ② permite que o agente corrija ambiguidades, expanda siglas do domínio (ex.: "AMS", "FCA") e incorpore contexto das mensagens anteriores da sessão — aumentando a precisão da busca vetorial no amIA Ingest sem depender de prompts perfeitos do usuário.

Seleção dinâmica de fontes

O RAG tradicional consulta apenas o Vector DB. No Agentic RAG, o agente decide qual fonte é mais adequada por query: para dúvidas procedimentais, consulta o amIA Ingest (FAQs e Documents); para contexto de chamados específicos, consulta o ADO ou a amIA Core API. Isso elimina a necessidade de indexar no pgvector dados que já existem em fontes estruturadas.

Auto-avaliação com refinamento iterativo

O passo ⑩ evita que respostas geradas com contexto insuficiente cheguem ao usuário. O agente avalia a relevância da resposta antes de entregá-la e, se necessário, itera com uma query refinada — algo impossível no modelo linear do RAG tradicional.

Aproveitamento da infraestrutura existente

A adoção de Agentic RAG não requer novos serviços. O amIA Agents (LangChain) já possui a capacidade de orquestrar ferramentas; o amIA Ingest já expõe busca vetorial; o ADO e o amIA Core já são integrados. A mudança é na lógica de orquestração dentro do amIA Agents, não na infraestrutura.

Por que não RAG Tradicional

  • Não há mecanismo para detectar que o contexto recuperado é irrelevante ou insuficiente
  • Fontes estruturadas (Work Items, Planos) não são acessíveis via busca vetorial com a mesma precisão
  • Queries mal formuladas comprometem toda a cadeia sem possibilidade de correção automática

Por que não Fine-tuning

  • Requer retraining contínuo a cada nova FAQ ou documento incorporado à base
  • Custo e tempo de treino incompatíveis com a cadência de atualização da base de conhecimento AMS
  • O Agentic RAG oferece atualização em tempo real via ingestão no amIA Ingest

Consequências

Positivas: - Respostas mais precisas mesmo para queries ambíguas ou incompletas - Dados estruturados (ADO, amIA Core) acessíveis no mesmo fluxo de chat sem reindexação - Base de conhecimento atualizada em tempo real via amIA Ingest — sem retraining - Loop de auto-avaliação reduz respostas incorretas entregues ao usuário

Negativas: - Latência maior que o RAG tradicional — múltiplas chamadas ao LLM por turno de conversa (rewrite, geração, avaliação) - Necessidade de guardrails para evitar loops infinitos de refinamento (máximo de iterações configurável) - Custo de tokens por mensagem é maior devido às chamadas intermediárias do agente

Convenções derivadas desta decisão: - O amIA Agents deve implementar um limite máximo de iterações do loop (ex.: 3 ciclos) antes de entregar a melhor resposta disponível, evitando loops infinitos - A seleção de fonte no passo ⑤ deve ser registrada no log de sessão para rastreabilidade e avaliação de qualidade - FAQs no padrão FCA registradas ao final de atendimentos (run.resolve_bug) devem ser ingeridas no amIA Ingest para estarem disponíveis como fonte vetorial no chat - O histórico de ChatSession persistido no schema ams (ver ADR-006) deve ser passado ao amIA Agents em cada turno para viabilizar o enriquecimento de contexto no passo ②