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:
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 ②