~/tools / Embedding dan pencarian (RAG) / RAG Prompt Builder

RAG Prompt Builder — Buat permintaan /api/chat Ollama yang menjawab dari sumber bernomor dan bersitasi

Ubah hasil pencarian dan sebuah pertanyaan menjadi permintaan /api/chat Ollama yang meminta model menjawab hanya dari sumber bernomor dan mengutipnya. Secara opsional meminta JSON berisi nomor sumber dan kutipan untuk setiap sitasi, mengatur temperature ke 0, dan mengirim "truncate": false agar prompt yang tidak muat gagal, bukan dipotong. Tidak ada data yang keluar dari browser Anda.

Contoh sumber ditulis tangan dalam bentuk yang dikembalikan json_agg.

3 sumber, dibaca sebagai array JSON berisi objek.

Perintah curl

Mengirim permintaan ke Ollama di mesin ini (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
}'

Isi permintaan (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
}

Pada respons, jawabannya ada di message.content. Jika prompt_eval_count jauh lebih rendah dari yang Anda duga, prompt mungkin terpotong.

Kolom permintaan dari referensi API dan kode sumber Ollama, diperiksa pada Ollama 0.40.11 pada 2026-11-05. Ollama API: /api/chat

Semuanya dilakukan di browser Anda. Alat ini menulis permintaan dan tidak terhubung ke mana pun.

Pada retrieval-augmented generation (RAG), Anda mencari dulu di dokumen Anda, lalu memberikan potongan teks terdekat kepada model bersama pertanyaannya. Alat ini menuliskan permintaan itu untuk /api/chat milik Ollama. Tempelkan hasil pencarian sebagai array JSON berisi string, sebagai array JSON berisi objek (misalnya keluaran json_agg dari PostgreSQL; teks dibaca dari content, text, chunk, document, atau page_content, dan id, title, serta url ditambahkan ke judul sumber), atau sebagai teks biasa yang dipisahkan baris --- atau baris kosong. Alat ini memberi nomor sumber mulai dari [1], menaruh aturan di pesan system, dan menaruh sumber lalu pertanyaan di satu pesan user. Dengan opsi JSON, kolom format mendapat JSON Schema berisi jawaban dan daftar sitasi (nomor sumber dan kutipan), dan skema yang sama ditulis di pesan system, seperti yang disarankan halaman keluaran terstruktur milik Ollama. Tanpa opsi itu, model diminta menulis nomor dalam tanda kurung siku setelah setiap kalimat. Opsi truncate penting karena Ollama memotong prompt yang panjang tanpa galat: di kode sumber Ollama (0.40.11), ia mempertahankan beberapa token pertama dan akhir prompt serta membuang bagian di antaranya, dan pada uji kami dengan num_ctx 1024 hal ini menghilangkan pesan system dan sumber-sumber pertama serta mengubah jawabannya. Kolom truncate ada di kode sumber Ollama tetapi tidak di halaman /api/chat; dengan "truncate": false, permintaan yang sama mengembalikan HTTP 400. Kami mengirim permintaan dari alat ini ke Ollama 0.40.11 dengan qwen2.5:7b, dalam kedua mode.

Logika utama alat ini bersifat sumber terbuka dengan lisensi MIT. github.com/seigo5555/toolkitbox-lib/src/rag-prompt.ts

Kapan dipakai

  • Menjawab pertanyaan tentang manual atau catatan Anda sendiri dengan model lokal, lengkap dengan sumber setiap pernyataan
  • Mencoba prompt dan format sitasi pada beberapa hasil pencarian asli sebelum Anda menulis kode aplikasi
  • Mengetahui apakah hasil pencarian Anda masih muat dalam panjang konteks model

Cara pakai

  1. Masukkan pertanyaan dan tempelkan hasil pencarian, misalnya baris yang dikembalikan oleh kueri dari pgvector SQL Builder.
  2. Pilih model, dan secara opsional num_ctx serta opsi sitasi JSON, temperature 0, dan truncate.
  3. Salin perintah curl atau isi JSON-nya dan kirim ke Ollama. Tempelkan jawabannya dan sumber yang sama ke RAG Citation Checker.

Tanya jawab

Mengapa sumber diberi nomor, bukan memakai id database saya?

Nomor pendek lebih mudah disalin model daripada id yang panjang, dan dapat dicocokkan dengan daftar yang dikirim. Id, title, dan url setiap objek tetap ditampilkan di samping nomornya, sehingga Anda dapat memetakan nomor kembali ke barisnya.

Mengapa pertanyaan diletakkan setelah sumber?

Bila prompt lebih panjang daripada panjang konteks, Ollama mempertahankan akhir prompt dan membuang teks sebelumnya, jadi pertanyaan di bagian akhir adalah bagian yang dipertahankan. Lebih aman lagi dengan mengirim "truncate": false, sehingga Anda mendapat galat dan dapat mengirim lebih sedikit baris atau menaikkan num_ctx.

Berapa banyak sumber yang bisa saya kirim?

Alat ini menerima hingga 50. Berapa yang muat bergantung pada panjangnya dan pada panjang konteks: dokumentasi Ollama menyebut default 4k token untuk VRAM kurang dari 24 GiB. Kolom prompt_eval_count pada respons menunjukkan berapa token yang dipakai prompt.

Apakah opsi JSON menjamin sitasi yang benar?

Tidak. Kolom format membuat jawaban mengikuti JSON Schema, tetapi model tetap bisa mengutip sumber yang salah atau mengutip sesuatu yang tidak ada di dalamnya. Periksa jawabannya dengan RAG Citation Checker.

Bisakah saya memakainya dengan API yang kompatibel dengan OpenAI?

Alat ini menuliskan permintaan /api/chat bawaan. Dokumentasi Ollama menyebut bahwa keluaran terstruktur juga berfungsi lewat API yang kompatibel dengan OpenAI melalui response_format, tetapi bentuk permintaannya berbeda.

Apakah data saya dikirim ke suatu tempat?

Tidak. Permintaan dibuat di browser Anda. Alat ini tidak pernah terhubung ke Ollama.

Artikel terkait

Terkait