~/tools / Embedding e ricerca (RAG) / RAG Prompt Builder
RAG Prompt Builder — Costruisci una richiesta /api/chat di Ollama con fonti numerate e citate
Trasforma i risultati della tua ricerca e una domanda in una richiesta /api/chat di Ollama che chiede al modello di rispondere solo in base a fonti numerate e di citarle. Facoltativamente chiede JSON con il numero della fonte e un testo citato per ogni citazione, imposta la temperatura (temperature) a 0 e invia "truncate": false in modo che un prompt che non ci sta fallisca invece di essere tagliato. Nulla lascia il tuo browser.
Le fonti dell'esempio sono scritte a mano nella forma che restituisce json_agg.
3 fonti, lette come un array JSON di oggetti.
Comando curl
Invia la richiesta a Ollama su questa macchina (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
}'Corpo della richiesta (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
}Nella risposta, il testo si trova in message.content. Se prompt_eval_count è molto più basso di quanto ti aspetti, il prompt potrebbe essere stato tagliato.
Campi della richiesta dalla documentazione di riferimento dell'API e dal codice sorgente di Ollama, verificati su Ollama 0.40.11 il 2026-11-05. Ollama API: /api/chat
Tutto avviene nel tuo browser. Lo strumento scrive la richiesta e non si collega a nulla.
Nella generazione aumentata dal recupero (RAG), prima cerchi nei tuoi documenti e poi dai al modello i passaggi più vicini insieme alla domanda. Questo strumento scrive quella richiesta per /api/chat di Ollama. Incolla i risultati della ricerca come array JSON di stringhe, come array JSON di oggetti (per esempio l'output di json_agg di PostgreSQL; il testo viene letto da content, text, chunk, document o page_content, e id, title e url vengono aggiunti all'intestazione della fonte) oppure come testo separato da righe con --- o da righe vuote. Lo strumento numera le fonti a partire da [1], mette le regole in un messaggio system e mette le fonti e poi la domanda in un unico messaggio user. Con l'opzione JSON, il campo format riceve un JSON Schema con la risposta e un elenco di citazioni (numero della fonte e testo citato), e lo stesso schema viene scritto nel messaggio system, come consiglia la pagina di Ollama sugli output strutturati. Senza, al modello viene chiesto di scrivere i numeri tra parentesi quadre dopo ogni frase. L'opzione truncate conta perché Ollama taglia i prompt lunghi senza errore: nel codice sorgente di Ollama (0.40.11) mantiene i primi token e la fine del prompt e scarta la parte in mezzo, e nel nostro test con num_ctx 1024 questo ha rimosso il messaggio system e le prime fonti e ha cambiato la risposta. Il campo truncate è nel codice sorgente di Ollama ma non nella pagina di /api/chat; con "truncate": false, la stessa richiesta ha invece restituito HTTP 400. Abbiamo inviato le richieste di questo strumento a Ollama 0.40.11 con qwen2.5:7b, in entrambe le modalità.
La logica principale di questo strumento è open source, con licenza MIT. github.com/seigo5555/toolkitbox-lib/src/rag-prompt.ts
Casi d'uso
- Rispondere a domande sui tuoi manuali o appunti con un modello locale, indicando la fonte di ogni affermazione
- Provare il prompt e il formato delle citazioni su alcuni risultati di ricerca reali prima di scrivere il codice della tua applicazione
- Scoprire se i risultati della tua ricerca stanno ancora nella lunghezza del contesto del modello
Utilizzo
- Inserisci la domanda e incolla i risultati della ricerca, per esempio le righe restituite dalla query del pgvector SQL Builder.
- Scegli il modello e, se vuoi, num_ctx e le opzioni per le citazioni in JSON, la temperatura 0 e truncate.
- Copia il comando curl o il corpo JSON e invialo a Ollama. Incolla la risposta e le stesse fonti nel RAG Citation Checker.
FAQ
Perché le fonti sono numerate invece di usare gli id del mio database?
Per il modello è più facile copiare numeri brevi che id lunghi, e si possono confrontare con l'elenco che è stato inviato. L'id, il title e l'url di ogni oggetto vengono comunque mostrati accanto al suo numero, così puoi ricondurre il numero alla riga.
Perché la domanda viene dopo le fonti?
Quando un prompt è più lungo della lunghezza del contesto, Ollama mantiene la fine del prompt e scarta il testo che la precede, quindi la domanda alla fine è la parte che resta. È ancora più sicuro inviare "truncate": false, per ottenere un errore e poter inviare meno righe o aumentare num_ctx.
Quante fonti posso inviare?
Lo strumento ne accetta fino a 50. Quante ce ne stanno dipende dalla loro lunghezza e dalla lunghezza del contesto: la documentazione di Ollama indica un valore predefinito di 4k token con meno di 24 GiB di VRAM. Il campo prompt_eval_count della risposta mostra quanti token ha usato il prompt.
L'opzione JSON garantisce citazioni corrette?
No. Il campo format fa seguire alla risposta il JSON Schema, ma il modello può comunque citare la fonte sbagliata o citare qualcosa che non c'è. Verifica la risposta con il RAG Citation Checker.
Posso usarlo con l'API compatibile con OpenAI?
Lo strumento scrive la richiesta nativa di /api/chat. La documentazione di Ollama dice che gli output strutturati funzionano anche tramite l'API compatibile con OpenAI con response_format, ma la richiesta ha una forma diversa.
I miei dati vengono inviati da qualche parte?
No. La richiesta viene costruita nel tuo browser. Lo strumento non si collega mai a Ollama.
Articoli correlati
- Salvare e cercare gli embedding di Ollama in PostgreSQL con pgvectorConserva gli embedding di Ollama in PostgreSQL con pgvector, cercali con HNSW o IVFFlat e passa i risultati a /api/chat perché la risposta citi le sue fonti.
- Embedding con Ollama: le basi per ricerca e RAGCrea embedding con l'/api/embed di Ollama: i modelli e le loro dimensioni, truncate e dimensions, vettori di lunghezza unitaria e similarità del coseno, secondo la documentazione ufficiale.