知行札记
专题技术实践AI 工程实践

工具与工作流实现

让模型提出动作,由应用负责权限、幂等、回执和可恢复的任务执行。

工具声明和业务执行分开实现

工具向模型说明动作名称、参数和可观察结果;工具执行器核实参数、用户权限与业务状态。可以把读文档、列任务和生成草稿作为不同工具,写入、发送、删除和付款由更具体的授权控制。模型输出的参数不直接成为数据库或 shell 指令。

工具结果包括业务状态、对象 ID、发生时间和回执。字段中包含外部网页、文档和用户内容时标明其来源与可信度,避免下一次模型请求把工具输出误当成高优先级指令。错误结果要区分可重试与不可重试;字段校验失败和“外部写入结果未知”采取不同恢复方式。

MCP 可以统一客户端与工具服务器的消息契约,工具实际权限仍在服务器与业务服务执行。固定规范版本、SDK、传输和认证配置后才描述支持范围;服务发现不代表可以信任或自动启用所有 server。

持久任务以阶段状态驱动

一个需要审批的文档发布任务,可以依次保存:preparing、ready-for-review、approved、executing、succeeded。另有 failed、cancelled 与 effect-unknown。每个阶段保存对应产物与版本;修改待发布正文后重新生成版本,审批绑定确切版本和发布目的地。

模型回路可选择下一项只读工作;发布步骤则由业务工作流根据授权和版本条件推进。LangGraph 等运行时提供图与 checkpoint 的实现原语,但 checkpoint 保存成功不能证明外部发布成功。LangGraph 概览 介绍持久执行与人在回路中的控制能力。

加载任务与已完成步骤
  → 获得本轮允许动作集合
  → 请求模型提出下一步
  → 参数校验与授权检查
  → 创建或复用动作 ID
  → 执行工具并保存回执
  → 保存任务状态
  → 核对目标、预算和停止条件

这是控制流程示意。实现时还需要并发锁或乐观版本检查、截止时间、工具白名单和取消标记。把失败工具结果反馈给模型可以帮助修复参数;应用维持执行上限,防止模型反复调用同一个失败工具。

幂等身份跟随业务动作

任务请求 ID 标识一次用户任务,工具调用 ID 标识一次模型提出的调用,业务幂等键标识一次外部动作。三者可能不同。模型重新提出“发布同一版本”时生成了新调用 ID,应用仍应复用相同的业务动作身份。

如果外部服务支持幂等键,在第一次调用前持久化该键;超时后先查询回执,再决定重试。若不支持,应保留外部对象查找条件与人工处理路径。数据库事务可以原子保存本地状态,不能把远程副作用纳入同一事务;outbox 可以连接本地提交与异步发送,仍需接收方幂等与回执。

MCP 接线的角色

应用 host 为一个或多个 MCP server 创建 client。server 发布工具描述、输入 schema 和调用结果;host 负责向模型提供工具、转发请求和呈现审批。采用版本的初始化、能力协商、传输和授权要求需分别核对。归档提到的 2026-07 无状态草案不能直接作为所有客户端的既成行为;现有核心专题以已发布的 2025-06-18 协议说明基本生命周期。MCP 生命周期。

Python 可以用官方 SDK 的 FastMCP 入口编写最小 stdio server。下例提供纯计算工具,采用官方 mcp 包的相应版本;社区 fastmcp 项目是独立发行包,其版本与 API 需另行核对。

from mcp.server.fastmcp import FastMCP

server = FastMCP('unit-converter')

@server.tool()
def metres_to_centimetres(value: float) -> float:
    """Convert a finite length in metres to centimetres."""
    import math
    if not math.isfinite(value):
        raise ValueError('value must be finite')
    result = value * 100
    if not math.isfinite(result):
        raise ValueError('converted result must be finite')
    return result

if __name__ == '__main__':
    server.run(transport='stdio')

host 启动命令应固定到受控虚拟环境,避免每次临时下载安装未核查包。stdio 的协议输出与日志分开;远程 HTTP 工具需要身份、授权、来源验证和超时。将 server 接入 SDK 时,先发现工具再映射模型工具 schema,保留调用 ID 对应关系,并在应用退出时关闭连接。MCP Python SDK、MCP TypeScript SDK。

多 Agent 围绕责任与证据分工

研究、撰写与审查可以拆成角色,每个角色获得自己的允许资料与工具集合。共享状态保存产物、来源和审查结论,避免多个角色复制整段聊天历史而丢掉版本与责任。独立审查者尽量直接核查原始证据;只阅读作者摘要会继承相同错误。

handoff 转交的是后续任务控制还是把子 Agent 当工具调用,要按运行时行为说明。失败时谁恢复、谁审批、谁承担写工具权限由主流程明确。协作协议可以传递任务和结果,授权仍由身份与资源服务决定。

沙箱、日志与验证边界

执行代码的工具放在隔离工作目录、资源与网络策略下;沙箱的本地回滚不能撤回已调用的远程服务。日志保留动作参数摘要、授权结果、回执与失败原因,秘密字段脱敏。任务完成时核对真实目标,例如文件存在、发布版本与目标一致;模型的一句“完成”只作为生成内容保存。

实际验收要覆盖重复动作、进程崩溃、审批后参数改变、权限撤回、超时后成功回执、恶意工具内容和预算耗尽。本页给出实现与验收设计,未执行这些外部操作。

记忆与恢复组件的接入

检查点保存本次运行位置、消息、审批和预算;长期记忆保存跨会话可用信息。LangGraph checkpointer 管理线程内状态,store 承接跨线程存储。Mastra 提供工作流及记忆;Temporal/DBOS 可承接持久任务。框架持久化与业务幂等配合,外部动作仍用业务动作身份查询、补记与恢复。LangGraph persistence。

记忆写入保存来源、时间、所有者、撤销规则,标明观察、用户声明与模型推断。Graphiti、Letta、Zep、Mem0 增加独立运维和数据治理边界,仅在检索需求与跨会话需求明确后引入。编程运行时、代码执行智能体及应用 agent 的选型参见运行框架调研。

最后更新于

本页目录