12-Factor Agent是由HumanLayer创始人提出的企业级复杂Agent设计12原则,旨在填平Agent从"能跑起来"到"能用起来"的鸿沟。与LangChain等工具箱不同,它是一套方法论,采用"反框架"理念,让开发者完全掌控核心组件。12项原则涵盖工作范式、工具执行、人机协同、提示词管理、上下文处理、错误处理、状态管理等,目标是构建可靠、可扩展、可维护、可调试、安全的企业级Agent系统,让AI真正在企业内部创造价值。


如果你正在面临这些问题:

  • LangChain、AutoGen 快速拼出一个 Agent demo,但一上线就各种报错、卡死,甚至连 bug 都不知道怎么复现;
  • 想让 Agent 真正融入业务流程,但发现它不是忘记上下文,就是“瞎回答”,更别提让业务同事真正依赖它;
  • 或者,老板已经问过你无数次:“这个 AI 项目什么时候能真正上线,稳定跑在生产环境里?”,你只能模棱两可地说“我们还在调模型”。

12-Factor Agent核心理念:

HumanLayer创始人Dexter Horthy提出的企业级复杂Agent设计12原则(12-Factor Agent),会给你一切答案。

12-Factor Agents 的价值,就是要填平Agent****从“能跑起来”到“能用起来”这中间的巨大鸿沟,让AI在公司内部真正创造价值。它不是炫技的概念,而是一套专门指导 企业级 Agent 工程化落地 的方法论。

目前 12-Factor Agents 已在 GitHub 收获 13.8k+ star、近 1000 个 fork,不仅是一个开源项目,更是一套指导 Agent 工程化的“行业共识”。

与 LangChain 等框架不同,12-Factor Agents 不是一个工具箱,而是一套****方法论

它的核心创新点是提出 **“反框架(Anti-Framework)”**的理念:

  • 不追求一键式的“黑盒解决方案”
  • 而是让开发者完全掌控核心组件(提示词、上下文、状态、控制流…)
  • 目标是让 Agent 符合 企业级应用标准:可靠、可扩展、可维护、可调试、安全

Horthy认为,在金融、医疗、供应链等行业,透明度比“开发快”更重要。开发者必须清楚:

  • 每一步的逻辑是什么
  • 数据是如何流动的
  • 出错后如何恢复

这就是 12-Factor Agents 存在的意义:通过一套工程化原则,让 Agent进化为“真正能稳定运行的企业级系统”。

12-Factor Agent12原则内容目录

原则一:组织规划、工具调用,复杂Agent的工作范式

原则二:工具执行器,Agent“思考”和“行动”分离解耦、独立进化

原则三:通过工具调用来联系人类,Agent中的“人机协同”

划重点:原则1、2、3聚焦的是“复杂Agent的顶层设计框架”

原则四:提示词可调试、可迭代、可回滚、面向场景设计、A/B测试

原则五:建设上下文评估与仲裁,突破上下文有限束缚,提升“生成质量”

原则六:将错误压缩到上下文窗口,让Agent从错误中学习并尝试自我纠正

划重点:原则4、5、6聚焦的是“复杂Agent的上下文管理策略”

原则七:统一执行状态和业务状态,为Agent赋予了“自主恢复”的能力

原则八:使用简单的API来完成启动、暂停和恢复,实现“任务全生命周期”管理

原则九:有限状态机,拥有Agent的自主控制流

划重点:原则7、8、9聚焦的是“复杂Agent的核心工作链路”

原则十:多个小而专注的Agent,共同组成“智能组织”

原则十一:从任何地方触发Agent,构建“无处不在的智能生产力”

原则十二:将Agent看做是一个“无状态的归约器”

划重点:原则10、11、12聚焦的是“复杂Agent构建的哲学思考”

你会收获什么?

  • 你主导的Agent逻辑和状态都可控,问题能被快速定位、复现和修复,再也不是“黑盒子里抓瞎”;
  • 你能精细化管理上下文和控制流,确保 Agent 每一步动作都有迹可循,真正适配业务需求;
  • 业务同事会真正信任 Agent,把它当成 可靠的团队伙伴,而不是偶尔试试的新鲜玩意;
  • 面对老板提问,你能很有底气地回答:“是的,这个系统稳定、可控、可扩展”,而不是模棱两可地说“我们还在调模型”;

最重要的是,你将真正的在AI产品领域“登堂入室”,让你主导的AI产品在公司内部真正创造价值。


这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

原则一:组织规划、工具调用,复杂Agent的工作范式

这个原则是整个12-Factor Agents方法论的第一块基石,它定义了智能体(Agent)最核心、最根本的工作范式,即:LLM的核心工作转变为“协调工具以解决用户的问题”。

1. 核心范式转变:从“直接回答”到“组织协调”

这个原则首先确立了一个根本性的定位:一个真正的、有用的Agent,不应该仅仅是一个更高级的聊天机器人,而应该是一个自主的“组织规划 和 推动执行者”。

  • 传统聊天机器人/基础大模型(直接回答):

    它的核心工作是生成文本以直接回答用户的问题。

  • 智能体 Agent(组织协调):

    它的核心工作是协调工具来解决用户的复杂问题。

这种从“直接回答”到“组织协调”的范式转变,是Agent价值飞跃的关键。它将大语言模型(LLM)定位为大脑和协调中心。它承认LLM可能没有精确的内部知识(如实时销售数据),但它拥有无与伦比的理解意图和规划步骤的能力。

2. 为什么原则1如此重要?—— 解决模糊性与实现精确性

自然语言天生是模糊的、充满歧义的,而计算机系统需要精确的、结构化的指令才能可靠运行。这个原则正是在这两者之间架起了一座桥梁。

让我们对比一下:

比如销售总监说:

“最近半年每月业绩连续下降的有哪些门店?为什么下降?生成一份分析报告,发送到我和运营部邮箱。”

  • 自然语言指令(模糊):

    如果让一个基础LLM直接回答,它的输出将是不可预测的。它可能会编造数据,或者基于过时的知识给出一个泛泛的回答。

  • **工具调用(精确):**在12-Factor原则下,一个设计良好的Agent会将此指令解析为一系列结构化的工具调用:

  1. 调用数据查询工具

    获取每个门店的营业额

  2. 调用数据预警工具

    找出营业额逐月下降的门店

  3. 调用归因分析工具

    定位到哪些因素导致了连续下降

  4. 调用报告生成工具

    生成分析报告

  5. 调用邮件发送工具

    将excel发送到用户和运营部的邮箱

这样做的好处是巨大的:

  • 可预测性:

    只要工具和参数定义清晰,Agent的行为就是高度可预测的。它每次都会以同样的方式执行相同的任务。

  • 可调试性:

    如果最终报告生成出错了,开发者可以清晰地追踪到是哪一个工具调用出了问题。调试的目标从“黑盒”的LLM思维过程,转移到了“白盒”的工具输入输出上,难度大大降低。

3. 如何落地实践这个原则?

落地此原则的关键不在于让LLM变得多强大,而在于开发者****如何为LLM设计和提供这些“工具”

1. 工具设计:清晰的功能、参数与返回结果

这是最核心的落地步骤。每一个工具都必须被严格定义,就像一个清晰的API接口文档:

  • 功能描述:

    用一段自然语言向LLM清晰地描述这个工具是做什么用的

  • 参数定义:

    明确调用工具需要的每个参数的名称、类型、是否必填、枚举值选项和描述

  • 返回结果:

    描述工具返回的数据结构。

2. 提供给LLM:

开发者需要将这些精心定义的工具列表(包括其功能、参数和返回格式)作为系统提示词的一部分提供给LLM。这相当于给了LLM一本它可以使用的“工具手册”。

3. 流程标准化:

在Agent的架构中,需要有一个标准的流程来处理LLM的输出:

  • 解析用户输入:

    LLM根据用户指令和“工具手册”,决定是否需要调用工具、调用哪些工具、调用先后顺序是什么、第一个工具的参数是什么。

  • 生成结构化请求:

    Agent框架将LLM的决策转换为一个具体的、结构化的工具调用请求(例如,一个JSON对象)。

  • 执行调用:

    系统安全地执行该工具(可能是调用一个API、运行一段代码、查询数据库)。

  • 处理返回结果:

    将工具返回的结构化数据再次提供给LLM,由LLM按照“工具调用序列”来执行下一步行动:是调用下一个工具,还是将结果整合成自然语言回复给用户。

4、案例说明:

假设用户输入是:“帮我分析一下上个月销售额最高的5个产品,并生成一个Excel报表。”

第1次调用LLM:意图识别与工具选择

  • 输入(给LLM的提示词):
  • 系统提示词:

    包含所有已定义工具的“手册”(功能、参数等)。

  • 用户消息:

    “帮我分析一下上个月销售额最高的5个产品,并生成一个Excel报表。”

  • 对话历史(可能为空):[]

  • LLM的思考与决策过程:

    LLM会分析用户的指令,并参考“工具手册”,得出以下结论:“用户的需求可以分为两步。第一步是查询数据,我需要使用查询销售数据工具;第二步是生成报表,我需要使用生成Excel报表工具,我现在应该先执行第一步。”

  • LLM的输出(结构化响应):

    LLM不会直接生成自然语言回答,而是输出一个结构化的动作指令,例如一个JSON

  • 系统执行:Agent框架接收到这个指令后,暂停LLM的会话去实际执行这个工具调用(比如,去查询数据库)。

第2次调用LLM:结果分析与下一步决策

  • 输入(给LLM的提示词):
  • 系统提示词:

    同样的“工具手册

  • 用户消息:

    原始用户消息

  • 对话历史:

    现在历史记录中增加了新内容:
    [ {“role”: “user”, “content”: “原始指令”} ,
    {“role”: “tool”, “content”: “工具返回的结果: [{"product_name": "A", "revenue": 100000}, ...]”} ]

  • LLM的思考与决策:

    LLM看到工具的返回结果后,会进行推理:“很好,第一步成功了,我拿到了需要的数据。现在用户还要求生成Excel报表,所以我应该调用下一个生成excel报表工具来处理这些数据。”

  • LLM的输出(结构化响应):

{
"action": "call_tool",
"tool_name": "generate_excel_report_tool",
"tool_parameters": {
"data": [{"product_name": "A", "revenue": 100000}, ...], // 上一步的工具结果
"format": "excel",
"columns": ["product_name", "revenue", "profit_margin"]
}
}{
"action": "call_tool",
"tool_name": "generate_excel_report_tool",
"tool_parameters": {
"data": [{"product_name": "A", "revenue": 100000}, ...], // 上一步的工具结果
"format": "excel",
"columns": ["product_name", "revenue", "profit_margin"]
}
}
  • 系统执行:

    Agent框架再次接收指令,调用报表生成工具(例如,调用一个Python库来创建Excel文件),并将文件保存到指定位置。

第3次调用LLM:任务终结与用户回复

  • 输入(给LLM的提示词):
  • 系统提示词:

    同样的“工具手册

  • 用户消息:

    原始用户消息

  • 对话历史:

    历史记录继续增加:
    [... ,
    {“role”: “tool”, “content”: “工具调用成功:报表已生成,文件保存在 /reports/sales_report_1027.xlsx”} ]

  • LLM的思考与决策:

    LLM看到第二个工具也成功返回,并且所有用户要求 steps 都已完成后,会认为任务已完结。“所有步骤都完成了。现在我需要用友好的语言告诉用户任务已经完成,并告知他结果在哪里。”

  • LLM的输出(最终响应):

{
"action": "respond_to_user",
"response": "您好!已为您完成分析。上个月销售额最高的5个产品数据已分析完毕,并生成了Excel报表,您可以在此下载:/reports/sales_report_1027.xlsx"
}
  • 系统执行:框架将这个最终回复返回给用户(例如,在聊天界面中显示)。

原则二:工具执行器,Agent“思考”和“行动”分离解耦、独立进化

这个原则,是 原则一关于“工具调用”的深入解读,倡导Agent 思考 与 行动 完全分离、独立进化,并“构建用来链接思考与行动的标准化工具分发执行器”。

1. 核心范式转变:从“行为”到“意图”

这个原则之所以“反直觉”,是因为它挑战了我们通常对“工具调用”的认知。我们容易将其想象成一个主动的“动作”(Agent去某事),但原则4要求我们将其重新定义为一种被动的“描述”(Agent建议做某事)。

  • 传统理解(Agent作为执行者):Agent -> 调用工具 -> 获取结果
  • 在这种模型下,Agent需要“知道”如何调用工具。它需要集成各种工具的SDK、处理身份认证、保障权限正确等。这会将Agent变成一个臃肿且高度耦合的“上帝对象”。
  • 原则2的理解(Agent作为决策者不直接调用工具,执行器作为执行者去调用工具):Agent -> 生成“工具调用意图”(结构化输出)-> 工具执行器(解析意图) -> 调用真实工具 -> 将结果返回给Agent
  • 在这个模型下,Agent的核心职责只有一个:根据对话上下文,决定下一步的“意图”是什么,并用一种结构化的语言将这个意图清晰地描述出来。它完全不需要关心这个意图如何被实现。

这种将“决策”和“执行”分离的架构,是软件工程中经典的关注点分离(Separation of Concerns) 原则的完美体现。

2. 为什么这个原则如此重要?—— 简化架构,提升可维护性

1. 职责清晰、降低耦合、独立进化:

  • Agent(大脑)的职责:

    理解自然语言、进行逻辑推理、规划任务步骤、生成结构化指令(包括工具调用意图和最终用户回复)。

  • 工具执行器(四肢)的职责:

    提供一个统一的接口,接收结构化指令,安全、可靠地调用对应的工具,并将结果标准化后返回给大脑。

  • 这两个组件通过一个定义良好的结构化接口(如JSON Schema) 进行通信。只要接口不变,它们就可以独立进化。你可以彻底重写工具执行器的代码,而Agent的代码一行都不用改。

2. 极大提升可维护性和可扩展性:

  • 修改工具:

    当某个工具的API发生变化时(例如,参数名从time_range改为range),你只需要在工具执行器中修改这一处映射逻辑即可。Agent发出的指令仍然不变{"tool": "sales_query", "parameters": {"time_range": "last_month"}},执行器负责将其转换为新API要求的格式。这极大地降低了维护成本。

  • 添加新工具:

    要增加一个新工具(例如,一个“发送短信”的工具),你只需要做两步:

  1. 在给Agent的“工具手册”中描述这个新工具的功能和参数。
  2. 工具执行器中注册这个新工具的实现(即,写一段调用短信API的代码)。Agent本身无需任何修改,它通过学习“工具手册”自然就获得了调用新工具的能力。
  • 安全性和控制:

    工具执行器可以作为一个安全代理。它可以在这里实现权限检查、参数校验、输入净化、速率限制、审计日志等。所有对外的调用都经过这一个统一关卡,使得整个系统的安全性变得可控和可观测。

3. 一个生动的比喻

可以把这想象成一家高级餐厅:

  • Agent是“厨师长”:

    他品尝食物、构思菜谱、决定下一道菜应该是什么(“一份五分熟的肋眼牛排,搭配黑胡椒酱”)。他输出的是一个结构化的“菜谱”(意图)。

  • 工具执行器是“厨房团队”:

    他们接收厨师长的菜谱。切肉员负责切肉,烧烤员负责掌握火候,酱汁师负责调酱。厨师长不需要知道烤炉怎么点火、酱汁的精确配方,他只需要信任团队能执行他的意图。

  • 结构化输出是“菜谱”:

    菜谱就是JSON。如果烧烤炉换了一个新品牌(工具API变了),只需要烧烤员自己去学习新设备的用法,厨师长的工作流程完全不受影响。

4. 如何落地实践这个原则?

1)定义统一的结构化输出JSON格式:

这是落地的基石。你需要为LLM的“工具调用意图”定义一个严格的、机器可读的输出格式。最普遍使用的是JSON Schema。

LLM输出示例格式:

// Agent的输出必须是这种格式
{
"action": "call_tool", // 动作类型:调用工具
"tool_name": "sales_data_query", // 工具名称
"parameters": { // 工具参数,非固定
"time_range": "last_month",//日期
"metric": "revenue",//指标
"category": "electronics"//类别
}
}

2) 建一个强大的工具分发执行器(Tool Executor):

这是一个独立的模块/服务,其核心是一个路由分发器。它通常包含一个“工具注册表”,其工作流如下:

  1. 接收:

    从Agent接收上述格式的JSON指令。

  2. 验证:

    检查工具tool_name是否存在,参数parameters是否符合预期格式。

  3. 路由:

    根据tool_name查找注册表中对应的工具函数。

  4. 执行:

    parameters为入参,调用该工具函数。

  5. 返回:

    捕获工具执行的结果或错误,并将其封装成一个标准格式返回给Agent。

3)在系统提示词中明确规范:

在你的Agent系统提示词中,必须清晰地规定其输出格式,并通过少样本示例来教导LLM始终生成符合要求的JSON。

总结

工具只是结构化输出,不仅仅是一个技术实现细节,更是一种高层次的架构哲学。它通过将智能体的“思考”与“行动”分离,带来了:

  • 清晰的架构:

    大脑和四肢各司其职,通过定义良好的接口通信。

  • 极致的可维护性:

    对工具链的修改被隔离在单一模块中,变更成本最小化。

  • 强大的可扩展性:

    添加新工具变得快速而安全。

  • 增强的安全性与可控性:

    所有对外部系统的访问都通过一个集中化的关卡进行管理。

遵循这一原则,是构建能够适应快速变化、易于团队协作的生产级Agent系统的核心保障。它确保了你的Agent基础设施是坚固而灵活的,能够支撑业务的长期发展。


原则三:通过工具调用来联系人类,Agent中的“人机协同”

这个原则是12-Factor Agents中最具创新性和颠覆性的理念之一,它从根本上重新定义了人机协作;

1. 核心范式转变:从“被动响应”到“主动求助”

在传统的人机交互中,模式是“人类驱动,AI响应”:

  • 人类提出问题或指令 -> AI尝试回答或执行 -> 人类等待并评估结果 -> 可能需要再次发出指令。
  • 在这种模式下,人类是对话的“司机”,必须全程保持注意力。如果AI遇到无法解决的问题或需要授权,它只能被动地等待人类发现并主动介入。

原则9彻底颠覆了这一模式,将其转变为“AI驱动,人类响应”:

  • AI自主执行任务 -> 遇到瓶颈或需要授权 -> AI主动调用****“人类工具” -> 人类在外部系统(如Slack、邮件)上收到通知并做出反馈 -> AI接收反馈并继续执行。
  • 在这种模式下,AI是任务的“司机”,而人类则扮演着“导航员”或“交管局”的角色,只在关键节点被AI邀请介入。人类从“全程紧盯屏幕的监工”解放为“按需处理的审批者”。

2. 为什么这个原则如此重要?—— 解决生产环境的核心痛点

1. 实现真正的自主性与安全性平衡:

这是最核心的价值。许多有价值的企业任务(如数据库操作、财务审批、内容发布)因为存在风险而无法完全自动化。Agent构建中要么完全不做自动化,要么让人类低效地全程监督。

  • 原则9的解决方案:

    Agent被授权完全自主地处理安全范围内的步骤,只有在触及预设的“安全边界”时(如执行DELETE语句、支付超过一定金额),才会强制性地将人类拉入循环(Human-in-the-Loop)进行审批。这实现了“机器能做的全交给机器,机器不能做的及时找人类”的理想状态。

2. 极大提升效率与用户体验:

  • 对人类而言:

    无需时刻监控Agent的聊天窗口。所有需要干预的请求会通过他们日常使用的协作工具(如企业微信、钉钉、Jira)主动推送过来,他们可以在方便的时候批量处理,将干扰降到最低

  • 对Agent而言:

    它不会被“卡死”在等待中。发出求助信号后,它可以异步等待(甚至在此期间先处理其他任务),一旦收到人类反馈,就能立即从中断的地方恢复(得益于原则5的全局状态),继续推进任务。

3. 职责清晰,流程可审计:

每一次人机交互都被建模为一次结构化的“工具调用”。这意味着:

  • 每次求助都有完整的日志记录:何时、因何事、向谁发起了请求。
  • 人类的反馈(批准/拒绝/修改意见)也是一个结构化的数据,会被记录在任务的全局状态中。
  • 这形成了一个完整、可追溯的审计链条,对于合规性要求高的行业(如金融、医疗)至关重要。

3. 如何落地实践这个原则?

落地此原则需要设计和集成两类专门的“人类工具”。

1. 设计“通知/请求”类工具:

这类工具负责主动向外发出信号,联系人类。其功能类似于一个通用的通知网关。

  • 示例工具定义:
  • 工具名称:send_human_approval_request

  • 功能描述:

    向指定的审批人发送一条审批请求,并等待其批复。

  • 参数:

  • approver_id

    (string, required): 审批人的系统ID或邮箱。

  • request_title

    (string, required): 请求标题,如“生产数据库修改申请”。

  • request_content

    (string, required): 请求详情,如“即将执行SQL: UPDATE users SET status=‘active’ WHERE …”。

  • actions

    (list, required): 可供审批人选择的操作,如 ["approve", "reject", "modify"]

  • 集成实现:

    在这个工具的底层实现中,需要集成企业的内部通信系统:

  • 调用Slack API发送一条消息到审批人的频道,消息中带有点击按钮。
  • 调用企业微信/钉钉的API发送一条工作通知。
  • 发送一封邮件,邮件中包含审核链接。

2. 设计“反馈收集”类工具:

这类工具负责接收并处理人类的反馈,将其转化为Agent可以理解的结构化数据。

  • 实现机制:
  1. 当审批人在Slack客户端消息上点击“Approve”按钮时,这会触发一个预先配置的回调URL(例如,https://youragent.com/api/human-feedback)。
  2. 这个API端点接收到回调请求,解析出其中的task_id(必须在发送通知时嵌入在回调URL里)和反馈(如 {"action": "approve"})。
  3. 该端点然后找到对应task_id全局状态,将人类的反馈结果(如 "human_approval": "granted")写入到business_state中。
  4. 最后,它可以根据需要唤醒或通知该Agent任务继续执行。

总结:

原则3是关于“协作”的原则。它不再将人类视为系统外的监督者,而是将其作为整个自动化流程中一个可编程、可集成、按需调用的“特殊服务”。这种架构使得构建既高度自动化又绝对安全可靠的第三代自主智能体成为了可能,是Agent技术真正赋能关键业务的核心突破。


原则四:提示词可调试、可迭代、可回滚、面向场景设计、A/B测试

这个原则触及了大模型应用开发中最核心、最易被忽视的一个方面——提示词(Prompt)的所有权和透明度。它倡导的是一种工程上的最佳实践,是生产级应用和业余原型之间的一个重要分水岭。

1. 核心问题:框架的“黑盒”陷阱

许多早期的大模型应用框架(如早期版本的LangChain)为了追求开发的“便捷性”和“开箱即用”,会将复杂的提示词模板深度封装在框架内部。开发者可能只需要写这样一行代码:

agent.run("帮我查一下上个月的销售额")

框架在背后默默地构建了一个非常长的、开发者不可见的提示词,可能包含了系统指令、少量示例(Few-shot)、工具描述、历史对话等,然后才发给大模型。

这带来了一个严重的问题:你失去了对应用“灵魂”的控制权。

2. 为什么“拥有提示词”至关重要?

a) 可调试性

这是最直接、最迫切的原因。当你的Agent行为异常时——比如调用了错误的工具、返回了无关的结果——你需要像侦探一样排查问题。

  • 拥有提示词:

    你可以像检查日志一样,精确地看到发给LLM的完整提示词。你可能会发现:“啊,原来是工具描述的部分有歧义”,或者“系统指令里忘了强调最重要的安全规则”。调试过程变得清晰、直接。

  • 失去提示词:

    你的调试变成了猜谜游戏。你只能看到输入和错误的输出,但对中间最重要的过程一无所知。你无法确定是LLM的问题,还是框架构建的提示词有问题。

b) 可定制性与优化

不同的业务场景对Agent的语气、风格、专业度和行为规范有截然不同的要求。

  • 客服Agent:

    需要 empathetic(有同理心)、patient(耐心)、提供准确信息。

  • 数据分析Agent:

    需要 precise(精确)、concise(简洁)、避免冗余信息。

  • 内部运维Agent:

    需要 highly secure(高度安全)、auditable(可审计)、有严格的权限控制。

如果提示词被框架锁死,你根本无法进行这种颗粒度的定制。“拥有提示词”意味着你可以为你的业务量身定制Agent的“人格”和“行为准则”,从而最大化其效果。

c) 版本控制与可重现性

在生产环境中,任何更改都必须是可控、可追溯、可回滚的。

  • 拥有提示词:

    你可以将提示词文件(如.txt.yaml)纳入Git等版本控制系统。每次对提示词的修改都会产生一个提交记录。如果新版的提示词导致准确率下降,你可以轻松地git revert回上一个稳定版本。你可以清晰地回答:“我们的Agent在10月版本的表现是这样的,因为在提示词中我们加强了XX规则。”

  • 失去提示词:

    你无法进行有效的版本管理。你甚至可能不知道框架的版本升级是否偷偷修改了内部的提示词模板,从而导致线上行为发生不可预知的变化。系统的行为不可重现,这是生产环境的大忌。

d) 性能与成本优化

提示词的长度直接关联着API调用成本和延迟。一个冗长、低效的提示词会让你的应用又慢又贵。

  • 拥有提示词:

    你可以主动地分析和优化提示词。例如,删除冗余的指令、精简示例、重构逻辑,在保证效果的同时尽可能缩短Token数量。

  • 失去提示词:

    你无法进行优化,只能被动接受框架带来的性能和成本开销。

3. 如何落地实践这个原则?

将提示词视为 “一等公民” ,像管理代码一样管理它。

1. 外部化存储:

  • 不要

    将提示词硬编码在代码逻辑中。

  • 应该

    将提示词存储在独立的配置文件或模板文件中。例如:

  • prompts/system_instruction.txt

  • prompts/customer_service_initial_prompt.j2

    (使用Jinja2模板)

  • config/agent_prompts.yaml

    (使用YAML结构化管理多个提示词片段)

2. 版本控制:

  • 将这些提示词文件纳入数据库进行管理。
  • 每次修改都需提交有意义的Commit Message,例如:feat(prompt): 在系统指令中增加禁止提供医疗建议的规则

3. 模块化设计:

  • 将复杂的提示词拆解成多个可复用的模块。例如:
  • 系统角色指令
  • 工具描述列表
  • 少样本示例
  • 输出格式要求
  • 在运行时,通过代码或模板引擎将这些模块组合成完整的提示词。这极大地提升了可维护性。

4. A/B测试与持续迭代:

  • 利用版本控制,你可以轻松地创建提示词的不同分支(版本)。

  • 通过A/B测试平台,让一部分用户使用Version A提示词,另一部分使用Version B提示词。

  • 量化评估

    关键指标(如工具调用准确率、任务完成率、用户满意度),用数据驱动你选择效果最好的提示词版本,然后将其推送给全部用户。这是一个持续的优化循环。

总结

拥有你的提示词,本质上是一种工程哲学的倡导。它强调:

  • 透明度 over 黑盒:

    拒绝“魔法”,要求对系统核心组件有完全的可视性和控制权。

  • 可维护性 over 便捷性:

    牺牲一点初期的开发便利,换取长期的调试、优化和迭代能力。

  • 工程化 over 脚本化:

    将提示词开发从一次性的“脚本编写”提升为可版本化、可测试、可部署的“软件工程”实践。

这个原则是构建可靠、可信、可进化的生产级Agent系统的坚实基础。它确保了你的智能体的“大脑”是由你精心设计和培育的,而不是一个你无法理解和控制的未知黑盒。


原则五:建设上下文评估与仲裁,突破上下文有限束缚

这个原则解决的是生产级Agent面临的一个非常实际且关键的挑战:如何在高性价比和高性能的前提下,突破大模型有限上下文窗口的束缚。

1. 核心问题:上下文窗口的“稀缺性”与“价值不均等”

大语言模型(LLM)的上下文窗口(Context Window)就像一块昂贵且有限的黑板。所有需要模型知晓的信息——系统指令、工具描述、对话历史、上一个工具执行结果、用户当前问题——都必须写在这块黑板上,模型才能基于这些信息进行推理。

这块黑板有两个核心特点:

  1. 有限性:

    它有固定的最大Token数量。当内容超出时,最旧的信息会被丢弃。

  2. 价值不均等:

    黑板上的每一条信息其重要性是不同的。有些信息是核心决策依据,有些则是冗余或次要的。

许多框架为了省事,会采用一种简单但危险的管理原则:FIFO(先进先出)。当黑板写满时,就像队列一样,直接删除最旧的对话轮次。

原则4的核心就是反对这种“一刀切”的懒惰原则,强调开发者必须根据业务逻辑,智能地、有选择地管理这块珍贵的黑板空间。

2. 为什么必须“拥有”上下文管理权?

采用FIFO等简单原则的致命缺陷在于:它可能会丢弃掉对话中最有价值的信息,而保留相对无用的信息。

让我们通过一个对比案例来感受一下:

场景: 一个用户与客服Agent进行了长达50轮的复杂对话,涉及产品咨询、故障排查、申请折扣等多项事宜。最终,用户的核心诉求是:“好的,就按刚才说的折扣,帮我下单吧。”

原则A:框架默认的FIFO原则

  • 由于对话很长,最早的对话(可能包含用户最初提出的产品型号遇到的核心故障描述)已经被挤出上下文窗口。

  • 此时,Agent的“黑板”上只剩下最近的一些闲聊和最后这句“帮我下单”。

  • 结果:

    Agent已经忘记了用户要买的是什么产品、约定的折扣条款是什么。它无法完成下单任务,要么会出错,要么会要求用户重复之前已经提供过的信息,导致体验极其糟糕。

原则B:自主管理的智能原则(遵循原则3)

  • 开发者预先定义规则:“用户明确表达的核心诉求(如‘我要买XXX’、‘我需要退款’)和关键业务参数(如产品型号、订单号、折扣金额)必须永久保留在上下文中,或拥有最高优先级,绝不删除。”

  • 同时,规则可以定义为:“重复的问候语、无关的闲聊、已解决的技术问题细节,在空间不足时优先被删除。”

  • 结果:

    即使对话进行了50轮,关键信息“产品型号=ABC123”和“折扣=8折”始终被保留在黑板上。Agent能准确无误地执行最终的下单指令,用户体验流畅。

3. 如何落地实践这个原则?

落地此原则需要开发者设计一套信息重要性评估与仲裁系统。以下是关键步骤和原则:

1. 定义信息的重要性等级(评分标准)

这是最核心的一步。你需要为对话中可能出现的所有类型的信息定义一个重要性权重。例如:

  • ★★★★★ 必须保留(极高重要性):
  • 用户的核心意图和最终诉求(如“下单”、“退款”、“升级套餐”)。
  • 关键的业务参数和实体(如订单ID、产品SKU、客户编号、金额)。
  • 系统指令和工具定义(这是Agent的“操作系统”,通常需长期保留)。
  • 当前步骤所需的工具调用结果
  • ★★★☆☆ 酌情保留(中等重要性):
  • 正在进行中的复杂问题的最新进展
  • 为了理解当前问题所必需的近期对话历史(最近几轮)。
  • ★☆☆☆☆ 可优先丢弃(低重要性):
  • 寒暄、问候、感谢等社交性用语(如“你好”、“谢谢”、“早上好”)。
  • 重复性的提问或确认。
  • 已被完全解决的旧问题的详细细节。
  • 冗长的、与当前任务无关的上下文信息。

2. 实施上下文管理原则

有了重要性标准后,你可以实现多种高级管理原则,远超简单的FIFO

  • 优先保留法:

    当接近上下文长度限制时,主动扫描整个对话历史,删除权重最低的片段,而不是最旧的片段。

  • 摘要提炼法:

    这是更高级的原则。对于一大段中等重要性的对话历史(例如10轮故障排查过程),可以调用LLM本身生成一个简短的摘要(例如:“用户经历了X、Y、Z步骤,最终发现是网络问题”),然后用这个摘要替换掉冗长的原始对话,极大地节省空间的同时保留了核心信息。

  • 外部记忆体:

    将完整的、冗长的对话历史存储到外部数据库(如向量数据库)中。上下文窗口中只保留一个用于检索的“指针”或最相关的几个片段。当需要回忆某些信息时,通过查询“记忆库”来动态地将相关片段重新注入上下文。这相当于将“黑板”无限扩展了。

3. 技术实现

  • 在你的Agent架构中,需要有一个“上下文管理器”模块。
  • 该模块在每次与LLM交互前/后都会运行,负责评估当前上下文的长度和价值,并执行上述的保留、删除、摘要或外部存储等操作。
  • 这个模块的逻辑完全由你根据业务需求定制,这就是“拥有”的真谛。

总结

拥有你的上下文窗口,其本质是:

  1. 一种资源优化意识:

    认识到上下文窗口是LLM交互中最宝贵且有限的资源,必须像管理内存或CPU一样精心管理它。

  2. 一种业务逻辑的体现:

    上下文管理原则不是通用的技术方案,而是高度依赖于业务场景的。客服Agent、数据分析Agent和创意写作Agent的原则必定不同。

  3. 一种追求极致体验的承诺:

    通过智能的上下文管理,确保Agent在任何时候都“记得”最重要的事情,从而为用户提供连贯、可靠、智能的交互体验,避免出现“金鱼记忆”般的尴尬和错误。

这个原则将Agent的对话能力从简单的“多轮对话”提升到了真正的“长程记忆和上下文感知”的级别,是构建复杂、可靠Agent系统的关键技术支柱之一


原则六:将错误压缩到上下文窗口,让Agent从错误中学习并尝试自我纠正

这个原则直面生产系统中一个不可避免的现实——错误总会发生——并提供了一个极其聪明和实用的处理原则。

1. 核心问题:错误处理的“上下文困境”

当Agent在执行过程中出错时(如工具调用失败、API返回异常),传统的处理方式可能是直接向用户抛出一个晦涩的技术错误,或者让整个任务失败。但这对于自主Agent来说是致命的。

一个智能的Agent应该能像人类一样:从错误中学习,并尝试自我纠正。实现这一点的最自然方式就是将错误信息反馈给Agent的“大脑”(LLM),让它决定下一步该怎么办。

这就引出了一个核心矛盾:

  • 需求:

    需要将错误信息提供给LLM作为决策参考。

  • 限制:

    LLM的上下文窗口(Context Window)是有限且昂贵的。原始的错误信息(尤其是完整的异常堆栈跟踪)可能非常冗长,会挤占掉大量原本用于任务指令、工具描述和历史对话的空间。

原则5的核心就是解决这个矛盾。

2. 为什么需要“压缩”错误?—— 效率与效果的平衡

未经处理的原始错误信息是低效有害的:

  1. 浪费宝贵的上下文窗口:

    一个典型的Java或Python异常堆栈跟踪(Stack Trace)可以轻松占用几百甚至上千个Token。这些Token本应用来存储更重要的任务上下文和工具定义。连续几次错误就可能导致关键历史信息被挤出窗口,使Agent“失忆”。

  2. 干扰模型判断:

    LLM虽然强大,但容易被无关细节干扰。堆栈跟踪中包含的大量技术细节(如内存地址、线程ID、内部的类和方法名)对于LLM解决问题通常是毫无帮助的噪音,反而可能使其困惑,导致它生成更不准确的响应。

因此,“压缩”错误不是为了隐藏错误,而是为了提炼错误的精髓,以最高效的方式让LLM理解问题所在并找到解决方案。

3. 如何落地实践这个原则?—— 设计错误压缩器

落地此原则需要开发一个专门的错误处理中间件错误压缩器(Error Compactor),可以自研或者基于LLM进行提炼。这个组件的作用是在错误信息被加入到LLM的上下文之前,对其进行预处理和提炼。

错误压缩器的处理逻辑:

假设一个工具调用返回了以下原始错误:

java.sql.SQLSyntaxErrorException: Incorrect datetime value: 'last_month' for column 'sale_date' at row 1
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:1003)
at org.apache.commons.dbcp2.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:83)
at org.apache.commons.dbcp2.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:83)
at com.example.SalesDataTool.execute(SalesDataTool.java:45)
... (20 more lines)

错误压缩器会解析这个异常,提取出关键信息,并生成一个对LLM友好的、紧凑的版本:

1. 提取错误类型(error_type):

  • 目的:

    让LLM快速对错误进行高级分类。

  • 提取:SQLSyntaxErrorException

  • 压缩后:[错误类型: 数据库语法错误]

2. 提取核心错误消息(error_message):

  • 目的:

    这是理解错误根本原因的最重要部分。

  • 提取:Incorrect datetime value: 'last_month' for column 'sale_date' at row 1

  • 压缩后:[错误原因: 提供的日期时间值 'last_month' 对于字段 'sale_date' 格式不正确]

3. 提取相关参数/上下文(relevant_context):

  • 目的:

    帮助LLM定位是哪个输入出了问题。

  • 提取:

    触发此次工具调用的参数。

  • 压缩后:[相关参数: time_range="last_month"]

4. (可选)提供修复建议或提示(suggestion):

  • 目的:

    直接引导LLM走向正确的解决方案。

  • 提取:

    根据错误类型和原因动态生成。

  • 压缩后:[修复提示: 请提供符合YYYY-MM-DD格式的具体日期范围,例如"2023-09-01"至"2023-09-30"]

最终压缩后的错误信息可能如下:

{
"error_summary": "工具 'sales_data_query' 调用失败。",
"details": {
"type": "SQLSyntaxErrorException",
"message": "日期时间值 'last_month' 格式不正确,无法用于数据库查询。",
"offending_parameter": "time_range",
"suggestion": "请将参数 'time_range' 的值转换为具体的日期范围格式,如 '2023-10-01:2023-10-27'。"
}
}

这个压缩版本只有不到100个Token,但信息量远超几百个Token的堆栈跟踪,并且对LLM极其友好。

4. 工作流整合

这个压缩后的错误信息会被加入到Agent的私有知识库中,并随着下一次请求成为LLM上下文的一部分。

LLM看到这个信息后,其推理过程可能是:

  1. “啊,我之前调用销售数据工具失败了。”

  2. “原因是参数time_range的格式不对,数据库不认识'last_month'这样的自然语言。”

  3. “错误提示建议我使用'2023-10-01:2023-10-27'这样的格式。”

  4. “我需要重新生成工具调用,但这次要把用户说的'上个月'转换成具体的日期格式。”

  5. (行动)

    调用一个日期计算工具或直接输出正确的日期格式,然后重新调用销售数据查询工具。

总结:

原则6是关于“韧性”的原则。 它承认错误是不可避免的,但通过智能地处理错误信息,它将错误从一种致命的故障转变为一个可学习的瞬间,使Agent能够自我修复和适应,从而极大地提升了其在复杂多变的生产环境中的可靠性和实用性。


原则七:统一执行状态和业务状态,为Agent赋予了“自主恢复”的能力

这是一个非常关键且深刻的原则,它直接关系到智能体(Agent)在生产环境中的可靠性可维护性

1. 核心概念定义:什么是“执行状态”与“业务状态”?

要理解这个原则,首先必须清晰界定这两个概念:

  • 执行状态:

    指的是Agent自身工作流程的进展和状况。它描述了Agent“正在做什么”、“做到哪一步了”、“下一步该做什么”。例如:

  • 正在调用“获取天气”工具
  • 等待用户确认订单
  • 推理中,正在分析用户意图
  • 当前步骤失败,需要重试或报错
  • 业务状态:

    指的是Agent在执行任务过程中所处理的具体业务数据和上下文。它描述了“任务的对象是什么”、“产生了什么结果”。例如:

  • 用户查询中的参数:时间范围=上个月产品名称=智能手机查询数据=销售额
  • 工具调用的结果:销售额=100万元天气=晴,25摄氏度
  • 数据库查询的原始结果集

在传统的、初级的Agent设计中,这两种状态通常是分离管理的。

2. 传统做法的痛点与问题:为何要“统一”?

正如原则背景中所指出的,传统做法是:

  • 执行状态

    保存在Agent的进程内存中。

  • 业务状态

    则被持久化到外部数据库或存储中。

这种分离会带来一个致命的“状态不一致”问题。让我们通过一个例子来感受一下

场景: 一个电商客服Agent需要为用户办理退货。

  1. 步骤1:

    Agent在内存中记录执行状态:正在调用“创建退货工单”工具

  2. 步骤2:

    Agent调用外部API,成功在业务系统中创建了一条工单(业务状态更新:数据库中新増了一条工单记录,状态为“审核中”)。

  3. 步骤3:

    Agent准备执行下一步,比如调用“发送确认邮件”工具。但就在此时,Agent进程意外崩溃了(可能由于资源限制、代码bug、部署平台问题等)。

问题显现:

  • Agent进程重启后,其内存中的执行状态全部丢失。它不知道自己已经成功创建了工单,甚至不知道自己已经执行到了第几步。
  • 它很可能会从头开始整个流程,导致重复创建退货工单
  • 或者,它可能因为丢失了上下文(如工单号),而无法继续后续操作,导致任务“卡死”。

这就是典型的 “执行状态”与“业务状态”不同步 导致的严重后果:数据重复、业务逻辑错误、用户体验受损。在生产环境中,这是绝对不可接受的。

3. 解决方案:统一的“全局状态”

第6条原则提出的解决方案非常直接且有效:将执行状态和业务状态视为一个整体,进行统一的管理和持久化

这个整体被称为 “全局状态”

在这个统一的全局状态中,一个任务的所有信息都被整合在一起:

{
"task_id": "a1b2c3d4", // 唯一任务ID,用于任务执行失败之后的,再次检索和恢复
"execution_state": {
"current_step": "awaiting_tool_response",
"previous_step": "invoked_sales_query_tool",
"status": "in_progress",
"next_action": "process_query_results"
},
"business_state": {
"tool_call_parameters": {
"time_range": "last_month",
"product_category": "electronics"
},
"tool_call_results": {
"total_sales": 1000000,
"units_sold": 500
},
"user_context": {
"user_id": "user_789",
"current_order_id": "ORDER-12345"
}
},
"timestamp": "2023-10-27T10:00:00Z"
}
JSON 结构详细解读
1. task_id: "a1b2c3d4"
含义: 整个全局状态的唯一标识符。
为什么重要? 这是检索和恢复任务的关键。每次用户发起一个新的对话或任务,系统都会生成一个唯一的task_id。这个ID会贯穿整个任务生命周期,并通常作为数据库或缓存(如Redis)中的主键。当Agent需要恢复状态时,就是通过这个ID去存储中查找对应的全局状态。
2. execution_state: { ... }
含义: 描述Agent自身工作流程的进展和状况。它回答的是“我(Agent)正在做什么?”的问题。
内部字段解析:
current_step: "awaiting_tool_response"
含义: 当前所处的具体步骤。这是一个非常精确的状态描述。
为什么重要? 它明确告诉系统:“我已经发出了一个工具调用请求,现在正在等待该工具的返回结果”。重启后,Agent就知道不该重复调用工具,而是应该去检查有没有结果。
previous_step: "invoked_sales_query_tool"
含义: 上一步执行了什么动作。
为什么重要? 提供了状态的上下文和回溯路径,对于调试和逻辑链完整性非常有用。
status: "in_progress"
含义: 任务的总体状态(如:not_started, in_progress, waiting_for_human_input, completed, failed)。
为什么重要? 让系统或监控工具能一眼看清任务的宏观健康状态。
next_action: "process_query_results"
含义: 计划下一步要执行的动作。
为什么重要? 这是Agent“思考”的体现。它意味着:“一旦我拿到工具的结果,我接下来就打算处理这些查询结果”。这指导了恢复后的行为。
3. business_state: { ... }
含义: 包含任务所处理的具体业务数据和上下文。它回答的是“这个任务是关于什么的,产生了什么样的结果?”的问题。
内部字段解析:
tool_call_parameters: { time_range: "last_month", ... }
含义: 上次发出的工具调用的参数。
为什么重要? 这是可重现性的关键。如果工具调用失败或超时,Agent可以使用完全相同的参数进行重试。它也记录了“为什么会得到这样的结果”。
tool_call_results: { total_sales: 1000000, ... }
含义: 上一次工具调用成功返回的结果。
为什么重要? 这是任务的“成果”或“中间产物”。恢复后,Agent无需重新调用工具就能直接使用这个结果进行下一步操作(如生成报表),节省了成本和时间,并避免了因重复调用可能带来的副作用(如重复下单)。
user_context: { user_id: "user_789", ... }
含义: 与当前任务相关的用户信息。
为什么重要? 保证了任务的上下文相关性。无论对话如何中断恢复,Agent都始终“记得”正在为谁服务、在处理哪个订单,提供了连贯的用户体验。
4. timestamp: "2023-10-27T10:00:00Z"
含义: 该状态最后一次被更新的时间戳(通常采用ISO 8601格式和UTC时区)。
为什么重要?
调试与审计: 可以精确追踪任务的生命周期和状态变化的时间线。
状态清理: 系统可以设置一个原则,自动清理超过一定时限的陈旧状态对象,释放存储空间。

4. 统一状态带来的巨大优势

  1. 强大的容错与恢复能力:

    这是最核心的好处。当Agent因任何原因崩溃或重启后,它可以通过唯一的task_id从状态存储中拉取最新的全局状态。它能立刻知道自己:“之前已经成功调用了销售查询工具,拿到了100万的销售额结果,现在正等待处理这些结果”。于是它可以无缝地从中断的地方继续执行,而不是重新开始或发生错误。

  2. 提升可观测性与可调试性:

    对于开发者或运维人员来说,这个统一的全局状态是一个完美的“快照”。当出现问题时,只需检查这个状态对象,就能对Agent当时所处的精确位置、它拥有什么数据、它正准备做什么一目了然,极大简化了调试和日志追踪的复杂度。

  3. 支持更复杂的异步和长时间运行任务:

    许多Agent任务可能耗时很长(例如,等待人工审核可能需要几小时)。统一的全局状态使得Agent可以被安全地终止和重新调度,在需要唤醒时能精确恢复上下文,这对于资源管理和扩展至关重要。

5. 如何落地实践这个原则?

  1. **使用外部状态存储服务:**绝不能

    将全局状态只放在Agent进程内存中。必须使用一个外部的、持久化的、高性能的存储服务。推荐的选择包括:

  • Redis:

    极其适合这种场景,因为它提供低延迟的内存存储,同时支持数据持久化到磁盘,是存储临时状态的理想选择。

  • 文档数据库(如 MongoDB, Firestore):它们的文档模型(如JSON)与全局状态的对象结构天然契合,易于读写和查询。

  • 关系数据库(如 PostgreSQL, MySQL):虽然可能需要设计表结构,但利用其JSON字段类型也能很好地支持。

  1. **为每个任务分配唯一ID:**每个Agent任务在创建时都必须有一个全局唯一的标识符(task_idsession_id)。这个ID是检索和更新其全局状态的唯一钥匙。

  2. 设计清晰的状态结构:

    预先设计好全局状态的Schema,明确哪些属于执行状态,哪些属于业务状态,并保持结构的一致性。

  3. 在关键节点持久化状态:

    在Agent的工作流中,在以下节点及时更新保存全局状态:

  • 任务开始时
  • 调用工具前后
  • 收到用户或外部系统输入后
  • 任务完成或失败时

总结

统一执行状态和业务状态,本质上是一个将软件工程中经典的“状态管理”和“持久化”最佳实践应用于Agent领域的典范。

它直面了原型Agent与生产级Agent的关键差距之一——可靠性。通过强制要求将易失的执行状态与持久的业务状态统一管理,它为Agent赋予了“断点续传”的能力,使其能够优雅地处理失败和重启,从而满足企业级应用对稳定性和数据一致性的高要求。这是构建真正可用、可信的自主Agent(第三代Agent)的基石之一。


原则八:使用简单的API来完成启动、暂停和恢复,实现“任务全生命周期”管理

这个原则关注的是生产环境中Agent任务的生命周期管理可运维性,是确保系统稳定、可控的关键。

1. 核心问题:生产环境中的长周期任务管理

在原型阶段,Agent任务往往是短平快的交互(如问答、简单查询)。但在生产环境中,Agent需要处理长时间运行的复杂任务,例如:

  • “分析全年数据并生成财报”(耗时数小时)
  • “监控一个持续整天的线上活动并定期汇报”
  • “处理一个需要等待人工审核的贷款申请”(等待可能数天)

这类任务无法在一个HTTP请求/响应周期内完成。因此,我们必须能够以异步可管理的方式来处理它们。这意味着我们需要一套标准化的接口来启动一个任务,并在其生命周期的中间阶段暂停恢复它。

2. API设计拆解与落地实践

落地此原则的关键是设计一套行为可预测的API。这套API本质上是对外暴露的任务生命周期管理器

核心API端点示例:

  1. 启动任务 (POST /api/tasks)
  • 功能:

    创建一个新的Agent任务。

  • 请求体:{"user_input": "生成去年的销售年报", "user_id": "abc123"}

  • 响应:201 Created

    • {"task_id": "tsk_12345", "status": "started", ...}
  • 逻辑:生成唯一task_id,创建初始的全局状态,并开始异步执行任务。

  1. 暂停任务 (POST /api/tasks/{task_id}/pause)
  • 功能:

    请求暂停一个正在运行的任务。

  • 响应:

  • 成功:202 Accepted + {"status": "pausing"}
  • 失败(如任务已暂停):400 Bad Request + {"error": "Task is already paused."}
  • 逻辑:

    这是一个优雅暂停。系统不会立即杀死进程,而是等待任务执行到一个安全的检查点(例如,完成当前获取数据工具调用并保存好结果后)再正式暂停,并更新全局状态为paused

  1. 恢复任务 (POST /api/tasks/{task_id}/resume)
  • 功能:

    继续执行一个被暂停的任务。

  • 响应:

  • 成功:202 Accepted + {"status": "resuming"}
  • 失败(如任务已完成):400 Bad Request + {"error": "Cannot resume a completed task."}
  • 逻辑:系统从该任务的全局状态中读取中断时的完整上下文(执行到哪一步、有什么数据),并从中断的地方继续执行。这是原则5价值的直接体现。
  1. 取消任务 (POST /api/tasks/{task_id}/cancel)
  • 功能:

    终止一个任务,并清理资源。

  • 逻辑:

    与暂停类似,但状态最终变为cancelled,且通常不可恢复。

  1. 查询任务状态 (GET /api/tasks/{task_id})
  • 功能:

    获取任务的最新信息和当前状态。

  • 响应:200 OK

    • 完整的全局状态JSON(包含execution_state执行状态, business_state业务状态等)。
  • 重要性:这是实现可观测性的主要方式,供前端界面或运维系统显示进度。

总结:

原则8并非孤立存在,它极大地依赖于之前的原则,并与之共同构成一个强大的整体:依赖原则7(统一状态):暂停/恢复功能得以实现的基石。没有统一的全局状态来记录“断点”,恢复任务就无从谈起。API只是暴露操作的接口,而状态是操作的对象。

原则8是关于“控制”的原则。它通过一组简单的API,赋予了运维人员和自动化系统对Agent任务生命周期的完全控制能力,这是将Agent系统从实验室推向严苛生产环境的必备能力。它确保了系统不仅是智能的,更是稳健、可管理且易于集成的


原则九:有限状态机,拥有Agent的自主控制流

这个原则关乎Agent的“大脑皮层”——负责复杂决策和逻辑编排的高级认知功能。它主张将Agent的核心逻辑控制权从通用框架手中夺回,交给开发者自己。

1. 核心问题:框架预定义逻辑的局限性

许多Agent框架(如LangChain、AutoGen)为了降低入门门槛,提供了大量预构建的“链”(Chains)或“代理”(Agents),例如“顺序链”(SequentialChain)或“If/Else链”。

  • 这些预置链的本质:

    它们是框架作者对通用、简单任务流程的抽象。它们假设任务的执行路径是线性的或只有少量分支。

  • 企业级应用的现实:

    真实业务逻辑极其复杂,充满了嵌套条件、循环、异常处理、回退机制和异步等待。试图用预置的链来拼凑这些逻辑,就像试图用乐高积木搭建一座功能齐全的摩天大楼——要么无法实现,要么结构脆弱、难以理解和维护。

2. 为什么必须“拥有”控制流?—— 复杂性与可维护性的必然要求

1. 应对业务的独一无二的复杂性:

以原则中提到的Agent为例,其真正的控制流远不止“如果-那么”这么简单,它可能是一个复杂的状态机:

这种高度定制化、包含特定回退和人工干预路径的逻辑,几乎不可能通过预先配置顺序链来实现。必须用代码明确编写。

3. 如何落地实践这个原则?—— 状态机(State Machine)模式

原则建议采用状态机(或称有限状态机,Finite State Machine, FSM) 的思想来设计和实现控制流。这是管理复杂流程的经典软件工程模式。

状态机核心概念:

  • 当前状态:

    表示Agent在某一时刻所处的阶段或情况。例如:查询库存状态等待采购结果状态等待人工反馈状态任务完成状态

  • 转换到下一个状态的触发条件:

    定义如何从一个状态切换到另一个状态。转换通常由事件条件触发。例如:“库存查询完成”是一个事件,“库存量>0”是一个条件,两者共同触发从查询库存状态发货状态的转换。

  • 进入到下一个状态时的动作:

    在进入某个状态、退出某个状态或 during 转换时执行的操作。例如:进入查询库存状态时,动作是调用库存查询工具

落地步骤:

  1. 定义状态枚举:

    首先,用代码明确列出任务所有可能的状态。

class TaskState:
INITIALIZED = "initialized"
CHECKING_INVENTORY = "checking_inventory"
EXECUTING_SHIPMENT = "executing_shipment"
PROCURING_GOODS = "procuring_goods"
WAITING_FOR_HUMAN = "waiting_for_human" # 原则7的体现
COMPLETED = "completed"
FAILED = "failed"
  1. 实现状态处理器:

    为每个状态编写一个处理函数。这个函数负责执行该状态该做的动作(如调用什么工具),并返回下一个状态。

async def handle_checking_inventory_state(task_state_data):
# 1. 执行动作:调用工具
inventory_result = await call_tool("inventory_query", task_state_data['product_id'])
# 2. 将结果保存到全局状态(原则6)
task_state_data['business_state']['inventory'] = inventory_result
# 3. 根据结果决定下一个状态
if inventory_result['quantity'] > 0:
next_state = TaskState.EXECUTING_SHIPMENT
else:
next_state = TaskState.PROCURING_GOODS
# 4. 更新执行状态(原则6)
task_state_data['execution_state']['status'] = next_state
return next_state
  1. 构建状态循环:

    编写一个主循环,根据当前状态路由到对应的状态处理器,并持续运行,直到到达终态(完成或失败)。

current_state = TaskState.INITIALIZED
while current_state not in [TaskState.COMPLETED, TaskState.FAILED]:
if current_state == TaskState.CHECKING_INVENTORY:
current_state = await handle_checking_inventory_state(global_state)
elif current_state == TaskState.PROCURING_GOODS:
current_state = await handle_procuring_goods_state(global_state)
# ... 其他状态处理

总结:

总而言之,原则9是关于“自主权”和“清晰度”的原则。 它要求开发者用代码明确地定义智能体的决策逻辑,拒绝框架的“黑盒魔法”。通过采用状态机等成熟的软件模式,开发者可以构建出能够处理任何复杂业务逻辑、易于调试且经久耐用的生产级Agent系统。这是将Agent技术从“玩具”升级为“引擎”的关键一步。


原则十:多个小而专注的Agent,共同组成“智能组织”

这个原则是架构哲学的体现,它借鉴了软件工程中经久不衰的微服务单一职责思想,并将其应用在Agent系统设计中,是构建复杂、可扩展且易于维护的Agent生态系统的基石。

1. 核心范式转变:从“万能上帝”到“专家团队”

这个原则挑战了一个常见的初始想法:构建一个无所不能的超级Agent

  • “超级Agent”模式(Monolithic Agent):

    一个庞大的、试图处理所有业务(如销售、库存、客服、财务)的Agent。它拥有所有工具的定义,需要理解所有领域的指令,其内部逻辑和控制流会变得极其复杂和混乱。

  • “小而专注”模式(Focused Agents):

    一套由多个独立Agent组成的“专家团队”。每个Agent都是一个领域的专家,只专注于完成一项特定类型的任务。它们各司其职,通过良好定义的接口进行协作。

原则10的核心就是倡导从前者向后者的转变。

2. 为什么需要“小而专注”?—— 复杂度管理与组织效能

1. 降低复杂度,提升可维护性:
这是最直接的好处。复杂度是软件系统的头号敌人。

  • 超级Agent:

    任何业务逻辑的修改(例如,库存查询API变更)都需要在这个庞然大物中修改代码。牵一发而动全身,回归测试困难,理解和调试的认知负荷极高

  • 小Agent:

    如果“库存管理Agent”的API变了,你只需要修改这一个Agent的代码。它的代码库小巧、功能聚焦,开发者可以完全掌握其所有逻辑,修改和测试都快速、安全。这完美践行了软件工程的“分离关注点”原则。

2. 便于独立部署与扩展:

  • 超级Agent:

    一旦某个功能成为性能瓶颈(如促销季销售查询暴增),你只能整体扩展这个超级Agent,浪费资源。

  • 小Agent:

    你可以单独对“销售数据Agent”进行水平扩展(部署更多实例),而其他Agent维持原样。资源分配更精细,成本效益更高。

3. 赋能团队分工,提升开发效率:

  • 超级Agent:

    所有开发人员必须在一个代码库上协作,容易产生冲突,发布流程笨重。

  • 小Agent:

    不同的团队可以独立拥有和运维各自的Agent。销售数据分析团队可以独立开发、迭代和发布“销售数据Agent”,而客服团队负责“客服Agent”。团队并行工作,交付速度更快,职责更清晰。

3. 如何落地实践这个原则?

落地此原则的关键在于如何进行合理的领域驱动设计(Domain-Driven Design, DDD)接口设计

1. 任务域拆分(定义专家边界):

这是最核心的一步。你需要根据业务边界来划分Agent,而不是技术边界。

  • 好的拆分(基于业务能力):
  • SalesDataAgent
    职责——一切与销售数据分析、报表生成相关的任务和工具。
  • InventoryAgent
    职责——一切与库存查询、采购触发、库存预警相关的任务和工具。
  • CustomerSupportAgent
    职责——处理客户查询、退货申请、工单创建和工具。
  • 坏的拆分(基于技术):
  • ToolCallingAgent
    职责——调用所有工具。(这违反了“专注”)
  • SQLAgent
    职责——执行所有SQL。(这同样没有业务意义)

2. 设计明确的契约(通讯接口):

Agent之间如果需要协作,必须通过结构化的数据进行交互,而不是共享内存或内部状态。

  • 例如:SalesDataAgent

    生成了一份销售报表。InventoryAgent 需要根据这份报表预测库存需求。

  • 错误方式:

    两个Agent共享一个巨大的、内部的数据结构。

  • 正确方式:SalesDataAgent

    将报表生成一个标准格式的文件(如JSON、Parquet)并存储在一个共享存储中,或者通过一个消息队列发送一个事件,事件体中包含该文件的地址。InventoryAgent 监听这个消息或直接去读取该文件。它们彼此不知晓对方的存在和内部实现,只通过契约(文件格式、事件 schema)进行交互。

3. 编排(Orchestration)与协同:

多个小Agent如何组织起来完成一个端到端的用户请求?通常有两种模式:

  • 通过工作流引擎/编排层(适合可预测流程链路):

    用户请求先到达编排器,由编排器依次调用SalesDataAgent -> InventoryAgent,并传递中间结果。这是更可控的方式。

  • 通过前端路由(适合不可预测流程链路):

    构建一个“网关Agent”或路由层,首先分析用户意图(“我想看销售数据并检查库存”),然后将请求分别转发给后端的SalesDataAgentInventoryAgent,最后聚合结果。

总结

原则10:小而专注的Agent,本质上是一种架构设计原则。它告诉我们:

  • 设计方向:

    不要追求功能的“大而全”,而要追求架构的“高内聚、低耦合”。

  • 价值导向:

    通过拆分,我们获得了更低的复杂度、更高的韧性、更好的可扩展性和更快的团队交付速度

遵循这一原则,你构建的不是一个脆弱的“智能怪物”,而是一个健壮的“智能组织”。这个组织由众多专家组成,每个专家精益求精,并通过高效的协作网络共同完成复杂的宏观目标。这是将Agent技术应用于大规模、严肃生产环境的必由之路


原则十一:从任何地方触发Agent,构建“无处不在的智能生产力”

这个原则关注的是Agent系统的集成能力可嵌入性,它决定了Agent能否从一个“孤立的新玩具”转变为企业工作流中一个“无缝的、无处不在的智能生产力组件”。

1. 核心问题:打破交互孤岛

许多AI应用在初期都是一个独立的聊天界面或Web应用。用户必须主动访问这个特定界面才能与AI交互。这就在企业中创造了一个新的“交互孤岛”——AI能力无法融入到员工日常使用的工具和业务流程中,其价值和便利性大打折扣。

原则11的核心思想是:Agent的能力应该是一种可以被“调用”的服务,而不是一个必须被“访问”的目的地**。** 它应该像电力一样,无处不在,按需取用。

2. 为什么必须“从任何地方触发”?—— 融入工作流,释放价值

1. 符合用户习惯,降低使用门槛:

  • 销售人员生活在CRM(如Salesforce)里。
  • 管理者查看数据在BI报表里。
  • 强迫用户离开自己最熟悉、最高频的工具,去一个单独的AI界面,会产生巨大的摩擦和阻力
  • 而允许在这些工具内直接触发Agent,则实现了“工具找人,而不是人找工具”, adoption rate(采用率)会大幅提升。

2. 响应业务事件,实现真正自动化:

  • 企业的运行是由事件驱动的:“新订单来了”、“服务器挂了”、“客户投诉了”、“每周一到了”。

  • 一个被动的、等待输入的Agent无法主动响应这些事件。而原则11允许Agent监听这些事件并自动触发,从而将自动化从“按需手动触发”升级到“事件驱动自动运行”。

  • 示例:

    无需人工下令,ERP系统中的“订单创建”事件可直接触发“订单处理Agent”;监控系统的“异常报警”事件可直接触发“故障排查Agent”。这是智能自动化的高级形态。

3. 赋能现有系统,提升旧系统智能:

  • 企业有大量遗留系统(Legacy Systems),它们本身不具备AI能力。
  • 通过为这些系统添加“触发Agent”的能力,你可以用最小的成本为其赋能。例如,在一个老旧的CMS内容管理系统中增加一个“一键AI校对”按钮,点击后即触发“内容审核Agent”。

3. 如何落地实践这个原则?—— 构建“触发适配器”

落地此原则的关键是设计一个灵活的架构,其核心组件是触发适配器

架构设计:

1. 设计统一的“触发指令”格式:

所有适配器,无论来源如何,都应该将其输入转换为一个标准化、内部通用的指令格式。这样Agent核心服务就无需关心请求的来源。

示例指令格式:

{
"trigger_id": "unique_id_123", // 唯一标识此次触发
"agent_type": "sales_data_agent", // 要触发哪个Agent
"command": "generate_report", // 要执行什么命令
"parameters": { // 命令的参数
"time_range": "last_month",
"format": "excel"
},
"source_context": { // 来源上下文(可选,用于审计和回复)
"source": "slack",
"user_id": "U12345",
"channel_id": "C67890"
}
}

2. 开发针对不同来源的适配器:

每个适配器都是一个独立的轻量级组件,负责三件事:监听、转换、发送

  • Slack客户端适配器:
  • 监听:

    监听特定频道或@机器人的消息。

  • 转换:

    使用一个小型LLM或解析逻辑,将自然语言“@bot 生成上月的销售报表”转换为上面的标准指令格式。

  • 发送:

    将指令发送给内部的触发指令路由器

3. 构建触发指令路由器:

这个组件接收来自所有适配器的标准化指令,并根据其中的agent_type字段,将请求路由到对应的Agent服务去执行。它还可以负责负载均衡、速率限制和审计日志。

总结:

总而言之,原则11是关于“集成”和“访问”的原则。 它要求开发者以“服务化”的思维来构建Agent,通过一个适配器层将企业现有的所有工具和系统变成Agent的“遥控器”,从而让智能能力渗透到业务的每一个角落,最终实现真正的、无处不在的智能化升级。


原则十二:将Agent看做是一个“无状态的归约器”

这是12-Factor Agents的最后一个原则,也是一个总结性和纲领性的架构原则,它从最高层面定义了生产级Agent应有的形态,并将其与函数式编程的优雅概念相结合。

1. 核心范式:函数式编程思想的应用

要理解这个原则,首先需要理解两个核心概念:

  • 归约器:

    这个概念源自函数式编程(如JavaScript中的Array.reduce函数)。一个归约器是一个纯函数,它的形式是:
    (currentState, action) => newState
    它接收当前的状态和一个描述“发生了什么”的动作(action),经过计算后,返回一个全新的状态对象,而不会修改旧的状态。

  • 无状态:

    指这个归约器函数本身不存储任何数据。它的输出完全且唯一地由输入(currentStateaction)决定。给定相同的输入,总是产生相同的输出。

原则12将Agent的核心逻辑比喻为这样一个无状态的归约器

2. 为什么必须“无状态”?—— 可靠性、可扩展性与简单性

将Agent设计为无状态(即状态不存在Agent内存中,而是存在外部如Redis),是将其推向生产环境的终极架构决策,旨在解决分布式系统中最核心的挑战。

1. 极致的可扩展性:
这是最直接的好处。无状态的Agent实例是完全平等且可替代的

  • 场景:

    突然有1000个用户同时请求生成报表。

  • 解决方案:

    自动化系统,可以瞬间在集群中启动1000个完全相同的Agent实例,每个实例处理一个请求。处理完成后,实例立即被销毁以释放资源。

  • 对比有状态:

    如果状态在Agent内存中,你就无法轻松创建新实例(因为新实例没有之前的状态),只能纵向扩展(升级单个服务器硬件),成本高昂且有上限。

2. 强大的容错能力:

  • 场景:

    一个Agent实例在处理任务时,所在的服务器突然宕机。

  • 解决方案:

    由于所有状态都安全地存储在外部(如Redis),监控系统可以简单地在一台新服务器上启动一个新的Agent实例。这个新实例从外部存储中拉取任务的最新状态,并无缝地从中断处继续执行。对用户而言,可能只会感知到一点延迟,而不会任务失败。

  • 对比有状态:

    实例崩溃意味着内存中的状态全部丢失,任务彻底失败。

3. 简化开发与部署:

  • 无状态Agent的代码是纯业务逻辑

    (即那个“归约”函数),不包含状态同步、线程安全等复杂问题,更容易编写和测试。

  • 你可以独立地部署、升级或回滚Agent的代码,而不用担心会影响正在进行的任务状态。

3. 如何落地实践这个原则?—— 状态外部化与归约循环

落地此原则需要两个关键部分:一个外部的状态存储一个无状态的Agent处理函数

1. 将所有状态置于外部存储:

Agent所需的全部上下文——无论是执行状态还是业务状态——都必须存储在Agent进程之外的高可用存储中(如Redis、数据库)。

  • 每个任务

    都有一个唯一的task_id

  • 这个task_id是检索其全局状态的唯一钥匙。

2. 将Agent逻辑实现为一个“归约器”:

Agent的核心工作流程被设计为一个循环,这个循环的本质就是一次又一次的“归约”。

Agent处理循环(伪代码):链接状态与状态之间的“通用跳板机

# 这个函数是一个无状态的“归约器”。它接收当前状态和输入,返回新状态。
def agent_reducer(current_state, new_input):
# 1. 基于当前状态和输入,决定下一步行动(调用LLM进行推理)
# 2. 执行行动(如调用工具、等待用户输入)
# 3. 生成一个新的状态对象,反映执行后的最新情况
return new_state
# --- 主循环(通常由外部系统触发)---
def handle_agent_task(task_id, new_input):
# 1. 根据task_id,从外部存储获取当前状态
current_state = external_storage.get(task_id)
# 2. 将当前状态和新输入交给“归约器”处理
new_state = agent_reducer(current_state, new_input)
# 3. 将全新的状态对象写回外部存储,覆盖旧状态
external_storage.save(task_id, new_state)
# 4. (可选)根据新状态决定下一步,例如:
#    - 如果状态是“已完成”,则发送结果通知。
#    - 如果状态是“等待工具回调”,则在此处退出,等待回调触发新一轮处理。
#    - 如果状态是“等待人类输入”,则退出,等待原则7中的回调。

这个handle_agent_task函数本身是无状态的! 它每次被调用时,都只依赖于从外部存储获取的current_state和传入的new_input。处理完成后,它将结果持久化,然后自身可以立即被销毁。

3. 触发下一次“归约”:

这个无状态函数可以被各种事件触发,从而推动任务状态机前进:

  • 用户新消息:

    new_input

  • 工具调用完成:

    工具返回的结果是new_input

  • 人类反馈到达:

    人类的审批意见是new_input

  • 定时事件:

    可以是new_input

每次触发都是一次独立的函数调用,处理完即释放资源,完美适配serverless(无服务器)架构。

总结:

总而言之,原则12是关于“架构”的终极原则。 它描绘了生产级Agent的终极蓝图:一个无状态的、事件驱动的、按需计算的函数。它通过将状态彻底外部化,换来了极致的弹性、韧性和可扩展性,使得Agent系统能够以云原生(Cloud-Native)的方式运行,从容应对任何规模的企业级负载。这是Agent从概念走向落地生产的最后一座桥梁,也是最坚实的一座。


大模型未来如何发展?普通人能从中受益吗?

在科技日新月异的今天,大模型已经展现出了令人瞩目的能力,从编写代码到医疗诊断,再到自动驾驶,它们的应用领域日益广泛。那么,未来大模型将如何发展?普通人又能从中获得哪些益处呢?

通用人工智能(AGI)的曙光:未来,我们可能会见证通用人工智能(AGI)的出现,这是一种能够像人类一样思考的超级模型。它们有可能帮助人类解决气候变化、癌症等全球性难题。这样的发展将极大地推动科技进步,改善人类生活。

个人专属大模型的崛起:想象一下,未来的某一天,每个人的手机里都可能拥有一个私人AI助手。这个助手了解你的喜好,记得你的日程,甚至能模仿你的语气写邮件、回微信。这样的个性化服务将使我们的生活变得更加便捷。

脑机接口与大模型的融合:脑机接口技术的发展,使得大模型与人类的思维直接连接成为可能。未来,你可能只需戴上头盔,心中想到写一篇工作总结”,大模型就能将文字直接投影到屏幕上,实现真正的心想事成。

大模型的多领域应用:大模型就像一个超级智能的多面手,在各个领域都展现出了巨大的潜力和价值。随着技术的不断发展,相信未来大模型还会给我们带来更多的惊喜。赶紧把这篇文章分享给身边的朋友,一起感受大模型的魅力吧!

那么,如何学习AI大模型?

在一线互联网企业工作十余年里,我指导过不少同行后辈,帮助他们得到了学习和成长。我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑。因此,我坚持整理和分享各种AI大模型资料,包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频。在这里插入图片描述

学习阶段包括:

1.大模型系统设计
从大模型系统设计入手,讲解大模型的主要方法。包括模型架构、训练过程、优化策略等,让读者对大模型有一个全面的认识。

在这里插入图片描述

2.大模型提示词工程
通过大模型提示词工程,从Prompts角度入手,更好发挥模型的作用。包括提示词的构造、优化、应用等,让读者学会如何更好地利用大模型。

在这里插入图片描述

3.大模型平台应用开发
借助阿里云PAI平台,构建电商领域虚拟试衣系统。从需求分析、方案设计、到具体实现,详细讲解如何利用大模型构建实际应用。

在这里插入图片描述

4.大模型知识库应用开发
以LangChain框架为例,构建物流行业咨询智能问答系统。包括知识库的构建、问答系统的设计、到实际应用,让读者了解如何利用大模型构建智能问答系统。
在这里插入图片描述

5.大模型微调开发
借助以大健康、新零售、新媒体领域,构建适合当前领域的大模型。包括微调的方法、技巧、到实际应用,让读者学会如何针对特定领域进行大模型的微调。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.SD多模态大模型
以SD多模态大模型为主,搭建文生图小程序案例。从模型选择、到小程序的设计、到实际应用,让读者了解如何利用大模型构建多模态应用。
在这里插入图片描述

7.大模型平台应用与开发
通过星火大模型、文心大模型等成熟大模型,构建大模型行业应用。包括行业需求分析、方案设计、到实际应用,让读者了解如何利用大模型构建行业应用。

在这里插入图片描述
在这里插入图片描述

学成之后的收获👈

全栈工程实现能力:通过学习,你将掌握从前端到后端,从产品经理到设计,再到数据分析等一系列技能,实现全方位的技术提升。

解决实际项目需求:在大数据时代,企业和机构面临海量数据处理的需求。掌握大模型应用开发技能,将使你能够更准确地分析数据,更有效地做出决策,更好地应对各种实际项目挑战。

AI应用开发实战技能:你将学习如何基于大模型和企业数据开发AI应用,包括理论掌握、GPU算力运用、硬件知识、LangChain开发框架应用,以及项目实战经验。此外,你还将学会如何进行Fine-tuning垂直训练大模型,包括数据准备、数据蒸馏和大模型部署等一站式技能。

提升编码能力:大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握将提升你的编码能力和分析能力,使你能够编写更高质量的代码。

学习资源📚

  1. AI大模型学习路线图:为你提供清晰的学习路径,助你系统地掌握AI大模型知识。
  2. 100套AI大模型商业化落地方案:学习如何将AI大模型技术应用于实际商业场景,实现技术的商业化价值。
  3. 100集大模型视频教程:通过视频教程,你将更直观地学习大模型的技术细节和应用方法。
  4. 200本大模型PDF书籍:丰富的书籍资源,供你深入阅读和研究,拓宽你的知识视野。
  5. LLM面试题合集:准备面试,了解大模型领域的常见问题,提升你的面试通过率。
  6. AI产品经理资源合集:为你提供AI产品经理的实用资源,帮助你更好地管理和推广AI产品。

👉获取方式: 😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费

在这里插入图片描述

Logo

更多推荐