fix: include matching body sections despite nonempty semantic recall

This commit is contained in:
2026-10-17 20:15:54 +08:00
parent eb8c545090
commit 93ff9c8c8d
3 changed files with 46 additions and 4 deletions
+32 -1
View File
@@ -26,7 +26,7 @@ from wisegrade.pages import classify_document
from wisegrade.parsing import text_quality
from wisegrade.rag import INDEX_VERSION, build_chunks, ingest, keyword_overlap, query_terms, retrieve, retrieve_targets
from wisegrade.rules import Criterion, EvidenceTarget
from wisegrade.scoring import _attach_page_types, _score_criterion
from wisegrade.scoring import _attach_page_types, _body_navigator, _score_criterion
from wisegrade.seed import seed_initial
from wisegrade.storage import extract_identity, sha256
from wisegrade.submissions import file_index_lock
@@ -149,6 +149,37 @@ def test_shared_chunk_keeps_all_target_ids():
assert selection["evidence"][0]["target_ids"] == ["t0", "t1"]
def test_plan_navigation_finds_future_work_body_despite_nonempty_semantic_hits(sqlite_db):
db = sqlite_db
item = project(db)
doc = document(db, item, pages=[
{"page_number": 3, "text": "目录\n4.2 后续改进方向.......... 11\n4.3 参考文献.......... 12"},
{"page_number": 6, "text": "2.3 系统控制\n控制器通过闭环反馈调整电机转速,实现稳定的运动控制。"},
{"page_number": 14, "text": "4.2 后续改进方向\n后续将探索深度学习检测算法,提高复杂光照场景下的鲁棒性;"
"引入模型预测控制优化动态跟踪,并完善状态监控和数据回放功能。"},
])
noise = db.scalar(select(KnowledgeChunk).where(KnowledgeChunk.document_id == doc.id,
KnowledgeChunk.page == 6))
navigator = _body_navigator(db, course_version_id=1, project_id=item.id, category="stage3")
targets = normalize_targets(["计划", "章节"])
selected = retrieve_targets(db, course_version_id=1, project_id=item.id, category="stage3",
targets=targets, navigator=navigator, limit=2,
retrieve_fn=lambda *args, **kwargs: [{
"chunk_id": noise.id, "document_id": doc.id, "page": 6,
"page_type": "body", "text": noise.text, "rank": .03}])
assert any(hit["page"] == 14 and "t0" in hit["target_ids"] for hit in selected["evidence"])
assert all(hit["page_type"] == "body" for hit in selected["evidence"])
def test_heading_navigation_supplements_existing_hits_for_custom_labels():
target = normalize_targets(["实验数据"])
raw = {"chunk_id": 1, "document_id": 1, "page": 2, "text": "仅描述装置。", "page_type": "body", "rank": .03}
body = {"chunk_id": 2, "document_id": 1, "page": 5, "text": "实测响应时间80毫秒。", "page_type": "body", "rank": .5}
result = retrieve_targets(None, course_version_id=1, project_id=1, targets=target, limit=1,
retrieve_fn=lambda *args, **kwargs: [raw], navigator=lambda _: [body])
assert result["evidence"][0]["chunk_id"] == 2
def test_document_filter_and_index_readiness_precede_limit(sqlite_db):
db = sqlite_db
item = project(db)