File size: 2,213 Bytes
6dfa658
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from __future__ import annotations

import argparse
import sys
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "src"))

from legal_rag.data import load_corpus
from legal_rag.metrics import citation_label_accuracy, lexical_faithfulness_proxy, token_f1
from legal_rag.rag import extractive_baseline_answer
from legal_rag.retrievers import BM25Retriever


def main() -> None:
    parser = argparse.ArgumentParser(description="Fast local health check for the legal RAG pipeline")
    parser.add_argument("--data-dir", type=Path, default=Path("data"))
    parser.add_argument("--question", default="Kasten oldurme sucu nedir?")
    parser.add_argument("--top-k", type=int, default=5)
    args = parser.parse_args()

    corpus = load_corpus(args.data_dir)
    if not corpus:
        raise SystemExit("Smoke test failed: corpus is empty")

    retriever = BM25Retriever(corpus)
    results = retriever.search(args.question, top_k=args.top_k)
    if not results:
        raise SystemExit("Smoke test failed: BM25 returned no results")

    answer = extractive_baseline_answer(args.question, results)
    if "Kaynak:" not in answer:
        raise SystemExit("Smoke test failed: answer does not include a citation line")

    contexts = [result.doc.text for result in results]
    citation_labels = {result.doc.citation_label for result in results[:1]}
    citation_ok = citation_label_accuracy(answer, citation_labels)
    faithfulness = lexical_faithfulness_proxy(answer, contexts)
    self_f1 = token_f1(answer, answer)

    if citation_ok < 1.0:
        raise SystemExit("Smoke test failed: generated citation does not match top source")
    if faithfulness <= 0.0:
        raise SystemExit("Smoke test failed: answer has no lexical support in retrieved context")
    if self_f1 != 1.0:
        raise SystemExit("Smoke test failed: metric sanity check failed")

    print("Smoke test passed")
    print(f"documents: {len(corpus)}")
    print(f"question: {args.question}")
    print(f"top_source: {results[0].doc.id}")
    print(f"citation: {results[0].doc.citation_label}")
    print(f"faithfulness_proxy: {faithfulness:.3f}")


if __name__ == "__main__":
    main()