docs(bidding-skills): 分析拆解机制化说明——analyst技能char_range分段硬规则(只读本区间禁全量重读);bid-orchestration技能说明机制层自动拆解与create_sub_tasks分工

This commit is contained in:
yumoqing 2026-09-15 17:47:27 +08:00
parent 474d3ea247
commit a26aaa2bdb
4 changed files with 17 additions and 8 deletions

View File

@ -29,9 +29,11 @@ tools: [analysis_progress, dispatch_analysis_dim]
- 被裁维度会被工具拒绝(裁剪计划是用户确认过的决定,不得绕过);
- 已过的上游自动注入任务参数,分析员会先读上游产出再抽取。
3. 派发完当前就绪的维度后完成任务——**不长等**,对账器下轮会再派新编排任务。
4. **复杂度拆解2026-09-11**:某维度工作面过大(如异常招标文档多包件、
需分段交叉核对)时,可用 `create_sub_tasks` 把该维度拆成子任务组
parent_id 挂编排任务depends_on 编排先后),拆解标准见技能 `flow-plan` 第五节。
4. **复杂度拆解2026-09-112026-09-15 机制化)**:招标文件正文超 `bid_split_chars`
阈值(默认 6 万字)时,**机制层自动把维度拆成 N 个分段子任务并行**dispatch 与
重做派发点都拆,子任务带 char_range 只读本段)——大文件不再出现单体长任务。
PM 的 `create_sub_tasks` 只用于**非字符数类**复杂度(多包件交叉核对、需分段
人工判断等),拆解标准见技能 `flow-plan` 第五节。
## 编排意图(归你,代码不管的部分)
- **指令补充**dispatch 的 instructions 参数):异常招标文档的特殊交代

View File

@ -11,6 +11,12 @@ tools: [read_tender_file, list_tender_files, extract_scoring, extract_quals, ext
招标文件分析拆成**四个独立维度**,对账器为每个缺失维度各派一个任务并行执行。
**先看任务参数里的 `analysis_dim`,只做对应维度,不要越维度操作**
**分段子任务硬规则2026-09-15 机制拆解配套,违反即返工)**:任务参数带
`char_range=[start,end]`本任务只负责正文该字符区间——read_tender_file 与
各 extract_* 工具一律传 offset=start、length=end-start**禁止读区间外内容、
禁止全量重读**;产出只写本区间抽到的条目(重复项机制层自动去重)。
任务标题带「第i/N段」即分段子任务。无 char_range 的任务按全文处理(小文件)。
- `analysis_dim=scoring` → 用 **extract_scoring** 抽取评分项+得分规则(逐条覆盖评标办法,满分准确,否决项 is_veto=1。大文件分段offset 递增),重复项自动去重。
- `analysis_dim=quals` → 用 **extract_quals** 抽取资质清单与要求(原文要求+是否必需)。
- `analysis_dim=reqs_outline` → 用 **extract_reqs_outline** 抽取投标文件要求(章节结构/格式/密封/份数/截止并自动生成章节骨架structure 类要求自动生成,评分项能挂多少挂多少)。

View File

@ -97,7 +97,7 @@ async def m():
# ② 记账检查(必须做)
async with db.sqlorContext("pipeline") as sor:
rs = await sor.sqlExe(
"SELECT id, req_tokens, resp_tokens, charge, cost, status, note FROM llm_usage "
"SELECT id, usages, charge, cost, status, note FROM llm_usage "
"WHERE model_id=(SELECT id FROM llm_model WHERE name=${n}$ LIMIT 1) "
"ORDER BY created_at DESC LIMIT 1", {"n": MODEL})
await sor.sqlExe("COMMIT", {})
@ -105,9 +105,9 @@ async def m():
print("USAGE_MISSING: 无流水——治理链未生效或结算失败,必须排查")
else:
u = rs[0]
print("USAGE|status=%s req=%s resp=%s charge=%s cost=%s note=%s" % (
getattr(u,'status',''), getattr(u,'req_tokens',''),
getattr(u,'resp_tokens',''), getattr(u,'charge',''),
print("USAGE|status=%s usages=%s charge=%s cost=%s note=%s" % (
getattr(u,'status',''), str(getattr(u,'usages',''))[:120],
getattr(u,'charge',''),
getattr(u,'cost',''), str(getattr(u,'note',''))[:60]))
rs = await sor.sqlExe("SELECT id, balance FROM llm_account WHERE status='active' "
"AND vendor_id=${v}$ LIMIT 5", {"v": vid})

View File

@ -60,7 +60,8 @@ try:
info.get('created_by', '') or '',
payload,
model_name=(info.get('model_name') or payload.get('model') or ''),
task_ref=task_ref)
task_ref=task_ref,
project_id=info.get('project_id') or '')
try:
await record_llm_token_usage(info.get('id', ''), data.get('usage') or {})
except Exception: