Por Sravan Jayanthi

Autores: Sravan Jayanthi, Joscha Koepke
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.
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.
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
*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
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.
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:
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:

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
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: "
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.
©️ 2025 Todos os direitos reservados. Connectly Inc. Desenvolvido com ❤️, globalmente.