~/tools / Embeddingi i wyszukiwanie (RAG) / RAG Prompt Builder

RAG Prompt Builder — Żądanie /api/chat Ollamy z ponumerowanymi, cytowanymi źródłami

Zamień wyniki wyszukiwania i pytanie w żądanie /api/chat Ollamy, które każe modelowi odpowiadać wyłącznie na podstawie ponumerowanych źródeł i je cytować. Opcjonalnie prosi o JSON z numerem źródła i cytatem dla każdego cytowania, ustawia temperaturę na 0 i wysyła "truncate": false, aby zbyt długi prompt kończył się błędem zamiast zostać ucięty. Nic nie opuszcza twojej przeglądarki.

Przykładowe źródła są napisane ręcznie w kształcie, jaki zwraca json_agg.

Liczba źródeł: 3. Rozpoznany format: tablica JSON z obiektami.

Polecenie curl

Wysyła żądanie do Ollamy na tym komputerze (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
}'

Treść żądania (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
}

W odpowiedzi odpowiedź modelu jest w message.content. Jeśli prompt_eval_count jest znacznie niższe, niż się spodziewasz, prompt mógł zostać ucięty.

Pola żądania z dokumentacji API i kodu źródłowego Ollamy, sprawdzone na Ollamie 0.40.11 dnia 2026-11-05. Ollama API: /api/chat

Wszystko dzieje się w twojej przeglądarce. Narzędzie pisze żądanie i z niczym się nie łączy.

W generowaniu wspomaganym wyszukiwaniem (RAG) najpierw przeszukujesz swoje dokumenty, a potem dajesz modelowi najbliższe fragmenty razem z pytaniem. To narzędzie pisze takie żądanie dla /api/chat Ollamy. Wklej wyniki wyszukiwania jako tablicę JSON ze stringami, jako tablicę JSON z obiektami (na przykład wynik json_agg z PostgreSQL; tekst jest czytany z content, text, chunk, document lub page_content, a id, title i url trafiają do nagłówka źródła) albo jako zwykły tekst rozdzielony liniami --- lub pustymi wierszami. Narzędzie numeruje źródła od [1], umieszcza zasady w komunikacie system, a źródła, a po nich pytanie, w jednym komunikacie user. Przy opcji JSON pole format dostaje JSON Schema z odpowiedzią i listą cytowań (numer źródła i cytat), a ten sam schemat jest zapisany w komunikacie system, jak zaleca strona Ollamy o ustrukturyzowanych wyjściach. Bez niej model dostaje prośbę o wpisywanie numerów w nawiasach kwadratowych po każdym zdaniu. Opcja truncate ma znaczenie, bo Ollama ucina długie prompty bez błędu: w kodzie źródłowym Ollamy (0.40.11) zachowuje kilka pierwszych tokenów i koniec promptu, a środkową część odrzuca, i w naszym teście z num_ctx 1024 to usunęło komunikat system oraz pierwsze źródła i zmieniło odpowiedź. Pole truncate jest w kodzie źródłowym Ollamy, ale nie na stronie /api/chat; z "truncate": false to samo żądanie zwróciło HTTP 400. Żądania z tego narzędzia wysłaliśmy do Ollamy 0.40.11 z qwen2.5:7b, w obu trybach.

Główna logika tego narzędzia jest otwartoźródłowa, na licencji MIT. github.com/seigo5555/toolkitbox-lib/src/rag-prompt.ts

Zastosowania

  • Odpowiadanie na pytania o własne instrukcje lub notatki za pomocą lokalnego modelu, ze źródłem każdej wypowiedzi
  • Wypróbowanie promptu i formatu cytowań na kilku prawdziwych wynikach wyszukiwania, zanim napiszesz kod aplikacji
  • Sprawdzenie, czy wyniki wyszukiwania nadal mieszczą się w długości kontekstu modelu

Jak używać

  1. Wpisz pytanie i wklej wyniki wyszukiwania, na przykład wiersze zwrócone przez zapytanie z pgvector SQL Builder.
  2. Wybierz model oraz, opcjonalnie, num_ctx i opcje: cytowania w JSON, temperaturę 0 i truncate.
  3. Skopiuj polecenie curl albo treść JSON i wyślij ją do Ollamy. Wklej odpowiedź i te same źródła do RAG Citation Checker.

FAQ

Dlaczego źródła są ponumerowane, zamiast używać identyfikatorów z mojej bazy?

Krótkie numery model łatwiej przepisuje niż długie identyfikatory i można je sprawdzić względem wysłanej listy. Id, title i url każdego obiektu są nadal pokazane obok jego numeru, więc możesz odwzorować numer z powrotem na wiersz.

Dlaczego pytanie jest po źródłach?

Gdy prompt jest dłuższy niż długość kontekstu, Ollama zachowuje jego koniec, a tekst przed nim odrzuca, więc pytanie na końcu jest tą częścią, która zostaje. Jeszcze bezpieczniej wysłać "truncate": false, aby dostać błąd i móc wysłać mniej wierszy albo zwiększyć num_ctx.

Ile źródeł mogę wysłać?

Narzędzie przyjmuje do 50. Ile się zmieści, zależy od ich długości i od długości kontekstu: dokumentacja Ollamy podaje domyślnie 4k tokenów przy mniej niż 24 GiB VRAM. Pole prompt_eval_count w odpowiedzi pokazuje, ile tokenów zajął prompt.

Czy opcja JSON gwarantuje poprawne cytowania?

Nie. Pole format sprawia, że odpowiedź zgadza się z JSON Schema, ale model nadal może powołać się na złe źródło albo zacytować coś, czego w nim nie ma. Sprawdź odpowiedź w RAG Citation Checker.

Czy mogę użyć tego z API zgodnym z OpenAI?

Narzędzie pisze natywne żądanie /api/chat. Dokumentacja Ollamy mówi, że ustrukturyzowane wyjścia działają też przez API zgodne z OpenAI za pomocą response_format, ale żądanie ma wtedy inny kształt.

Czy moje dane są dokądś wysyłane?

Nie. Żądanie jest budowane w twojej przeglądarce. Narzędzie nigdy nie łączy się z Ollamą.

Powiązane artykuły

Powiązane