随着人工智能的飞速发展,构建能够完成复杂任务的智能体系统已成为现实。然而,在设计这些智能体时,我们面临着一个根本性的挑战:如何让智能体在充满不确定性的环境中做出合理决策?
为解答这一问题,Anthropic于2024年12月20日发布了《构建高效智能体指南》。该指南汇集了公司在自主开发以及与客户合作过程中积累的宝贵经验。本文是对该指南的解读,旨在为读者提供切实可行的智能体开发指导。
什么是智能体?
"智能体"可以有多种定义。一些研究人员将智能体定义为能够长期独立运行、使用各种工具完成复杂任务的完全自主系统。另一些则用这个词来描述遵循预定工作流程的更规范化实现。在Anthropic,他们将所有这些变体都归类为"智能系统",但在架构上区分"工作流"和"智能体":
工作流是通过预定义代码路径编排LLM和工具的系统。
智能体则是LLM能够动态指导自己的流程和工具使用,控制如何完成任务的系统。
何时或者何时不使用智能体
在构建LLM应用时,应寻找最简单的解决方案,只在必要时增加复杂性。这可能意味着完全不构建智能系统。智能系统通常会用延迟和成本换取更好的任务表现,需要考虑这种权衡是否合理。
当需要更复杂的解决方案时,工作流为定义明确的任务提供可预测性和一致性,而智能体则更适合需要规模化灵活性和模型驱动决策的场景。然而,对很多应用来说,通过检索和上下文示例优化单个LLM调用通常就足够了。
智能系统的构建模块
基础构建模块:增强型LLM
智能系统的基本构建模块是通过检索、工具和记忆等功能增强的LLM。当前的模型可以主动使用这些功能——生成自己的搜索查询、选择适当的工具,并确定需要保留哪些信息。
实现时应关注两个关键方面:
- 根据具体用例定制这些功能
- 确保它们为LLM提供简单、文档完善的接口
工作流模式
1. 提示链
提示链将任务分解为一系列步骤,每个LLM调用处理前一个调用的输出。可以在任何中间步骤添加程序检查,以确保流程仍在正轨上。
这种工作流最适合任务可以轻松清晰地分解为固定子任务的情况。主要目标是通过让每个LLM调用成为更简单的任务来用延迟换取更高的准确性。
2. 路由
路由对输入进行分类并将其导向专门的后续任务。这种工作流允许关注点分离,构建更专门化的提示。
当复杂任务有明显的不同类别需要分别处理,且分类可以由LLM或更传统的分类模型/算法准确处理时,路由效果很好。
3. 并行化
LLM有时可以同时处理任务,并通过程序化方式汇总它们的输出。这种并行化工作流有两个主要变体:
- 分段:将任务分解为并行运行的独立子任务
- 投票:多次运行相同任务以获得多样化输出
4. 协调者-工作者
在协调者-工作者工作流中,中央LLM动态分解任务,将其委派给工作者LLM,并综合他们的结果。这种工作流很适合无法预测所需子任务的复杂任务。
5. 评估者-优化者
在评估者-优化者工作流中,一个LLM调用生成响应,而另一个在循环中提供评估和反馈。当有明确的评估标准,且迭代改进能提供可衡量的价值时,这种工作流特别有效。
智能体
随着LLM在关键能力上不断成熟——理解复杂输入、进行推理和规划、可靠使用工具以及从错误中恢复——智能体正在生产环境中涌现。智能体从人类用户的命令或互动讨论开始工作。一旦任务明确,智能体就会独立规划和运行,必要时会向人类寻求更多信息或判断。
智能体可以处理复杂任务,但其实现通常很简单。它们通常只是基于环境反馈在循环中使用工具的LLM。因此,清晰周到地设计工具集及其文档至关重要。
智能体可用于难以或不可能预测所需步骤数量的开放性问题,以及无法硬编码固定路径的场景。智能体的自主性意味着更高的成本,以及可能的错误累积。建议在沙箱环境中进行广泛测试,并配备适当的安全guardrails。
实践中的智能体
经验揭示了两个特别有前途的AI智能体应用:
客户支持
客户支持将熟悉的聊天机器人界面与通过工具集成实现的增强功能相结合。这很适合更开放式的智能体,因为:
- 支持互动自然遵循对话流程,同时需要访问外部信息和操作
- 可以集成工具来获取客户数据、订单历史和知识库文章
- 可以通过程序处理发放退款或更新工单等操作
- 可以通过用户定义的解决方案清晰衡量成功
编码智能体
软件开发领域在LLM功能方面显示出显著潜力,能力从代码补全发展到自主问题解决。智能体特别有效,因为:
- 代码解决方案可以通过自动化测试验证
- 智能体可以使用测试结果作为反馈来迭代解决方案
- 问题空间定义明确且结构化
- 输出质量可以客观衡量
工具的提示工程
无论构建哪种智能系统,工具很可能是智能体的重要组成部分。工具使LLM能够与外部服务和API交互。工具定义和规范应该得到与整体提示同样多的提示工程关注。
工具格式的建议:
- 给模型足够的令牌来"思考",避免把自己写入死角
- 保持格式接近模型在互联网文本中自然遇到的格式
- 确保没有格式"开销",比如必须保持准确计数数千行代码,或对它写的任何代码进行字符串转义
在构建智能体-计算机界面(ACI)时:
- 站在模型的角度思考
- 优化参数名称和描述使事情更明显
- 测试模型如何使用工具并迭代改进
- 对工具进行防错设计(Poka-yoke)
总结
在LLM领域取得成功不在于构建最复杂的系统,而在于为特定需求构建正确的系统。从简单的提示开始,通过全面评估优化它们,只有当更简单的解决方案不足时才添加多步骤智能系统。
在实现智能体时,遵循三个核心原则:
1. 保持智能体设计的简单性
2. 通过明确展示智能体的规划步骤来优先考虑透明度
3. 通过全面的文档和测试来精心设计智能体-计算机接口(ACI)
框架可以帮助快速入门,但当转向生产环境时,不要犹豫减少抽象层并使用基本组件构建。遵循这些原则,可以创建不仅强大而且可靠、可维护,并能获得用户信任的智能体。