Volver al inicio

Recursos

Cómo Claix responde preguntas sobre tus documentos, sin una base de datos vectorial

Una pregunta que nos hacen a menudo, casi siempre alguien que ya montó un pipeline de RAG y está cansado de depurarlo: «¿y dónde está el almacén de vectores?»

No hay ninguno. Claix no trocea tus documentos, no los embebe y no hace una búsqueda de vecinos más cercanos antes de responder. Lo que hace es más fácil de describir de lo que parece, y los tres endpoints encajan con tres cosas distintas que querrías hacer con un documento ya procesado.

Cuando el documento ya está guardado

Las tres cosas que puedes hacer con un documento ya almacenado

Cuando un documento se extrae (por cualquiera de los seis endpoints de formato: PDF, Excel, Word, imagen, texto plano o audio) con la ventana de contexto activa, queda guardado como contenido estructurado y persistente, ligado a un document_id. A partir de ahí hay tres opciones, y son operaciones distintas de verdad, no tres nombres para lo mismo.

  • GET /get-document/{document_id}

    Te devuelve el contenido. En este paso no hay IA: es la recuperación de lo que ya está, en markdown. Si ya sabes lo que quieres (vas a montar tu propio pipeline después, o solo quieres el texto limpio sin volver a pagar la interpretación), es el más barato y el más rápido de los tres, porque no se vuelve a razonar nada.

  • POST /document-context/{document_id}

    Aquí es donde preguntas de verdad. Envías hasta cinco preguntas tipadas —cada una con el formato que esperas de vuelta (string, int, boolean, timestamp, array)— y recibes respuestas tipadas, una a una, en el mismo orden. No un párrafo que tengas que parsear tú. Si pides un boolean, recibes true o false, no «sí, parece que el contrato sí lo especifica».

  • POST /space-context/{space_id}

    La misma forma de petición y de respuesta —a propósito, para que tu código no cambie al pasar de un documento a un grupo— pero responde desde todos los documentos de un espacio de conocimiento a la vez. Es el que hace algo que una consulta de un solo documento no puede: cruza archivos. «Qué proveedor factura más entre todas las facturas» solo tiene sentido cuando hay más de una factura que sumar.

Agrupación

Cómo se agrupa de verdad

Los espacios no son un paso de subida aparte. Cualquiera de los endpoints de extracción acepta un space_id opcional en la petición. Pasa el mismo space_id en tantas extracciones como quieras y cada una se une a ese grupo. No hay una llamada de «añadir documento al espacio» que recordar por separado: la agrupación ocurre en el momento en que se procesa el documento, un detalle pequeño que evita documentos extraídos y luego olvidados antes de que nadie los agrupe.

Escala

Qué pasa cuando un espacio crece

Esta es la parte fácil de pasar por alto y la que más importa. Un espacio de conocimiento puede crecer sin límite por tu lado, pero una llamada a space-context no puede entregar todo eso a un modelo: deja de ser precisa (y deja de ser asequible) bastante antes de «ilimitado».

Hay un tope: los 50 documentos añadidos más recientemente, y un presupuesto compartido de 200.000 caracteres entre los que se seleccionan. Si un documento se recorta para caber, al modelo se le dice de forma explícita que no vio el documento entero: no responde en silencio como si tuviera la información completa cuando no la tiene. Los documentos caducados (si has puesto una ventana de retención) no cuentan en el espacio, así que una factura vieja que ya no debería considerarse no desvía un total sin que se note.

Nada de esto es recuperación por similitud. Se parece más a «estos son los datos que están de verdad en alcance, acotados por recencia y tamaño, y esto es lo que quedó fuera»: un problema de presupuesto, no de búsqueda.

Source Tracing

Dónde entra la verificación

Si la verificación de fuente está activa en un espacio, la respuesta no es solo el valor: es { value, source }. En una respuesta que cruza documentos, el campo source nombra de qué documentos salió, por document_id y nombre de archivo, y dice de forma explícita cuándo se cruzó más de uno para producir el número. Si en los documentos no hay nada que sostenga una respuesta, source vuelve como requires_human_revision, en lugar de una conjetura vestida de hecho.

Es el mismo mecanismo tanto si preguntas por un documento como por cincuenta: document-context y space-context comparten la forma de la respuesta a propósito. No es una función especial del «modo espacio». Es lo que hacen los dos endpoints.

Por qué esta forma

Por qué no embeddings

Respuesta corta: porque las preguntas que la gente hace de verdad sobre un espacio suelen ser del tipo «esta factura coincide con su contrato» o «suma los totales de estos tres archivos», y eso no son preguntas de similitud. La distancia del coseno no te dice si 48.320€ es la suma correcta de tres líneas. Una coincidencia de texto y un modelo que puede leer los documentos relevantes enteros llega ahí con más fiabilidad, y la respuesta a «qué miró de verdad» es un nombre de archivo y un document_id, no una conjetura sobre qué fragmento eligió el recuperador.

Esto no es decir que nadie debería usar una base de datos vectorial. Si buscas en una biblioteca grande y casi estática, y la pregunta es «encuéntrame cosas relacionadas conceptualmente con X» y no «cuadra estos números concretos», los embeddings resuelven un problema real que la coincidencia exacta no resuelve. Claix está hecho para el segundo tipo de pregunta, no como sustituto del primero.

Ejemplo

Un ejemplo pequeño

Dos facturas y un contrato, agrupados en el mismo espacio en el momento de la extracción. Una llamada, y la respuesta que vuelve. Ese es todo el mecanismo. Tres endpoints, una forma de respuesta compartida y un presupuesto que dice con honestidad qué miró y qué no.

Petición
{
  "questions": [
    { "question": "¿Qué proveedor factura más entre todas las facturas?", "format": "string" },
    { "question": "¿Hay algún contrato cuyo importe no coincida con su factura?", "format": "boolean" }
  ]
}

Respuesta
{
  "ia_response": [
    { "value": "Suministros Omega S.A., 48.320€ en tres facturas.", "source": "document_id a1b2... (factura-feb.pdf) cruzado con document_id b2c3... (factura-mar.pdf): suma de importes" },
    false
  ],
  "log_id": "7c2e1a90-4b3d-4f8a-9e21-6d5c8b0a1f34"
}

Preguntas frecuentes

¿Claix usa una base de datos vectorial?
No. Las consultas a un documento o a un espacio usan extracción estructurada y coincidencia de texto, no embeddings ni búsqueda de vecinos más cercanos.
¿Cuál es la diferencia entre get-document y document-context?
get-document devuelve el contenido guardado tal cual, sin razonar. document-context hace preguntas tipadas sobre ese contenido y devuelve respuestas tipadas.
¿Cuántos documentos puede considerar una llamada a space-context?
Hasta los 50 documentos vivos añadidos más recientemente en el espacio, dentro de un presupuesto compartido de 200.000 caracteres. Los documentos caducados quedan fuera automáticamente.
¿Qué pasa si una pregunta no se puede responder con los documentos?
Con la verificación de fuente activa, la respuesta vuelve como requires_human_revision en lugar de un valor inventado.
¿Puedo hacer más de 5 preguntas en una llamada?
No en una sola petición: repártelas en varias llamadas a document-context o space-context.

Tres endpoints, una forma de respuesta y un presupuesto honesto.

Pregunta a un documento guardado, o a todos los documentos vivos de un espacio, y recibe respuestas tipadas. La llamada te dice qué miró y qué dejó fuera.