Connectly
Engenharia2025-04-10

Quando seu agente de IA mente para você: enfrentando alucinações de LLM no mundo real

Por Sravan Jayanthi

Quando seu agente de IA mente para você: enfrentando alucinações de LLM no mundo real

Autores: Sravan Jayanthi, Joscha Koepke

Visão geral

Nós, da Connectly AI, estamos mergulhados na construção de IA conversacional de vendas e suporte ao cliente desde o início da era do ChatGPT. Depois de desenvolver vários agentes de IA em produção, incluindo o Sofia Lite e o Sofia V3, identificamos sistematicamente os principais pontos de dor em torno de alucinação e confiabilidade. Foi isso que nos levou a desenvolver o Sofia QA, o produto de IA mais recente da Connectly AI, construído sobre a vasta quantidade de dados reais e aprendizados de agentes de IA em produção para garantir alta confiabilidade e precisão dentro do bot. Por meio de um trabalho extenso de diagnóstico e mitigação de alucinação no design e na arquitetura do produto, o Sofia QA teve forte adoção e engajamento, com uma taxa de resposta de 77% em 25 mil sessões de usuários e feedback de clientes destacando uma experiência de configuração nota 5/5, resolução eficaz de dúvidas e melhora na qualidade das respostas.

Neste artigo, buscamos definir com precisão as falhas que observamos e nossa estratégia para avaliar e detectá-las durante o design e a implementação do Sofia QA.

Contexto

Nesta seção, destacamos as principais deficiências das versões anteriores do bot Sofia e categorizamos a natureza dos modos de falha. O termo alucinação tende a ser usado de forma genérica, descrevendo uma ampla gama de comportamentos. Nós definimos alucinação de um modelo de linguagem como o momento em que um modelo executa comportamentos ou faz afirmações que não podem ser verificadas ou sustentadas.

Sofia V3, uma arquitetura agêntica autônoma

Leia mais sobre o Sofia V3

A natureza pouco restrita da arquitetura agêntica do Sofia V3 dificultava alcançar um comportamento confiável e previsível em uma ampla gama de tarefas, desde respostas a perguntas em formato RAG até recomendações de produtos baseadas em imagem. Essa falta de restrição também resultou em falta de explicabilidade sobre as instruções geradas e a estratégia de execução do LLM, o que, por sua vez, dificultava treinar não especialistas sobre as capacidades do bot e como ajustar seu comportamento.

Tabela 1: Análise de falhas agênticas

Análise dos modos de falha agênticos

Análise dos modos de falha agênticos

*Links acima*: AmiEnt, CLAMBER, mCoT, MAGICORE, Reflexion, PARC, HaluEval 2.0, CDQG, LLM Effective Negotiators, Hallucination Survey, PersuaBot, HiAgent, Sierra AI's Tau-bench, Claude 3.7, RuleBench

Tabela 2: Análise dos desafios de configuração para não especialistas

Dificuldade para não especialistas configurarem um app de IA agêntica

Dificuldade para não especialistas configurarem um app de IA agêntica

Sofia QA

O Sofia QA foi desenhado para enfrentar todos esses grandes desafios, fornecendo respostas factuais e baseadas em conhecimento, reduzindo a carga sobre os agentes de atendimento e entregando analytics claros para mostrar seu impacto. Ele é confiável, fácil de configurar, autoaprimorável e sustentável sem exigir suporte de engenharia significativo.

Estratégias de atribuição

Técnicas de atribuição para Large Language Models (LLMs) buscam melhorar a confiabilidade factual ao ligar o texto gerado a fontes verificáveis. Esses métodos garantem que as respostas sejam sustentadas pelo conteúdo fornecido, reduzindo o risco subjacente de alucinação.

Estas foram as 3 estratégias que exploramos para atribuição:

  1. Citações inline na resposta -- essa abordagem integra citações diretamente nas respostas conforme elas são geradas, melhorando a transparência. O design de prompt de RAG da Nova estrutura os prompts para impor atribuições inline, orientando os LLMs a referenciar explicitamente as fontes recuperadas.
  2. Chain-of-Thought -- o CoT faz o LLM decompor seu processo de raciocínio, garantindo que ele use citações ligadas a evidências relevantes e de alta qualidade, em vez de fontes arbitrárias ou de baixa relevância. Esse método adiciona raciocínio extra sobre a abordagem de citação inline.
  3. Pós-atribuição (geração de citações com atribuição via LLM ou modelo de entailment) -- em vez de embutir citações durante a geração, essa abordagem aplica um modelo de atribuição depois que a resposta já foi redigida. LLMs ou modelos de entailment como o RoBERTa ou outros modelos de avaliação de alucinação (Patronus, MiniCheck) analisam as afirmações, associam-nas aos documentos recuperados e inserem citações posteriormente.

Experimentação

Usamos o Metrics-Driven Development para ter um dataset de baseline mensurável, sobre o qual desenhar e otimizar nosso sistema. Realizamos essa experimentação em uma amostra de dataset de clientes com mais de cento e vinte e uma perguntas em espanhol. Desenvolver esse framework de RAG exigiria identificar os métodos mais fortes de recuperação, citação e geração de resposta para esse caso de uso específico de RAG conversacional multilíngue.

A. Qualidade da recuperação

Exploramos 3 abordagens de recuperação:

  • Recuperação em uma única etapa (one-shot): essa técnica recupera informação em um único passo, usando uma abordagem de busca híbrida que combina busca vetorial esparsa e densa. É a técnica de recuperação mais simples e rápida.
  • Reranking: essa técnica envolve um passo inicial de recuperação, seguido por um passo de reranking que usa um LLM re-ranker para reordenar os resultados recuperados. Essa técnica pode melhorar a qualidade dos resultados, mas também pode gerar ruído e adicionar tempo extra.
  • Filtragem: essa técnica usa um LLM para filtrar os resultados recuperados, removendo os que são considerados irrelevantes. Essa técnica também pode melhorar a qualidade dos resultados, mas ao custo de tempo adicional de resposta.

Experimento 1: Qualidade de recuperação para diferentes técnicas de recuperação

Experimento 1: Qualidade de recuperação para diferentes técnicas de recuperação

Conclusão: há um trade-off de aumento no tempo de recuperação com os métodos de Reranker e Filtragem (pela chamada de LLM associada). Os melhores rankings finais vieram do uso do re-ranker. Porém, isso vem com um custo adicional extremamente alto em tempo de resposta.

B. Qualidade das citações

Calculamos a precisão das citações determinando a precisão das citações selecionadas em relação às citações de ground truth.

Experimento 2: Precisão de citação para diferentes técnicas de citação

Experimento 2: Precisão de citação para diferentes técnicas de citação

Conclusão: a estratégia de citação mais precisa envolve um passo de atribuição, que é marginalmente mais precisa do que CoT ou citações inline. Notavelmente, o Reranker com CoT parece performar pior em nosso dataset do que a recuperação one-shot comparável, o que sugere que não há melhora significativa na qualidade das citações a jusante ao usar o Reranker.

C. Métricas de qualidade da resposta

Separamos o dataset em Answerable (respondível), perguntas com uma resposta correspondente na base de conhecimento, e Redirect (redirecionamento), perguntas que exigem enviar um fallback ou direcionar para um agente humano. Para determinar quais dessas técnicas de citação e recuperação usar, utilizamos um crítico LLM-as-a-judge baseado em referência para avaliar as técnicas em uma escala de 1 a 4, com base no seguinte prompt:

LLM_AS_A_JUDGE_PROMPT = "Rate how well the generated response answers the user query in the conversation.
Provide reasoning in full sentences and then provide the rating.
Output just one number: 4 for strong, 3 for good, 2 for okay, or 1 for weak.
If the original response says it cannot find an answer or does not answer the user query and the generated response says {no_answer_string}, then both are in alignment and the rating should be 4.
If the conversation style is "Redirect", the generated response should say {no_answer_string} or redirect to the company contact information.
Conversation Style: {conversation_style}
Conversation: {conversation}
Assessement:
Lets think through step by step."
ONE_SHOT_RESPONSE_SYSTEM_PROMPT = "In this session, the model has access to search results and a user's question, your job is to answer the user's question using only information from the search results.
Remember to add a citation to the end of your response using markers like %[1]%, %[2]%, %[3]%, etc for the corresponding passage supports the response.
IMPORTANT: If the search results does not contain an answer to the question, you must state exactly "{default_fallback_message}".
IMPORTANT: If no passages support the response, do not cite any passages and state exactly "{default_fallback_message}"."
RESPONSE_USER_MESSAGE = "
{query}
Resource: Search Results: {search_results}"
COT_RESPONSE_USER_MESSAGE_1 = "
{query}
 Think step-by-step."
COT_RESPONSE_USER_MESSAGE_2 = "
{query}
 Please follow these steps:
1. {{Step 1}}
2. {{Step 2}}
…"
COT_RESPONSE_USER_MESSAGE_3 = "
{query}
Please follow these steps:
1. {{Step 1}}
2. {{Step 2}}
…
{{ User query}}
Think step by step first and then answer. Follow below format when responding
Response Schema:
<thinking>
( your thinking goes here )
</thinking>
<answer>
( your answer goes here )
</answer>"
COT_REFLECT_PROMPT = "You are an advanced reasoning agent that can improve based on self refection. You will be given a previous reasoning trial in which you were given a question to answer. You were unsuccessful in answering the question either because you guessed the wrong answer with Finish[<answer>] or there is a phrasing discrepancy with your provided answer and the answer key. In a few sentences, Diagnose a possible reason for failure or phrasing discrepancy and devise a new, concise, high level plan that aims to mitigate the same failure. Use complete sentences.
Previous trial:
{context}
Question: {question}
Reflection:"
COT_SIMPLE_AGENT_REFLECT_INSTRUCTION = "Solve a question answering task by having a Thought, then Finish with your answer. Thought can reason about the current situation. Finish[answer] returns the answer and finishes the task.
{context}
{reflections}
Question: {question}"

[Pré-filtragem] Reranking ou filtragem com LLM: o objetivo desse prompt é mudar a ordenação para que o contexto mais relevante apareça no topo. Ele também pode descartar contexto irrelevante, reduzindo informação confusa enviada ao LLM.

LLM_RERANKING_PROMPT = "Reorder the following list of passages based on how well they answer the user's query.
Include the ID of the passage in the output along with a reason for its ordering. Make sure all passages are included, do not exclude any. Delimit the output as a numbered list with the ID and reason. (Ex: ID: 123 | Reason: The answer is relevant to the query)
User Query: {query}
Passages: {context}
Reordered Passages:"

[Pós-filtragem] Filtrando frases da resposta: dada uma resposta fornecida pelo LLM, você pode usar um LLM para filtrar o conteúdo que não é sustentado pelas passagens.

ATTRIBUTION_RESPONSE_CITATION_PROMPT = "Add in-line text citations for each of the given statements in <statement> using the content in <response_context>. Remove any statements not supported by the content in <response_context>.
The in-line text citation should use markers like %[1]%, %[2]%, %[3]%, etc for the corresponding passage that supports the response.
If the response_context does not contain information that supports any of the statements, you must state exactly "{default_fallback_message}".
<response_context>
{response_context}
</response_context>
<statement>
{statement}
</statement>
Filtered Statement with Citations: "

Ajuste de parâmetros de geração do LLM

Decodificação com beam search: mudar a decodificação de greedy para beam search pode melhorar significativamente a qualidade das saídas.

Definir temperatura como 0: definir a temperatura como 0 garante um comportamento determinístico do LLM.

Diminuir a penalidade de comprimento: esses ajustes podem ser feitos quando as gerações estão muito longas ou muito curtas; em geral, respostas mais curtas favorecem gerações mais precisas.