框架: 前文实体索引压缩为名字清单(每章16万→2万token砍86%,判重只需名字)

This commit is contained in:
zizi 2026-07-14 12:29:40 +08:00
parent 1444dfb956
commit be6e36f8e3

View File

@ -86,7 +86,10 @@ def render_contracts(contracts):
def scaffold_prompt(title, ch, ch_title, text, prev_entities):
ents = json.dumps(prev_entities, ensure_ascii=False) if prev_entities else "(第一章,为空)"
# 前文实体压缩(创始人 2026-07-14):判重只需名字清单,不必重发型+摘要全档——
# 全量 json 到后期每章膨胀到 15 万+ token(深空第 557 章 2851 实体≈15 万),是次数被压的真凶
_names = sorted({(e.get("名称") or e.get("name") or "").strip() for e in prev_entities} - {""}) if prev_entities else []
ents = "、".join(_names) if _names else "(第一章,为空)"
wc = len(text.replace("\n", "").replace(" ", ""))
cap = max(60, int(wc * 0.05)) # 绝对字数上限(纯比例约束 M3 会写超,首轮实测 9.8%–19%)
# 缓存友好(read-context「稳定度递减吃前缀缓存」):固定规则段全部前置吃前缀缓存,
@ -95,7 +98,7 @@ def scaffold_prompt(title, ch, ch_title, text, prev_entities):
对参考书的当前章(书名/章号/正文见文末材料区)做三件事:
1) 逆推本章细纲:章目标/关键事件/出场角色/伏笔动作(埋·推·收)/章末钩子。**细纲全文不得超过文末给出的字数上限**(约本章正文的 5%;超标会被校验脚本机械退回)。细纲是结构骨架,不是缩写复述——用短语与分号,不写完整句子。
2) 抽实体增量(脚手架级索引):{ENTITY_CRITERIA}
判重:文末给出前文已收录实体,不重报(除非本章给出新身份,则在一句话摘要里并入)。
判重:文末给出前文已收录实体的**名字清单**,清单内的实体本章不重报(若本章赋予其新身份,可在摘要里点明);清单外的本章新实体照抽。
3) 报范式候选线索(**只报线索不出卡**,出卡由窗级聚类另做):本章表现突出、疑似可跨书复用的写法。五型候选:craft=单点叙事装置(删去它场景仍成立);combat=整场武力对抗的打法;emotion=整场情绪戏的推进;scene_pattern=拍卖/谈判/审讯等场景公式;trope=跨章复用的情节公式。
每条线索给四项:type(五型之一,拿不准填"?")、name(2–8 字短名,作者口头会说的话,禁书内专名禁修饰堆叠)、clue(一句话:这个写法怎么运作,用{PLACEHOLDERS}等抽象指代)、evidence(一句话:本章哪里这样写、为何突出,可用专名)。
0–5 条/章,平庸章 0 条正常;门槛比出卡低——拿不准的报上来,窗级聚类会过滤。
@ -105,7 +108,7 @@ def scaffold_prompt(title, ch, ch_title, text, prev_entities):
━━━ 本章材料(每章不同,非规则)━━━
【当前章】《{title}》第 {ch} 章《{ch_title}》|正文约 {wc} 字|细纲上限 {cap} 字
【前文实体索引】
【前文实体名字清单(判重用,已在列的不重报)】
{ents}
【本章正文】
{text}"""