Compare commits

...
Author SHA1 Message Date
prof-dev b9cec60730 feat(distill): 三档粒度重构 ZHIYI_DISTILL_MODE/ CAP(t_afacc477 只交数据不部署)
E1 128 ep 隔离对照:A p50=23/act26.5% · B p50=47/act50.6% · C p50=34/act35.3%
E2 90 ep(>1000字) 截断+最优臂:C@1000 act=57.1% / C@2000 act=62.2% / C@none act=62.8%
AC3 32k 压测:单槽 cap32000 均值 23.7s p90=39.2s;生产 16K 槽路由判定全 fits_local=True(1000/2000 档 5-9s)
A37 结论:truncate+limitDistillContent+proxy路由+120s客户端超时 四重保护,现码路径 32k 场景不可重现

改动:新增 granularity_gate.go(env 三档 + cap 可配,默认 mode=context cap=1000);
engine.go 组装段按档拼附加段(current 逐字节等价现状 A)。
未部署生产;红线未改 FUSION_W/FEEDBACK_BIAS/POS_MODE;go build ./... + go test 全绿。
2026-10-31 13:07:48 +08:00
2 changed files with 111 additions and 5 deletions
+22 -5
View File
@@ -750,13 +750,30 @@ SCORE|五个数字用竖线分隔
// 注意:本行写法刻意让 vet 的 Sprintf(格式串) 检查不匹配(外层 %s%s%s 与 3 实参对齐,
// 内层「内容:\n%s」是嵌套 Sprintf 的独立格式串,运行时各自 1 槽 1 参);
// rawscore_liveprobe_test.go 的 extractPromptTemplate 锚点须与本行「fmt.Sprintf("内容:\n%s"」保持同步。
// t_ab5b2461 信息密度判据灰度(ZHIYI_DISTILL_DENSITY=1):只在开关开时追加信息量要求段。
// 关态 instrFull == instr,prompt 逐字节与现状一致(AC5);上方旧 prompt 常量一字未动。
// t_afacc477 三档粒度(ZHIYI_DISTILL_MODE)+ 截断可配(ZHIYI_DISTILL_CAP,默认 1000=现状)。
// current = 逐字节等价现状 A(cap=1000、无附加段);context = B 档(默认);merged = C 档。
instrFull := instr
if densityGateEnabled {
instrFull = instr + densityPromptAddendum
if distillMode == "context" {
instrFull = instr + addendumContext
} else if distillMode == "merged" {
instrFull = instr + addendumMerged
}
prompt := fmt.Sprintf("%s%s%s", instrFull, outFmt, fmt.Sprintf("内容:\n%s", truncate(content, 1000)))
// t_ab5b2461 信息密度判据灰度(ZHIYI_DISTILL_DENSITY=1):只在开关开时追加信息量要求段。
// 关态 instrFull 不含密度门附加段,prompt 逐字节与现状一致(AC5);上方旧 prompt 常量一字未动。
if densityGateEnabled {
instrFull = instrFull + densityPromptAddendum
}
capVal := distillCap
if capVal <= 0 {
capVal = 0 // 不截断
}
var contentTail string
if capVal <= 0 {
contentTail = content
} else {
contentTail = truncate(content, capVal)
}
prompt := fmt.Sprintf("%s%s%s", instrFull, outFmt, fmt.Sprintf("内容:\n%s", contentTail))
body := map[string]interface{}{
"model": e.LLMModel,
+89
View File
@@ -0,0 +1,89 @@
//go:build !ignore
package distill
// 织忆 · 蒸馏粒度重构(t_afacc477,2026-10-31 交付分支,未部署)
//
// 背景:现状 prompt(A)输出 p50=23 字、97.2% 短于 60 字、可执行标记仅 26.5%,
// 11:1 压缩是粒度设计造成的(2B 与 agnes 一样碎)。同 128 episode 隔离 A/B/C 对照(E1):
// A(现状) p50=23 条/ep 6.51 act=26.5% lt60=97.2%
// B(上下文) p50=47 条/ep 2.61 act=50.6% lt60=71.0% ← 推荐
// C(合并) p50=34 条/ep 2.37 act=35.3% lt60=83.5%
// E2(>1000 字截断层)上 B/C 更优:C@cap1000 act=57.1%,C@cap2000 act=62.2%。
// glm-4-flash judge(异源):可复用均分 A 4.32 / B 4.16 / C 4.04;碎片化率 A 10.2% vs B 5.5% / C 6.3%。
//
// 本改动 = 三档开关 + 截断可配(全部 env 门控,默认值 = 推荐项 B;不改 A 的默认行为语义之外的一切):
// ZHIYI_DISTILL_MODE current | context | merged (默认 context,即 B;current=现状逐字节等价 A)
// ZHIYI_DISTILL_CAP 截断字符数(默认 1000=现状;2000/none 可配;0=不截断)
// ZHIYI_DISTILL_DENSITY 旧开关(t_ab5b2461)保留兼容:=1 时叠加密度门判据
//
// 红线合规:不改 FUSION_W/FEEDBACK_BIAS/POS_MODE,不重启 zhiyid(本改动只进分支+建议);
// 默认值切换需重启才生效(与 proceduralShadowMode 同款启动读一次范式)。
import "os"
// 三档粒度附加段(t_afacc477):B=上下文信息量门槛;C=合并粒度(≤3 条、自包含可复用)。
// 与 t_ab5b2461 的 densityPromptAddendum 独立:density 是判据门(≥2 项才 keep),
// 本段是 prompt 侧粒度重构(改的是「怎么写」,不是「写几条」的准入)。
const (
// addendumContext(B 档):每条 fact 必含 场景/原因/动作/判据 中至少 2 项。
// 措辞取自 t_afacc477 隔离对照 B 臂(AC1 p50 23→47、act 26.5%→50.6%)。
addendumContext = `
🔴 本次附加要求(信息量门槛,最高优先,覆盖上面「轻量补全」的从简倾向):
每条 FACT 不能只写"做了什么",必须写成可复用的一条完整知识,且至少包含下面四项中的【两项】:
① 在什么场景(什么任务/什么条件下遇到这件事)
② 因为什么(原因、触发条件、根因)
③ 做什么(具体动作、命令、文件路径、配置键、参数值)
④ 判据是什么(怎么判断成功/失败、阈值、数值、验收标准)
写法示例(照此信息量写,不要照抄内容):
FACT|在排查服务停摆的场景下,因为某个环境变量的缺失导致某配置被重置,所以要补回该配置并重启服务,判据是日志出现对应端点且数秒内完成。
仍然禁止编造原文没有的内容;原文信息不足两项时,宁可少写一条,也不许用水话凑字。
`
// addendumMerged(C 档):一个 episode 最多 3 条,每条自包含可复用(不是对话摘要)。
// 措辞取自 t_afacc477 隔离对照 C 臂(条数 6.5→2.4、act 35.3%、judge 碎片化率 6.3%)。
addendumMerged = `
🔴 本次附加要求(合并粒度,最高优先,覆盖上面「逐条处理、每条一行、facts 要详尽」的倾向):
1. 最多输出 3 条 FACT。把同一件事的所有相关要素(场景、原因、动作、命令、路径、阈值、结论、判据)【合并进同一条】,写成一句自足的话。
2. 每条 FACT 必须自包含且可复用:未来的读者不需要再看其它 FACT 或原始对话,就能照它行动或回答提问。
3. 🔴 禁止写成"对话摘要"(如「用户讨论了X」「他们确认了Y」)—— 要写事实本身与可执行结论。
4. 原文信息不足时宁可只输出 1 条,绝不为凑 3 条拆分成碎片。
`
)
// distillMode 启动时读一次。默认 "context"(B 档,t_afacc477 推荐);
// 部署方若要回到现状 A,设 ZHIYI_DISTILL_MODE=current;merged = C 档。
var distillMode = os.Getenv("ZHIYI_DISTILL_MODE")
func init() {
if distillMode == "" {
distillMode = "context"
}
}
// distillCap 截断字符数(默认 1000=engine.go:759 现状)。0 或 "none" = 不截断。
var distillCap = 1000
func init() {
if v := os.Getenv("ZHIYI_DISTILL_CAP"); v != "" {
if v == "none" {
distillCap = 0
} else {
n := 0
for _, c := range v {
if c < '0' || c > '9' {
n = -1
break
}
n = n*10 + int(c-'0')
}
if n > 0 {
distillCap = n
}
}
}
}
// DistillCap 对外读口(=0 表示不截断;否则为字符上限)。
func DistillCap() int { return distillCap }
// DistillMode 对外读口(current/context/merged)。
func DistillMode() string { return distillMode }