Workflow 编排指南
学习如何通过将客服邮件处理流程分解为离散步骤来使用 ARGI Graph 构建智能工作流。
ARGI Graph 可以改变您构建智能代理的思维方式。使用 Graph 构建代理时,您将首先把它分解为称为 节点(nodes) 的离散步骤。然后,描述每个节点的不同决策和转换。最后,通过一个共享的 状态(state) 将节点连接起来,每个节点都可以读取和写入该状态。在本教程中,我们将指导您完成使用 ARGI Graph 构建客服邮件处理代理的思维过程。
当前核心能力
refactor 分支中的 Graph Core 已提供以下能力:
| 能力 | 关键类型 | 说明 |
|---|---|---|
| 图定义与运行 | StateGraph、CompiledGraph、RunnableConfig、CompileConfig | 定义节点、边、检查点配置并运行图。 |
| 状态 | OverAllState、KeyStrategy | 以状态键保存节点输出,并按策略合并更新。 |
| 节点 | NodeAction、NodeActionWithConfig、AsyncNodeAction、AsyncNodeActionWithConfig | 支持同步、异步和带运行配置的节点。 |
| 路由 | EdgeAction、EdgeActionWithConfig、Command、MultiCommand | 支持固定边、条件边、同时更新状态与路由,以及多分支并行路由。 |
| 状态策略 | ReplaceStrategy、AppendStrategy、MergeStrategy、KeyStrategyFactoryBuilder | 覆盖、追加、合并以及集中声明策略。 |
| 持久化 | MemorySaver、VersionedMemorySaver、FileSystemSaver、RedisSaver、MongoSaver、H2Saver、MysqlSaver、PostgresSaver、OracleSaver | 支持内存、文件、Redis、MongoDB 和 JDBC checkpoint。 |
| 序列化 | SpringAIStateSerializer、ObjectStreamStateSerializer、SpringAIJacksonStateSerializer、JacksonStateSerializer | 支持 Spring AI 消息与 Graph 状态序列化。 |
| 流式输出 | StreamingOutput、OutputType、NodeOutput | 以 Reactor Flux 输出节点和模型流式结果。 |
| 子图 | SubGraphNode、SubCompiledGraphNode | 支持把子图作为节点或 CompiledGraph 嵌入父图。 |
| Store | MemoryStore、FileSystemStore、RedisStore、MongoStore、DatabaseStore | 提供长期记忆接口和多种 Store 实现;DatabaseStore 在源码中已标记 deprecated。 |
| 调度 | ScheduleConfig、ScheduledAgentTask、ScheduledAgentManager | 支持 cron、fixed delay、fixed rate、one-time 和 Spring Trigger 调度。 |
| 生命周期与观测 | GraphLifecycleListener、GraphObservationLifecycleListener | 支持节点生命周期回调和 Micrometer Observation 集成。 |
从需要自动化的流程开始
假设您需要构建一个处理客服邮件的 AI 代理。产品团队给出了以下需求:
代理应该:
- 读取客户邮件
- 按紧急程度和主题分类
- 搜索相关文档以回答问题
- 起草适当的回复
- 将复杂问题上报给人工客服
- 在需要时安排后续跟进
需要处理的示例场景:
- 简单产品问题:"如何重置我的密码?"
- Bug 报告:"导出功能在选择 PDF 格式时崩溃"
- 紧急账单问题:"我的订阅被重复扣费了!"
- 功能请求:"能在移动应用中添加暗黑模式吗?"
- 复杂技术问题:"我们的 API 集成间歇性失败,返回 504 错误"
要在 ARGI Graph 中实现代理,通常遵循以下五个步骤。
步骤 1:将工作流映射为离散步骤
首先识别流程中的不同步骤。每个步骤将成为一个节点(执行特定任务的函数)。然后勾画这些步骤如何相互连接。
箭头显示可能的路径,但具体选择哪条路径的决策发生在每个节点内部。
现在您已经识别了工作流中的组件,让我们了解每个节点需要做什么:
- 读取邮件:提取和解析邮件内容
- 分类意图:使用 LLM 对紧急程度和主题进行分类,然后路由到适当的操作
- 文档搜索:查询知识库以获取相关信息
- Bug跟踪:在跟踪系统中创建或更新问题
- 起草回复:生成适当的响应
- 人工审核:上报给人工客服进行审批或处理
- 发送回复:发送邮件响应
提示:注意有些节点会决定接下来去哪里(分类意图、起草回复、人工审核),而其他节点总是进入相同的下一步(读取邮件总是进入分类意图,文档搜索总是进入起草回复)。
步骤 2:确定每个步骤需要做什么
对于图中的每个节点,确定它代表什么类型的操作以及它需要什么上下文才能正常工作。
LLM 步骤
当步骤需要理解、分析、生成文本或做出推理决策时:
分类意图节点
- 静态上下文(提示):分类类别、紧急程度定义、响应格式
- 动态上下文(来自状态):邮件内容、发件人信息
- 期望结果:确定路由的结构化分类
起草回复节点
- 静态上下文(提示):语气指南、公司政策、响应模板
- 动态上下文(来自状态):分类结果、搜索结果、客户历史
- 期望结果:准备好审核的专业邮件响应
数据步骤
当步骤需要从外部源检索信息时:
文档搜索节点
- 参数:从意图和主题构建的查询
- 错误处理:捕获异常并存储错误信息,继续执行流程
- 缓存:可以缓存常见查询以减少 API 调用(本示例中未实现)
客户历史查询
- 参数:来自状态的客户邮箱或 ID
- 错误处理:如果不可用则回退到基本信息(本示例中未实现)
- 缓存:是,使用生存时间来平衡新鲜度和性能(本示例中未实现)
操作步骤
当步骤需要执行外部操作时:
发送回复节点
- 何时执行:批准后(人工或自动)
- 错误处理:让异常冒泡以进行调试(本示例中未实现重试逻辑)
- 不应缓存:每次发送都是唯一操作
Bug跟踪节点
- 何时执行:当意图是"bug"时总是执行
- 错误处理:直接执行,不丢失 bug 报告至关重要(本示例中未实现重试逻辑)
- 返回:要包含在响应中的票据 ID
用户输入步骤
当步骤需要人工干预时:
人工审核节点
- 决策上下文:原始邮件、草稿响应、紧急程度、分类
- 预期输入格式:批准布尔值加上可选的编辑响应
- 何时触发:高紧急程度、复杂问题或质量问题