Hướng dẫn
Hướng dẫn: đánh giá một ứng dụng RAG
Một bài hướng dẫn có thể chạy được cho một ứng dụng tăng cường truy xuất, theo hai lộ trình: một ứng dụng hộp đen có sẵn mà bạn ghi lại việc truy xuất, ngữ cảnh và trích dẫn của nó từ bên ngoài, và một ứng dụng phân tầng mà Oloproof chạy từng tầng một để oloproof diagnose có thể thực thi lại các trường hợp thất bại dưới những thay đổi có kiểm soát. Cả hai đều chạy cục bộ mà không cần thông tin xác thực của nhà cung cấp.
Các khái niệm đằng sau mỗi bước (tầng, nhãn liên quan, ngữ cảnh chuẩn, bốn nhãn thất bại) nằm ở trang Đánh giá RAG; các thuật ngữ trường hợp, bộ đánh giá, chỉ số, khoảng và cổng nằm ở Khái niệm cốt lõi. Trang này là lộ trình thực hành đi qua chúng.
Lộ trình nào là của bạn
| Ứng dụng của bạn | Lộ trình | Bạn nhận được gì | Bạn không nhận được gì |
|---|---|---|---|
| Một lần gọi vào, một câu trả lời ra (một dịch vụ, một endpoint HTTP, một chuỗi framework bạn không muốn tách) | A, hộp đen | Chỉ số truy xuất, kiểm tra trích dẫn, giám khảo bám nguồn, cổng, so sánh | Can thiệp có kiểm soát: diagnose không thực thi lại gì cả |
| Truy xuất và sinh mà bạn có thể gọi riêng | B, phân tầng | Mọi thứ trong A, bộ nhớ đệm theo tầng, và diagnose với ngữ cảnh chuẩn, top-k và một reranker bên cạnh một nhóm đối chứng | Các can thiệp ngoài ba loại đó |
Hãy bắt đầu với A nếu bạn chưa chắc. Nó không cần thay đổi ứng dụng, và chuyển sang B sau này vẫn giữ nguyên tập dữ liệu, các bộ đánh giá và chính sách.
Điều kiện tiên quyết
- Python 3.11 trở lên, và Oloproof đã được cài (pip install oloproof).
- Các dự án ví dụ, đi kèm với gói: blackbox_rag cho lộ trình A và support_rag cho lộ trình B. Sao chép một dự án vào một thư mục mới và làm việc ở đó:
oloproof init --example blackbox_rag my-rag
cd my-ragMọi lệnh bên dưới chạy từ bên trong thư mục đã sao chép. Các lần chạy, phán quyết và chẩn đoán được lưu trong .oloproof/ ở đó.
Lộ trình A: một ứng dụng có sẵn như một hộp đen
Các tệp
| Tệp | Nó là gì |
|---|---|
| app.py | support_api(question), đứng thay cho ứng dụng của bạn, và run(case), adapter |
| server.py | Cùng ứng dụng đó qua HTTP, cho biến thể HTTP bên dưới |
| data/corpus.jsonl | Cơ sở tri thức 14 đoạn văn mà ứng dụng tìm kiếm |
| data/support.jsonl | 15 trường hợp: 13 có nhãn liên quan và đoạn văn chuẩn, 2 không có cả hai |
| oloproof.yaml | Bộ kiểm thử: tập dữ liệu, hệ thống, bộ đánh giá, lát cắt |
| oloproof.http.yaml | Cùng bộ kiểm thử đó trên máy chủ HTTP |
| release.yaml | Chính sách phát hành cho một lần chạy đơn lẻ |
| compare.yaml | Chính sách để so sánh một lần chạy ứng viên với một đường cơ sở |
Ứng dụng trả về gì
support_api hoạt động như một ứng dụng bạn đã có: nó tìm kiếm, xây một prompt từ các nguồn tốt nhất vừa với một ngân sách từ, trả lời và trích dẫn. Phản hồi của nó đã mang theo những gì nó đã làm:
{
"answer": "Team plans include five seats.",
"cited": ["kb-03"],
"sources": [{"id": "kb-03", "score": 3.0, "text": "Team plans include five seats. ..."}],
"prompt_sources": [{"id": "kb-03", "score": 3.0, "text": "...", "rank": 1, "tokens": 17}],
"skipped": [{"id": "kb-05", "rank": 3, "why": "top_k"}]
}Tên các trường trong ứng dụng của bạn sẽ khác. Điều quan trọng là nó có thể cho bạn biết, theo từng câu hỏi, các nguồn đã xếp hạng mà nó truy xuất, những nguồn đã tới được mô hình, và những nguồn nó đã trích dẫn. Nếu không thể, hãy thêm những thứ đó vào phản hồi hoặc log của nó trước: Oloproof đo những gì được ghi lại và không bao giờ suy ra việc truy xuất từ một câu trả lời.
Adapter
run gọi ứng dụng mà không thay đổi và ánh xạ phản hồi lên ba artifact có kiểu, những bản ghi mà các bộ đánh giá truy xuất và trích dẫn đọc:
@system(
name="support-rag-blackbox",
version="tutorial",
records=("retrieval/v1", "context/v1", "citations/v1"),
)
def run(case):
response = support_api(str(case["question"]))
recorder = current_case()
recorder.retrieval(
Retrieval(
query=case["question"],
depth=SEARCH_DEPTH,
candidates=tuple(
Passage(doc_id=s["id"], score=s["score"], text=s["text"])
for s in response["sources"]
),
)
)
recorder.context(
Context(
items=tuple(
ContextItem(doc_id=i["id"], position=i["rank"], tokens=i["tokens"], text=i["text"])
for i in response["prompt_sources"]
),
dropped=tuple(
DroppedItem(doc_id=i["id"], position=i["rank"], reason=i["why"])
for i in response["skipped"]
),
token_budget=PROMPT_WORD_BUDGET,
)
)
recorder.citations(response["cited"])
return {"answer": response["answer"], "citations": response["cited"]}| Artifact | Hình dạng | Được đọc bởi |
|---|---|---|
| retrieval/v1 | query, depth, và candidates theo đúng thứ tự bộ truy xuất của bạn trả về, mỗi cái là một Passage(doc_id, chunk_id, score, text) | hit_rate, recall, mrr, ndcg |
| context/v1 | items đã tới được mô hình (doc_id, position, tokens, text), các mục dropped với reason là top_k hoặc token_budget, và token_budget | citation_validity, groundedness_judge, citation_support_judge |
| citations/v1 | ids, mỗi cái là một doc_id hoặc doc_id#chunk_id | citation_validity, citation_support_judge |
Oloproof ghi lại vị trí như được đưa và không bao giờ xếp hạng lại. Một artifact sai dạng làm dừng lần chạy với mã thoát 2 thay vì được lưu. case là đối tượng input của trường hợp, nên case["question"] là câu hỏi từ tập dữ liệu.
Để dùng ứng dụng của chính bạn, hãy thay thân của support_api bằng một lời gọi tới nó (một lời gọi SDK, một yêu cầu HTTP) và giữ nguyên run. Trỏ system.callable trong oloproof.yaml tới nó dưới dạng module:function.
Biến thể HTTP
Một hệ thống HTTP không thể gọi bộ ghi, nên phản hồi của nó mang bằng chứng thay vào đó, đã ở sẵn ba hình dạng nêu trên, và cấu hình nêu vị trí của chúng:
system:
name: support-rag-http
version: tutorial
http:
url: http://127.0.0.1:8766/answer
output_path: result
artifacts:
retrieval/v1: evidence.retrieval
context/v1: evidence.context
citations/v1: evidence.citationsserver.py phục vụ đúng như vậy. Khởi động nó, rồi chạy trên nó:
python server.py 8766
oloproof run --config oloproof.http.yamlĐầu vào của trường hợp được gửi làm thân JSON. output_path lấy đầu ra ra khỏi phản hồi, và mỗi mục artifacts ghi lại một đường dẫn có dấu chấm thành loại đó; một trường bị thiếu hoặc sai dạng làm dừng lần chạy với mã thoát 2. Kết quả giống hệt lộ trình callable bên dưới. Trong dịch vụ của chính bạn, đối tượng bằng chứng thường là một trường gỡ lỗi mà bạn bật cho lưu lượng đánh giá.
Một trường hợp khai báo gì
{"id":"seat_count","input":{"question":"How many seats does a team plan include?"},"expected":{"answer":"5 seats","relevant":[{"doc_id":"kb-03"}],"gold_context":[{"doc_id":"kb-03","text":"Team plans include five seats. ..."}]},"metadata":{"topic":"billing"}}
{"id":"office_hours","input":{"question":"What are the support office hours?"},"expected":{"answer":"09:00"},"metadata":{"topic":"account"}}- expected.relevant liệt kê các đoạn văn trả lời câu hỏi. Các chỉ số truy xuất đọc nó. Một trường hợp không có nó, như office_hours, bị loại khỏi các chỉ số đó với no_relevance_labels: nó rời khỏi mẫu số thay vì được tính là đạt hay thất bại.
- expected.gold_context là chính văn bản của đoạn văn. Lộ trình A không bao giờ dùng nó; lộ trình B thay nó vào chỗ ngữ cảnh đã truy xuất trong khi chẩn đoán.
Các trường hợp không có nhãn là chuyện bình thường trên thực tế, vì gán nhãn liên quan tốn công. Chúng vẫn được tính cho các kiểm tra câu trả lời và trích dẫn.
Chọn các bộ đánh giá
evaluators:
- {type: contains, criterion: answer_correct, field: answer, expected_field: answer}
- {type: hit_rate, k: 2}
- {type: recall, k: 2}
- {type: citation_validity, require_citations: true}
slices: [metadata.topic]
min_slice_support: 4- contains kiểm tra câu trả lời có chứa văn bản kỳ vọng. Đó là kiểm tra tác vụ: người dùng có nhận được câu trả lời đúng không. Hãy dùng một giám khảo chính xác hoặc rubric thay vào đó khi cách diễn đạt thay đổi.
- hit_rate và recall ở k: 2 đo việc truy xuất ở độ sâu mà ứng dụng thực sự đưa vào prompt. Một chỉ số truy xuất ở độ sâu mà mô hình không bao giờ thấy mô tả chỉ mục, không phải ứng dụng.
- citation_validity kiểm tra mọi id được trích dẫn đều nêu một đoạn văn đã tới được mô hình; require_citations: true cũng đánh trượt một câu trả lời không trích dẫn gì.
- groundedness_judge và citation_support_judge (tùy chọn) hỏi một mô hình xem câu trả lời có được ngữ cảnh hỗ trợ không. Chúng cần một nhà cung cấp, một mô hình và thông tin xác thực trong một biến môi trường, và tốn tiền cho mỗi trường hợp; xem Giám khảo để biết một giám khảo phải vượt qua gì trước khi được làm cổng.
Các lát cắt relevant_position và context_truncated không khả dụng ở đây: chúng so sánh vị trí với top-k của ứng dụng, thứ mà chỉ một hệ thống phân tầng khai báo. Yêu cầu chúng sẽ làm dừng lần chạy với slice 'relevant_position' compares relevant positions with top_k, so it needs a staged system.
Chính sách phát hành
version: 1
confidence_level: 0.95
block_on: [FAIL, INSUFFICIENT_EVIDENCE, MANUAL_REVIEW]
rules:
- id: answer-floor
metric: answer_correct
min: 0.70
- id: retrieval-floor
metric: hit_rate_at_2
min: 0.80
- id: citations-valid
metric: citations_valid
kind: observed_count
max_failures: 0Một quy tắc min chỉ đạt khi toàn bộ khoảng vượt qua mức sàn, thất bại khi toàn bộ khoảng nằm dưới nó, và là INSUFFICIENT_EVIDENCE trong trường hợp còn lại. Một quy tắc observed_count quyết định trên các trường hợp thực sự đã chạy, không có khoảng: "không có trích dẫn không hợp lệ nào trong bộ kiểm thử này". Xem Cổng.
Chạy
oloproof runRun run_01M4FCBPE0G550CKCVGXCNEM2P [DECIDED/COMPLETE]
Gate: BLOCK (exit 1)
│ answer-floor │ answer_correct │ INSUFFICIENT_EVIDENCE │ interval_overlaps_threshold │
│ retrieval-floor │ hit_rate_at_2 │ INSUFFICIENT_EVIDENCE │ interval_overlaps_threshold │
│ citations-valid │ citations_valid │ FAIL │ observed_failures_exceed_limit │
│ answer_correct │ 73.3% │ [44.8%, 92.3%] │ 11 / 15 observed · 0 missing · 0 excluded │
│ hit_rate_at_2 │ 92.3% │ [63.9%, 99.9%] │ 12 / 13 observed · 0 missing · 2 excluded │
│ recall_at_2 │ 92.3% │ [63.9%, 99.9%] │ 12 / 13 observed · 0 missing · 2 excluded │
│ citations_valid │ 93.3% │ [68.0%, 99.9%] │ 14 / 15 observed · 0 missing · 0 excluded │
Cache: execution 0 hit/15 miss; judgment 0 hit/56 missCách đọc:
- Gate: BLOCK (exit 1): một quy tắc đã FAIL. Mã thoát 1 nghĩa là có một FAIL; mã thoát 3 nghĩa là cổng chặn mà không có FAIL (ở đây sẽ là INSUFFICIENT_EVIDENCE); mã thoát 0 nghĩa là không có gì mà chính sách chặn. [DECIDED/COMPLETE] là trạng thái thực thi: mọi trường hợp đều đã chạy.
- citations-valid FAIL: một câu trả lời không trích dẫn gì, và require_citations tính điều đó là không hợp lệ.
- answer-floor là INSUFFICIENT_EVIDENCE, không phải PASS, dù 73,3% cao hơn 70%: với 15 trường hợp, khoảng kéo xuống tới 44,8%, nên bằng chứng không thể cho thấy mức sàn được đáp ứng.
- hit_rate_at_2 ghi 2 excluded: hai trường hợp không có nhãn. Mẫu số của nó là 13, không phải 15.
- Bảng Slices theo sau mang tính khám phá và không bao giờ làm cổng; một lát cắt dưới min_slice_support không hiển thị khoảng.
Xem xét các thất bại
Mã lần chạy nằm ở dòng đầu tiên trong đầu ra của lần chạy.
oloproof inspect RUN_ID --failures4 of 15 cases failed, errored or did not finish
refund_review
output: {"answer": "Every refund request on an annual plan is logged in the audit trail, and the same request is listed again on the day it was reviewed and approved."…
answer_correct: failed
money_back
output: {"answer": "I could not find that in the knowledge base.", "citations": []}
answer_correct: failed
hit_rate_at_2: failed
recall_at_2: failed
citations_valid: failed
security_review
output: {"answer": "Security reviews during Enterprise onboarding include an access review and a written summary for the customer, and every review is scheduled with t…
answer_correct: failed
seat_count
output: {"answer": "Team plans include five seats.", "citations": ["kb-03"]}
answer_correct: failedoloproof inspect RUN_ID --case refund_review in ra đầu vào, các giá trị kỳ vọng, đầu ra và mọi phán quyết của một trường hợp. Các artifact được ghi lại nằm trong gói đã xuất:
oloproof export RUN_IDMỗi dòng của .oloproof/bundles/RUN_ID/cases.jsonl là bản ghi của một trường hợp; trường artifacts của nó chứa những gì đã được ghi lại. Với money_back, trường đó ghi:
{"retrieval/v1": [{"candidates": [], "depth": 6, "query": "Where do I claim money back on a yearly subscription?"}], "context/v1": [{"dropped": [], "items": [], "source": "retrieval", "token_budget": 40}], "citations/v1": [{"ids": []}]}Đọc bốn thất bại chỉ từ bằng chứng đã ghi:
| Trường hợp | Bản ghi cho thấy gì | Một hành động tiếp theo có ý nghĩa |
|---|---|---|
| money_back | Truy xuất không trả về gì: câu hỏi không có từ nào chung với đoạn văn về hoàn tiền | Viết lại truy vấn hoặc dùng từ đồng nghĩa, được đo bằng hit_rate_at_2 |
| refund_review, security_review | hit_rate_at_2 đạt, nhưng câu trả lời đến từ một đoạn văn khác | Xem xét context/v1: đoạn văn liên quan có bị bỏ vì ngân sách không? |
| seat_count | Đúng đoạn văn đã được truy xuất, giữ lại và trích dẫn; câu trả lời nói "five", trường hợp kỳ vọng "5" | Sửa kỳ vọng hoặc định dạng câu trả lời, không phải việc truy xuất |
Bảng đó là cách bạn đọc bản ghi. Đó là một mối liên hệ giữa một thất bại và một tầng, không phải một nguyên nhân đã được chứng minh: không có gì thực thi lại trường hợp với tầng đó được thay đổi.
Diagnose làm gì trên một hộp đen
oloproof diagnose RUN_ID --intervention gold-context --criterion answer_correctSelected: 4 failed cases with gold context (observed; no population claim)
UNRESOLVED: 4 of 4, the system is not staged, so no case was re-executed
Diagnosis sha256:8809e100ab2ec1dad8ffeacc136cd510300081a0edf01ec11f881c543ed104bc
Cases: oloproof inspect sha256:8809e100ab2ec1dad8ffeacc136cd510300081a0edf01ec11f881c543ed104bcMọi trường hợp đều UNRESOLVED với lý do intervention_unsupported. Oloproof không thể đưa cho một hộp đen đoạn văn chuẩn thay cho việc truy xuất của chính nó, nên nó không giả vờ làm vậy. Các can thiệp có kiểm soát cần lộ trình B.
Thực hiện một thay đổi ứng viên và so sánh
Bản ghi nói money_back thất bại ở bước truy xuất. Thay đổi ứng viên mở rộng câu hỏi bằng từ đồng nghĩa trước khi tìm kiếm. Trong app.py:
EXPAND_QUERY = TrueThay đổi mã sẽ thay đổi phiên bản hệ thống được ghi cho lần chạy. Chạy lại, rồi so sánh ứng viên với đường cơ sở:
oloproof run
oloproof compare CANDIDATE_RUN_ID BASELINE_RUN_ID --policy compare.yamlRiêng lần chạy ứng viên: citations-valid giờ PASS, hit_rate_at_2 ghi 100.0% [75.2%, 100.0%], và cổng vẫn chặn với mã thoát 3 vì answer-floor và retrieval-floor vẫn là INSUFFICIENT_EVIDENCE. Phép so sánh:
Comparison sha256:2feb024c… of run_01M4FCCJYCVVYA8NB4XZDV6YMB against run_01M4FCCHVBG9WHDP7G5HFX7RDT · 15 paired cases
answer_correct: +6.7 points [-26.5, +40.8] · 15 paired · 0 missing · 0 excluded
hit_rate_at_2: +7.7 points [-29.8, +45.5] · 13 paired · 0 missing · 2 excluded
excluded 2: no_relevance_labels
recall_at_2: +7.7 points [-29.8, +45.5] · 13 paired · 0 missing · 2 excluded
excluded 2: no_relevance_labels
citations_valid: +6.7 points [-26.5, +40.8] · 15 paired · 0 missing · 0 excluded
20 exploratory slice differences not shown; add --slices to list them
Decisions
answers-not-worse answer_correct non-inferiority, margin 5.0 points INSUFFICIENT_EVIDENCE interval_overlaps_margin
about 38 more paired cases would decide it, if the difference holds (53 in total at 7% discordance)
citations-not-worse citations_valid non-inferiority, margin 2.0 points INSUFFICIENT_EVIDENCE interval_overlaps_margin
about 68 more paired cases would decide it, if the difference holds (83 in total at 7% discordance)
Gate: BLOCK (exit 3)Thay đổi đã sửa được trường hợp nó nhắm tới (thêm một câu trả lời, +6,7 điểm trên 15 trường hợp ghép cặp). Phép so sánh vẫn không thể xác lập rằng ứng viên không tệ hơn đường cơ sở quá biên: 15 trường hợp ghép cặp để lại một khoảng rộng khoảng 67 điểm. Dòng lập kế hoạch cho biết cần thêm bao nhiêu trường hợp ghép cặp để quyết định nếu khác biệt giữ nguyên. Một bộ kiểm thử lớn hơn, không phải một biên khác, là hành động tiếp theo. Xem So sánh hai lần chạy và Quy tắc so sánh.
Lộ trình B: một ứng dụng phân tầng với chẩn đoán
Các tệp phân tầng
Lộ trình B chạy ví dụ support_rag, được mô tả ở trang Đánh giá RAG. Sao chép nó:
oloproof init --example support_rag my-staged-rag
cd my-staged-rag| Tệp | Nó là gì |
|---|---|
| app.py | SupportRag, một lớp được trang trí bằng @rag_system: retrieve(input, depth), generate(input, context), count_tokens(passage) |
| data/corpus.jsonl, data/support.jsonl | Cơ sở tri thức, và 13 trường hợp, mỗi trường hợp có relevant và gold_context |
| oloproof.yaml | system.rag trỏ tới lớp và đặt depth, top_k, token_budget, index_version |
| release.yaml, compare.yaml | Cùng các chính sách như lộ trình A |
Khác biệt so với lộ trình A là ai lắp ráp ngữ cảnh. Ở đây Oloproof gọi retrieve, giữ top_k ứng viên đầu tiên, bỏ các đoạn văn vượt quá token_budget, và chuyển phần còn lại cho generate. Vì nó giữ các tầng tách biệt, nó có thể lưu đệm chúng riêng và thực thi lại bước sinh với một ngữ cảnh khác. Để điều chỉnh ứng dụng của chính bạn, hãy thay thân của retrieve (gọi chỉ mục của bạn, trả về Retrieval(candidates=[Passage(...)]) theo thứ tự của bộ truy xuất) và generate (gọi mô hình của bạn với các đoạn văn được đưa). Đặt index_version thành một giá trị thay đổi khi chỉ mục của bạn thay đổi: nó là một phần danh tính của việc truy xuất, và một giá trị cũ sẽ tái sử dụng các lần truy xuất đã lưu đệm trên một chỉ mục không còn trả về chúng.
Cùng cấu hình đó cũng cho phép các lát cắt relevant_position và context_truncated, và một bộ đánh giá ndcg trên toàn bộ độ sâu truy xuất.
Chạy bộ kiểm thử phân tầng
oloproof runGate: BLOCK (exit 3)
│ answer-floor │ answer_correct │ INSUFFICIENT_EVIDENCE │ interval_overlaps_threshold │
│ retrieval-floor │ hit_rate_at_2 │ INSUFFICIENT_EVIDENCE │ interval_overlaps_threshold │
│ citations-valid │ citations_valid │ PASS │ observed_failures_within_limit │
│ answer_correct │ 69.2% │ [38.5%, 91.0%] │ 9 / 13 observed · 0 missing · 0 excluded │
│ hit_rate_at_2 │ 92.3% │ [63.9%, 99.9%] │ 12 / 13 observed · 0 missing · 0 excluded │
│ recall_at_2 │ 92.3% │ [63.9%, 99.9%] │ 12 / 13 observed · 0 missing · 0 excluded │
│ ndcg_at_6 │ 0.866 │ [0.506, 0.990] │ mean of 13 observed · 0 missing · 0 excluded │
│ citations_valid │ 100.0% │ [75.2%, 100.0%] │ 13 / 13 observed · 0 missing · 0 excluded │
Cache: execution 0 hit/13 miss; judgment 0 hit/65 miss
Stages: retrieve 0 hit/13 miss; generate 0 hit/13 missDòng Stages là bộ nhớ đệm riêng của hệ thống phân tầng. Mã thoát 3: không có gì FAIL, nhưng hai quy tắc thiếu bằng chứng để PASS.
Chẩn đoán với ngữ cảnh chuẩn, bên cạnh một nhóm đối chứng
oloproof diagnose RUN_ID --intervention gold-context --criterion answer_correctSelected: 4 failed cases with gold context (observed; no population claim)
Control: 0 of 4 passed when re-executed without the intervention
Recovered under gold context: 3 of 4
RETRIEVAL_MISS: 1 of 4, recovered; no relevant evidence was retrieved
CONTEXT_ASSEMBLY_LOSS: 2 of 4, recovered; relevant evidence within top-k was left out of the context
GENERATION_FAILURE: 1 of 4, still failed with the gold context
Implicated: context budget, in 2 of the 3 recovered failures.
Candidate experiment: a larger token budget. This is a hypothesis to test, not an established cause.
Candidate experiment: smaller chunks. This is a hypothesis to test, not an established cause.
Diagnosis sha256:50a6124f…
Child runs: gold context run_…, control run_…
Cases: oloproof inspect sha256:50a6124f…Hai lần chạy con được tạo từ các trường hợp thất bại: một lần với gold_context của trường hợp thay cho ngữ cảnh đã truy xuất, và một nhóm đối chứng thực thi lại chúng mà không thay đổi. Nhóm đối chứng là điều làm cho cách đọc an toàn: một trường hợp đạt khi chạy lại đơn thuần là không ổn định, chứ chưa được chẩn đoán. diagnose thoát với 0 dù nó tìm thấy gì; nó không quyết định gì về bản phát hành.
oloproof inspect DIAGNOSIS_IDmoney_back: RETRIEVAL_MISS, relevant_not_retrieved, strength intervention_recovery, best relevant position none
refund_review: CONTEXT_ASSEMBLY_LOSS, relevant_dropped_from_context, strength intervention_recovery, best relevant position 2
seat_count: GENERATION_FAILURE, fails_with_gold_context, strength intervention_non_recovery, best relevant position 1
security_review: CONTEXT_ASSEMBLY_LOSS, relevant_dropped_from_context, strength intervention_recovery, best relevant position 2Đọc các nhãn
| Nhãn | Điều đã được quan sát | Điều nó không xác lập |
|---|---|---|
| RETRIEVAL_MISS | Không đoạn văn liên quan nào được truy xuất, và trường hợp đạt với đoạn văn chuẩn | Rằng việc truy xuất là thứ duy nhất sai, hoặc một thay đổi truy xuất cụ thể sẽ sửa được nó |
| RANKED_OUT | Một đoạn văn liên quan được truy xuất dưới top_k, và trường hợp đạt với đoạn văn chuẩn | Rằng mở rộng top-k sẽ giúp các trường hợp khác |
| CONTEXT_ASSEMBLY_LOSS | Một đoạn văn liên quan trong top-k bị bỏ khỏi ngữ cảnh, và trường hợp đạt với đoạn văn chuẩn | Ngân sách nào sẽ là đủ |
| GENERATION_FAILURE | Trường hợp vẫn thất bại dù đã có đoạn văn chuẩn | Rằng lỗi là do mô hình, thay vì do prompt hay kỳ vọng |
| UNRESOLVED | Không thể kết luận gì: hệ thống không phân tầng (intervention_unsupported), trường hợp phục hồi dưới nhóm đối chứng (unstable_under_control), nó không có nhãn liên quan (no_relevance_labels), hoặc bằng chứng bị thiếu | Bất cứ điều gì về trường hợp đó |
Mọi nhãn đều là một mối liên hệ giữa một thất bại và một tầng dưới một can thiệp trên các trường hợp này. Đó không phải một nguyên nhân đã được chứng minh: "Implicated" và "Candidate experiment" là những từ mạnh nhất mà đầu ra dùng, và các số đếm chỉ mô tả các trường hợp đã chọn ("no population claim"). seat_count là một lời nhắc tốt: nó thất bại với đúng đoạn văn vì cơ sở tri thức nói "five" còn trường hợp kỳ vọng "5", điều mà không thay đổi truy xuất nào sửa được.
Các trường hợp có và không có đoạn văn chuẩn
Chỉ các trường hợp thất bại có khai báo expected.gold_context mới có thể được thực thi lại. Bỏ đoạn văn chuẩn khỏi seat_count và money_back (và nhãn liên quan khỏi money_back) thì cùng lệnh đó báo:
Selected: 2 failed cases with gold context (observed; no population claim)
Excluded: 2 failed cases, no_gold_context - declare the passages that would have answered the case in its `expected.gold_context`, as a list of `{doc_id, text}` objects; an intervention needs them to tell a retrieval failure from a generation one
Control: 0 of 2 passed when re-executed without the intervention
Recovered under gold context: 2 of 2
CONTEXT_ASSEMBLY_LOSS: 2 of 2, recovered; relevant evidence within top-k was left out of the contextCác trường hợp bị loại được liệt kê, không bị âm thầm bỏ đi. Cũng lưu ý việc bỏ một nhãn liên quan tác động thế nào tới chính lần chạy: hit_rate_at_2 tăng lên 100.0% (12 / 12 observed, 1 excluded), vì trường hợp duy nhất mà việc truy xuất bỏ sót không còn được đo. Các trường hợp không có nhãn rời khỏi mẫu số; chúng không được tính là đạt, và một chỉ số trên ít trường hợp hơn có thể trông tốt hơn thực tế của ứng dụng. Hãy gán nhãn cho các trường hợp khó trước.
Thử một bản sửa trước khi thực hiện: top-k và một reranker
Hai can thiệp nữa phát lại việc truy xuất đã ghi với một thiết lập khác, nên bộ truy xuất không bị gọi lại:
oloproof diagnose RUN_ID --intervention top-k --top-k 4 --criterion answer_correctRecovered under top-k 4: 0 of 4
Confirmed under top-k 4: 0 of 0 RANKED_OUT cases also recovered
Labels from gold context (diagnosis sha256:50a6124f…): 3 of 4 recoveredMột reranker là một hàm (input, candidates) -> candidates do bạn viết. Lưu nó thành rerank.py bên cạnh app.py:
"""A candidate reranker: shorter passages first, so more of them fit the token budget."""
from oloproof import Passage
def shortest_first(input: dict, candidates: list[Passage]) -> list[Passage]:
return sorted(candidates, key=lambda passage: len((passage.text or "").split()))oloproof diagnose RUN_ID --intervention reranker --reranker rerank:shortest_first --criterion answer_correctRecovered under reranker rerank:shortest_first: 0 of 4
Confirmed under reranker rerank:shortest_first: 0 of 0 RANKED_OUT cases also recoveredKhông cái nào phục hồi được gì, đúng như các nhãn ngữ cảnh chuẩn đã dự đoán: không thất bại nào ở đây là một đoạn văn xếp hạng ngay dưới ngưỡng cắt. Mỗi lần phát lại mang các nhãn ngữ cảnh chuẩn đi tiếp, nên các chẩn đoán được đọc cùng nhau.
Chạy thử nghiệm mà chẩn đoán đã nêu, và so sánh
Nâng token_budget lên 120 trong oloproof.yaml, rồi:
oloproof run
oloproof compare CANDIDATE_RUN_ID BASELINE_RUN_ID --policy compare.yamlStages: retrieve 13 hit/0 miss; generate 7 hit/6 missMọi lần truy xuất đều được tái sử dụng, vì top_k và ngân sách nằm ngoài danh tính của việc truy xuất; chỉ sáu trường hợp có ngữ cảnh thay đổi được sinh lại.
answer_correct: +0.0 points [-33.6, +33.6] · 13 paired · 0 missing · 0 excluded
Decisions
answers-not-worse answer_correct non-inferiority, margin 5.0 points INSUFFICIENT_EVIDENCE interval_overlaps_margin
citations-not-worse citations_valid non-inferiority, margin 2.0 points INSUFFICIENT_EVIDENCE interval_overlaps_margin
Gate: BLOCK (exit 3)Thử nghiệm không giúp được gì: không một trường hợp nào thay đổi phán quyết, nên giả thuyết mà chẩn đoán đưa ra không được hỗ trợ với các trường hợp này. Đó là một kết quả hữu ích. Thử nghiệm tiếp theo là các đoạn nhỏ hơn, hoặc prompt của hai trường hợp lắp ráp ngữ cảnh; seat_count cần sửa lại kỳ vọng của nó.
Khắc phục sự cố
| Triệu chứng | Nguyên nhân | Cách sửa |
|---|---|---|
| Configuration error: slice 'relevant_position' ... needs a staged system | Một lát cắt vị trí trên một hệ thống callable hoặc HTTP | Bỏ lát cắt, hoặc chuyển sang lộ trình B |
| Lần chạy dừng với mã thoát 2 và malformed retrieval/v1 artifact | Một trường mà schema không cho phép, hoặc nhiều ứng viên hơn depth | Chỉ ánh xạ các trường đã được mô tả; đặt depth ít nhất bằng số được trả về |
| citations_valid ghi 0 / 0 observed · 15 missing và quy tắc của nó là INSUFFICIENT_EVIDENCE với no_observations | Adapter đã không ghi citations/v1 (hoặc context/v1); mỗi trường hợp như vậy bị thiếu, không phải đạt | Ghi cả hai trên mọi nhánh đi qua adapter, kể cả "không có câu trả lời"; oloproof inspect RUN_ID --failures cho thấy lỗi theo từng trường hợp |
| Một chỉ số truy xuất cho thấy nhiều excluded | Các trường hợp không có expected.relevant | Gán nhãn cho chúng, hoặc chấp nhận mẫu số nhỏ hơn một cách có ý thức |
| diagnose nói UNRESOLVED ... not staged | Lộ trình A | Đúng như dự kiến; hãy dùng lộ trình B cho các can thiệp |
| diagnose từ chối với an intervention must re-execute the same system | Mã hoặc cấu hình đã thay đổi từ lần chạy | Chẩn đoán một lần chạy của phiên bản hiện tại, hoặc khôi phục phiên bản đã chạy |
| Chẩn đoán chọn ít trường hợp hơn số đã thất bại | Các trường hợp thất bại không có expected.gold_context | Thêm các đoạn văn chuẩn; các trường hợp bị loại được nêu tên trong đầu ra |
| Các lần truy xuất được tái sử dụng sau khi chỉ mục thay đổi | index_version không đổi | Đổi index_version khi chỉ mục thay đổi |
Giới hạn
- Oloproof gọi ứng dụng của bạn; nó không lưu trữ, cô lập hay đặt lại ứng dụng. Chỉ mục, bộ nhớ đệm và mọi trạng thái mà nó giữ là của bạn.
- Trên một hộp đen, các can thiệp không khả dụng: diagnose gán nhãn UNRESOLVED cho mọi trường hợp và không thực thi lại gì cả.
- Các can thiệp là ngữ cảnh chuẩn, top-k và một reranker. Không có can thiệp về chia đoạn, embedding hay prompt.
- Các nhãn chẩn đoán mô tả các trường hợp thất bại đã chọn dưới một can thiệp bên cạnh một nhóm đối chứng. Chúng liên hệ một thất bại với một tầng; chúng không chứng minh một nguyên nhân, và không khẳng định gì về các trường hợp không được chọn.
- Các chỉ số truy xuất cần nhãn liên quan, và việc chẩn đoán cần các đoạn văn chuẩn; Oloproof không tạo ra cái nào trong số đó.
- Các ví dụ tất định đứng thay cho một bộ truy xuất và một mô hình thật. Một mô hình thật trong generate hoặc một bộ đánh giá giám khảo sẽ gọi một nhà cung cấp, cần thông tin xác thực và tốn tiền cho mỗi trường hợp.
- Cái gì hoạt động ở đâu, SDK so với YAML so với trình duyệt, có ở Những gì hoạt động hôm nay.