Ver todos los proyectos

go-ms-rag

Ingesta de documentos y respuestas acotadas por evidencia mediante un servicio de recuperación por etapas en Go.

La evidencia permitida guía la respuesta.
Interfaz
API HTTP
Lenguaje
Go
Índice vectorial
Pinecone
Base de datos
PostgreSQL
Proveedor de modelos
AWS Bedrock
Ver repositorio
Consola de consultas
Se conservan puntuaciones ≥ 0.55 × la mayor, hasta el límite del contexto.Límite de fragmentos: 5 · Conservados: 3

Traducción visual; extractos originales en inglés.

Préstamo de herramientasFragmento 1

Cada socio puede pedir prestado un soporte de reparación por dos días. El soporte debe devolverse limpio antes del cierre del taller.

Similitud ilustrativa0.92
Préstamo de herramientasFragmento 2

El soporte debe devolverse limpio antes del cierre del taller. Para recoger un soporte, hay que reservarlo primero en la recepción de la cooperativa.

Similitud ilustrativa0.78
Préstamo de herramientasFragmento 3

Para recoger un soporte, hay que reservarlo primero en la recepción de la cooperativa. El socio debe firmar el registro del préstamo al recogerlo.

Similitud ilustrativa0.62
Renovación de préstamosFragmento 1

El préstamo de una herramienta puede renovarse una vez antes de su fecha de devolución. La renovación solo está disponible si ningún otro socio ha reservado la herramienta.

Similitud ilustrativa0.49
Acceso al tallerFragmento 1

Los socios pueden utilizar un banco de trabajo durante el horario de atención. Antes de la primera visita, es obligatorio recibir una orientación de seguridad.

Similitud ilustrativa0.31

Cada socio puede pedir prestado un soporte de reparación por dos días. Debe devolverlo limpio antes del cierre del taller.

Puntuaciones ilustrativas fijas, no mediciones de calidad.

Simulación ilustrativa con datos de ejemplo fijos. No se llama a ningún modelo ni servicio en vivo.

Figura 1. Una interfaz ilustrativa para la API de documentos; no es una interfaz incluida en el repositorio.

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.

Una línea entre muchos documentos.

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.

Documento, pasajes, vectores, respuesta.
Flujo del servicio
IngestaConsultaSolicitud deingestaExtraer ynormalizarDividir yclasificarCrearembeddingsPersistirBase de datosrelacionalÍndicevectorialAlmacén deobjetosDescomponerEnrutarRecuperarDocumentospermitidosGenerarrespuestaTerminarsin evidenciaIngestaAlmacenamientoConsultaSolicitud deingestaExtraer ynormalizarDividir yclasificarCrearembeddingsPersistirBase de datosrelacionalÍndicevectorialAlmacén deobjetosDescomponerEnrutarRecuperarDocumentospermitidosGenerarrespuestaTerminarsin evidencia

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.

Figura 2. La ingesta y las consultas comparten documentos y vectores; la lista de permitidos se aplica antes de generar.

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.

De documentos a fragmentos que se pueden buscar
  1. Documentos
  2. Extraer y normalizar
  3. Fragmentos por oraciones
  4. Representaciones vectoriales
  5. Guardar
  6. Dos escrituras vectoriales

Más detalle Ejemplos ilustrativos

Cola asíncrona202 processing

DocumentosPDF / DOCX / texto
Extraer y normalizarQuitar HTML y normalizar texto
Fragmentos por oracionesOración compartida
Representaciones vectorialesSímbolos vectoriales abstractos
Guardar
Espacio por documento
Espacio predeterminado
Metadatos en Postgres
Originales subidosSolo archivos subidos, si está configurado

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.

Figura 3. Un documento pasa por extracción, división, embeddings y persistencia.

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.

Dos señales de bajo costo
  1. Pregunta
  2. Comprobar palabras
  3. Coincidencia de entidad
  4. Enrutamiento

Más detalle Ejemplos ilustrativos

Pregunta
Comprobar palabras«compare» / «y»
Conteo sintético: 2Solo si no coincide una entidad
Coincidencia de entidadNombre registrado
Entidad encontradaConteo sintético: 1
Enrutamiento

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.

Figura 4. Los nombres y las expresiones de varias necesidades aportan señales para la ruta.

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.

Decide la primera regla que se cumple
  1. ¿Modo explícito?
  2. ¿Falló el sondeo?
  3. ¿Varias necesidades?
  4. ¿Entidad identificada?
  5. ¿Sondeo ≥ 0.70?
  6. En otro caso

Más detalle Ejemplos ilustrativos

  1. ¿Modo explícito?Modo solicitado
  2. ¿Falló el sondeo?GLOBAL
  3. ¿Varias necesidades?GLOBAL
  4. ¿Entidad identificada?LOCAL
  5. ¿Sondeo ≥ 0.70?LOCAL
  6. En otro casoGLOBAL
Si no, continuar

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.

Figura 5. La ruta combina el modo explícito con las señales de la consulta.

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.

Una puerta de acceso antes de sintetizar
  1. Omitida / null
  2. Solo el documento A
  3. Lista vacía

Más detalle Ejemplos ilustrativos

Omitida / null
ABC
Filtro de acceso
ABC
Pasan todos
Solo el documento A
ABC
Filtro de acceso
ABC
Solo pasan coincidencias
Lista vacía
ABC
Filtro de acceso
∅
No pasa ninguno

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.

Figura 6. La lista determina qué pasajes pueden entrar en el contexto de respuesta.

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.

Entra evidencia, sale una respuesta sustentada
  1. Fragmentos recuperados
  2. Umbral relativo
  3. Síntesis
  4. Salida anticipada

Más detalle Ejemplos ilustrativos

Fragmentos recuperados
0.900.640.30
Umbral relativo0.90 × 0.55 = 0.495
SíntesisRespuesta basada solo en extractos
Hasta 5 fragmentos; 8 para varias necesidadesCada extracto: hasta 1.200 caracteres Unicode
Sin fragmentos → Salida anticipada

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.

Figura 7. Con evidencia se genera una respuesta; sin evidencia se termina antes.

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.

Fragmentos por oraciones
Préstamo de herramientas

Cada socio puede pedir prestado un soporte de reparación por dos días. El soporte debe devolverse limpio antes del cierre del taller. Para recoger un soporte, hay que reservarlo primero en la recepción de la cooperativa. El socio debe firmar el registro del préstamo al recogerlo.

Fragmento 1Tipo: bodyCalidad: high

Traducción visual; extractos originales en inglés.

Enfoca un fragmento o pasa el puntero para inspeccionar sus etiquetas. Las oraciones resaltadas aparecen en ambos fragmentos vecinos.

Los tamaños se redujeron para esta ilustración: dos oraciones por fragmento, con una compartida. Los valores predeterminados son aproximadamente 512 tokens y 64 de solapamiento.

Simulación ilustrativa con datos de ejemplo fijos. No se llama a ningún modelo ni servicio en vivo.

Figura 8. Un documento dividido en pasajes solapados, con etiquetas de tipo y calidad.

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.

Enrutamiento de recuperación
LOCAL

El sondeo alcanza el umbral de 0.70

0.82 ≥ 0.70

En el código actual ambos modos consultan el espacio predeterminado; GLOBAL amplía la búsqueda y elimina duplicados cuando devuelve menos de 3 fragmentos.

Simulación ilustrativa con datos de ejemplo fijos. No se llama a ningún modelo ni servicio en vivo.

Figura 9. Las señales de la consulta cambian el enrutamiento, sin modificar la lista de documentos permitidos.

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.

Acceso antes de la síntesis

allowed_document_idsOmitida

Una lista omitida o null no restringe el acceso; una lista vacía no permite nada. El filtro se aplica después de recuperar, antes de sintetizar.

Traducción visual; extractos originales en inglés.

Préstamo de herramientasFragmento 1

Cada socio puede pedir prestado un soporte de reparación por dos días. El soporte debe devolverse limpio antes del cierre del taller.

Similitud ilustrativa0.86
Acceso al tallerFragmento 1

Los socios pueden utilizar un banco de trabajo durante el horario de atención. Antes de la primera visita, es obligatorio recibir una orientación de seguridad.

Similitud ilustrativa0.80
Préstamo de herramientasFragmento 2

El soporte debe devolverse limpio antes del cierre del taller. Para recoger un soporte, hay que reservarlo primero en la recepción de la cooperativa.

Similitud ilustrativa0.76
Acceso al tallerFragmento 2

Antes de la primera visita, es obligatorio recibir una orientación de seguridad. Las herramientas compartidas deben permanecer dentro del taller después de cada sesión.

Similitud ilustrativa0.68
Préstamo de herramientasFragmento 3

Para recoger un soporte, hay que reservarlo primero en la recepción de la cooperativa. El socio debe firmar el registro del préstamo al recogerlo.

Similitud ilustrativa0.63
Acceso al tallerFragmento 3

Las herramientas compartidas deben permanecer dentro del taller después de cada sesión. Hay que limpiar el banco antes de dejar el espacio al siguiente socio.

Similitud ilustrativa0.59
Renovación de préstamosFragmento 1

El préstamo de una herramienta puede renovarse una vez antes de su fecha de devolución. La renovación solo está disponible si ningún otro socio ha reservado la herramienta.

Similitud ilustrativa0.52
Renovación de préstamosFragmento 2

La renovación solo está disponible si ningún otro socio ha reservado la herramienta. La renovación se solicita en la recepción durante el horario de atención del taller.

Similitud ilustrativa0.49
Renovación de préstamosFragmento 3

La renovación se solicita en la recepción durante el horario de atención del taller. La recepción anota la nueva fecha de devolución en el registro del préstamo.

Similitud ilustrativa0.40

Cada socio puede pedir prestado un soporte de reparación por dos días. Debe devolverlo limpio antes del cierre del taller. El préstamo de una herramienta puede renovarse una vez antes de la devolución, solo si ningún otro socio la ha reservado. Los socios pueden usar un banco de trabajo durante el horario de atención después de una orientación de seguridad. Las herramientas compartidas permanecen dentro del taller.

Simulación ilustrativa con datos de ejemplo fijos. No se llama a ningún modelo ni servicio en vivo.

Figura 10. Los documentos permitidos determinan qué pasajes recuperados pueden llegar a la generación.

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.

Filtrar antes de construir el contexto
  1. Fragmentos recuperados
  2. Filtro de acceso
  3. Contexto enviado

Más detalle Ejemplos ilustrativos

Orden elegido
Fragmentos recuperados
AB
Filtro de accesoAntes de sintetizar
Contexto enviadoSolo el fragmento AA
Alternativa descartada
Fragmentos recuperados
AB
Contexto enviadoA y B ya fueron expuestos
Filtro de accesoDemasiado tarde para evitar la exposición

El orden elegido mantiene el texto de documentos denegados fuera del contexto, a diferencia de la alternativa descartada de filtrar después de sintetizar.

Figura 11. El filtrado de documentos precede a la síntesis.

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 evidencia, el proceso se detiene
  1. Sin fragmentos
  2. Salida anticipada
  3. Respuesta fija

Más detalle Ejemplos ilustrativos

Orden elegido
Sin fragmentos
Salida anticipadaUso de tokens en cero
Respuesta fija
Alternativa descartada
Sin fragmentos
Llamada al modelo
Riesgo de una respuesta sin sustento

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.

Figura 12. Un conjunto vacío de pasajes evita la llamada al modelo.

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.

Dos destinos para cada vector
  1. Un vector
  2. Espacio por documento
  3. Espacio predeterminado
  4. Dos escrituras vectoriales

Más detalle Ejemplos ilustrativos

Un vector
Espacio por documento
Borrado por documento
Espacio predeterminado
Recuperación global
Dos escrituras vectoriales
Más escrituras y almacenamiento

Un espacio por documento y otro predeterminado requieren más escrituras y almacenamiento vectorial a cambio de recuperación global y borrado por documento.

Figura 13. Cada vector se escribe en el espacio del documento y en el predeterminado.

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.

Una heurística, no subpreguntas generadas
  1. Comprobaciones de palabras y entidades
  2. Conteo sintético: 2
  3. Descomposición mediante un modelo
  4. Puede omitir o sobreactivar

Más detalle Ejemplos ilustrativos

Comprobaciones de palabras y entidadesUna llamada menos al modelo
Conteo sintético: 2Puede omitir o sobreactivar
Descomposición mediante un modelo

“¿Dónde se guardan el soporte y su estuche?”

Una necesidad previstaSeñal encontrada: «y» → Conteo: 2

Las 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.

Figura 14. Las reglas fijas ofrecen señales inspeccionables, con una interpretación más acotada.

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.

Una alternativa local, no una base de datos menos
  1. Hash determinista
  2. Vectores en memoria
  3. Síntesis simulada
  4. Pruebas sin llamadas externas
  5. Postgres sigue siendo necesario

Más detalle Ejemplos ilustrativos

Hash determinista
Vectores en memoria
Síntesis simulada
Pruebas sin llamadas externas
Postgres sigue siendo necesario

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.

Figura 15. Los sustitutos locales no eliminan la dependencia de la base de datos.

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.

Dos modos, un mismo espacio de búsqueda
  1. LOCAL / GLOBAL
  2. Espacio predeterminado
  3. Búsqueda ampliada

Más detalle Ejemplos ilustrativos

LOCALGLOBAL
Espacio predeterminado
ABC
GLOBALMenos de 3 fragmentosBúsqueda ampliada: 20

Actualmente ambos modos consultan el espacio predeterminado; solo GLOBAL amplía la búsqueda cuando devuelve menos de tres fragmentos.

Figura 16. Ambos modos de recuperación consultan el espacio vectorial predeterminado.

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.

Ampliar la búsqueda no equivale a reordenar
  1. Búsqueda inicial
  2. Límite de búsqueda: 20
  3. Combinar y quitar duplicados
  4. Resultados únicos

Más detalle Ejemplos ilustrativos

Búsqueda inicialA · 0.91B · 0.82
Límite de búsqueda: 20A · 0.91C · 0.68
Combinar y quitar duplicados
Resultados únicosA · 0.91B · 0.82C · 0.68
Solo la puntuación vectorialSin reordenador adicional

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.

Figura 17. Pocos resultados amplían la recuperación GLOBAL, sin una etapa de reordenamiento.

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.

Las palabras no siempre reflejan la intención
  1. Conteo: 2
  2. Conteo: 1

Más detalle Ejemplos ilustrativos

“¿Dónde se guardan el soporte y su estuche?”

Una necesidad prevista
Señal encontrada: «y»Conteo: 2

“Explica la renovación; describe el acceso al taller.”

Dos necesidades previstas
Sin palabra claveConteo: 1

Una regla basada en palabras puede interpretar una intención como varias necesidades o pasar por alto varias necesidades que no usan sus palabras clave.

Figura 18. Las reglas y los presupuestos de contexto acotan lo que llega a la respuesta.

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.

Fuentes junto a la respuesta, no dentro de ella
  1. Texto de respuesta
  2. Metadatos de fuentes

Más detalle Ejemplos ilustrativos

Texto de respuesta

Devuelve el soporte limpio antes del cierre del taller.

Sin citas insertadas

La respuesta devuelve la identidad de documentos y fragmentos en los metadatos scored_chunks, no como citas insertadas en cada afirmación del texto.

Figura 19. Los metadatos de origen acompañan a la respuesta, pero no se insertan en ella.