diff --git a/PROGRESS.md b/PROGRESS.md index ae0f070..04a1b85 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -23,6 +23,7 @@ ### 2026-05-28 +- **`skills/review/SKILL.md` 加"长文档处理"段(骨架扫描 + 用户挑章节深审 + 中间文件落盘)**:用户报实际审稿场景里"有些文件很多页",现 SKILL.md 的"审稿顺序"只讲做什么维度(结构/语义/逻辑/表达/细节),不讲长文怎么切 —— 一篇 50 页报告塞一轮处理,中段易略读、修改稿覆盖不全、跨章一致性问题漏掉、易超输出限制。新加 `## 长文档处理` 段插在"审稿顺序"和"输出格式"之间:**阶段 1 骨架扫描** —— 通读全文只出章节目录 + 全局问题(主旨/论证链/跨章一致性/结构)+ 每章一句话粗读印象,**不出修改稿**,带专用输出模板,结束后停下等用户挑章节;**阶段 2 分段深审** —— 用户指定后按"审稿顺序"做完整深审,每段独立避免数十页润色稿一把吐,允许多轮每轮 1-3 章;**中间文件落盘** —— Claude 自主判断要不要写,典型三类(骨架 `review-outline.md` / 分章 `review-<编号>-<短标题>.md` / 合并稿 `<原文>.revised.<扩展名>`),默认原文同目录,只读位置或路径不明放 cwd,要求"写完同时给文件路径 + 关键摘要"避免只丢路径不汇报。"输出格式"段开头加交叉引用提醒长文先看新段不要直接套常规模板。否决:(a) 全自动逐段(不让用户挑) —— 长文里大部分章节其实没大问题,逐段精修浪费 token + 把跨章问题切散;(b) 单轮两遍法(pass 1 全局 + pass 2 局部) —— 仍是一把梭,输出超限风险一样;(c) 硬编码字数 / 页数门槛 —— 给"约 5000 字 / 8 页 / ≥4 章节"作启发标记 + 列出典型长稿类型(申报书/报告/学位论文/标书/蓝皮书),让 LLM 综合判断更稳。`DESIGN.md` 不动(纯 skill 内部流程,无架构变化);`RUN.md` 不动(无 CLI / env / 文件布局变化)。 - **新增 `config/models/local.yaml`(family=`local`,variant `r1` / `qwen3`)接内网 OpenAI 兼容推理服务,涉密任务专用**:用户报建材院有些科研 / 立项 / 配方任务不能上公网模型(数据敏感),内部已部署 DeepSeek-R1(满血,调试中)+ Qwen3-30B-A3B(MoE)在 `http://182.54.21.126:9000/v1`(OpenAI 兼容,共享同一 key)。yaml 两个 variant `model_id` 写 `openai/DeepSeek-R1` / `openai/Qwen3-30B-A3B`(litellm provider 前缀 `openai/`,后段透传给 base_url),`api_base` 指内网 IP,`api_key_env` 同填 `LOCAL_LLM_API_KEY`。**上下文取舍**:R1 满血官方 128K → `max_context=131072 / reliable=65536`;Qwen3-30B-A3B 原生 32K → `max=32768 / reliable=16384`,reliable 给一半跟 deepseek_v4 / glm 档案比例一致。**`thinking_mode=false`** 是关键:R1 / Qwen3 是天生推理模型默认就思考(响应里带 `` 标签),不通过 OpenAI / DeepSeek V4 的 `reasoning_effort` 等级控制 — 设 true 会发 reasoning_effort 字段,本地 vLLM / sglang 多半不认报 400。`tool_calling_quality=fair` 标注 R1 / Qwen3 tool use 弱于 V4 / GLM(routing 层用到的话会避开,目前只是文档标记)。`optimal_temperature=0.6` 按用户给的值。`.env` 加 `LOCAL_LLM_API_KEY`(用户已填实际值);`RUN.md` env 段同步加说明 + probe 命令两行(`local.r1` / `local.qwen3`)+ 最后更新日期改 2026-05-28。**初次连通性测试**:`local.qwen3` 跑通(15s,prompt=13 / completion=363,响应带 `` 推理段);`local.r1` 当前 InternalServerError 500(服务器侧还在调试,非 yaml 问题)。**第二个 variant 原本写 `Qwen/QwQ-32B`,实测服务端返回 `model=Qwen3-30B-A3B` → 改 model_id + display_name 对齐真实部署的 MoE 模型**(Qwen3 系列 30B 总参 / 3B 激活,2025 阿里新出),variant key `qwq` → `qwen3` 跟着改。**不改 `agent.yaml` 默认模型**(`default_model` 仍 `deepseek_v4.flash`),涉密任务用户显式选;**未写"敏感任务自动路由本地模型"逻辑** — 当前没 sensitivity 标记机制,加是大改,先按显式选,要不要自动路由后面再说。否决:(a) family 叫 `private` / `intranet` — `local` 更短且语义对齐(本地推理服务);(b) `model_id` 不加 `openai/` 前缀 — litellm 不知走 OpenAI 兼容协议会按 model 名猜 provider 必跪;(c) reasoning_effort_levels 给 ["low","medium","high"] — 跟 thinking_mode=false 配相互矛盾,留空更干净;(d) 默 default_model 切到 local.r1 — R1 推理慢、tool calling 弱、且公网模型多数场景代价 / 质量更好,涉密是少数;(e) 在 `config/media/` 加同名 file — local 是 chat LLM 不是媒体生成,放 `config/models/` 才对。`DESIGN.md` 不动(新加 model 档案无架构变化)。 - **修 `LoadSkillTool` 在 docker backend 下返回 host 绝对路径导致容器内 fs 工具找不到 references 的 bug**:实测部署机 dogfood `analyze` skill 时,LLM 调 `load_skill('analyze')` 拿到 header `[skill=analyze, dir=/home/lighthouse/zcbot/skills/analyze]`,照 SKILL.md 教学拼 `/references/pico_template.md` 给 `read` →"file not found"。**根因**:`core/executor_docker.py` 设计上 fs/shell/run_python 全走 `docker exec` 进容器(行 56-60 `CONTAINER_TOOLS`),skills/ bind mount 到容器内 `/sandbox/skills:ro`(`core/sandbox/pool.py:227-229`)—— 容器 namespace 里**没有 host 路径**(`/home/lighthouse/zcbot/...` 不存在),只有 `/sandbox/skills/analyze`。`LoadSkillTool` 跑在 host agent 进程里,塞给 LLM 的 `dir=...` 一直是 host 绝对路径,docker backend 下 LLM 用这条路径调容器内 read/glob/grep 必抓瞎。**为什么没早暴露**:proposal/research/ppt 这些 references-heavy skill 历史多在 host backend(开发期)跑通,docker backend 是部署期才打开;且 LLM 经常就着 SKILL.md 本体直接干活不去 read references,踩到的人不多;analyze 拆成 5 references 强制 read,首次集中暴露。**修法(A 候选,user 选)**:`LoadSkillTool` 加 `container_skills_dir: Optional[str]` 构造参数,有值时返回头 `dir=/`(去重末尾斜杠),无值保持原 host 绝对路径。`agent_builder.py:392-405` 在装 LoadSkillTool 时复用 `select_executor` 同款 env 判断(`os.getenv("ZCBOT_SANDBOX_BACKEND")=="docker"`),为 True 时传 `"/sandbox/skills"`(与 pool.py mount target 一致)。`tests/test_load_skill.py` 4 case 锁住:host backend host 路径 / docker backend `/sandbox/skills/` / 末尾斜杠拼接不双斜杠 / 未知 skill 报错走原路径。全套 4/4 PASS + `tests/test_executor_docker.py` 15/15 PASS 回归无破。**结构性收益**:所有现存 skill(proposal/ppt/research/coding/pymatgen/stats_ml/plot_pub/...)references 在 docker backend 下自动 work,不用一个个改 SKILL.md 教 LLM 用容器路径(那会破 host backend 开发环境)。**部署后操作**:部署机需 `git pull` 拉这条 commit + 重启 agent 进程让新代码生效(skill 注册表已经是每请求重建 §c4229be,但 LoadSkillTool 实例化在 build_agent 里,需要新进程或新连接才能拿到带 container_skills_dir 的实例)。否决:(b) bind mount host 路径到容器同样位置 —— 容器路径跟 host 强耦合,部署路径换地方就跪;(c) 改全部 SKILL.md 让 LLM 用 `/sandbox/skills/...` —— 散点改易漏,且 host backend 下 `/sandbox` 不存在,反破 dev 环境。`DESIGN.md` 不动(无架构变化,纯实现修);`RUN.md` 不动(无 CLI / env 变化)。 - **新增 `analyze` skill(科学问题分析 / 拆解 / 引导),服务建材院 R&D 早期问题翻译场景**:用户拿"模糊的高层科研问题"(典型句式"想搞清楚 X 原因 / 怎么提升 Y / 该不该做 Z")过来时,既不是写本子(proposal)/也不是查文献(research)/也不是建模(stats_ml),而是**问题还在概念阶段需要先想清楚**——之前 10 个 skill 没人接这个场景,模型只能凭直觉糊弄。本 skill 定位为"协调器 / 问题翻译器",**不执行任务**,只把模糊命题拆成可操作子问题 + 实施路线图,最终接力给下游 skill。**四段式工作流**:① PICO/PECO 规范化(P 对象 / I 干预 / C 对照 / O 量化输出 + FINER 五维自检)—— 卡 BLOCKING;② Issue Tree 拆解(MECE 原则,默认"机理-现象-工艺"三层,叶子节点标 `[类型 / 优先级 / 能力描述]`)—— 卡 BLOCKING;③ 按叶子类型分支深化:根因型走 Fishbone(六大支:材料/工艺/设备/检测/环境/人员)+ 5Whys、创新型走 First-principles 拆假设 + TRIZ 矛盾矩阵(摘 10 对建材常见冲突),优化型走 DoE 选型导航(PB/全因子/CCD/Box-Behnken/混料/序贯);④ 实施路线图 + TODO + 接力建议(`analysis.md` §6 每步四件事:干什么 / 能力描述 / 产物 / 判停条件)。**文件结构**:`skills/analyze/SKILL.md`(121 行)+ 5 份 references(78-95 行,按需 always read 或分支 read)+ 1 份 `templates/analysis_report.md`(87 行 = 最终 `analysis.md` 骨架),共 7 文件 657 行。**关键决策**:(a) **不硬编码"叶子能力 → skill 名"映射表** —— runtime 的 skill discovery 已经把所有 skill description 注入 prompt(DESIGN §3.5),硬编码等于重复 + 改名要回来改;改用"能力描述"(动词短语)让 LLM 按当时看到的 skill 清单自匹配;(b) **触发 description 双重防护** —— A 写死"还在想方向 / 不知道从哪入手"触发条件 + 显式列出何时不用(proposal/research/stats_ml/review 走对应 skill),B 在 §输出末尾推荐"下一步用 X 能力推进",前者拦"路由进"后者拦"路由出"卡死;(c) **不需要 Python helper** —— 全引导式对话 + markdown 输出,跟 review skill 同范式,无代码;(d) **TRIZ 不抄全 40 原理矩阵** —— 摘 10 对建材常见矛盾(强度↑韧性↑ / 早强↑后期↓ / 致密↑透气↑ 等),够 80% 场景 + 不污染上下文;(e) **DoE 选型表不生成实验点位** —— analyze 只规划设计类型 + 因素表,具体随机化 / 点位生成由下游 stats_ml 跑 pyDOE2,职责清晰;(f) **产物文件简单命名 `analysis.md`** —— 不学 proposal 的 `--.spec.md` 多版本机制(spec 是"宪法"需要定调一次,analysis 是工作文档迭代覆盖即可);(g) **examples 全打建材域**(P42.5 早强偏低 / 熔铸 AZS 砖热震 / 低碳水泥探索 / 矿粉粉煤灰配方 DoE),触发 description 保持领域无关(框架本身通用),只在 references 里塞建材 case 让 LLM 学场景适配。否决:(a) `proposal` 直接覆盖问题分析功能 —— proposal 已包含"先写要点再写正文"两段式,但那是"已定调要立项"之后的拆解,跟"还没决定要不要立项"的探索阶段语义不同;(b) 合并到 `research` —— research 是查文献执行能力,问题拆解不查文献也能做;(c) 写成 Python framework(自动拆解 + 自动 PICO 填空)—— 强行结构化反而压死开放探索,引导式对话更贴 R&D 实际节奏。`DESIGN.md` 不动(新加 skill 无架构变化);`RUN.md` 不动(无 CLI / env / 文件布局变化);`SCIENTIFIC_SKILLS.md` 不动(该文件是 K-Dense 仓库引进评估笔记,analyze 是自主设计不在其列)。 diff --git a/skills/review/SKILL.md b/skills/review/SKILL.md index d555092..f9c76f1 100644 --- a/skills/review/SKILL.md +++ b/skills/review/SKILL.md @@ -31,9 +31,66 @@ description: 审稿、润色、校对文本时使用。用户要求检查语法 5. **表达与风格**: 检查句子是否冗长、口语化、空泛、重复、语气不合场景;保留作者原有风格,不要改成模板腔。 6. **语言细节**: 最后检查错别字、语法、标点、格式、术语大小写、数字单位、引用标注、图表编号。 +## 长文档处理 + +输入约 5000 字 / 8 页 / ≥4 个一级章节,或文本类型本身就是结构复杂的长稿(申报书 / 报告 / 学位论文 / 标书 / 蓝皮书),**不要一把梭** —— 一次性处理容易中段略读、修改稿只覆盖前 1/3、跨章节问题漏掉、输出超限。改用两阶段。 + +### 阶段 1: 骨架扫描 + +通读全文,**只输出骨架 + 全局问题,不出修改稿**: + +- 章节目录(自动提取或编号) +- 主旨与论证链:中心论点是什么、论证骨架是否清楚 +- 跨章节一致性:术语 / 简称 / 数字 / 人名 / 时态 / 称谓 / 引用编号 +- 全局结构问题:章节顺序、主次、重复、缺项 +- 每章节一句话粗读印象,标出疑点章节 + +输出模板: + +```markdown +## 总体判断 +- 文本类型 / 目标读者: +- 主旨: +- 全局策略: + +## 章节目录 +1. ... +2. ... + +## 全局问题 +| 类型 | 问题 | 涉及范围 | +|---|---|---| + +## 章节粗读 +| # | 章节标题 | 印象 | 疑点 | +|---|---|---|---| + +## 下一步 +建议优先深审: 章节 X / 章节 Y +请挑选要深审的章节(可多选),我再展开。 +``` + +骨架扫描结束后**停下等用户挑章节**,不要主动展开局部修改。 + +### 阶段 2: 分段深审 + +用户指定章节后,对该段按"审稿顺序"做完整深审,输出常规的"问题表 + 修改稿"(见下节模板)。每段独立,避免一次性吐数十页润色稿。需要时可多轮,每轮处理 1-3 章。 + +### 中间文件 + +长文 / 多轮深审时,**主动把中间产物落盘到工作目录**,不要全靠对话历史: + +| 产物 | 文件名 | +|---|---| +| 骨架扫描结果 | `review-outline.md` | +| 分章深审结果 | `review-<章节编号>-<短标题>.md`(如 `review-3-methodology.md`) | +| 全篇修改后的合并稿 | `<原文件名>.revised.<扩展名>` | + +默认放在原文件同目录;原文是只读位置或路径不明时放 cwd。自己判断**何时写**: 短文一轮能搞定的不写;长文 + 骨架扫描 / 多章深审 / 后续要拼回去的,要写。写完在对话里同时给**文件路径 + 关键摘要**,不要只丢路径不汇报,也不要把整份内容再贴一遍。 + ## 输出格式 -根据用户要求选择最合适的交付物;用户没指定时,默认给"问题清单 + 修改稿"。 +长文档(见上 §长文档处理)先用骨架扫描模板,不要直接套这里的格式。短文 / 单段深审根据用户要求选交付物;用户没指定时,默认给"问题清单 + 修改稿"。 ### 默认:问题清单 + 修改稿