Por Sravan Jayanthi

Autores: Sravan Jayanthi, Joscha Koepke
En Connectly AI hemos estado inmersos en la construcción de IA conversacional de ventas y soporte al cliente desde el amanecer de la era ChatGPT. Después de desarrollar varios agentes de IA en producción, incluyendo Sofia Lite y Sofia V3, hemos identificado sistemáticamente los puntos de dolor clave en torno a la alucinación y la confiabilidad. Esto es lo que nos llevó a desarrollar Sofia QA, el último producto de IA de Connectly AI, construido sobre la gran cantidad de datos reales y aprendizajes de agentes de IA en producción para asegurar alta confiabilidad y precisión dentro del bot. A través del extenso trabajo realizado para diagnosticar y mitigar la alucinación dentro del diseño y la arquitectura del producto, Sofia QA ha tenido una fuerte adopción y retención, con una tasa de respuesta del 77% en 25 mil sesiones de usuario y comentarios de clientes que destacan una experiencia de configuración de 5/5, resolución efectiva de consultas y mejor calidad de respuesta.
En este blog, intentamos definir con precisión las fallas que observamos y nuestra estrategia para evaluar y detectarlas durante el diseño y la implementación de Sofia QA.
En esta sección, destacamos las principales deficiencias de las iteraciones anteriores del bot Sofia y categorizamos la naturaleza de los modos de falla. Las alucinaciones tienden a usarse como un término genérico sobrecargado que describe una amplia gama de comportamientos. Definimos la alucinación de un modelo de lenguaje como cuando un modelo realiza comportamientos o hace afirmaciones que no pueden verificarse ni respaldarse.
Lee para saber más sobre Sofia V3
La naturaleza sin restricciones de la arquitectura agéntica de Sofia V3 dificultaba lograr un comportamiento confiable y predecible en una amplia gama de tareas, desde responder preguntas en formato RAG hasta recomendaciones de productos basadas en imágenes. Esta falta de restricciones también resultó en una falta de explicabilidad respecto a las instrucciones generadas y la estrategia de ejecución del LLM, lo que a su vez dificultaba capacitar a personas no expertas sobre las capacidades del bot y cómo ajustar su comportamiento.
Tabla 1: Análisis de fallas agénticas

Análisis de los modos de falla agénticos
*Enlaces de arriba*: 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
Tabla 2: Análisis de los desafíos de configuración para no expertos

Dificultad para que los no expertos configuren una aplicación de IA agéntica
Sofia QA fue diseñada para abordar todos estos desafíos principales, proporcionando respuestas factuales basadas en conocimiento, reduciendo la carga de trabajo de los agentes de atención al cliente y ofreciendo analítica clara para mostrar su impacto. Es confiable, fácil de configurar, se automejora y es mantenible sin necesidad de soporte de ingeniería significativo.
Las técnicas de atribución para modelos de lenguaje grandes (LLM) buscan mejorar la confiabilidad factual vinculando el texto generado con fuentes verificables. Estos métodos asegurar que las respuestas estén respaldadas por el contenido proporcionado, reduciendo el riesgo subyacente de alucinación.
Estas fueron las 3 estrategias que exploramos para la atribución:
Aprovechamos el Desarrollo Impulsado por Métricas para tener un dataset base medible con el cual diseñar y optimizar nuestro sistema. Realizamos esta experimentación sobre un dataset de muestra de clientes con más de ciento veintiún preguntas en español. Desarrollar este framework de RAG requería identificar los métodos más sólidos de recuperación, citación y generación de respuestas para este caso de uso específico de RAG conversacional multilingüe.
A. Calidad de recuperación
Exploramos 3 enfoques de recuperación:

Experimento 1: calidad de recuperación para diferentes técnicas de recuperación
Conclusión: Hay una compensación entre el aumento del tiempo de recuperación con los métodos de Reranker y Filtrado (para la llamada al LLM asociada). Los mejores rankings finales provinieron de usar el re-ranker. Sin embargo, esto viene con un costo adicional extremadamente alto en tiempo de respuesta.
B. Calidad de las citas
Calculamos la precisión de las citas determinando la exactitud de las citas seleccionadas respecto a las citas de referencia (ground truth).

Experimento 2: precisión de citas para diferentes técnicas de citación
Conclusión: La estrategia de citación más precisa involucra un paso de atribución, que es marginalmente más precisa que CoT o las citas en línea. Notablemente, el Reranker con CoT parece rendir peor en nuestro dataset que la recuperación one-shot comparable, lo que sugiere que no hay una mejora significativa en la calidad de las citas al usar el Reranker.
C. Métricas de calidad de respuesta
Separamos el dataset en Respondibles, preguntas con una respuesta correspondiente en la base de conocimiento, y Redirección, preguntas que requieren enviar un mensaje de respaldo o dirigir a un agente humano. Para determinar cuál de estas técnicas de citación y recuperación usar, aprovechamos un crítico LLM-como-juez basado en referencia para calificar las técnicas en una escala de 1 a 4 según el siguiente 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}"
[Pre-filtrado] Reranking o filtrado por LLM: El objetivo de este prompt es cambiar el orden para que el contexto más relevante se muestre primero. También puede descartar contexto no relevante, de modo que se envíe menos información confusa al 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:"
[Post-filtrado] Filtrado de oraciones de la respuesta: Dada una respuesta proporcionada por el LLM, se puede usar un LLM para filtrar el contenido que no está respaldado por los pasajes.
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: "
Decodificación con búsqueda por haces (Beam Search): Cambiar la decodificación de greedy a beam search puede mejorar notablemente la calidad de las salidas.
Establecer la temperatura en 0: Establecer la temperatura en 0 asegura un comportamiento determinista del LLM.
Disminuir la penalización de longitud: Se pueden ajustar si las generaciones son demasiado largas o cortas; generalmente, las respuestas más cortas fomentan generaciones más precisas.
©️ 2025 Todos los derechos reservados. Connectly Inc. Creado con ❤️, globalmente.