Por qué la lista de «Fuentes» de tu chatbot de IA probablemente está mal

ai-agents

Casi todos los chatbots de soporte con IA muestran una fila de fuentes bajo sus respuestas. Es lo que hace que la respuesta parezca tener respaldo: de aquí lo saqué.

En la mayoría de las implementaciones, esa fila te miente. No con mala intención, pero responde a una pregunta distinta de la que hace el usuario.

Recuperado no es lo mismo que usado

Un chatbot con generación aumentada por recuperación (RAG) responde más o menos así: busca en la base de conocimiento, mete los mejores resultados en el contexto del modelo y lo deja escribir. La forma obvia de construir la fila de fuentes es mostrar lo que haya devuelto esa búsqueda.

Es lo que hace la mayoría de los productos, y falla de una manera concreta. Una búsqueda semántica devuelve diez candidatos porque diez es una cantidad razonable para que un modelo de lenguaje elija entre ellos. Luego el modelo los lee y usa uno. Mostrar los diez como fuentes le dice al usuario que diez artículos dieron forma a la respuesta, cuando nueve se descartaron.

El fallo es silencioso. Nadie abre un bug que diga «la fila de fuentes tiene demasiados elementos». Los usuarios simplemente aprenden, poco a poco, que la fila es decorativa, y dejan de leerla. Pagaste todo el coste de ingeniería de las citas y no recibiste nada de la confianza que debían darte.

El problema de listarlo todo

El fallo se vuelve más evidente en cuanto un usuario pregunta algo sobre la estructura.

«¿Sobre qué temas tienes artículos?»

Un buen asistente responde con una lista de tus artículos. Ahora la fila de fuentes contiene todos los artículos de tu centro de ayuda y repite, justo debajo de la respuesta, los mismos enlaces que ya están en ella. El usuario ve los mismos treinta títulos dos veces.

Ahí es donde la abstracción se rompe de forma visible, y merece tomarse en serio, porque revela el error real: la procedencia no se puede deducir de la recuperación. Hay que deducirla de lo que hizo el modelo.

Tres conjuntos, no uno

La solución es dejar de tratar esto como una sola lista. Detrás de cualquier respuesta hay tres conjuntos distintos de documentos:

Recuperados: todo lo que devolvió cualquier herramienta durante el turno. Es el conjunto que muestra la mayoría de los productos. Su función real es otra, e importante: es la lista de permitidos. Si el modelo cita un documento que nunca se recuperó, se inventó la referencia, y la descartas. Esa comprobación no es teórica. En mis propias pruebas, un modelo que transcribía treinta ID de documentos se equivocó en uno por un solo carácter; la comprobación lo detectó y se negó a convertir un ID corrupto en una fuente.

Citados: los documentos a los que la respuesta enlaza de verdad. Es lo que hace que las citas dentro del texto se puedan pulsar, y es la base honesta para cobrar por uso.

Consultados: los documentos cuyo texto leyó el modelo. Es el único conjunto que debe ir en una fila de fuentes.

El tercer conjunto es el que nadie calcula, y calcularlo no es difícil. Ya sabes qué herramienta devolvió cada documento. Algunas herramientas le dan al modelo contenido real: una búsqueda que devuelve fragmentos o una llamada de «obtener este documento» que devuelve el texto completo. Otras le dan un índice: listar las categorías, listar los artículos, explorar una sección. Esas devuelven títulos.

Así que:

  • El modelo abrió un documento completo → es una fuente, tanto si la respuesta lo enlaza como si no. Abrirlo es la procedencia. Si el modelo resume un artículo y olvida escribir un enlace en Markdown, es un descuido de formato, no una falta de pruebas.

  • Una búsqueda lo devolvió y la respuesta lo citó → es una fuente. La cita indica cuál de los diez candidatos se usó.

  • El modelo solo lo vio como título en un listado → nunca es una fuente, aunque la respuesta lo enlace.

Con esa regla, «¿qué artículos tienes?» produce una lista limpia de enlaces que funcionan y ninguna fila de fuentes, porque el modelo no leyó nada. Y «¿cómo configuro el SSO?» produce un párrafo con uno o dos chips debajo: los artículos que de verdad leyó.

El detalle de diseño que da problemas

Al implementar esto hay una trampa, y vale la pena nombrarla porque es fácil equivocarse de una forma que parece correcta hasta que un usuario hace clic en algo.

Tu array de fuentes suele cumplir dos funciones. Contiene los datos de los chips y es la tabla de búsqueda que hace que las citas dentro del texto se puedan pulsar: el manejador del clic busca el ID del documento de la cita en ese array y lo abre.

Así que no puedes reducir el array al conjunto consultado sin más. Si lo haces, todos los enlaces de una respuesta con un listado dejan de funcionar: se muestran como cita, tienen estilo de cita y no hacen nada al pulsarlos.

Mantén el conjunto completo de citados en el payload, marca cada elemento con un indicador y filtra solo en el momento de mostrarlos. Un booleano por fuente, filtrado al renderizar. Los enlaces siguen funcionando y los chips dicen la verdad.

Haz que el indicador sea opcional

Si publicas esto como un cambio de la API, haz que el campo sea opcional, no obligatorio, y trata un valor ausente como «sí, muéstralo».

Con esa sola decisión, un cliente antiguo con un servidor nuevo sigue funcionando, y un cliente nuevo con un servidor antiguo vuelve al comportamiento anterior en lugar de ocultar todas las fuentes. No vas a desplegar las dos partes en el mismo instante, y los usuarios conservan copias en caché de tu widget más tiempo del que te gustaría.

Por qué vale la pena el esfuerzo

Una fila de fuentes es una afirmación: esta respuesta salió de estos documentos. Si la afirmación se genera a partir de la recuperación, es aproximadamente cierta, y los usuarios acaban notándolo. Si se genera a partir de lo que el modelo leyó de verdad, es exactamente cierta, y se convierte en la forma más rápida de que tu equipo de soporte revise una respuesta que salió mal.

Hay una segunda ventaja. Cuando «sin fuentes» significa de forma fiable «el modelo no leyó nada», se convierte en una señal real. Una respuesta sin fuentes a una pregunta de fondo sobre el producto es un hueco en la documentación, y puedes filtrar esas respuestas y convertirlas en una cola de artículos por escribir.

Eso solo funciona si la fila significa algo.


El asistente de chat con IA de Kookee sigue esta regla: la fila Fuentes muestra los artículos en los que se basó una respuesta, y todos los artículos que la respuesta enlaza se siguen pudiendo pulsar. Consulta Cómo elige el asistente sus fuentes para los detalles, o Cómo crear un centro de ayuda para tu SaaS para el panorama general.