ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

法律长文档问答怎样验:先检查引文,再谈推理

法律长文档问答怎样验:先检查引文,再谈推理

法律长文档里,模型最容易把“找到了相似条款”写成“条款支持了这个结论”。检索正确与法律解释正确之间,还有很长一段路。先把引用做成可检查对象,至少能拦下不存在的页码、错文档和改写过的引文。

这里不用真实案件,也不评价某份合同的法律效力。我们构造两份教学材料,只验证文档ID、字符跨度和逐字片段。这样的例子范围很窄,却比声称一次读完20万字就做对判决更容易复核。

引文应带着原文位置回来

答案可以包含多个主张,每个主张关联一组引文。引用校验器检查“原文有没有”,之后再由规则或领域审阅检查“原文支不支持”。这两个状态不能合成一个布尔值,否则字符串匹配通过会被误读成推理通过。

from dataclasses import dataclass @dataclass(frozen=True) class Quote: document: str start: int end: int text: str def locate(quote, documents): source = documents.get(quote.document) if source is None: return 'unknown_document' if not 0 <= quote.start < quote.end <= len(source): return 'invalid_span' return 'located' if source[quote.start:quote.end] == quote.text else 'mismatch' docs = {'D1': '教学材料:交付地点为仓库甲。', 'D2': '教学补充:本段只变更交付时间。'} start = docs['D2'].index('只变更') q = Quote('D2', start, start + len('只变更交付时间'), '只变更交付时间') assert locate(q, docs) == 'located' assert locate(Quote('D3', 0, 2, '教学'), docs) == 'unknown_document' assert locate(Quote('D2', start, q.end, '同时变更交付地点'), docs) == 'mismatch' answer = {'claim': '交付地点已改成仓库乙', 'quote_status': locate(q, docs), 'support_status': 'needs_review'} assert answer['quote_status'] == 'located' assert answer['support_status'] != 'supported' print('quote location checked; legal support remains ungraded: PASS')

长上下文评测还需要负例

把同一句话放在另一个附件,或者把“仅变更时间”改成“同时变更地点”,都应成为不同题目。还要记录材料版本:后签署的附件未必适用于所有主体,缺一处确认也不应由模型脑补。

Kimi近期官方型号列表提供长上下文模型,但容量只表示可接收的序列范围,不等于法律可靠性承诺。API文档 Anthropic评测方法则可作为设计任务与评分器的工程参考,不能当作法律判断来源。

这段程序已在本地验证引用定位和负例拒绝,没有调用模型,没有处理真实卷宗,也没有计算法律问答准确率。后续实验需要经授权的材料、明确的领域真值和独立审阅者;对于只能定位、尚不能判断支持关系的答案,状态就应停在needs_review。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进