12-factor-agents
为构建生产级LLM应用总结的12条设计原则,源自对上百个AI项目的观察和实际工程经验。每条原则都聚焦可操作性:Own your prompts、Unify execution state、Small focused agents等,帮助开发者避免框架陷阱,写出真正可靠的agent代码。当前热度高,因为直接回应了AI工程中'80%质量陷阱'的痛点,提供了模块化、可渐进应用的解决方案。
README
12-Factor Agents - 构建可靠 LLM 应用的原则
秉承 12 Factor Apps 的精神。本项目的源码位于 https://github.com/humanlayer/12-factor-agents,欢迎提供反馈和贡献。让我们一起探索!
[!TIP] 错过了 AI Engineer World's Fair?点此观看演讲
寻找 Context Engineering?直接跳转到第三因素
想为
npx/uvx create-12-factor-agent做贡献?查看讨论帖
嗨,我是 Dex。我已经在 AI agent 上研究了一段时间。
我尝试过市面上所有的 agent 框架,从即插即用的 crew/langchains 到所谓的“极简” smolagents,再到“生产级”的 langraph, griptape 等。
我与许多非常优秀的创始人交流过,包括 YC 内部和外部的,他们都在用 AI 构建令人印象深刻的产品。大多数都是自己搭建技术栈。我在面向客户的生产级 agent 中很少看到框架的身影。
我惊讶地发现,市面上大多数标榜为“AI Agent”的产品,其自主性并不强。它们大部分是确定性代码,只是在恰到好处的地方点缀了 LLM 步骤,使体验变得真正神奇。
Agent(至少是优秀的 agent)并不遵循“这是你的 prompt,这是你的工具包,不断循环直到达成目标”的模式。它们主要由普通的软件组成。
因此,我开始寻找答案:
我们能用哪些原则来构建 LLM 驱动的软件,使其真正足够好,能够交付给生产环境中的客户使用?
欢迎来到 12-factor agents。正如戴利之后的每一位芝加哥市长都会在主要机场贴满标语那样:我们很高兴你来到这里。
特别感谢 @iantbutler01, @tnm, @hellovai, @stantonk, @balanceiskey, @AdjectiveAllison, @pfbyjy, @a-churchill 以及旧金山 MLOps 社区对本指南的早期反馈。
简版:12 个因素
即使 LLM 持续以指数级变得更强大,仍有一些核心工程技巧能让基于 LLM 的软件更可靠、更具可扩展性、更易于维护。
- 我们如何走到今天:软件简史
- 因素 1:自然语言到工具调用
- 因素 2:掌控你的 prompt
- 因素 3:掌控你的上下文窗口
- 因素 4:工具只是结构化输出
- 因素 5:统一执行状态与业务状态
- 因素 6:通过简单 API 实现启动/暂停/恢复
- 因素 7:通过工具调用联系人类
- 因素 8:掌控你的控制流
- 因素 9:将错误压缩进上下文窗口
- 因素 10:小型、专注的 agent
- 因素 11:随处触发,适应用户所在之处
- 因素 12:让你的 agent 成为无状态 reducer
视觉导航
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
我们如何走到今天
关于我的 agent 之旅以及为何走到这里,更深度的探讨请参阅 软件简史 - 这里快速总结:
agent 的承诺
我们将大量讨论有向图(Directed Graphs, DG)及其无环版本 DAG。首先需要指出的是……软件本身就是一个有向图。我们过去用流程图表示程序,这是有原因的。

从代码到 DAG
大约 20 年前,DAG 编排器开始流行。比如经典的 Airflow、Prefect,一些前辈,以及一些更现代的(dagster、inggest、windmill)。它们遵循相同的图模式,并额外提供了可观测性、模块化、重试、管理等功能。

agent 的承诺
我不是第一个这么说的人,但我开始学习 agent 时最大的收获是:你可以抛弃 DAG。不再需要软件工程师为每一步和边界情况编写代码,而是给 agent 一个目标和一组转换规则:

然后让 LLM 实时决策,找出路径:

这里的承诺是:你写的软件更少,只需给 LLM 图的“边”,让它自己找出节点。你可以从错误中恢复,编写更少的代码,并且可能发现 LLM 能给出新颖的解决方案。
agent 作为循环
正如我们稍后会看到的,结果证明这并不完全奏效。
我们再深入一步——对于 agent,你有一个由 3 步组成的循环:
- LLM 确定工作流中的下一步,输出结构化 JSON(“工具调用”)
- 确定性代码执行工具调用
- 结果被追加到上下文窗口
- 重复,直到下一步被确定为“完成”
initial_event = {"message": "..."}
context = [initial_event]
while True:
next_step = await llm.determine_next_step(context)
context.append(next_step)
if (next_step.intent === "done"):
return next_step.final_answer
result = await execute_step(next_step)
context.append(result)
我们的初始上下文就是起始事件(可能是用户消息、cron 触发器、webhook 等),然后让 LLM 选择下一步(工具),或者判断我们已经完成。
这里是一个多步示例:
GIF 版本
为什么是 12-factor agents?
归根结底,这种方法的效果并没有达到我们的期望。
在构建 HumanLayer 的过程中,我与至少 100 位 SaaS 构建者(主要是技术创始人)交流过,他们希望让自己的现有产品更具 agent 特性。他们的历程通常是这样的:
- 决定构建一个 agent
- 产品设计、用户体验映射、解决哪些问题
- 想要快速推进,所以拿起 $FRAMEWORK 开始构建
- 达到 70-80% 的质量门槛
- 意识到 80% 对于大多数面向客户的功能来说还不够好
- 意识到要越过 80%,需要逆向工程框架、prompt、流程等
- 从头开始重做
免责声明:我不太确定在哪说最合适,但这里似乎不错:这绝不是对现有各种框架或为其工作的聪明人的贬低。它们实现了不可思议的事情,并加速了 AI 生态系统的发展。
我希望这篇文章的成果之一是:agent 框架的构建者能从我和其他人的经历中学习,让框架变得更好。
特别是对于那些希望快速推进但又需要深度控制的构建者。
免责声明 2:我不会谈论 MCP。我相信你能看出它适合的位置。
免责声明 3:我主要使用 TypeScript,原因在此,但所有这些在 Python 或其他你喜欢的语言中也适用。
好了,回到正题……
优秀 LLM 应用的设计模式
在研究了数百个 AI 库并与数十位创始人合作后,我的直觉是:
- 有一些核心的东西能让 agent 变得出色
- 全力投入一个框架,基本上在编写一个绿地基重构,可能适得其反
- 有一些核心原则能让 agent 变得出色,如果你引入一个框架,你会获得其中大部分/全部
- 但是,我见过的让构建者快速将高质量 AI 软件交付给客户的最快方式,是从 agent 构建中提取小而模块化的概念,并将其融入现有产品中
- 这些来自 agent 的模块化概念可以被大多数熟练的软件工程师定义和应用,即使他们没有 AI 背景
我见过的让构建者将优秀 AI 软件交付给客户的最快方式,是从 agent 构建中提取小而模块化的概念,并将其融入现有产品中
12 个因素(再次列出)
- 我们如何走到今天:软件简史
- 因素 1:自然语言到工具调用
- 因素 2:掌控你的 prompt
- 因素 3:掌控你的上下文窗口
- 因素 4:工具只是结构化输出
- 因素 5:统一执行状态与业务状态
- 因素 6:通过简单 API 实现启动/暂停/恢复
- 因素 7:通过工具调用联系人类
- 因素 8:掌控你的控制流
- 因素 9:将错误压缩进上下文窗口
- 因素 10:小型、专注的 agent
- 因素 11:随处触发,适应用户所在之处
- 因素 12:让你的 agent 成为无状态 reducer
荣誉提名 / 其他建议
相关资源
- 向本指南贡献请到这里
- 我在 2025 年 3 月的 Tool Use 播客 中讨论了很多这些内容
- 我在 The Outer Loop 上写了一些相关文章
- 我与 @hellovai 一起举办关于最大化 LLM 性能的网络研讨会
- 我们使用这套方法论在 got-agents/agents 下构建开源 agent
- 我们忽略了自己所有的建议,构建了一个在 kubernetes 中运行分布式 agent 的框架
- 本指南中的其他链接:
- 12 Factor Apps
- Building Effective Agents (Anthropic)
- Prompts are Functions
- Library patterns: Why frameworks are evil
- The Wrong Abstraction
- Mailcrew Agent
- Mailcrew Demo Video
- Chainlit Demo
- TypeScript for LLMs
- Schema Aligned Parsing
- Function Calling vs Structured Outputs vs JSON Mode
- BAML on GitHub
- OpenAI JSON vs Function Calling
- Outer Loop Agents
- Airflow
- Prefect
- Dagster
- Inngest
- Windmill
- The AI Agent Index (MIT)
- NotebookLM on Finding Model Capability Boundaries
贡献者
感谢所有为 12-factor agents 做出贡献的人!
许可
所有内容和图片均采用 CC BY-SA 4.0 许可证
代码采用 Apache 2.0 许可证










