十二要素智能体:构建生产就绪的LLM应用

本文深入探讨十二要素智能体架构模式,介绍如何基于大语言模型构建健壮、可扩展且可维护的生产级应用,涵盖依赖管理、配置分离、无状态执行等核心原则。

十二要素智能体:构建生产就绪的LLM应用

在探索并发表关于AI智能体可观测性工具和架构模式的文章后,我偶然在YouTube上看到Dex Horthy关于十二要素智能体的精彩演讲。本文深入探讨十二要素智能体的概念,这是一种旨在创建健壮、可扩展且可维护应用的架构模式,特别适用于现代云环境。我们将探讨该方法的核心原则,以及它们如何帮助构建适合在动态分布式系统中部署和运营的应用。

大语言模型(LLM)的兴起为构建智能应用创造了前所未有的机遇,但同时也给软件工程带来了新的挑战。十二要素智能体方法借鉴了Heroku最初的十二要素应用方法论,为构建LLM驱动软件提供了一套原则,确保其可靠性足以交付给生产环境客户。

十二要素应用方法最初于2011年提出,为构建软件即服务(SaaS)应用提供了一套最佳实践。虽然最初专注于Web应用,但其原则广泛适用于任何设计用于现代云原生环境部署的应用。十二要素智能体通过关注分布式系统中的智能体组件来扩展这些原则,确保其符合相同的健壮性、可扩展性和可维护性标准。

在尝试了所有框架并与许多使用AI的创始人交流后,关键洞察是:大多数进入生产的"AI智能体"实际上并不那么智能。最好的智能体大多只是在关键点加入了LLM的精心设计软件。该方法解决了原型AI系统与生产就绪应用之间的差距。

十二要素智能体原则详解

映射十二要素智能体到十二要素应用

十二要素智能体方法将经过验证的原始十二要素应用原则适应于LLM驱动应用的独特挑战。以下是它们的映射关系:

  1. 代码库 → 单一用途智能体

    • 原始十二要素应用:一个代码库通过版本控制跟踪,多次部署
    • 十二要素智能体:每个智能体应具有单一、明确定义的用途
    • 示例:传统应用→电子商务平台的单一代码库;智能体应用→客户服务、库存管理和推荐引擎的独立智能体
  2. 依赖 → 显式依赖

    • 原始十二要素应用:显式声明和隔离依赖
    • 十二要素智能体:显式声明所有模型依赖、API版本和工具需求
    • 示例:传统应用→requirements.txt指定Python包版本;智能体应用→配置指定OpenAI API版本、模型名称和工具模式
  3. 配置 → 配置管理

    • 原始十二要素应用:在环境中存储配置
    • 十二要素智能体:将配置与代码分离,包括提示和模型参数
    • 示例:传统应用→环境变量中的数据库URL;智能体应用→环境变量中的模型温度、系统提示和工具配置
  4. 支持服务 → 外部工具集成

    • 原始十二要素应用:将支持服务视为附加资源
    • 十二要素智能体:将外部API、数据库和工具视为可交换资源
    • 示例:传统应用→通过环境变量的数据库连接;智能体应用→支付处理器、电子邮件服务和CRM系统作为可插拔工具
  5. 构建、发布、运行 → 确定性部署

    • 原始十二要素应用:严格分离构建和运行阶段
    • 十二要素智能体:确保跨环境的可重现智能体行为
    • 示例:传统应用→具有不可变构建的Docker容器;智能体应用→冻结模型权重、版本化提示和确定性工具配置
  6. 进程 → 无状态执行

    • 原始十二要素应用:作为一个或多个无状态进程执行应用
    • 十二要素智能体:智能体应无状态并依赖外部状态管理
    • 示例:传统应用→外部缓存(Redis)中的会话状态;智能体应用→外部数据库中的对话历史,不在智能体内存中
  7. 端口绑定 → 服务接口

    • 原始十二要素应用:通过端口绑定导出服务
    • 十二要素智能体:通过明确定义的接口暴露智能体能力
    • 示例:传统应用→监听特定端口的HTTP服务器;智能体应用→用于智能体调用的REST API端点或消息队列处理器
  8. 并发 → 水平扩展

    • 原始十二要素应用:通过进程模型扩展
    • 十二要素智能体:基于工作负载水平扩展智能体
    • 示例:传统应用→处理HTTP请求的多个工作进程;智能体应用→处理队列任务的多个智能体实例
  9. 可处置性 → 快速启动和关闭

    • 原始十二要素应用:通过快速启动和优雅关闭最大化健壮性
    • 十二要素智能体:智能体应快速启动并优雅处理中断
    • 示例:传统应用→HTTP连接的优雅关闭;智能体应用→关闭前完成当前任务,检查点进度
  10. 开发/生产对等 → 环境一致性

    • 原始十二要素应用:保持开发、预生产和生产环境尽可能相似
    • 十二要素智能体:跨环境保持一致的智能体行为
    • 示例:传统应用→跨环境相同的数据库版本;智能体应用→跨环境相同的模型版本和提示配置
  11. 日志 → 全面日志记录

    • 原始十二要素应用:将日志视为事件流
    • 十二要素智能体:记录所有智能体决策、工具调用和模型交互
    • 示例:传统应用→结构化日志输出到stdout;智能体应用→记录模型输入/输出、工具执行和决策路径
  12. 管理进程 → 人在回路

    • 原始十二要素应用:将管理任务作为一次性进程运行
    • 十二要素智能体:为关键决策实施人工监督
    • 示例:传统应用→作为独立进程的数据库迁移;智能体应用→高风险决策的人工审批工作流

生产LLM应用的关键原则

关注软件工程基础

核心洞察是成功的智能体"主要由软件组成",而不是典型的"这是你的提示,这是一袋工具,循环直到达到目标"模式。这意味着:

  • 尽可能使用确定性工作流
  • 清晰的错误处理和恢复机制
  • 全面的测试策略
  • 整个系统的监控和可观测性

强调可靠性和可审计性

生产LLM应用需要:

  • 跨不同输入的预测行为
  • 所有决策和行动的审计追踪
  • 模型失败时的回退机制
  • 成本控制和资源管理

人工监督集成

与传统应用不同,LLM驱动系统通常需要人工监督:

  • 可能产生重大业务影响的高风险决策
  • 生成内容的质量控制
  • 处理模型未见过的边缘情况
  • 持续学习和系统改进

实施策略

以下是在使用智能体构建应用前可以考虑的一些示例实施策略。这些是供您入门的基本想法。

  1. 从小型专注智能体开始 与其构建单一复杂智能体,不如从处理特定任务的小型智能体开始:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 良好:专注的智能体
class EmailClassificationAgent:
    def classify_email(self, email_content):
        # 单一职责:分类邮件
        pass

# 避免:全能智能体
class GeneralPurposeAgent:
    def classify_email(self, email_content): pass
    def generate_response(self, email_content): pass
    def manage_calendar(self, request): pass
    def analyze_sentiment(self, text): pass
  1. 实施健壮的错误处理
1
2
3
4
5
6
7
8
class AgentExecutor:
    def execute_with_fallback(self, task):
        try:
            return self.primary_agent.execute(task)
        except ModelTimeoutError:
            return self.simple_fallback(task)
        except InvalidResponseError:
            return self.request_human_intervention(task)
  1. 全面日志记录和监控
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import logging
from datetime import datetime
import json

class AgentLogger:
    def log_decision(self, agent_id, input_data, decision, confidence):
        log_entry = {
            'timestamp': datetime.utcnow(),
            'agent_id': agent_id,
            'input_hash': self.hash_input(input_data),
            'decision': decision,
            'confidence': confidence,
            'model_version': self.get_model_version()
        }
        logging.info(json.dumps(log_entry))

十二要素智能体方法的好处

  1. 可扩展性 通过遵循这些原则,LLM应用可以水平扩展,处理增加的负载而不会降低性能。

  2. 可维护性 清晰的关注点分离和显式依赖使系统更易于维护和更新。

  3. 可靠性 无状态设计和全面的错误处理提高了系统可靠性并减少了停机时间。

  4. 可审计性 全面的日志记录和人工监督机制提供了企业应用所需的审计追踪。

  5. 成本效率 通过优化特定用例和实施适当的资源管理,可以有效控制成本。

结论

十二要素智能体方法直接解决了将LLM融入现实世界软件的挑战,强调了健壮性、可维护性以及人工监督的关键作用。即使模型变得指数级更强大,这些核心技术对于构建生产就绪的LLM应用仍然有价值。

关键要点是成功的LLM应用不仅仅是拥有强大的模型——它们关乎应用坚实的软件工程原则来创建可靠、可扩展和可维护的系统。通过将经过验证的十二要素应用方法适应于LLM驱动应用的独特挑战,开发人员可以构建真正准备好用于生产的AI系统。

十二要素智能体方法为超越原型AI系统提供了路线图,使应用能够在生产环境中可靠地为真实用户服务。随着AI领域的不断发展,这些原则将有助于确保LLM驱动应用建立在坚实的工程基础之上。

本文基于Dex Horthy和HumanLayer团队开发的十二要素智能体方法,可在https://github.com/humanlayer/12-factor-agents 获取。这是我在文章开头提到的YouTube演讲。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计