结论句的判定回到原来的方向词、因果词(evidence._DIRECTIONAL 照 main 原样):W1-d 为了让裁判优先判判断句把「主要、集中、异常、偏离、持续、趋势、显著、大幅、新高、新低、抵消、分散」等加进了 _DIRECTIONAL,可 _classify 用同一个正则认结论句,没有数字、没有引用的「下面是主要渠道的表现。」「促销期间活动效果显著。」「整体运行平稳,未见异常。」就成了结论句,结论句策略要求挂依据(模板 ⑨ 和已发布的受管版本都这么写)时计入缺口、出具降档,改了已发布版本的档位;出口的 io._concluding 也照它认代码块里的正文。扩充的判断词挪到 judge._JUDGEMENT,只给 claim_priority 排送判的先后(结论句里有它们的排第二)。测试:判断词让结论句先送判、不让连接性的话变成结论句;结论句要挂依据、出口带契约的周报多写这三句,档位照旧 formal、没挂依据的结论 0 句

This commit is contained in:
ThearchyHelios
2026-10-21 15:37:41 +08:00
parent a286792e13
commit 7e2ee912b3
4 changed files with 45 additions and 16 deletions
+2 -7
View File
@@ -2870,16 +2870,11 @@ def _context(text: str, start: int, end: int) -> str:
_BOLD = re.compile(r"(\*\*|__)(?P<inner>(?:\[\[" + _MARKER_GUARD + r"[^\[\]\n]*?\]\]|(?!\1)[^\n])+?)\1")
#: 方向词、因果词:没有数字也没有引用的句子,含这些词才算结论。「同比」「环比」不在里面:它们只说明
#: 跟谁比,本身不是涨跌;真正的比较结论还会带「增长」「下降」或者数字。
#: 分析判断词(分析能力一轮,engine/analysis_claims 的说法表)也算:「主要来自」「集中在」「异常」「持续下降」「趋势」
#: 「显著」,裁判优先判这类句子(judge.claim_priority)。「主要」后面是「包括、内容、分为、有、看」这类的是在列提纲,
#: 「持续关注」「持续跟进」是建议,「趋势图」「趋势如下」是在引出图表,「集中采购」「分散风险」说的不是数据,都不算
#: 分析判断词(「主要」「异常」「趋势」「显著」……)不在这里:一句话算不算结论决定了结论句策略要不要它挂依据、出具缺口
#: 怎么数,已发布的版本按这份词表定了档位,扩了就变;裁判优先判判断句另用 judge._JUDGEMENT 排序,只影响送判的先后
_DIRECTIONAL = re.compile(
r"增长|增加|上升|提升|提高|上涨|下降|下滑|减少|降低|回落|下跌|反弹|超过|高于|低于|领先|落后|最高|最低"
r"|最多|最少|来自|导致|因为|由于|带动|拉动|拖累|驱动|原因|归因|贡献|占比|翻倍|持平|波动"
r"|主要(?!包括|内容|分为|分成|有|看|从|是指|指|结论|发现|观点|工作|任务|目的|目标|问题|方面)"
r"|集中(?!采购|管理|处理|展示|讨论|培训)|异常|偏离"
r"|持续(?!关注|跟踪|跟进|观察|监控|推进|优化|改进|更新)|趋势(?![图表线如::])|显著|明显高于|明显低于|大幅|激增"
r"|骤降|暴跌|飙升|新高|新低|抵消|分散(?!注意|精力|风险|投资|采购)"
r"|(?<![A-Za-z])(?:increase|decrease|grow|growth|decline|drop|rise|due to|because|driven)(?![A-Za-z])",
re.I)
#: 定义句:「同比是将本期与上年同月对比」「增长率是指……」。解释一个概念怎么算,不是对数据下结论
+14 -4
View File
@@ -3,8 +3,8 @@
数字、实体、引文是确定性的,系统自己取值、自己核对。可「增长主要来自华东」说得对不对,规则判断不了,
只能交给模型——这是概率性的判断,所以这里每一步都说实话、留余地:
1. 预筛(claim_priority):只把结论句送去判。挂了依据的排第一,有方向词、因果词的排第二,其余有数字、
实体这类实质内容的排第三;标题、表格单元格、代码、连接性的话、只有过渡词的、短句不送
1. 预筛(claim_priority):只把结论句送去判。挂了依据的排第一,有方向词、因果词、分析判断词的排第二,其余有
数字、实体这类实质内容的排第三;标题、表格单元格、代码、连接性的话、只有过渡词的、短句不送
2. 证据摘录(prepare):句子挂的每件证据摘一段。指标写「名称 = 值」加原式,再附上输入取自哪次查询、
哪一格和那次查询的 SQL;查询给 SQL 前 300 字和被引用的行(最多 20 行,数据源遮罩的列不给;宽表先给
被引用的列,再补满 12 列);表附上字段清单和类型(最多 60 个,遮罩的列不列,快照不完整要注明),
@@ -202,6 +202,16 @@ _TRANSITIONS = re.compile(
r"因此|所以|总之|如下|以下|(?<![A-Za-z])(?:in summary|as follows|overall|next)(?![A-Za-z])",
re.I)
_INVISIBLE = re.compile(r"[\W_]+")
#: 分析判断词(分析能力一轮,engine/analysis_claims 的说法表):「主要来自」「集中在」「异常」「持续下降」「趋势」「显著」。
#: 结论句里有它们的和方向词、因果词一样排第二,裁判优先判这类句子。只管送判的先后:一句话算不算结论仍按
#: evidence._DIRECTIONAL(结论句策略、出具缺口照它数,扩了会改已发布版本的档位)。「主要」后面是「包括、内容、分为、有、看」
#: 这类的是在列提纲,「持续关注」「持续跟进」是建议,「趋势图」「趋势如下」是在引出图表,「集中采购」「分散风险」说的
#: 不是数据,都不算
_JUDGEMENT = re.compile(
r"主要(?!包括|内容|分为|分成|有|看|从|是指|指|结论|发现|观点|工作|任务|目的|目标|问题|方面)"
r"|集中(?!采购|管理|处理|展示|讨论|培训)|异常|偏离"
r"|持续(?!关注|跟踪|跟进|观察|监控|推进|优化|改进|更新)|趋势(?![图表线如::])|显著|明显高于|明显低于|大幅|激增"
r"|骤降|暴跌|飙升|新高|新低|抵消|分散(?!注意|精力|风险|投资|采购)")
# --------------------------------------------------------------------------
@@ -231,7 +241,7 @@ def claim_priority(unit: dict[str, Any], block: dict[str, Any], markdown: str) -
- 不是结论句(连接性的话、标题、代码)、或者在表格里(一格值不是一句话):不送
- 写作者挂了依据(行内引用或 [[see:]],自动链接的名字不算):1
- 去掉过渡词和标点什么都不剩(「原因如下:」):不送
- 有方向词、因果词:2
- 有方向词、因果词、分析判断词(_JUDGEMENT):2
- 有数字、值、实体、引文,看得见的字又不少于 SHORT_CHARS 个:3
- 其余(短句):不送
"""
@@ -246,7 +256,7 @@ def claim_priority(unit: dict[str, Any], block: dict[str, Any], markdown: str) -
shown = body + "".join(_INVISIBLE.sub("", str(s.get("text") or "")) for s in substance)
if not shown:
return None
if _DIRECTIONAL.search(body):
if _DIRECTIONAL.search(body) or _JUDGEMENT.search(body):
return 2
if (substance or unit.get("see")) and len(shown) >= SHORT_CHARS:
return 3
+11 -5
View File
@@ -454,12 +454,18 @@ def test_the_prompt_rules_depend_on_whether_there_are_conclusions():
assert "[[a:A1]]" in ac.ANALYSIS_RULES_PROMPT
def test_judgement_words_make_a_sentence_a_claim_for_the_judge():
def test_judgement_words_rank_claims_for_the_judge_but_do_not_make_sentences_claims():
"""判断词只管裁判送判的先后(judge._JUDGEMENT):一句话算不算结论仍按原来的方向词、因果词(evidence._DIRECTIONAL),
结论句策略要求挂依据、出具缺口照它数——扩了就改了已发布版本的档位。"""
from app.engine.judge import claim_priority
doc = compose_doc("华东异常。\n\n下面主要看三个方面。\n\n建议持续关注。\n\n近 8 周的趋势图如下:", catalog())
doc = compose_doc("华东异常。\n\n华东异常,退款 12 单。\n\n下面是主要渠道的表现。\n\n促销期间活动效果显著。\n\n"
"整体运行平稳,未见异常。\n\n建议持续关注。\n\n近 8 周的趋势图如下:\n\n华东退款 12 单。", catalog())
kinds = {doc["markdown"][slice(*u["span"])]: (u["kind"], claim_priority(u, b, doc["markdown"]))
for b, u in evidence.iter_units(doc)}
assert kinds["华东异常。"] == ("claim", 2)
assert kinds["下面主要看三个方面。"][0] == "connective" and kinds["建议持续关注。"][0] == "connective"
assert kinds["近 8 周的趋势图如下:"][0] == "connective", "引出图表的话不算判断"
for text in ("华东异常。", "下面是主要渠道的表现。", "促销期间活动效果显著。", "整体运行平稳,未见异常。", "建议持续关注。",
"近 8 周的趋势图如下:"):
assert kinds[text] == ("connective", None), text
assert doc["stats"]["uncited_claims"] == 2, "只有两句带数字的算结论"
assert kinds["华东异常,退款 12 单。"] == ("claim", 2), "结论句里的判断词让裁判先判它"
assert kinds["华东退款 12 单。"] == ("claim", 3)
@@ -265,6 +265,24 @@ async def test_the_scope_is_written_only_when_there_are_conclusions(monkeypatch,
assert "analysis_scope" not in doc
# --------------------------------------------------------------------------
# 判断词不改一句话算不算结论:已发布版本的档位不变
# --------------------------------------------------------------------------
@pytest.mark.parametrize("extra", ["整体运行平稳,未见异常。", "下面是主要渠道的表现。", "促销期间活动效果显著。"])
async def test_judgement_words_do_not_turn_connective_sentences_into_uncited_claims(monkeypatch, extra):
"""已发布的受管版本(结论句要挂依据、出口带契约):没有数字、没有引用的话照旧是连接性的话,不因为带了「主要」「异常」
「显著」就算没挂依据的结论、记缺口降档(判断词只给裁判排送判的先后,judge._JUDGEMENT)。"""
graph = weekly(numbers="strict", on_violation="flag", claims="require_citation")
graph["nodes"][-1]["data"]["config"]["contract"] = {
"report_from": "write", "metrics_from": ["caliber"], "required": ["gmv"], "strict": True}
script(monkeypatch, f"{PLAIN}\n\n{extra}")
issuance = (await finish(graph)).output["_issuance"]
assert issuance["tier"] == "formal" and issuance["gaps"] == []
assert issuance["claims"] == {"policy": "require_citation", "uncited_claims": 0, "uncited": []}
# --------------------------------------------------------------------------
# 取值写错
# --------------------------------------------------------------------------