1-Intro
1)-Workflows vs Agents
工作流是通过预定义的代码路径编排LLM和工具的系统。 代理则是LLM动态指导自己的流程和工具使用的系统,保持对如何完成任务的控制。
graph TD A[LangGraph系统设计] --> B[工作流模式 Workflow] A --> C[代理模式 Agent] B -->|"特点"| D["开发者控制流程<br>预定义决策逻辑<br>固定的执行路径"] C -->|"特点"| E["LLM控制流程<br>动态决策逻辑<br>自适应执行路径"] F[相同点] --> G["基本代码结构类似<br>都使用graph_builder.compile<br>都可以包含工具使用"] H[核心区别] --> I["决策权归属<br>流程控制方式<br>系统灵活性"]
- 实际中: 一般都是混合2种模式,有的地方让
LLM动态决策, 有的地方由Workflow定义编排
2)-Selection
LangGraph- …Amazon Bedrock的AI代理系统 ;Rivet: 一个拖放式GUILLM工作流构建器 ;Vellum: 另一个用于构建和测试复杂任务工作流的GUI工具 ;

2-Pattern
2-1 LLM 增强

graph TD A[LLM增强功能实现] --> B[定制到特定用例] A --> C[提供简单、文档完善的接口] B --> D[根据业务需求调整功能] C --> E[确保开发者易于集成] F[实现方法] --> G[模型上下文协议<br>Model Context Protocol] G --> H[简化与第三方工具生态系统的集成]
Model Context Protocol 是 Anthropic 提供的一种实现方式, 具有如下的优势:
- 简化集成的流程 - 通过简单的客户端实现即可 连接各种工具;
- 生态系统接入 - 可以与不断增长的第三方工具生态系统无缝连接 ;
- 标准化接口 - 提供统一的方式来增强
LLM的能力;
2-2 Workflow: Prompt chaining

提示链 是一种把复杂任务分解为连续步骤的工作流模式, 每个步骤由单独的 LLM 调用完成, 形成一个处理链.
优势: • 提高复杂任务的准确性 • 每个步骤可以专注于特定目标 • 便于在中间步骤进行质量控制 • 流程更可预测和可控
局限性:
• 增加总体延迟(多次LLM调用) • 可能增加成本 • 需要明确的任务分解 • 不适合需要整体思考的任务
Tips
提示链代表了工作流模式(而非代理模式)的典型应用,因为执行路径是预定义的,每个步骤有明确的目标和检查点。这种模式在需要高质量、可控输出的企业应用中特别有价值
2-3 Routing

路由对输入进行分类并将其引导到专门的后续任务。这种工作流允许关注点分离,并构建更专业化的提示。如果没有这种工作流,为一种输入类型优化可能会损害对其他输入的性能.
优势:
- 每个专门流程可以针对特定类型输入优化
- 可以根据需求分配不同资源(如不同模型)
- 提高整体系统的性能和效率 • 便于模块化开发和维护
局限性:
- 依赖于分类准确性
- 增加系统复杂性
- 可能增加初始延迟(需要先分类)
- 需要维护多个专门处理流程
路由的实现方式:
LLM分类: 使用LLM判断输入类型- 传统分类器: 使用机器学习分类模型
- 规则引擎: 基于关键词或者模式的 规则系统
- 混合方法: 结合上述的方式来提供性能
Tips
路由工作流是工作流模式的典型应用,通过预定义的决策树结构来处理不同类型的输入,实现系统性能和资源利用的优化
2-4 Workflow: Parallelization

当分割的子任务可以并行处理以提高速度,或者需要多种视角或尝试以获得更高置信度的结果时,并行化是有效的。对于具有多种考虑因素的复杂任务,当每个考虑因素由单独的LLM调用处理时,LLM通常表现更好,允许对每个特定方面进行集中注意
并行化工作流通过同时执行多个LLM调用并聚合结果来提高性能或准确性,主要有两种实现模式:分段和投票.
graph TD A[并行化工作流] --> B[分段 Sectioning] A --> C[投票 Voting] B -->|"特点"| D["任务分解为独立子任务<br>各子任务并行执行<br>结果组合形成完整输出"] C -->|"特点"| E["同一任务多次执行<br>产生多样化结果<br>通过聚合提高可靠性"] style B fill:#d4f1f9 style C fill:#ffe6cc
核心优势
- 性能提升:通过并行处理减少总体延迟
- 准确性提高:多视角或多次尝试提高结果可靠性
- 关注点分离:每个LLM可以专注于特定方面
- 资源优化:可以根据子任务复杂度分配不同资源
实施考量 • 任务分解策略:如何有效拆分任务至关重要 • 结果聚合机制:需要设计合适的聚合或投票机制 • 资源消耗:并行调用会增加总体资源使用 • 一致性管理:确保各并行任务使用一致的上下文
Tips
并行化工作流代表了现代LLM应用中的高级模式,通过智能分解和并行执行,在保持或提高质量的同时优化性能,特别适合需要多角度分析或高可靠性的场景
2-5 Orchestrator-workers

这种工作流非常适合那些无法预测所需子任务的复杂任务(例如,在编码中,需要更改的文件数量和每个文件中更改的性质可能取决于具体任务)。虽然在拓扑结构上与并行化相似,但关键区别在于其灵活性——子任务不是预定义的,而是由编排器根据特定输入确定的
graph TD A[用户输入] --> B[编排器LLM] B -->|"任务分析<br>动态分解"| C[任务分配] C -->|子任务1| D[工作者LLM 1] C -->|子任务2| E[工作者LLM 2] C -->|子任务3| F[工作者LLM 3] D --> G[结果收集] E --> G F --> G G --> H[编排器LLM] H -->|"结果综合<br>整合输出"| I[最终输出] style B fill:#f9d5e5 style H fill:#f9d5e5 style D fill:#d4f1f9 style E fill:#d4f1f9 style F fill:#d4f1f9
核心特点
- 动态任务分解:编排器根据输入动态决定需要哪些子任务
- 灵活的工作分配:子任务不是预定义的,而是根据具体情况确定
- 层级结构:明确的指挥与执行层级
- 结果综合:编排器负责整合各工作者的输出
和 并行化工作流的区别.
graph LR A[对比] --> B[并行化工作流] A --> C[编排器-工作者工作流] B -->|"特点"| D["预定义子任务<br>静态任务分配<br>简单结果聚合"] C -->|"特点"| E["动态确定子任务<br>灵活任务分配<br>智能结果综合"]
优势: • 适应复杂且不可预测的任务 • 更智能的任务分解和资源分配 • 可以处理需要多步骤、多角度思考的问题 • 结果综合考虑整体一致性
挑战:
• 实现复杂度高 • 可能增加总体延迟(多轮LLM调用) • 需要有效的任务分解和结果整合策略 • 资源消耗较大
Tips
编排器-工作者工作流代表了一种更高级的工作流模式,特别适合那些需要动态规划和执行的复杂任务。它结合了工作流的结构化优势和代理的灵活性,在复杂系统开发和信息处理任务中特别有价值
Examples1-复杂代码修改:
flowchart TD A[代码修改需求] --> B[编排器分析项目] B --> C[确定需修改的文件和修改性质] C --> D[分配文件1修改任务] C --> E[分配文件2修改任务] C --> F[分配文件3修改任务] D --> G[整合修改] E --> G F --> G G --> H[确保一致性和功能性]
Examples2-多源信息搜索和分析
flowchart TD A[复杂查询] --> B[编排器分析查询] B --> C[确定信息来源和搜索策略] C --> D[来源1信息收集] C --> E[来源2信息收集] C --> F[来源3信息收集] D --> G[信息整合与分析] E --> G F --> G G --> H[综合回答]
2-6 Evaluator-optimizer

评估器-优化器工作流是一种迭代改进模式,通过一个LLM生成内容,另一个LLM评估并提供反馈,形成闭环优化过程.
何时使用此工作流:当我们有明确的评估标准,且迭代改进能提供可衡量的价值时,这种工作流特别有效。适合使用的两个标志是:首先,当人类明确表达他们的反馈时,LLM响应可以明显改进;其次,LLM能够提供这样的反馈。这类似于人类作家在创作精细文档时可能经历的迭代写作过程。
flowchart TD A[用户输入] --> B[优化器LLM] B -->|"生成初始响应"| C[初始输出] C --> D[评估器LLM] D -->|"评估与反馈"| E{达到标准?} E -->|否| F[反馈] F --> B E -->|是| G[最终输出] style B fill:#d4f1f9 style D fill:#f9d5e5 style E fill:#ffe6cc
核心特点
- 双角色协作:优化器负责生成,评估器负责评价
- 迭代改进:通过多轮反馈循环提升质量
- 明确标准:基于明确的评估标准进行判断
- 自主优化:系统能自我改进,减少人工干预
适用条件: 评估器-优化器工作流在满足以下条件时特别有效:
- 明确的评估标准:能够清晰定义什么是”好”的输出
- 可迭代改进:内容能通过多轮修改明显提升质量
- LLM能提供有效反馈:评估LLM能识别问题并提出有意义的改进建议
- 价值大于成本:迭代改进带来的质量提升值得额外的计算成本
例子1: 文学翻译,其中有一些微妙之处,翻译LLM最初可能无法捕捉,但评估器LLM可以提供有用的批评
flowchart LR A[原文] --> B[翻译LLM] B --> C[初始翻译] C --> D[评估LLM] D -->|"文化细微差别<br>语言风格<br>表达准确性"| E{符合标准?} E -->|否| F[详细反馈] F --> B E -->|是| G[最终翻译]
例子2: 复杂的搜索任务,需要多轮搜索和分析来收集全面信息,评估器决定是否需要进一步搜索
flowchart LR A[原文] --> B[翻译LLM] B --> C[初始翻译] C --> D[评估LLM] D -->|"文化细微差别<br>语言风格<br>表达准确性"| E{符合标准?} E -->|否| F[详细反馈] F --> B E -->|是| G[最终翻译]
优势:
• 显著提高输出质量 • 减少人工审核需求 • 适应复杂、主观的任务 • 模拟人类创作过程中的自我修改
挑战:
• 增加延迟和计算成本 • 需要精心设计评估标准 • 可能在某些情况下陷入循环 • 评估器的质量直接影响最终结果
思想来自于人类的创作过程:
- 草稿创作(优化器初次生成)
- 自我审视(评估器评价)
- 修改完善(基于反馈改进)
- 最终定稿(达到标准后输出)
2-7 Agents

代理开始工作时,要么接收来自人类用户的命令,要么与人类用户进行交互讨论
一旦任务明确,代理会独立规划和操作,可能会返回人类获取更多信息或判断。在执行过程中,代理在每一步获取环境中的”基本事实”(如工具调用结果或代码执行)来评估其进展至关重要。代理可以在检查点或遇到阻碍时暂停以获取人类反馈。任务通常在完成时终止,但也常常包括停止条件(如最大迭代次数)以保持控制
- 自主性:能够独立规划和执行任务
- 环境感知:通过工具调用获取”基本事实”
- 适应性:能够根据反馈调整策略
- 人机协作:在关键点与人类交互
- 实现简洁:本质上是”在循环中基于环境反馈使用工具的LLM
例如 coding-agent: 一个解决SWE-bench任务的编码代理,这些任务涉及基于任务描述对多个文件进行编辑

3-Summary
上面的设计模式 不是什么 Rules , 只是一些经验的东西, 你可以灵活组装, 最重要的一点: 应该在明确能改善结果的时候才考虑增加复杂性. 跟所有的系统一样,好的东西是演进而非来自于一次性的设计
Claude 有三个核心的原则:
- Maintain simplicity in your agent’s design
- Prioritize transparency by explicitly showing the agent’s planning steps
- Carefully craft your agent-computer interface (ACI) through thorough tool documentation and testing
一些框架可以帮助我们快速入门,例如 dify, 实践的时候, 不要犹豫减少抽象层并使用基本组件进行构建.
总结要点如下.
1.灵活的去取组合各种模式:
graph TD A[LLM系统设计方法论] --> B[模式组合与定制] A --> C[复杂性增加原则] A --> D[核心设计原则] B --> B1["非规定性<br>可塑造的构建块"] B --> B2["根据用例定制<br>灵活组合模式"] C --> C1["从简单开始<br>测量性能<br>迭代改进"] C --> C2["只在明确改善结果时<br>增加复杂性"] style A fill:#f9d5e5
2. 成功的构建 LLM 系统的路径
flowchart LR A[起点] --> B[简单提示] B --> C[全面评估] C --> D{性能满足需求?} D -->|是| E[部署使用] D -->|否| F[增加复杂性] F --> G[工作流模式] G --> H{性能满足需求?} H -->|是| E H -->|否| I[代理系统] I --> J[持续评估与优化] J --> E style B fill:#d4f1f9 style G fill:#ffe6cc style I fill:#e6ccff
3. 代理系统的三大设计原则
graph TD A[代理系统核心原则] --> B[简单性] A --> C[透明度] A --> D[接口设计] B --> B1["避免不必要复杂性<br>保持代码清晰<br>简化系统架构"] C --> C1["展示规划步骤<br>可解释的决策<br>清晰的执行流程"] D --> D1["精心设计工具文档<br>全面测试接口<br>一致的交互模式"]
4-Appendix
4-1 examples
Customer support
flowchart LR A[客户支持代理] --> B[优势特点] B --> B1["自然对话流程<br>+外部信息访问"] B --> B2["工具集成能力<br>客户数据/订单/知识库"] B --> B3["程序化操作<br>退款/工单更新"] B --> B4["明确的成功衡量<br>用户定义的解决方案"] A --> C[商业模式验证] C --> C1["基于使用的定价<br>仅对成功解决收费"] C --> C2["显示对代理<br>有效性的信心"]
flowchart LR A[客户查询] --> B[代理理解问题] B --> C[访问相关信息] C -->|"客户数据"| D[制定解决方案] C -->|"订单历史"| D C -->|"知识库"| D D --> E[执行必要操作] E -->|"更新工单"| F[解决方案] E -->|"发放退款"| F E -->|"安排服务"| F F --> G[客户确认] style C fill:#e6ccff style E fill:#e6ccff
Coding Agent:
flowchart TD A[代码问题描述] --> B[代理分析问题] B --> C[规划解决方案] C --> D[编写代码] D --> E[运行自动测试] E -->|"测试失败"| F[分析失败原因] F --> C E -->|"测试通过"| G[提交解决方案] G --> H[人类代码审查] H -->|"需修改"| C H -->|"批准"| I[最终解决方案] style D fill:#d4f1f9 style E fill:#ffe6cc style H fill:#f9d5e5
价值体现
• 可验证性:通过自动化测试客观验证解决方案 • 迭代改进:利用测试结果作为反馈循环 • 结构化环境:代码领域的明确规则和约束 • 实际应用:已能解决SWE-bench Verified基准中的真实GitHub问题 • 人机协作:自动测试验证功能,人类审查确保系统一致性
共同特征:
- 明确的成功标准:可以客观衡量代理是否完成任务
- 反馈循环机制:代理可以根据结果调整行动
- 结构化但开放的问题空间:既有规则约束又有创新空间
- 人类适当监督:保持人类在关键决策点的参与
- 工具集成能力:与外部系统和数据源无缝交互
4-2 tools is important
Tips
工具设计的小改动可以显著提高代理系统的可靠性。在构建SWE-bench代理时,团队发现优化工具设计比优化整体提示更重要
正如人机界面(HCI)设计至关重要,代理-计算机接口同样需要精心设计.
工具设计是代理系统成功的关键因素,良好的工具定义和规范需要与整体提示同等重视。本附录提供了工具提示工程的核心原则和最佳实践。
graph TD A[工具提示工程] --> B[格式选择原则] A --> C[代理-计算机接口设计] A --> D[工具优化策略] B --> B1["提供足够思考空间"] B --> B2["接近自然文本格式"] B --> B3["避免格式开销"] C --> C1["站在模型角度思考"] C --> C2["优化参数名称和描述"] C --> C3["进行广泛测试"] C --> C4["防错设计"] style A fill:#f9d5e5
工具格式的考虑和设计.
flowchart LR A[格式选择] --> B{更友好的格式} A --> C{更困难的格式} B --> B1["Markdown代码块"] B --> B2["完整文件重写"] B --> B3["自然语言描述"] C --> C1["代码差异(diff)"] C --> C2["JSON内嵌代码"] C --> C3["需要计数的格式"] style B fill:#d4f1f9 style C fill:#ffcccc
关键原则
- 提供足够思考空间:给模型足够的令牌来规划和思考,避免陷入格式困境
- 接近自然文本:选择接近模型在训练数据中见过的格式
- 避免格式开销:避免需要精确计数、特殊转义或复杂格式规则的输出