7.1 KiB
行动提取与评估
本文介绍 Partner 行动系统的入口决策层:如何从输入中识别行动意图,并在进入执行或调度前完成可行性评估。
行动提取与评估位于 ActionPlanner 的前半段。它的输出不是执行结果,而是一个明确的运行时决策:本轮输入是否应进入行动系统;如果进入,应当成为即时行动、计划行动,还是等待用户确认。
入口决策层
行动系统面对的输入通常并不直接等同于行动。用户可能是在提问、讨论、确认、补充条件,也可能是在要求系统实际完成某件事。入口决策层负责把这些情况分开。
它需要在三个对象之间建立关系:
- 输入意图:来自用户或认知模块的当前表达。
- 上下文状态:当前会话、感知、记忆、认知和已有行动状态。
- 行动能力:系统当前真实可用的
MetaAction集合。
只有当一个意图能在当前上下文中被解释为可推进目标,并且存在可承接的行动能力时,它才会进入行动建模与执行链路。
分层职责
行动入口被拆成三个层次:
ActionExtractor
负责发现候选行动倾向
ActionEvaluator
负责判断候选倾向是否可推进
ActionPlanner
负责把评估结果装配为运行时行动
三者的边界如下:
| 层次 | 输入 | 输出 | 不负责 |
|---|---|---|---|
ActionExtractor |
当前输入 + 上下文 | tendencies |
生成行动链、判断能力是否足够 |
ActionEvaluator |
单条 tendency + 上下文 + 可用能力 | EvaluatorResult |
执行行动、持久化行动对象 |
ActionPlanner |
EvaluatorResult |
ExecutableAction / pending confirmation / refused tendency |
重新解释用户意图 |
这种分层使“发现可能要做的事”和“决定能不能做”相互独立。提取阶段保持轻量,评估阶段负责执行前的结构化判断,Planner 负责与行动运行时交接。
主流程
flowchart TD
Input["当前输入"] --> Extractor["ActionExtractor"]
ContextA["ContextWorkspace\n对话 / 感知 / 行动状态"] -.-> Extractor
Extractor --> T{"tendencies"}
T -- " empty " --> NoAction["不进入行动系统"]
T -- " non-empty " --> IntentBlock["发布 pending_action_intentions"]
IntentBlock --> Evaluator["ActionEvaluator"]
ContextB["ContextWorkspace\n行动 / 对话 / 感知 / 记忆 / 认知"] -.-> Evaluator
Capabilities["available_meta_actions"] -.-> Evaluator
Evaluator --> Decision{"EvaluatorResult"}
Decision -- " rejected " --> Refused["拒绝进入行动链"]
Decision -- " need confirmation " --> Pending["actions_need_confirmation"]
Decision -- " immediate " --> Immediate["ImmediateExecutableAction"]
Decision -- " planned " --> Scheduled["SchedulableExecutableAction"]
Pending --> ConfirmTurn["请求用户确认"]
Immediate --> Executor["ActionExecutor"]
Scheduled --> Scheduler["ActionScheduler"]
ActionExtractor:候选行动发现
ActionExtractor 的职责是从当前输入中提取行动倾向。倾向不是行动计划,而是一个待评估目标。
行动倾向应保持“目标语义”,而不是“执行语义”。例如用户说“先检查配置,再修复问题,最后告诉我结果”,提取结果应表达为一个整体目标,而不是拆成多个工具步骤。
提取阶段只决定是否存在候选目标,不承诺该目标一定能执行。它不会绑定 MetaAction,也不会判断是否需要确认。
提取边界
行动倾向通常对应以下语义:
- 用户要求系统代为完成某件事。
- 当前目标需要访问能力、操作对象、修改状态或安排未来动作。
- 该目标如果不进入行动链,就无法被实际推进。
普通交流不应进入行动系统。解释、分析、翻译、总结、评价、闲聊,以及可直接基于当前上下文回答的问题,都应留给沟通模块处理。
这条边界能避免行动系统过度激活。
ActionEvaluator:执行前判断
ActionEvaluator 对单条 tendency 做执行前判断。它不重新提取意图,而是在当前上下文和能力集合下判断该倾向是否可推进。
评估阶段主要形成四类结论:
| 结论 | 含义 |
|---|---|
| 拒绝 | 倾向不应进入行动链,原因可能是无需行动、能力不足、目标不清或已有行动覆盖 |
| 待确认 | 行动可以建模,但执行前需要用户确认 |
| 即时行动 | 行动可以立即装配并交给执行器 |
| 计划行动 | 行动应按未来时间、周期或条件进入调度器 |
评估结果通过 EvaluatorResult 表达。它是 planner 的输入契约,而不是给用户展示的回复文案。
确认与 pending action
某些行动虽然可以建模,但不能直接执行。典型原因包括副作用、权限风险、外部可见影响、长期运行影响或用户意图仍需最终确认。
这类行动会进入 pending confirmation:
EvaluatorResult(ok=true, needConfirm=true)
↓
ActionPlanner
↓
ContextWorkspace.register(actions_need_confirmation)
↓
后续输入承接确认 / 取消 / 修改
pending confirmation 将借助 CommunicationBlockContent 作为输入时的补充块,用来及时提醒交流模块生产合适响应。
Planner 装配
ActionPlanner 异步接收评估结果后,把结构化决策转换为运行时对象。
主要装配动作包括:
- 将
primaryActionChain转换为Map<Int, List<MetaAction>>。 - 加载每个 action key 对应的
MetaAction。 - 根据
MetaActionInfo修正顺序并补齐严格依赖。 - 根据评估类型构造
ImmediateExecutableAction或SchedulableExecutableAction。 - 对待确认行动注册
actions_need_confirmation。 - 对已承接的 pending block 执行过期。
- 将即时行动交给
ActionExecutor,将计划行动交给ActionScheduler。
Planner 是入口决策层与运行时执行层之间的边界。评估器给出“应该怎样推进”,Planner 负责把这个结论变成可运行对象。
输出流向
评估和装配后的输出分为四种:
| 流向 | 说明 |
|---|---|
| 不进入行动系统 | 没有提取到 tendency,或评估认为无需行动 |
| 等待确认 | 行动可建模,但先写入 pending confirmation |
| 即时执行 | 构造 ImmediateExecutableAction 并交给执行器 |
| 计划调度 | 构造 SchedulableExecutableAction 并交给调度器 |
这四种流向共同构成行动系统的入口安全阀。任何行动在进入执行器前,都必须先经过提取、评估和 planner 装配。