English mirror
This English page is generated from the current Chinese documentation so every route, anchor, code sample, and language switch stays available on agently.tech. Human-edited English copy can replace this generated body page by page.
文档审查全链路 Playbook
文档审查很容易被做成一个长 prompt:把合同、制度或规格说明丢给模型,让它直接写审查报告。这样 demo 很快,但系统很难上线。问题不在模型不会审,而是下游不知道它按什么路径审、证据来自哪里、高风险结论谁确认、报告质量怎么复核。
更稳的结构是把“审查”拆成几段可检查的能力:先路由,再拆任务,再做风险判断,再反思报告,最后服务化。
推荐演进路线
| 版本 | 新增能力 | 解决的问题 | 不要越过的边界 |
|---|---|---|---|
| v0 | 文档类型路由 | 不同文档走不同审查框架 | 路由只产出类型和配置 hint,不直接写完整报告 |
| v1 | To-Do + 依赖图执行 | 审查项由输入动态生成,可并发也可按依赖执行 | 先抽取事实,再分析风险,不凭印象判断 |
| v2 | 风险审批 | 高风险结论进入人工或策略闸门 | 审批不是模型说“谨慎”,而是流程里的等待点 |
| v3 | Reflection | 报告对照标准自检和修订 | 评估调用独立于生成调用,避免自说自话 |
| v4 | FastAPI 服务化 | 产品和业务系统可以调用审查能力 | Router 只做接入、校验和返回,不承载审查核心 |
这条路线适合合同审查、制度审查、技术规格审查、合规检查、投研材料复核等场景。
模块边界
| 模块 | 输入 | 输出 | Owner |
|---|---|---|---|
classify_document | 原文、文件元信息 | doc_type、confidence、framework_id | 模型请求 + output schema |
build_review_tasks | 原文、审查框架 | tasks[]、depends_on[] | 模型请求 + TaskDAG / TriggerFlow |
run_task | 单个任务、依赖结果 | 事实、风险、证据、建议 | AgentExecution / Actions |
assess_risk | 所有任务结果 | risk_level、auto_proceed、reason | 结构化输出 + 确定性分支 |
reflect_report | 报告草稿、标准 | passed、missing_items、revision | 独立模型评估 |
review_api | HTTP 请求 | job id、stream、最终报告 | FastAPI / service layer |
业务职责就是接口边界。每个模块只暴露下游需要的字段,不让别的模块读取自己的内部 state。组装层负责把上游输出打包成下游输入。
结构骨架
review_document(input)
|
|-- classify_document
| -> doc_type + framework_id
|
|-- build_review_tasks
| -> tasks + depends_on
|
|-- execute_task_graph
| -> per-task facts / risks / evidence
|
|-- assess_risk
| -> low: continue
| -> high: pause for approval
|
|-- reflect_report
| -> revise until pass or budget exhausted
|
|-- return report + evidence refsTriggerFlow 适合承载这条链路,因为它能让阶段、依赖图、审批等待、runtime stream 和最终 close snapshot 都有明确位置。
关键实现选择
路由输出的是配置选择,不是最终判断
路由阶段只回答“这是什么文档,应该使用哪套审查框架”。审查规则放在配置或 Skill / resource 里。这样新增文档类型时,优先改框架配置,不动下游审查模块。
To-Do 先抽事实,再做判断
复杂文档审查最好让任务图里先出现事实抽取,再出现风险分析。让模型先看到原文事实,再基于事实判断,能减少凭印象写结论。
风险审批发生在执行后
有些场景不是“执行前批准计划”,而是“所有分析都完成后,看风险等级决定是否出报告”。这类审批应该放在风险评估之后,不要和 Plan / Confirm 混成一个概念。
Reflection 是独立评估调用
报告生成和报告评估应是两次独立调用。评估者只看草稿、标准和证据,不继承生成时的上下文。这样才能发现缺失项,而不是替原意图找理由。
服务层不要吞掉业务核心
FastAPI router 只负责请求校验、调用 service、返回 job id / stream / result。审查流程、模型请求、配置读取和报告生成留在业务服务或 flow 层。这样 CLI、后台任务和 HTTP 入口能复用同一套核心能力。
什么时候引入 Workspace
只要出现这些情况,就不要把材料继续塞进 execution state:
- 原文很长,后续只需要引用片段;
- 中间审查结果要作为证据保留;
- 最终报告、附件、截图或 PDF 要被下载和复核;
- 后续轮次要基于上一轮结论继续;
- 需要回放“当时为什么给出这个风险等级”。
推荐做法是把原文、任务结果、报告草稿和最终报告存成 Workspace record / artifact,flow state 只保留 ref、摘要和必要控制字段。
上线前检查
| 检查项 | 通过标准 |
|---|---|
| 路由 | 每类文档都有稳定 doc_type 和审查框架映射 |
| 任务图 | 每个任务有标题、目标、依赖和输出字段 |
| 证据 | 风险结论能追到原文片段或任务结果 |
| 审批 | 高风险路径有 pause/resume 或外部审批系统接入 |
| 报告质量 | Reflection 有明确标准、最大轮次和失败输出 |
| 服务化 | /health、提交接口、结果读取、stream 或 job 状态清楚 |
| 观测 | 每个阶段有 trace / runtime stream / action logs |
常见误用
| 写法 | 后果 |
|---|---|
| 一个 prompt 直接产出完整审查报告 | 没有阶段证据,难以复核 |
| 用关键词路由文档类型 | 复杂文档和混合文档容易错分 |
| 让下游模块读上游内部 state | 模块一改,整条链都碎 |
把人工确认写成 input() 堵住 HTTP worker | 服务化后无法并发和恢复 |
| Reflection 不设最大轮次 | 成本和等待时间不可控 |