~/tools / Embeddings y búsqueda (RAG) / RAG Prompt Builder
RAG Prompt Builder — Crea una petición /api/chat de Ollama con fuentes numeradas y citas
Convierte tus resultados de búsqueda y una pregunta en una petición /api/chat de Ollama que pide al modelo que responda solo a partir de fuentes numeradas y que las cite. Opcionalmente pide JSON con el número de fuente y un fragmento citado en cada cita, fija la temperatura (temperature) en 0 y envía "truncate": false para que un prompt que no cabe falle en lugar de recortarse. Nada sale de tu navegador.
Las fuentes del ejemplo están escritas a mano con la forma que devuelve json_agg.
3 fuentes, leídas como un array JSON de objetos.
Comando curl
Envía la petición a Ollama en esta máquina (localhost:11434).
curl http://localhost:11434/api/chat -d '{
"model": "qwen2.5:7b",
"messages": [
{
"role": "system",
"content": "Answer the question using only the numbered sources in the user message. Cite the number of each source you use. If the sources do not contain the answer, say that you do not know and cite nothing. Answer in the same language as the question. For each citation, give the source number and copy a short quote from that source exactly as it is written. Return JSON that matches this schema: {\"type\":\"object\",\"properties\":{\"answer\":{\"type\":\"string\"},\"citations\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"source\":{\"type\":\"integer\"},\"quote\":{\"type\":\"string\"}},\"required\":[\"source\",\"quote\"]}}},\"required\":[\"answer\",\"citations\"]}"
},
{
"role": "user",
"content": "Sources:\n\n[1] (id: 12)\nWith HNSW, hnsw.ef_search is 40 by default, so a query returns at most 40 rows unless you raise it.\n\n[2] (id: 7)\nSET LOCAL inside a transaction changes hnsw.ef_search for a single query.\n\n[3] (id: 3)\npgvector supports PostgreSQL 13 and later.\n\nQuestion: Why does my HNSW search return only 40 rows with LIMIT 100?"
}
],
"stream": false,
"format": {
"type": "object",
"properties": {
"answer": {
"type": "string"
},
"citations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"source": {
"type": "integer"
},
"quote": {
"type": "string"
}
},
"required": [
"source",
"quote"
]
}
}
},
"required": [
"answer",
"citations"
]
},
"options": {
"temperature": 0
},
"truncate": false
}'Cuerpo de la petición (JSON)
{
"model": "qwen2.5:7b",
"messages": [
{
"role": "system",
"content": "Answer the question using only the numbered sources in the user message. Cite the number of each source you use. If the sources do not contain the answer, say that you do not know and cite nothing. Answer in the same language as the question. For each citation, give the source number and copy a short quote from that source exactly as it is written. Return JSON that matches this schema: {\"type\":\"object\",\"properties\":{\"answer\":{\"type\":\"string\"},\"citations\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"source\":{\"type\":\"integer\"},\"quote\":{\"type\":\"string\"}},\"required\":[\"source\",\"quote\"]}}},\"required\":[\"answer\",\"citations\"]}"
},
{
"role": "user",
"content": "Sources:\n\n[1] (id: 12)\nWith HNSW, hnsw.ef_search is 40 by default, so a query returns at most 40 rows unless you raise it.\n\n[2] (id: 7)\nSET LOCAL inside a transaction changes hnsw.ef_search for a single query.\n\n[3] (id: 3)\npgvector supports PostgreSQL 13 and later.\n\nQuestion: Why does my HNSW search return only 40 rows with LIMIT 100?"
}
],
"stream": false,
"format": {
"type": "object",
"properties": {
"answer": {
"type": "string"
},
"citations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"source": {
"type": "integer"
},
"quote": {
"type": "string"
}
},
"required": [
"source",
"quote"
]
}
}
},
"required": [
"answer",
"citations"
]
},
"options": {
"temperature": 0
},
"truncate": false
}En la respuesta, el texto está en message.content. Si prompt_eval_count es mucho menor de lo que esperas, es posible que el prompt se haya recortado.
Campos de la petición según la referencia de la API y el código fuente de Ollama, comprobados en Ollama 0.40.11 el 2026-11-05. Ollama API: /api/chat
Todo se ejecuta en tu navegador. La herramienta escribe la petición y no se conecta a nada.
En la generación aumentada por recuperación (RAG), primero buscas en tus documentos y después das al modelo los pasajes más cercanos junto con la pregunta. Esta herramienta escribe esa petición para /api/chat de Ollama. Pega los resultados de la búsqueda como un array JSON de cadenas, como un array JSON de objetos (por ejemplo, la salida de json_agg de PostgreSQL; el texto se lee de content, text, chunk, document o page_content, y id, title y url se añaden al encabezado de la fuente) o como texto separado por líneas de --- o por líneas en blanco. La herramienta numera las fuentes desde [1], pone las reglas en un mensaje system y pone las fuentes y después la pregunta en un único mensaje user. Con la opción JSON, el campo format recibe un JSON Schema con la respuesta y una lista de citas (número de fuente y fragmento citado), y el mismo esquema se escribe en el mensaje system, como recomienda la página de salidas estructuradas de Ollama. Sin ella, se pide al modelo que escriba los números entre corchetes después de cada frase. La opción truncate importa porque Ollama recorta los prompts largos sin dar ningún error: en el código fuente de Ollama (0.40.11), conserva los primeros tokens y el final del prompt y descarta la parte intermedia, y en nuestra prueba con num_ctx 1024 esto eliminó el mensaje system y las primeras fuentes y cambió la respuesta. El campo truncate está en el código fuente de Ollama pero no en la página de /api/chat; con "truncate": false, la misma petición devolvió HTTP 400. Enviamos las peticiones de esta herramienta a Ollama 0.40.11 con qwen2.5:7b, en ambos modos.
La lógica principal de esta herramienta es de código abierto, con licencia MIT. github.com/seigo5555/toolkitbox-lib/src/rag-prompt.ts
Casos de uso
- Responder preguntas sobre tus propios manuales o notas con un modelo local, indicando la fuente de cada afirmación
- Probar el prompt y el formato de las citas con unos pocos resultados de búsqueda reales antes de escribir el código de tu aplicación
- Comprobar si tus resultados de búsqueda siguen cabiendo en la longitud de contexto del modelo
Cómo usarlo
- Escribe la pregunta y pega los resultados de la búsqueda, por ejemplo las filas que devuelve la consulta del pgvector SQL Builder.
- Elige el modelo y, si quieres, num_ctx y las opciones de citas en JSON, temperatura 0 y truncate.
- Copia el comando curl o el cuerpo JSON y envíalo a Ollama. Pega la respuesta y las mismas fuentes en el RAG Citation Checker.
FAQ
¿Por qué las fuentes se numeran en lugar de usar los id de mi base de datos?
Al modelo le resulta más fácil copiar números cortos que id largos, y se pueden comprobar con la lista que se envió. El id, el title y la url de cada objeto se siguen mostrando junto a su número, así que puedes asociar el número a la fila.
¿Por qué la pregunta va después de las fuentes?
Cuando un prompt es más largo que la longitud de contexto, Ollama conserva el final del prompt y descarta el texto anterior, así que la pregunta al final es la parte que se conserva. Es aún más seguro enviar "truncate": false, para recibir un error y poder enviar menos filas o subir num_ctx.
¿Cuántas fuentes puedo enviar?
La herramienta acepta hasta 50. Cuántas caben depende de su longitud y de la longitud de contexto: la documentación de Ollama indica un valor por defecto de 4k tokens con menos de 24 GiB de VRAM. El campo prompt_eval_count de la respuesta muestra cuántos tokens usó el prompt.
¿La opción JSON garantiza citas correctas?
No. El campo format hace que la respuesta siga el JSON Schema, pero el modelo aún puede citar la fuente equivocada o citar algo que no está en ella. Comprueba la respuesta con el RAG Citation Checker.
¿Puedo usarla con la API compatible con OpenAI?
La herramienta escribe la petición nativa de /api/chat. La documentación de Ollama dice que las salidas estructuradas también funcionan a través de la API compatible con OpenAI mediante response_format, pero la petición tiene otra forma.
¿Se envían mis datos a algún sitio?
No. La petición se construye en tu navegador. La herramienta nunca se conecta a Ollama.
Artículos relacionados
- Guarda y busca embeddings de Ollama en PostgreSQL con pgvectorGuarda embeddings de Ollama en PostgreSQL con pgvector, búscalos con HNSW o IVFFlat y pasa los resultados a /api/chat para que la respuesta cite sus fuentes.
- Embeddings con Ollama: lo básico para búsqueda y RAGCrea embeddings con el /api/embed de Ollama: los modelos y sus tamaños, truncate y dimensions, vectores de longitud unitaria y similitud del coseno, según la documentación oficial.