多智能体“三剑客”:Task
Laiyong Wang Lv6

Task 设计:从“定人”到“派活”

人设工程完成了“定人”的步骤,有了优秀的数字员工,接下来就需要给他们派发明确的工作了。


一、认知原点——一切 AI 应用皆为“Task”

upload successful

无论是传统的 Chatbot、智能客服,还是复杂的数据分析 Agent,其底层逻辑都包含以下三个核心环节:

输入(Input)

用户的原始诉求或系统的定时触发事件。

执行过程

Agent 思考、调用工具、交互协作的中间环节。

输出(Output / 交付物)

经过执行后,必须产出一个明确的结果。这个结果可能是:

  • 一段对话回复
  • 一份结构化的 Markdown 报告
  • 一个 PPT 文件
  • 或是在业务系统中提交的一系列操作

未来我们在做 AI 应用评测时,最核心的依据也就是对比这“输入”和“产出”是否匹配预期的标准。


二、拆解心法——火车轨道 vs 里程碑

在定义任务时,开发者最容易陷入传统编程的惯性思维,这就引出了核心心法:

任务定义终点,而非路径。

upload successful

火车轨道(传统工作流)

像铺设铁轨一样,事无巨细地规定 Agent:

  • 第一步必须做什么
  • 第二步必须怎么做

在面对充满不确定性的复杂场景时,一旦中途出现意外状况,“火车”就会彻底脱轨崩溃。

里程碑(最佳实践)

我们应该像设定里程碑一样去定义 Task:

  • 明确当前阶段需要交付什么成果
  • 中间过程(搜索、策略调整)交由模型自主决策

结构化的交付标准,就是最好的“里程碑”。


三、交付标准——结构是混乱世界中的确定性

既然任务是契约驱动的,我们就必须提供清晰的“验收标准”。

upload successful

工程实践:Pydantic 定义输出结构

在工程代码中,我们强烈推荐使用 Pydantic 定义任务的目标输出结构。

这不仅仅是为了让代码好看,它在底层发挥着极大的作用:

1)提示词注入(Schema Injection)

当你用 Pydantic 定义好数据结构和字段 description 后:

  • 框架会自动转换为 JSON Schema
  • 并注入到 System Prompt 中

2)结果提取与校验(Validation)

模型会倾向于按 Schema 输出:

  • 框架通过 JSON 提取结果
  • 使用 Pydantic 进行结构校验

最终实现:

将不确定的自然语言 → 转化为确定性的工程数据


四、代码实战

执行结果(代码我就不贴了)

upload successful


$li-margin-bottom = 0.8rem $post-tool-button-width = 2.5rem .post-tools-container { padding-top var(--component-gap) .post-tools-list { li { margin-bottom $li-margin-bottom &:last-child { margin-bottom 0 } } li.tools-item { position relative box-sizing border-box width $post-tool-button-width height $post-tool-button-width color var(--text-color-3) font-size 1.2rem background var(--background-color-1) border-radius 50% box-shadow 2px 2px 5px var(--shadow-color) cursor pointer &:hover { box-shadow 2px 2px 8px var(--shadow-hover-color) } i { color var(--text-color-3) } &:hover { color var(--background-color-1) background var(--primary-color) i { color var(--background-color-1) !important } } &.toggle-show-toc { display none } &.go-to-comments { .post-comments-count { position absolute top 0 right -1rem display none align-items center justify-content center box-sizing border-box min-width 1.1rem height 1.1rem padding 0 0.2rem color var(--badge-color) font-size 12px background var(--badge-background-color) border-radius 0.4rem +keep-tablet() { display none !important } } } } li.status-item { width $post-tool-button-width height $post-tool-button-width color var(--text-color-3) font-size 1.6rem cursor pointer &.post-lock { cursor default .fa-lock-open { display none color var(--keep-success-color) } &.decrypt { cursor pointer .fa-lock-open { display block } .fa-lock { display none } } } } } }