~/tools / Embedding và tìm kiếm (RAG) / RAG Prompt Builder
RAG Prompt Builder — Tạo yêu cầu Ollama /api/chat chỉ trả lời từ các nguồn có đánh số, có trích dẫn
Biến kết quả tìm kiếm và một câu hỏi của bạn thành một yêu cầu /api/chat của Ollama, yêu cầu mô hình chỉ trả lời từ các nguồn có đánh số và trích dẫn chúng. Có thể yêu cầu JSON với số nguồn và một đoạn trích cho mỗi trích dẫn, đặt temperature về 0, và gửi "truncate": false để một prompt không vừa sẽ báo lỗi thay vì bị cắt. Không có gì rời khỏi trình duyệt của bạn.
Các nguồn trong ví dụ được viết tay theo dạng mà json_agg trả về.
3 nguồn, được đọc là một mảng JSON các đối tượng.
Lệnh curl
Gửi yêu cầu tới Ollama trên máy này (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
}'Thân yêu cầu (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
}Trong phản hồi, câu trả lời nằm ở message.content. Nếu prompt_eval_count thấp hơn nhiều so với bạn dự đoán, prompt có thể đã bị cắt.
Các trường của yêu cầu lấy từ tài liệu tham khảo API và mã nguồn của Ollama, đã kiểm tra trên Ollama 0.40.11 vào ngày 2026-11-05. Ollama API: /api/chat
Mọi việc đều được thực hiện trong trình duyệt của bạn. Công cụ viết yêu cầu và không kết nối tới đâu cả.
Trong retrieval-augmented generation (RAG), bạn tìm trong tài liệu của mình trước rồi đưa các đoạn gần nhất cho mô hình cùng với câu hỏi. Công cụ này viết yêu cầu đó cho /api/chat của Ollama. Hãy dán kết quả tìm kiếm dưới dạng một mảng JSON các chuỗi, một mảng JSON các đối tượng (chẳng hạn đầu ra của json_agg trong PostgreSQL; văn bản được đọc từ content, text, chunk, document hoặc page_content, còn id, title và url được thêm vào tiêu đề của nguồn), hoặc văn bản thuần được ngăn cách bằng các dòng --- hay các dòng trống. Công cụ đánh số các nguồn từ [1], đặt các quy tắc vào một thông điệp system, và đặt các nguồn rồi đến câu hỏi vào một thông điệp user. Với tùy chọn JSON, trường format nhận một JSON Schema có câu trả lời và một danh sách các trích dẫn (số nguồn và đoạn trích), và cùng schema đó cũng được viết vào thông điệp system, đúng như trang structured outputs của Ollama khuyên. Khi không dùng tùy chọn này, mô hình được yêu cầu viết các số trong ngoặc vuông sau mỗi câu. Tùy chọn truncate quan trọng vì Ollama cắt các prompt dài mà không báo lỗi: trong mã nguồn của Ollama (0.40.11), nó giữ vài token đầu và phần cuối của prompt rồi bỏ phần ở giữa, và trong thử nghiệm của chúng tôi với num_ctx 1024, điều này làm mất thông điệp system cùng các nguồn đầu tiên và làm thay đổi câu trả lời. Trường truncate có trong mã nguồn của Ollama nhưng không có trên trang /api/chat; với "truncate": false, cùng yêu cầu đó trả về HTTP 400. Chúng tôi đã gửi các yêu cầu từ công cụ này tới Ollama 0.40.11 với qwen2.5:7b, ở cả hai chế độ.
Phần xử lý chính của công cụ này là mã nguồn mở theo giấy phép MIT. github.com/seigo5555/toolkitbox-lib/src/rag-prompt.ts
Trường hợp dùng
- Trả lời các câu hỏi về tài liệu hướng dẫn hoặc ghi chú của riêng bạn bằng một mô hình cục bộ, kèm nguồn cho từng phát biểu
- Thử prompt và định dạng trích dẫn trên vài kết quả tìm kiếm thật trước khi bạn viết mã cho ứng dụng của mình
- Tìm hiểu xem các kết quả tìm kiếm của bạn có còn vừa trong độ dài ngữ cảnh của mô hình hay không
Cách dùng
- Nhập câu hỏi và dán các kết quả tìm kiếm, chẳng hạn các hàng do truy vấn từ pgvector SQL Builder trả về.
- Chọn mô hình, và tùy ý chọn num_ctx cùng các tùy chọn trích dẫn JSON, temperature 0 và truncate.
- Sao chép lệnh curl hoặc phần thân JSON rồi gửi cho Ollama. Dán câu trả lời và chính các nguồn đó vào RAG Citation Checker.
Hỏi đáp
Vì sao các nguồn được đánh số thay vì dùng id trong cơ sở dữ liệu của tôi?
Các số ngắn dễ để mô hình chép lại hơn các id dài, và có thể đối chiếu với danh sách đã gửi. id, title và url của mỗi đối tượng vẫn được hiển thị bên cạnh số của nó, nên bạn có thể ánh xạ số về hàng của nó.
Vì sao câu hỏi nằm sau các nguồn?
Khi một prompt dài hơn độ dài ngữ cảnh, Ollama giữ phần cuối của prompt và bỏ văn bản đứng trước nó, nên câu hỏi ở cuối là phần được giữ lại. Gửi "truncate": false vẫn an toàn hơn, để bạn nhận được lỗi và có thể gửi ít hàng hơn hoặc tăng num_ctx.
Tôi có thể gửi bao nhiêu nguồn?
Công cụ chấp nhận tối đa 50. Bao nhiêu nguồn vừa còn tùy vào độ dài của chúng và độ dài ngữ cảnh: tài liệu của Ollama nêu mặc định là 4k token khi VRAM dưới 24 GiB. Trường prompt_eval_count của phản hồi cho biết prompt đã dùng bao nhiêu token.
Tùy chọn JSON có đảm bảo các trích dẫn đúng không?
Không. Trường format khiến câu trả lời tuân theo JSON Schema, nhưng mô hình vẫn có thể trích dẫn sai nguồn hoặc trích một đoạn không có trong nguồn. Hãy kiểm tra câu trả lời bằng RAG Citation Checker.
Tôi có thể dùng nó với API tương thích OpenAI không?
Công cụ viết yêu cầu /api/chat gốc. Tài liệu của Ollama nói rằng structured outputs cũng hoạt động qua API tương thích OpenAI bằng response_format, nhưng yêu cầu có dạng khác.
Dữ liệu của tôi có được gửi đi đâu không?
Không. Yêu cầu được tạo ngay trong trình duyệt của bạn. Công cụ không bao giờ kết nối tới Ollama.
Bài viết liên quan
- Lưu và tìm kiếm embedding của Ollama trong PostgreSQL bằng pgvectorLưu embedding của Ollama trong PostgreSQL bằng pgvector, tìm kiếm bằng HNSW hoặc IVFFlat, rồi chuyển kết quả sang /api/chat để câu trả lời trích dẫn các nguồn của nó.
- Embedding với Ollama: kiến thức nền tảng cho tìm kiếm và RAGTạo embedding bằng /api/embed của Ollama: các mô hình và dung lượng, truncate và dimensions, vector độ dài đơn vị và độ tương đồng cosine, theo tài liệu chính thức.