~/tools / Embeddings e busca (RAG) / RAG Prompt Builder
RAG Prompt Builder — Monte uma requisição /api/chat do Ollama com fontes numeradas e citadas
Transforme os resultados da sua busca e uma pergunta em uma requisição /api/chat do Ollama que pede ao modelo que responda somente com base em fontes numeradas e as cite. Opcionalmente pede JSON com o número da fonte e um trecho citado em cada citação, define a temperatura (temperature) como 0 e envia "truncate": false para que um prompt que não cabe falhe em vez de ser cortado. Nada sai do seu navegador.
As fontes do exemplo foram escritas à mão no formato que o json_agg devolve.
3 fontes, lidas como um array JSON de objetos.
Comando curl
Envia a requisição ao Ollama nesta 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
}'Corpo da requisição (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
}Na resposta, o texto está em message.content. Se prompt_eval_count for muito menor do que você espera, o prompt pode ter sido cortado.
Campos da requisição conforme a referência da API e o código-fonte do Ollama, conferidos no Ollama 0.40.11 em 2026-11-05. Ollama API: /api/chat
Tudo roda no seu navegador. A ferramenta escreve a requisição e não se conecta a nada.
Na geração aumentada por recuperação (RAG), você primeiro pesquisa nos seus documentos e depois entrega ao modelo as passagens mais próximas junto com a pergunta. Esta ferramenta escreve essa requisição para o /api/chat do Ollama. Cole os resultados da busca como um array JSON de strings, como um array JSON de objetos (por exemplo, a saída do json_agg do PostgreSQL; o texto é lido de content, text, chunk, document ou page_content, e id, title e url são acrescentados ao cabeçalho da fonte) ou como texto separado por linhas de --- ou por linhas em branco. A ferramenta numera as fontes a partir de [1], coloca as regras em uma mensagem system e coloca as fontes e depois a pergunta em uma única mensagem user. Com a opção JSON, o campo format recebe um JSON Schema com a resposta e uma lista de citações (número da fonte e trecho citado), e o mesmo esquema é escrito na mensagem system, como a página de saídas estruturadas do Ollama recomenda. Sem ela, pede-se ao modelo que escreva os números entre colchetes depois de cada frase. A opção truncate importa porque o Ollama corta prompts longos sem dar erro: no código-fonte do Ollama (0.40.11), ele mantém os primeiros tokens e o final do prompt e descarta a parte do meio, e no nosso teste com num_ctx 1024 isso removeu a mensagem system e as primeiras fontes e mudou a resposta. O campo truncate está no código-fonte do Ollama, mas não na página do /api/chat; com "truncate": false, a mesma requisição devolveu HTTP 400. Enviamos as requisições desta ferramenta para o Ollama 0.40.11 com qwen2.5:7b, nos dois modos.
A lógica principal desta ferramenta é de código aberto, sob a licença MIT. github.com/seigo5555/toolkitbox-lib/src/rag-prompt.ts
Casos de uso
- Responder perguntas sobre os seus próprios manuais ou anotações com um modelo local, indicando a fonte de cada afirmação
- Testar o prompt e o formato das citações com alguns resultados de busca reais antes de escrever o código da sua aplicação
- Descobrir se os resultados da sua busca ainda cabem no tamanho do contexto do modelo
Como usar
- Digite a pergunta e cole os resultados da busca, por exemplo as linhas devolvidas pela consulta do pgvector SQL Builder.
- Escolha o modelo e, se quiser, num_ctx e as opções de citações em JSON, temperatura 0 e truncate.
- Copie o comando curl ou o corpo JSON e envie ao Ollama. Cole a resposta e as mesmas fontes no RAG Citation Checker.
FAQ
Por que as fontes são numeradas em vez de usar os ids do meu banco de dados?
Números curtos são mais fáceis para o modelo copiar do que ids longos, e podem ser conferidos com a lista que foi enviada. O id, o title e a url de cada objeto continuam aparecendo ao lado do número, então você pode associar o número à linha.
Por que a pergunta vem depois das fontes?
Quando um prompt é mais longo que o tamanho do contexto, o Ollama mantém o final do prompt e descarta o texto anterior, então a pergunta no final é a parte que fica. É ainda mais seguro enviar "truncate": false, para receber um erro e poder enviar menos linhas ou aumentar num_ctx.
Quantas fontes posso enviar?
A ferramenta aceita até 50. Quantas cabem depende do comprimento delas e do tamanho do contexto: a documentação do Ollama indica um padrão de 4k tokens com menos de 24 GiB de VRAM. O campo prompt_eval_count da resposta mostra quantos tokens o prompt usou.
A opção JSON garante citações corretas?
Não. O campo format faz a resposta seguir o JSON Schema, mas o modelo ainda pode citar a fonte errada ou citar algo que não está nela. Verifique a resposta com o RAG Citation Checker.
Posso usar com a API compatível com a OpenAI?
A ferramenta escreve a requisição nativa do /api/chat. A documentação do Ollama diz que as saídas estruturadas também funcionam pela API compatível com a OpenAI por meio de response_format, mas a requisição tem outro formato.
Meus dados são enviados para algum lugar?
Não. A requisição é montada no seu navegador. A ferramenta nunca se conecta ao Ollama.
Artigos relacionados
- Guarde e pesquise embeddings do Ollama no PostgreSQL com o pgvectorGuarde embeddings do Ollama no PostgreSQL com o pgvector, pesquise-os com HNSW ou IVFFlat e passe os resultados para o /api/chat para que a resposta cite suas fontes.
- Embeddings com o Ollama: o básico para busca e RAGCrie embeddings com o /api/embed do Ollama: os modelos e seus tamanhos, truncate e dimensions, vetores de comprimento unitário e similaridade de cosseno, segundo a documentação oficial.