RAG en Android: responder preguntas usando documentos propios
Construye un flujo de recuperación de fragmentos y respuesta fundamentada sin inventar fuentes.
Comprender una arquitectura RAG y desarrollar un prototipo de recuperación local verificable.
Por qué es importante
RAG significa generación aumentada mediante recuperación. En vez de pedir a un modelo que responda de memoria, recuperas fragmentos relevantes de documentos autorizados y los incorporas como contexto. Es imprescindible mostrar las fuentes y admitir cuando no existe evidencia suficiente.
Requisitos
- Documentos de prueba sin información sensible; por ejemplo, archivos de ayuda de una app.
- Conocimientos básicos de Kotlin y un proveedor de generación de texto opcional para la fase final.
Trabaja en un proyecto de pruebas. Revisa las versiones y condiciones específicas de la documentación oficial, ya que las APIs y las políticas evolucionan.
Implementación
Convierte los documentos a texto y conserva metadatos…
Convierte los documentos a texto y conserva metadatos: archivo, sección, versión y permiso de acceso.
Divide el texto en fragmentos cortos que mantengan…
Divide el texto en fragmentos cortos que mantengan el sentido. Evita cortar encabezados o definiciones en mitad de la explicación.
Comienza con un buscador sencillo por coincidencia de…
Comienza con un buscador sencillo por coincidencia de palabras. Para grandes colecciones evalúa embeddings y un índice vectorial mantenido fuera del dispositivo.
Selecciona pocos fragmentos relevantes y construye un contexto…
Selecciona pocos fragmentos relevantes y construye un contexto con referencias. Indica al modelo que no responda cuando el material no cubra la pregunta.
En la interfaz, muestra respuesta y documentos consultados…
En la interfaz, muestra respuesta y documentos consultados. Nunca conviertas el texto de documentos recuperados en comandos privilegiados.
Evalúa con preguntas respondibles, preguntas sin respuesta y…
Evalúa con preguntas respondibles, preguntas sin respuesta y documentos contradictorios. Mide exactitud de fuentes, no solo fluidez del texto.
Fragmento de referencia
data class Fragmento(val fuente: String, val texto: String)
fun buscar(query: String, corpus: List<Fragmento>) =
corpus.filter { f ->
query.lowercase().split(' ').any { palabra ->
palabra.length > 3 && f.texto.contains(palabra, true)
}
}.take(3)
// Es una recuperación léxica de demostración; no es un motor vectorial.Ejemplo educativo: cuando se indique, añade las importaciones, dependencias, claves de prueba o clases de tu proyecto. No se presenta como proyecto Android completo y compilado.
Ponlo a prueba
Crea tres fragmentos sobre permisos Android. Realiza una pregunta incluida en el corpus y otra no cubierta; comprueba que el prototipo identifique correctamente la ausencia de evidencia.
Lista de comprobación
- La implementación cumple el objetivo: comprender una arquitectura rag y desarrollar un prototipo de recuperación local verificable.
- El comportamiento se verificó con datos de prueba y se documentaron los casos de fallo.
- Los recursos, dependencias y políticas se comprobaron contra las referencias oficiales.
- No se registran datos sensibles ni se da por probada una mejora sin evidencia.
Errores habituales
- No atribuir al documento frases que no contiene.
- No indexar documentos privados sin controles de autorización.
- No confundir la búsqueda léxica del ejemplo con un sistema RAG de producción.
¿RAG requiere entrenar un modelo?
No. Normalmente utiliza recuperación de documentos y un modelo generativo existente.
Referencias para ampliar
Consulta las versiones, limitaciones y requisitos vigentes antes de integrar los ejemplos en producción.