go-ms-rag
Ingesta de documentos y respuestas acotadas por evidencia mediante un servicio de recuperación por etapas en Go.
- Interfaz
- API HTTP
- Lenguaje
- Go
- Índice vectorial
- Pinecone
- Base de datos
- PostgreSQL
- Proveedor de modelos
- AWS Bedrock
Simulación ilustrativa con datos de ejemplo fijos. No se llama a ningún modelo ni servicio en vivo.
Problema
Una consulta sobre documentos necesita evidencia, no solo una respuesta fluida. La generación aumentada por recuperación (RAG) busca primero pasajes relevantes y luego los usa para responder. go-ms-rag expone ese flujo como una API HTTP para texto y documentos subidos.
Cómo funciona
La ingesta extrae y normaliza el texto, lo divide en pasajes, crea representaciones numéricas llamadas embeddings y las almacena. Las consultas recuperan pasajes candidatos, aplican la lista de documentos permitidos y solo entonces generan una respuesta.
Sin pasajes, devuelve una respuesta fija, cero tokens y no llama al modelo.
Todos los componentes
- Solicitud de ingesta
El servicio recibe texto o documentos subidos.
- Extraer y normalizar
Extrae texto de archivos, elimina HTML y normaliza espacios.
- Dividir y clasificar
Los pasajes solapados reciben etiquetas de tipo y calidad.
- Crear embeddings
Las representaciones numéricas permiten comparar textos.
- Persistir
Guarda vectores y registros de documentos, pasajes y huellas digitales.
- Base de datos relacional
PostgreSQL guarda documentos, pasajes y huellas digitales.
- Índice vectorial
Pinecone guarda espacios por documento y el predeterminado; las consultas usan actualmente este último.
- Almacén de objetos
Los originales se guardan en S3 si está configurado.
- Descomponer
Los nombres y las palabras clave aportan una señal heurística.
- Enrutar
El modo solicitado, el sondeo y las señales eligen LOCAL o GLOBAL.
- Recuperar
Recupera del espacio predeterminado; GLOBAL puede ampliar resultados escasos.
- Documentos permitidos
Filtra los pasajes antes de que lleguen a la generación.
- Generar respuesta
Selecciona un contexto acotado y responde con los pasajes disponibles.
- Terminar sin evidencia
Sin pasajes, devuelve una respuesta fija, cero tokens y no llama al modelo.
Ingestar un documento
El texto o archivo cargado entra en una cola asíncrona acotada. El texto se extrae y normaliza, se divide en pasajes clasificados, se convierte en vectores y se guarda.
- Documentos
- Extraer y normalizar
- Fragmentos por oraciones
- Representaciones vectoriales
- Guardar
- Dos escrituras vectoriales
Más detalle Ejemplos ilustrativos
Cola asíncrona202 processing
Una cola asíncrona recibe documentos, crea fragmentos por oraciones con solapamiento y vectores, y guarda estos en dos espacios, los metadatos en Postgres y los originales subidos en almacenamiento de objetos si está configurado.
Identificar señales de la consulta
El servicio busca nombres conocidos y palabras que sugieren varias necesidades. Son reglas deterministas, no una llamada a un modelo de lenguaje.
- Pregunta
- Comprobar palabras
- Coincidencia de entidad
- Enrutamiento
Más detalle Ejemplos ilustrativos
Sin llamada de descomposición a un modelo
Las palabras clave y las entidades alimentan el enrutamiento sin llamar a un modelo; una palabra clave genera un conteo sintético de dos solo si no coincide ninguna entidad.
Elegir un modo de recuperación
Un modo explícito tiene prioridad. Si no se indica, el servicio usa el sondeo, la cantidad de necesidades, los nombres y el umbral de puntuación para elegir LOCAL o GLOBAL.
- ¿Modo explícito?
- ¿Falló el sondeo?
- ¿Varias necesidades?
- ¿Entidad identificada?
- ¿Sondeo ≥ 0.70?
- En otro caso
Más detalle Ejemplos ilustrativos
- ¿Modo explícito?Modo solicitado
- ¿Falló el sondeo?GLOBAL
- ¿Varias necesidades?GLOBAL
- ¿Entidad identificada?LOCAL
- ¿Sondeo ≥ 0.70?LOCAL
- En otro casoGLOBAL
Primero se respeta el modo explícito, luego el fallo del sondeo, las necesidades múltiples, la entidad y finalmente el umbral inclusivo de similitud de 0.70.
Aplicar la lista de documentos permitidos
Los pasajes recuperados se filtran antes de la síntesis. Si se omite la lista, no hay restricción; una lista vacía no permite ningún documento.
- Omitida / null
- Solo el documento A
- Lista vacía
Más detalle Ejemplos ilustrativos
Después de recuperar y antes de sintetizar, una lista omitida conserva todos los fragmentos, una lista de documentos conserva solo coincidencias y una lista vacía no conserva ninguno.
Responder con evidencia acotada
El servicio selecciona pasajes con un umbral relativo de puntuación y un presupuesto fijo de contexto. Si no quedan pasajes, devuelve una respuesta fija sin llamar al modelo.
- Fragmentos recuperados
- Umbral relativo
- Síntesis
- Salida anticipada
Más detalle Ejemplos ilustrativos
No relevant information was found to answer this question.
Esta oración exacta en inglés se devuelve incluso ante una pregunta en español.Solo los extractos con puntuación suficiente entran en el contexto limitado; si no queda ningún fragmento, se devuelve la respuesta fija sin llamar al sintetizador.
Detalles
División de documentos
Un documento se divide en pasajes con solapamiento para conservar contexto entre sus límites. El servicio también clasifica cada pasaje por tipo y calidad.
Simulación ilustrativa con datos de ejemplo fijos. No se llama a ningún modelo ni servicio en vivo.
Regla de enrutamiento
LOCAL y GLOBAL son etiquetas de enrutamiento, no límites de acceso por documento. Ambos consultan actualmente el espacio de nombres predeterminado; GLOBAL puede ampliar la búsqueda si obtiene menos de tres resultados.
Simulación ilustrativa con datos de ejemplo fijos. No se llama a ningún modelo ni servicio en vivo.
Lista de permitidos antes de generar
La lista se aplica después de recuperar y antes de generar. Omitirla no restringe documentos; enviarla vacía no permite ninguno. Sin pasajes, el servicio devuelve una respuesta fija sin llamar al modelo.
Simulación ilustrativa con datos de ejemplo fijos. No se llama a ningún modelo ni servicio en vivo.
Decisiones y compromisos
Filtrar antes de generar
La lista de documentos permitidos se aplica antes de enviar el texto recuperado al contexto de síntesis. El límite de acceso no depende del prompt del modelo.
- Fragmentos recuperados
- Filtro de acceso
- Contexto enviado
Más detalle Ejemplos ilustrativos
El orden elegido mantiene el texto de documentos denegados fuera del contexto, a diferencia de la alternativa descartada de filtrar después de sintetizar.
Detenerse cuando no hay evidencia
Sin evidencia, el servicio devuelve una respuesta fija y registra cero tokens. No pide al modelo que complete lo que falta.
- Sin fragmentos
- Salida anticipada
- Respuesta fija
Más detalle Ejemplos ilustrativos
No relevant information was found to answer this question.
Esta oración exacta en inglés se devuelve incluso ante una pregunta en español.Detenerse cuando no hay evidencia evita pedir una respuesta sin sustento y devuelve la oración fija exacta con uso de tokens en cero.
Escribir vectores en dos espacios
La ingesta escribe cada vector en el espacio de su documento y en el espacio predeterminado. Se mantienen ambas distribuciones, aunque las consultas actuales usan el espacio predeterminado.
- Un vector
- Espacio por documento
- Espacio predeterminado
- Dos escrituras vectoriales
Más detalle Ejemplos ilustrativos
Un espacio por documento y otro predeterminado requieren más escrituras y almacenamiento vectorial a cambio de recuperación global y borrado por documento.
Usar reglas de consulta inspeccionables
La búsqueda de nombres y expresiones de varias necesidades evita una llamada adicional al modelo. También limita la descomposición a los patrones que reconocen esas reglas.
- Comprobaciones de palabras y entidades
- Conteo sintético: 2
- Descomposición mediante un modelo
- Puede omitir o sobreactivar
Más detalle Ejemplos ilustrativos
“¿Dónde se guardan el soporte y su estuche?”
Una necesidad previstaSeñal encontrada: «y» → Conteo: 2Las comprobaciones de palabras y entidades evitan la latencia y el costo de una llamada de descomposición, pero una simple conjunción puede exagerar el número de necesidades.
Mantener una ruta de prueba local
El modo de prueba sustituye proveedores por implementaciones deterministas y un almacén de vectores en memoria. PostgreSQL sigue siendo necesario.
- Hash determinista
- Vectores en memoria
- Síntesis simulada
- Pruebas sin llamadas externas
- Postgres sigue siendo necesario
Más detalle Ejemplos ilustrativos
El modo de prueba sustituye las llamadas externas por vectores deterministas derivados de un hash, almacenamiento en memoria y un sintetizador simulado, pero Postgres sigue siendo necesario.
Limitaciones
LOCAL también usa el espacio predeterminado
LOCAL y GLOBAL consultan actualmente el espacio vectorial predeterminado. LOCAL no aísla un espacio por documento; la lista de documentos permitidos sigue siendo un filtro aparte.
- LOCAL / GLOBAL
- Espacio predeterminado
- Búsqueda ampliada
Más detalle Ejemplos ilustrativos
Actualmente ambos modos consultan el espacio predeterminado; solo GLOBAL amplía la búsqueda cuando devuelve menos de tres fragmentos.
La ampliación es una alternativa acotada
Si GLOBAL devuelve menos de tres resultados, el servicio amplía la búsqueda a un límite de 20 y elimina duplicados al combinar. Esto no es una segunda etapa de reordenamiento; la ruta actual no incluye un reranker.
- Búsqueda inicial
- Límite de búsqueda: 20
- Combinar y quitar duplicados
- Resultados únicos
Más detalle Ejemplos ilustrativos
La búsqueda ampliada combina y elimina duplicados hasta el límite solicitado, pero el orden sigue dependiendo de la similitud vectorial, sin un reordenador adicional.
Las heurísticas pueden omitir la intención
La detección de varias necesidades reconoce un conjunto fijo de expresiones. Los umbrales, la cantidad de pasajes y el truncamiento también pueden dejar fuera material recuperado.
- Conteo: 2
- Conteo: 1
Más detalle Ejemplos ilustrativos
“¿Dónde se guardan el soporte y su estuche?”
Una necesidad prevista“Explica la renovación; describe el acceso al taller.”
Dos necesidades previstasUna regla basada en palabras puede interpretar una intención como varias necesidades o pasar por alto varias necesidades que no usan sus palabras clave.
El texto de respuesta no incorpora citas
La respuesta incluye metadatos de origen junto con los pasajes puntuados. El texto generado no incorpora citas de las fuentes.
- Texto de respuesta
- Metadatos de fuentes
Más detalle Ejemplos ilustrativos
Devuelve el soporte limpio antes del cierre del taller.
Sin citas insertadasLa respuesta devuelve la identidad de documentos y fragmentos en los metadatos scored_chunks, no como citas insertadas en cada afirmación del texto.