~/tools / Embedding'ler ve arama (RAG) / RAG Prompt Builder
RAG Prompt Builder — Yalnızca numaralı, atıflı kaynaklardan yanıtlayan Ollama /api/chat isteği
Arama sonuçlarınızı ve bir soruyu, modelden yalnızca numaralı kaynaklara dayanarak yanıt vermesini ve onlara atıf yapmasını isteyen bir Ollama /api/chat isteğine dönüştürür. İsteğe bağlı olarak her atıf için kaynak numarası ve bir alıntı içeren JSON ister, sıcaklığı (temperature) 0 yapar ve sığmayan bir istemin kesilmek yerine hata vermesi için "truncate": false gönderir. Hiçbir şey tarayıcınızdan çıkmaz.
Örnek kaynaklar, json_agg'in döndürdüğü biçimde elle yazılmıştır.
3 kaynak, nesnelerden oluşan bir JSON dizisi olarak okundu.
curl komutu
İsteği bu makinedeki Ollama'ya gönderir (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
}'İstek gövdesi (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
}Yanıtta cevap message.content içindedir. prompt_eval_count beklediğinizden çok düşükse istem kesilmiş olabilir.
İstek alanları Ollama'nın API başvurusundan ve kaynak kodundan alınmıştır; Ollama 0.40.11 üzerinde 2026-11-05 tarihinde denetlendi. Ollama API: /api/chat
Her şey tarayıcınızda yapılır. Araç isteği yazar ve hiçbir yere bağlanmaz.
Retrieval-augmented generation (RAG) yönteminde önce belgelerinizde arama yaparsınız, ardından en yakın pasajları soruyla birlikte modele verirsiniz. Bu araç, Ollama'nın /api/chat uç noktası için bu isteği yazar. Arama sonuçlarını string'lerden oluşan bir JSON dizisi olarak, nesnelerden oluşan bir JSON dizisi olarak (örneğin PostgreSQL'in json_agg çıktısı; metin content, text, chunk, document veya page_content alanından okunur, id, title ve url ise kaynağın başlığına eklenir) ya da --- satırlarıyla veya boş satırlarla ayrılmış düz metin olarak yapıştırın. Araç kaynakları [1]'den başlayarak numaralandırır, kuralları bir system mesajına, kaynakları ve ardından soruyu tek bir user mesajına koyar. JSON seçeneğinde format alanı, yanıtı ve bir atıf listesini (kaynak numarası ve alıntı) içeren bir JSON Schema alır ve aynı şema, Ollama'nın yapılandırılmış çıktılar sayfasının önerdiği gibi system mesajına da yazılır. Bu seçenek olmadan modelden her cümlenin ardına numaraları köşeli parantez içinde yazması istenir. truncate seçeneği önemlidir, çünkü Ollama uzun istemleri hata vermeden keser: Ollama'nın kaynak kodunda (0.40.11) ilk birkaç token'ı ve istemin sonunu korur, aradaki kısmı atar; num_ctx 1024 ile yaptığımız testte bu, system mesajını ve ilk kaynakları kaldırdı ve yanıtı değiştirdi. truncate alanı Ollama'nın kaynak kodunda vardır ama /api/chat sayfasında yoktur; "truncate": false ile aynı istek bunun yerine HTTP 400 döndürdü. Bu aracın isteklerini her iki kipte de qwen2.5:7b ile Ollama 0.40.11'e gönderdik.
Bu aracın temel mantığı MIT lisansıyla açık kaynaktır. github.com/seigo5555/toolkitbox-lib/src/rag-prompt.ts
Kullanım örnekleri
- Yerel bir modelle kendi kılavuzlarınız veya notlarınız hakkındaki soruları, her ifadenin kaynağıyla birlikte yanıtlamak
- Uygulamanızın kodunu yazmadan önce istemi ve atıf biçimini birkaç gerçek arama sonucunda denemek
- Arama sonuçlarınızın modelin bağlam uzunluğuna hâlâ sığıp sığmadığını öğrenmek
Nasıl kullanılır
- Soruyu girin ve arama sonuçlarını yapıştırın; örneğin pgvector SQL Builder'daki sorgunun döndürdüğü satırları.
- Modeli seçin; isteğe bağlı olarak num_ctx'i ve JSON atıfları, sıcaklık 0 ve truncate seçeneklerini belirleyin.
- curl komutunu veya JSON gövdesini kopyalayıp Ollama'ya gönderin. Yanıtı ve aynı kaynakları RAG Citation Checker'a yapıştırın.
SSS
Kaynaklar neden veritabanı kimlikleri yerine numaralandırılıyor?
Kısa numaraları modelin kopyalaması uzun kimliklere göre daha kolaydır ve gönderilen listeyle karşılaştırılarak denetlenebilir. Her nesnenin id, title ve url değerleri yine numarasının yanında gösterilir; böylece numarayı satırına geri eşleyebilirsiniz.
Soru neden kaynaklardan sonra geliyor?
İstem bağlam uzunluğundan uzun olduğunda Ollama istemin sonunu korur ve öncesindeki metni atar; bu yüzden sondaki soru korunan kısımdır. Yine de "truncate": false göndermek daha güvenlidir; böylece bir hata alır, daha az satır gönderebilir veya num_ctx değerini artırabilirsiniz.
Kaç kaynak gönderebilirim?
Araç en fazla 50 kabul eder. Kaç tanesinin sığacağı uzunluklarına ve bağlam uzunluğuna bağlıdır: Ollama'nın belgeleri, 24 GiB'tan az VRAM olduğunda varsayılan olarak 4k token verir. Yanıttaki prompt_eval_count alanı istemin kaç token kullandığını gösterir.
JSON seçeneği doğru atıfları garanti eder mi?
Hayır. format alanı yanıtın JSON Schema'ya uymasını sağlar, ama model yine de yanlış kaynağa atıf yapabilir veya kaynakta olmayan bir şeyi alıntılayabilir. Yanıtı RAG Citation Checker ile denetleyin.
OpenAI uyumlu API ile kullanabilir miyim?
Araç yerel /api/chat isteğini yazar. Ollama'nın belgeleri, yapılandırılmış çıktıların OpenAI uyumlu API üzerinden de response_format ile çalıştığını söyler, ama istek farklı bir biçimdedir.
Verilerim bir yere gönderiliyor mu?
Hayır. İstek tarayıcınızda oluşturulur. Araç Ollama'ya hiç bağlanmaz.
İlgili makaleler
- Ollama embedding'lerini pgvector ile PostgreSQL'de saklama ve aramaOllama embedding'lerini pgvector ile PostgreSQL'de saklayın, HNSW veya IVFFlat ile arayın ve sonuçları /api/chat'e iletin; yanıt kaynaklarını belirtsin.
- Ollama ile embedding: arama ve RAG için temellerOllama'nın /api/embed uç noktasıyla embedding üretin: modeller ve boyutları, truncate ve dimensions, birim uzunlukta vektörler ve kosinüs benzerliği, resmî belgelere göre.