daily-news

daily-news: RAG dentro de una app móvil en producción

Un asistente RAG Ask-the-News con recuperación cosine top-k y citas de fuentes tocables: embeddings locales MiniLM + Groq (Llama 3.3), respuestas fundamentadas, sin base de datos vectorial.

Solo: diseño, desarrollo, infraestructura
FlutterDartFirebaseembeddings locales (MiniLM)Groq (Llama 3.3)

TL;DR

  1. Un asistente RAG "Ask the News" con recuperación cosine top-k y citas de fuentes tocables.
  2. Embeddings locales MiniLM + Groq (Llama 3.3): respuestas fundamentadas, sin base de datos vectorial.
  3. Clean Architecture + BLoC, con reglas de seguridad de Firebase probadas en CI.

Problema

Un asistente de noticias en el que puedas confiar.

Un asistente de chat sobre las noticias solo es útil si cada afirmación puede rastrearse hasta un artículo real. Los modelos sin fundamento inventan citas y fechas con total seguridad. La vara acá era cero datos alucinados en un teléfono: cómputo limitado, red intermitente y un presupuesto de backend chico.

Arquitectura

ingesta de artículos → embed local con MiniLM → almacenamiento en Firestore → recuperación cosine top-k → respuesta fundamentada con Groq → fuentes citadas

Decisiones clave

Embeddings locales + cosine por fuerza bruta en vez de una base vectorial

Elegí MiniLM en el dispositivo más un barrido cosine simple en Firestore en lugar de montar una base de datos vectorial. Compensación: no va a escalar más allá de unos pocos miles de artículos, pero con este tamaño de corpus, una base vectorial es costo y operación que todavía no necesito.

Fundamento + rechazo en vez de generación libre

Elegí forzar que cada respuesta cite las fuentes recuperadas y rechazar cuando nada coincide. Compensación: más respuestas del tipo "no tengo eso", pero cada afirmación tiene que remontarse a un artículo citado en vez de a la memoria del modelo, la decisión correcta para noticias.

Clean Architecture + BLoC en vez de widgets rápidos

Elegí arquitectura por capas y BLoC en lugar de cablear la lógica directo en los widgets. Compensación: más boilerplate al inicio, pero las capas de LLM y de recuperación quedan intercambiables y las reglas de seguridad quedan testeables.

Para un asistente de noticias, "no lo sé" es una funcionalidad. Un rechazo es recuperable; un dato erróneo dicho con seguridad no lo es. El fundamento y el rechazo hicieron más por la confianza que cualquier actualización de modelo.

el principio de diseño

Más difícil de lo esperado

Lograr que los embeddings en el dispositivo fueran lo bastante rápidos en teléfonos de gama baja. Correr MiniLM por consulta sin congelar la UI implicó mover la inferencia fuera del isolate principal y cachear de forma agresiva: más trabajo que la recuperación y el prompting juntos.

Resultados

  • Top-k: recuperación cosine con citas tocables
  • 0 bases de datos vectoriales: corre dentro de Firestore
  • Probadas en CI: reglas de seguridad de Firebase

Demo

El flujo Ask-the-News: pregunta → respuesta fundamentada → tocás una cita.

Repositorio