From 700176a0c66bbbeaeb65aa01d44f3da5fe2633e2 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 29 Jun 2026 14:38:32 +0800 Subject: [PATCH] =?UTF-8?q?docs(brief):=20=E5=8A=A0=20context=20=E7=BA=AA?= =?UTF-8?q?=E5=BE=8B,=E5=A0=B5=E5=8F=8D=E5=A4=8D=20dump=20=E5=85=A8?= =?UTF-8?q?=E6=96=87=20abstract=20=E7=83=A7=20token(bump=200.32.3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 承接定时任务超时复盘:同一 job 的 agent 把 38 篇全文英文 abstract 用 run_python/print 反复灌进上下文(≥3 次),工具输出每轮重发 → 48 次 LLM 调用累计输入 2.5M tokens(输出仅 28K),既慢又贵还顶满 600s 超时。根因 brief skill 虽要求证据落 evidence.md 文件,却没明令"别反复 print 进上下文"。 skills/brief/SKILL.md 三处加指示文: - 阶段二「context 纪律」:落文件、按需 read、别整批重打 - 阶段三:一次成稿别重复 dump + 论文多时按期刊分批 write - 反模式加一条:反复 print 全文 abstract 让 context 滚雪球 纯指示文,frontmatter/description 不变 → SKILL_LIST 无需更新。 Co-Authored-By: Claude Opus 4.8 (1M context) --- PROGRESS.md | 6 ++++++ core/__init__.py | 2 +- skills/brief/SKILL.md | 5 +++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/PROGRESS.md b/PROGRESS.md index 6e9c15a..9d39c0a 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -21,6 +21,12 @@ ## 已完成关键能力 +### 2026-06-29 / brief skill 加 context 纪律,堵反复 dump abstract 烧 token(bump 0.32.3) + +- 承上条同一 job 复盘:agent 把同一批 38 篇全文英文 abstract 用 `run_python`/`print` **反复灌进上下文**(实测 dump ≥3 次),工具输出每轮重发 → 48 次 LLM 调用累计输入 **2.5M tokens**(输出仅 28K),既慢又贵,还顶满 600s 超时。根因:brief skill 虽已要求把证据落 `evidence.md` 文件,但没明令"别反复 print 进上下文",弱模型(deepseek-v4-flash)规律不足就放飞。 +- 修:`skills/brief/SKILL.md` 三处加指示文——阶段二「context 纪律」(落文件、按需 read、别整批重打)、阶段三「一次成稿别重复 dump + 按期刊分批写」、反模式加一条。纯指示文,frontmatter/description 不变 → SKILL_LIST 无需更新。 +- 仍存的更大杠杆(未做):框架层对超大 `run_python` stdout 在上下文里做截断/省略,根治"工具输出滚雪球",但改动面大、有风险,留待单议。 + ### 2026-06-29 / 修定时任务超时被误记成 ok(bump 0.32.2) - 实测 bug:定时 job(isolated)跑满 `timeout_seconds` 被调度器协作式 cancel 后,`_run_agent_bg` 对 ok/cancelled 都把 `run_status` 收回 `idle`(二者 DB 不可区分),而 `_execute_scheduled_job` 收尾只判 `run_status=="error"`,于是超时中断被落成 `last_status="ok"` —— 掩盖"跑到一半没写 sections / 没推送",且不计连续失败、不触发兜底。复盘 job `e621c8a6`「每日水泥科研简报」:`timeout_seconds=600`,task 创建→`last_run_at` 正好 600.0s,最后一条 agent 消息停在"按期刊分组打印 38 篇摘要"(还在取数阶段),`last_status` 却是 ok。 diff --git a/core/__init__.py b/core/__init__.py index e0783d0..f86db69 100644 --- a/core/__init__.py +++ b/core/__init__.py @@ -1,3 +1,3 @@ # zcbot 版本号单一事实源:web/app.py 的 FastAPI version、/healthz 返回、前端展示都引这里。 # 改版本只动这一行。 -__version__ = "0.32.2" +__version__ = "0.32.3" diff --git a/skills/brief/SKILL.md b/skills/brief/SKILL.md index f9e3689..3214484 100644 --- a/skills/brief/SKILL.md +++ b/skills/brief/SKILL.md @@ -62,6 +62,8 @@ for jname in ["Cement and Concrete Research", "Cement and Concrete Composites", - 汇成证据表 `/evidence.md`:期刊 | 标题 | 第一作者(机构)| 年-月 | 摘要概述 | DOI | 来源(research/documents/web)。 - 跨源去重:同 DOI 一条(documents 全文优先,DOI 记自 research);web 不与论文去重、单列。 +> **context 纪律(省时省钱,务必遵守)**:检索结果(尤其全文 abstract)**落进 `evidence.md` / `selected_papers.json` 文件**,**不要在对话里反复 `run_python`/`print` 把整批 abstract 灌进上下文**。工具输出会永久留在 context 并每轮重发——同一批摘要 dump 三次,context 就滚成雪球(实测一次简报因此累计烧 2.5M 输入 token、跑满超时被掐断)。需要看某几篇时按需 `read` 文件片段,看完即弃,别整批重打。 + > **窗口内 0 篇**:如实告知库内该窗口暂无收录(可能该刊本窗口尚未发文),可用 web 补更近的非论文动向,**不脑补文献**。 ## 阶段三:列清单 + 内容总结(写 `/sections/*.md`) @@ -78,6 +80,8 @@ for jname in ["Cement and Concrete Research", "Cement and Concrete Composites", <简介/摘要概述:2–4 句,讲研究对象、方法/表征、主要发现与关键数据 —— 基于 abstract 或全文,不夸张、不评判> ``` 按 `publication_date` 倒序,最新在前。每篇都要有摘要概述,不能只留标题。 + + > **一次成稿,别重复 dump**:中文概述基于 `evidence.md` / `selected_papers.json` **一遍生成写入**,生成后**不要再把英文 abstract 重新 `print` 进上下文**(它已在文件里)。论文多时按期刊**分批写**(每个 `###` 期刊段一次 `write`/`edit`),避免单次超长输出拖慢——而不是先把全批 abstract 全打印出来再憋一个巨型 write。 - **`02_summary.md` 内容总结**:对这批论文**客观归纳**——主题分布、常涉材料体系、常用方法/表征、共同关注点;引具体论文挂 `[n]` 上标(回链到 01)。**只描述"这批论文在讲什么",不给"应当/建议/可切入"**。 - **`03_web.md` 其他动向(仅 spec 开 web 时)**:政策/标准/会议/产业,`[W1]` 标来源 + 日期,单列。 @@ -107,3 +111,4 @@ for jname in ["Cement and Concrete Research", "Cement and Concrete Composites", - ❌ 跳过定题直接检索 / 用中文 keyword 搜英文库 / 期刊名不精确 —— 先定题、转英文术语、用精确 `publication_name` - ❌ web 资讯混进论文列表/总结 —— 单列"其他动向" - ❌ 编造 DOI / "据报道"无源句 —— 查不到就如实说 +- ❌ 反复 `run_python`/`print` 把整批全文 abstract 灌进上下文 —— 落文件、按需读;同批摘要 dump 多次会让 context 滚雪球(实测一次简报累计烧 2.5M token、跑满超时被掐断没推送出去)