Pruebas y errores al agregar una función de fact-checking con IA a una comunidad política
(app.uhheung.kr)Hola.
Soy el desarrollador que hace unos 6 meses les presentó Uhheung, un servicio de participación ciudadana para consultar proyectos de ley de forma sencilla y dejar opiniones.
Esta vez incorporé una función de fact-checking con IA con la intención de reducir las noticias falsas y las discusiones improductivas dentro de la comunidad, y quería compartir las dudas y los tropiezos técnicos que fui encontrando en el proceso.
Al principio lo encaré de manera muy simple: le pasaba el texto objetivo y armé un prompt del tipo "verifica si este texto es cierto". Pero al subirlo al servicio real empezaron a aparecer problemas inesperados.
Intentaba hacer fact-checking incluso de simples “opiniones” personales como si fueran hechos, y aunque no hubiera fundamentos, terminaba sacando conclusiones que sonaban plausibles. Además, si después de terminado el fact-checking el autor editaba el contenido, se generaban situaciones absurdas en las que el resultado ya no cuadraba con el texto.
Al final descarté toda la estructura inicial y ahora opero con un pipeline bastante rearmado, de la siguiente manera.
1. Filtrar qué se debe verificar (opinión vs. hecho)
En vez de verificar todo el texto de una sola vez, primero hago que extraiga solo las “afirmaciones factuales” que pueden verificarse objetivamente. Es decir, ignora juicios de valor como “esta política es la peor” y toma como objetivo solo frases como “este proyecto de ley aumenta los impuestos un 20%”.
Para entender el contexto con precisión, no se limita a mirar el texto objetivo: le doy contexto a la IA agrupando de forma multimodal el post original, el comentario padre e incluso las imágenes adjuntas.
2. Hacer que responda “no lo sé”
Esta fue una de las partes en las que más puse atención. Para evitar las alucinaciones típicas de los LLM, controlé fuertemente el prompt para que, cuando no haya evidencia confiable suficiente para hacer verificación cruzada o cuando algo no se pueda confirmar, no fuerce una conclusión y responda “no se puede saber” o “juicio en suspenso”.
3. Conservar un snapshot del original y ofrecer fuentes transparentes
Para evitar el problema de que el autor edite el texto, guardo tal cual los datos originales (snapshot) del momento en que se solicitó el fact-checking. Cuando otros usuarios ven el resultado, pueden confirmar de forma transparente “qué texto/imagen de qué momento se usó como base para la verificación” y “qué fuentes se consultaron”.
4. Manejo de tráfico y recursos
Como este proceso de traer todo el contexto y verificarlo es pesado, hizo falta gestionar una cola de espera de usuarios. Por eso todas las solicitudes se envían a una cola asíncrona con Redis Cluster + BullMQ y se procesan de forma secuencial en workers en segundo plano.
Teniendo en cuenta costo y velocidad, uso Gemini 3.5 Flash como modelo principal, pero apliqué una estructura que hace fallback a Gemini 3.1 Pro cuando sube la tasa de errores o falla un razonamiento complejo.
(Para evitar solicitudes indiscriminadas, también puse un límite: se ofrece 1 vez gratis por día y luego se descuentan puntos dentro de la app).
Tareas que todavía sigo resolviendo
Aunque armé lógica defensiva a mi manera, todavía hay muchos casos complicados. Cuando las estadísticas usan puntos de referencia temporales distintos, declaraciones con metáforas o interpretaciones propias de los políticos, o textos largos que mezclan hechos y falsedades de forma sutil, aún es difícil procesarlos a la perfección.
Pueden probarlo directamente en la app Uhheung.
Si tienen tips de prompting para detectar mejor las alucinaciones en este tipo de lógica de verificación, o ideas de UX/UI para que los usuarios acepten mejor resultados ambiguos, cualquier consejo es bienvenido. ¡Gracias por leer este texto largo!
Google Play: https://play.google.com/store/apps/details?id=kr.uhheung.app
App Store: https://apps.apple.com/kr/app/%EC%96%B4%ED%9D%A5/id6751951353
Aún no hay comentarios.