~/tools / Embedding và tìm kiếm (RAG) / RAG Citation Checker
RAG Citation Checker — Kiểm tra số nguồn và đoạn trích trong câu trả lời RAG so với các nguồn đã gửi
Kiểm tra các trích dẫn trong một câu trả lời RAG so với các nguồn bạn đã gửi: mọi số nguồn phải tồn tại, mọi đoạn trích nên xuất hiện trong nguồn của nó, và công cụ liệt kê các câu không có số nguồn, các nguồn chưa bao giờ được trích dẫn và các câu trả lời bị cắt giữa chừng. Đọc được phản hồi /api/chat của Ollama (kể cả phản hồi truyền luồng), phản hồi tương thích OpenAI và văn bản thuần. Không có gì rời khỏi trình duyệt của bạn.
Câu trả lời trong ví dụ được viết tay để cho thấy một đoạn trích không có trong nguồn của nó.
4 nguồn (một mảng JSON các chuỗi). Câu trả lời được đọc là một phản hồi /api/chat của Ollama, ở dạng JSON có trích dẫn.
Số token trong prompt (prompt_eval_count): 306
- Đoạn trích của trích dẫn #2 không có trong nguồn [4].
Các trích dẫn
| Nguồn | Đoạn trích | Kết quả |
|---|---|---|
| [2] | hnsw.ef_search is 40 by default | Tìm thấy đúng như đã viết |
| [4] | 4 bytes per dimension plus 8 | Không có trong nguồn này |
Công cụ chỉ kiểm tra rằng các số và đoạn trích khớp với các nguồn. Nó không thể cho biết câu trả lời có đúng không hay một nguồn có thật sự ủng hộ một câu hay không.
Định dạng phản hồi 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ụ không kết nối tới đâu cả.
Khi một mô hình trả lời từ các nguồn có đánh số, các trích dẫn có thể được kiểm tra một cách máy móc. Hãy dán chính các nguồn bạn đã gửi, theo cùng định dạng như trong RAG Prompt Builder (một mảng JSON các chuỗi hoặc đối tượng, hoặc văn bản được ngăn cách bằng các dòng --- hay các dòng trống; chúng được đánh số từ [1] theo cùng cách), rồi dán câu trả lời. Câu trả lời có thể là toàn bộ phản hồi từ /api/chat của Ollama (công cụ lấy message.content; một phản hồi truyền luồng với mỗi dòng là một đối tượng JSON sẽ được nối lại), một phản hồi tương thích OpenAI (choices[0].message.content), hoặc chỉ là văn bản. Nếu câu trả lời là JSON có câu trả lời và một danh sách các trích dẫn, như RAG Prompt Builder yêu cầu, công cụ sẽ kiểm tra từng trích dẫn: số nguồn phải là một trong các nguồn, và đoạn trích nên xuất hiện trong nguồn đó, hoặc giống hệt, hoặc sau khi bỏ qua khác biệt về khoảng trắng, chữ hoa chữ thường, ký tự toàn chiều rộng và dấu nháy cong. Nếu câu trả lời là văn bản, công cụ thu thập các số trong ngoặc vuông, chẳng hạn [2] hoặc [1, 3], báo các số không khớp với nguồn nào, và liệt kê các câu không có số. Trong cả hai trường hợp, nó liệt kê các nguồn chưa bao giờ được trích dẫn và cảnh báo khi hoàn toàn không có trích dẫn, hoặc khi done_reason là "length", nghĩa là câu trả lời đã bị num_predict cắt giữa chừng. Điều nó không làm được là đánh giá câu trả lời có đúng hay không. Trong thử nghiệm của chúng tôi với qwen2.5:7b, một câu trả lời trích đúng từng chữ quy tắc từ nguồn của nó mà vẫn đưa ra một con số sai, và một câu trả lời khác nói là không biết nhưng vẫn trích dẫn một nguồn không liên quan. Một trích dẫn qua được kiểm tra ở đây chỉ cho thấy văn bản được trích có trong nguồn.
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-citations.ts
Trường hợp dùng
- Kiểm tra rằng câu trả lời của một mô hình cục bộ chỉ trích dẫn các nguồn thật sự đã được gửi, với các đoạn trích thật sự có trong đó
- Tìm các câu trong câu trả lời không có nguồn, trước khi bạn hiển thị câu trả lời cho người dùng
- So sánh các prompt hoặc mô hình trên cùng các câu hỏi theo mức độ các trích dẫn của chúng đứng vững
Cách dùng
- Dán các nguồn bạn đã gửi cùng với câu hỏi, theo cùng thứ tự.
- Dán câu trả lời: toàn bộ phản hồi /api/chat, một phản hồi tương thích OpenAI, hoặc văn bản của câu trả lời.
- Đọc bảng các trích dẫn, các câu không có số nguồn và các nguồn không được trích dẫn.
Hỏi đáp
Một đoạn trích bị đánh dấu là không tìm thấy. Câu trả lời có sai không?
Không nhất thiết. Mô hình có thể đã diễn đạt lại nguồn thay vì sao chép. Nhưng một đoạn trích không có trong nguồn thì không thể kiểm tra, nên hãy coi phát biểu đó là chưa có căn cứ cho đến khi bạn đọc nguồn.
Mọi trích dẫn đều qua. Câu trả lời có đúng không?
Không nhất thiết. Công cụ chỉ kiểm tra rằng các số và đoạn trích khớp với các nguồn. Trong thử nghiệm của chúng tôi, mô hình trích đúng quy tắc (4 × số chiều + 8 byte) mà vẫn trả lời 1552 byte thay vì 1,544 cho một vector 384 chiều.
Vì sao các nguồn phải theo cùng thứ tự?
Các số trong câu trả lời chỉ thứ tự mà các nguồn đã được gửi. Nếu thứ tự khác, [2] sẽ trỏ tới một văn bản khác và việc kiểm tra trở nên vô nghĩa.
Công cụ tách câu trả lời thành các câu như thế nào?
Tại các ngắt dòng, sau . ! ? theo sau là một khoảng trắng, và sau các ký tự toàn chiều rộng 。!?. Một số đứng ngay sau phần kết của một câu, chẳng hạn "… here. [1]", được tính cho câu đó. Các chữ viết tắt như e.g. có thể tách một câu thành hai.
done_reason "length" nghĩa là gì?
Trong mã nguồn của Ollama, đó là lý do được đưa ra khi câu trả lời chạm giới hạn token (num_predict) thay vì tự dừng. Phần cuối của câu trả lời, và có thể cả các trích dẫn của nó, bị thiếu.
Dữ liệu của tôi có được gửi đi đâu không?
Không. Việc kiểm tra chạy trong trình duyệt của bạn. Công cụ không bao giờ kết nối tới Ollama hay bất kỳ dịch vụ nào khác.
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.