~/tools / Embeddings und Suche (RAG) / RAG Prompt Builder

RAG Prompt Builder — Eine Ollama-/api/chat-Anfrage mit nummerierten, zitierten Quellen erstellen

Verwandelt Ihre Suchergebnisse und eine Frage in eine /api/chat-Anfrage für Ollama, die das Modell auffordert, nur anhand nummerierter Quellen zu antworten und diese zu zitieren. Fordert auf Wunsch JSON mit der Quellennummer und einer zitierten Textstelle je Zitat an, setzt die Temperatur (temperature) auf 0 und sendet "truncate": false, damit ein Prompt, der nicht hineinpasst, fehlschlägt, statt abgeschnitten zu werden. Nichts verlässt Ihren Browser.

Die Beispielquellen sind von Hand in der Form geschrieben, die json_agg zurückgibt.

3 Quellen, gelesen als ein JSON-Array aus Objekten.

curl-Befehl

Sendet die Anfrage an Ollama auf diesem Rechner (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
}'

Anfrage-Body (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
}

In der Antwort steht der Text in message.content. Wenn prompt_eval_count deutlich niedriger ist, als Sie erwarten, wurde der Prompt möglicherweise abgeschnitten.

Anfragefelder nach der API-Referenz und dem Quellcode von Ollama, geprüft mit Ollama 0.40.11 am 2026-11-05. Ollama API: /api/chat

Alles läuft in Ihrem Browser. Das Tool schreibt die Anfrage und verbindet sich mit nichts.

Bei der Retrieval-Augmented Generation (RAG) durchsuchen Sie zuerst Ihre Dokumente und geben dem Modell dann die nächsten Passagen zusammen mit der Frage. Dieses Tool schreibt diese Anfrage für /api/chat von Ollama. Fügen Sie die Suchergebnisse als JSON-Array aus Strings, als JSON-Array aus Objekten (zum Beispiel die Ausgabe von json_agg in PostgreSQL; der Text wird aus content, text, chunk, document oder page_content gelesen, und id, title und url werden der Überschrift der Quelle hinzugefügt) oder als Text ein, der durch Zeilen mit --- oder durch Leerzeilen getrennt ist. Das Tool nummeriert die Quellen ab [1], legt die Regeln in eine system-Nachricht und legt die Quellen und danach die Frage in eine einzige user-Nachricht. Mit der JSON-Option erhält das Feld format ein JSON Schema mit der Antwort und einer Liste von Zitaten (Quellennummer und zitierte Textstelle), und dasselbe Schema wird in die system-Nachricht geschrieben, wie es die Seite zu strukturierten Ausgaben von Ollama empfiehlt. Ohne diese Option wird das Modell gebeten, nach jedem Satz die Nummern in eckigen Klammern zu schreiben. Die Option truncate ist wichtig, weil Ollama lange Prompts ohne Fehler abschneidet: Im Quellcode von Ollama (0.40.11) behält es die ersten Tokens und das Ende des Prompts und verwirft den Teil dazwischen, und in unserem Test mit num_ctx 1024 entfernte das die system-Nachricht und die ersten Quellen und veränderte die Antwort. Das Feld truncate steht im Quellcode von Ollama, aber nicht auf der Seite zu /api/chat; mit "truncate": false lieferte dieselbe Anfrage stattdessen HTTP 400. Wir haben die Anfragen dieses Tools in beiden Modi an Ollama 0.40.11 mit qwen2.5:7b gesendet.

Die Kernlogik dieses Tools ist Open Source unter der MIT-Lizenz. github.com/seigo5555/toolkitbox-lib/src/rag-prompt.ts

Anwendungsfälle

  • Fragen zu Ihren eigenen Handbüchern oder Notizen mit einem lokalen Modell beantworten, mit der Quelle jeder Aussage
  • Den Prompt und das Format der Zitate an einigen echten Suchergebnissen ausprobieren, bevor Sie den Code für Ihre Anwendung schreiben
  • Herausfinden, ob Ihre Suchergebnisse noch in die Kontextlänge des Modells passen

Verwendung

  1. Geben Sie die Frage ein und fügen Sie die Suchergebnisse ein, zum Beispiel die Zeilen, die die Abfrage aus dem pgvector SQL Builder zurückgibt.
  2. Wählen Sie das Modell und bei Bedarf num_ctx sowie die Optionen für JSON-Zitate, Temperatur 0 und truncate.
  3. Kopieren Sie den curl-Befehl oder den JSON-Body und senden Sie ihn an Ollama. Fügen Sie die Antwort und dieselben Quellen in den RAG Citation Checker ein.

FAQ

Warum werden die Quellen nummeriert, statt die IDs aus meiner Datenbank zu verwenden?

Kurze Nummern kann das Modell leichter abschreiben als lange IDs, und sie lassen sich mit der gesendeten Liste abgleichen. Die id, der title und die url jedes Objekts werden weiterhin neben seiner Nummer angezeigt, sodass Sie die Nummer der Zeile zuordnen können.

Warum steht die Frage hinter den Quellen?

Wenn ein Prompt länger als die Kontextlänge ist, behält Ollama das Ende des Prompts und verwirft den Text davor, die Frage am Ende ist also der Teil, der erhalten bleibt. Noch sicherer ist es, "truncate": false zu senden, damit Sie einen Fehler erhalten und weniger Zeilen senden oder num_ctx erhöhen können.

Wie viele Quellen kann ich senden?

Das Tool akzeptiert bis zu 50. Wie viele hineinpassen, hängt von ihrer Länge und von der Kontextlänge ab: Die Dokumentation von Ollama nennt einen Standardwert von 4k Tokens bei weniger als 24 GiB VRAM. Das Feld prompt_eval_count der Antwort zeigt, wie viele Tokens der Prompt verbraucht hat.

Garantiert die JSON-Option korrekte Zitate?

Nein. Das Feld format sorgt dafür, dass die Antwort dem JSON Schema folgt, aber das Modell kann trotzdem die falsche Quelle zitieren oder etwas zitieren, das darin nicht steht. Prüfen Sie die Antwort mit dem RAG Citation Checker.

Kann ich es mit der OpenAI-kompatiblen API verwenden?

Das Tool schreibt die native /api/chat-Anfrage. Die Dokumentation von Ollama sagt, dass strukturierte Ausgaben auch über die OpenAI-kompatible API mit response_format funktionieren, die Anfrage hat dort aber eine andere Form.

Werden meine Daten irgendwohin gesendet?

Nein. Die Anfrage wird in Ihrem Browser erstellt. Das Tool verbindet sich nie mit Ollama.

Passende Artikel

Ähnliche Tools