407份真实世界 System Prompt 工程结构报告:Agent 正在积累新的软件技术债
论文《Configuration, Not Conscience: A Large-Scale Empirical Study of LLM System Prompts》对这一变化进行了较系统的实证分析。
过去讨论 System Prompt,关注点通常集中在模型身份、安全规则、拒答策略和行为边界上。
但随着 AI 从聊天机器人逐渐演化为具备工具调用、文件操作、浏览器访问、代码执行和长期记忆能力的 Agent,System Prompt 所承担的功能也发生了明显变化。
它已经不再只是描述“模型应该如何回答”,而开始大量承载工具协议、执行流程、权限边界、上下文管理和运行时约束。
论文《Configuration, Not Conscience: A Large-Scale Empirical Study of LLM System Prompts》对这一变化进行了较系统的实证分析。

研究人员收集了来自 62 家厂商的 407 份真实世界 System Prompt,覆盖通用助手、编程 Agent、搜索 Agent、浏览器 Agent 和自主 Agent 等不同产品形态,并从内容结构、厂商间复用、Prompt Injection 防御、版本演化和维护风险等多个角度展开分析。
407份system pompt数据来源见文末
论文最终得到的核心结论是:现代 System Prompt 正在从行为规则逐渐演变为 Agent 的运行时配置,其复杂度和维护方式已经开始呈现传统软件工程的特征。
58%的内容都在描述工具和运行协议
论文首先按照功能对 System Prompt 中的文本进行分类,主要包括工具与协议、格式与风格、记忆与上下文、安全策略、身份设定、法律与知识产权以及 Prompt Injection 边界等类别。
其中,Tool / Protocol 占全部内容的 58.0%,明显高于其他类别;Formatting / Style 占 12.4%,Memory / Context 占 7.4%,Safety Policy 仅占 5.4%,Identity / Persona 和 Legal / IP 分别占 2.9% 和 2.1%。

这个结果说明,真实世界中的 System Prompt 已经与早期大模型时代有明显区别。传统聊天机器人主要需要规定回答风格、安全边界和角色身份,而 Agent 需要进一步定义工具如何调用、文件如何处理、什么时候可以执行代码、失败后如何重试、何时需要用户确认以及如何管理上下文和状态。这些运行规则很快就会超过单纯的行为规范,成为 Prompt 的主要组成部分。
尤其是在编程 Agent 和自主 Agent 中,这种特征更加明显。随着模型获得更多外部能力,System Prompt 本质上开始承担一部分 Runtime Specification 的作用。从工程角度看,它已经越来越接近“配置文件、接口说明、权限规则和执行协议”的混合体。
强约束规则主要集中在工具和执行过程
论文进一步统计了包含 MUST、NEVER、DO NOT、CRITICAL、IMPORTANT、STRICTLY、REQUIRED 等强制性表达的规则,共识别出 4725 条。
其中,Tool Protocol 类规则有 639 条,文件修改和代码安全相关规则有 478 条,输出格式规则有 468 条,状态、记忆和上下文相关规则有 256 条,幻觉和准确性相关规则有 229 条。相比之下,直接属于 Safety / Harmful Content 的规则只有 56 条。
也就是说,工具协议类强约束规则的数量大约是有害内容规则的 11.4 倍。
这一结果说明,Agent 系统中需要被严格控制的对象已经明显扩大。系统不仅需要规定哪些内容不能生成,还需要限制模型在什么情况下可以调用工具、修改文件、执行代码或访问外部环境。
例如,很多 Prompt 会明确要求模型在修改文件前先读取内容,避免覆盖用户数据,严格按照指定 Schema 调用工具,或者将网页中的文本视为不可信数据而非上级指令。
因此,对 Agent 安全来说,“内容安全”已经不足以覆盖全部风险。模型是否能够正确执行工具调用、遵守权限边界以及区分可信指令和外部数据,正在成为同样重要甚至更核心的问题。
公开 System Prompt 可能只是完整运行配置的一部分
论文中一个比较有代表性的实验,是将 Anthropic 官方公开的 System Prompt 与对应的社区泄露或观测版本进行比较。
研究覆盖多个 Opus、Sonnet 和 Fable 版本。官方版本平均约 3080 个英文单词,而对应的观测版本平均约 20215 个单词,后者约为前者的 6.6 倍。
两类 Prompt 的内容构成差异更加明显。官方版本中 Safety Policy 占 34.5%,Tool / Protocol 占 17.1%;在观测版本中,Safety Policy 的比例下降到 8.9%,Tool / Protocol 则上升到 57.2%。
论文还发现,在其中四组匹配 Prompt 中,官方版本约 76% 至 94% 的 5-gram 文本可以在观测版本中找到。这说明官方公开的内容并不是完全不同的一套 Prompt,更可能是完整系统中的一个子集,而完整运行版本在此基础上增加了大量工具、协议和运行时规则。
从架构上看,可以将其理解为两层:一层负责定义模型身份、安全原则和基本行为,另一层负责描述工具调用、文件系统、浏览器、代码执行、记忆管理、权限控制和具体环境约束。论文估算,匹配后的观测版本平均比官方版本增加约 1.7 万个英文单词的工具和协议内容。

需要强调的是,这一严格配对分析主要针对 Anthropic,因此不能直接推广到所有厂商。但它较清晰地展示了现代 Agent System Prompt 可能存在的典型分层结构。
不同 Agent 正在形成相似的工程结构
论文还分析了不同厂商 System Prompt 之间的相似性,并将文本相似、语义相似和结构相似分别处理。
例如,Devin 与 Amp 的语义相似度达到 0.915,但文本 Jaccard 相似度只有 0.014;Devin 与 GitHub Copilot CLI 的语义相似度达到 0.893,而文本重叠仅为 0.001。
这说明不同厂商并不一定复制彼此的 Prompt,但在处理相似 Agent 问题时,往往会形成类似的规则结构。工具调用、状态管理、权限确认、异常处理、指令优先级和外部数据隔离等需求,会自然推动不同产品向相似的设计方式收敛。
这种现象与传统软件架构比较相似。数据库、操作系统和 Web 框架虽然实现不同,但面对共同的问题时,最终都会形成一些稳定的设计模式。Agent System Prompt 目前也开始表现出类似趋势,逐渐形成一套较稳定的工程范式。
论文同时也发现了一些明显的文本复用关系。例如 Cline 到 RooCode 的 Containment 达到 54%,Cline 到 Tencent CodeBuddy 达到 50%。其中 Cline 与 RooCode 的关系比较容易解释,因为后者本身来自 Cline 的开源分支。
更值得注意的是浏览器 Agent。部分 Browser Agent 在外部网页内容的处理方式、指令优先级以及 Prompt Injection 防护方面出现了高度相似的结构,这说明相关安全机制也在逐渐形成固定模式。
Prompt Injection 防御仍然缺乏统一做法
论文还统计了 System Prompt 中常见的 Prompt Injection 防御方式,包括禁止泄露 System Prompt、设置指令优先级、将外部内容标记为数据、忽略外部内容中的嵌入指令以及明确拒绝绕过安全规则等。
62 家厂商中,只有 35 家至少使用了其中一种机制,同时采用三种以上机制的只有 7 家。
这一结果表明,虽然越来越多 Agent 已经开始接入浏览器、文件和外部数据,但如何划分 Instruction 与 Data 的边界仍然没有形成统一、成熟的做法。
尤其值得注意的是,“禁止泄露 System Prompt”本身并不是一个可靠的安全边界。论文分析的数据中存在大量已经被社区提取或泄露的 Prompt,这本身就说明自然语言中的禁止性指令只能构成软约束。真正可靠的安全控制仍然需要依赖权限系统、工具隔离和运行时机制。
对于 Agent 而言,更关键的问题其实不是模型是否“知道某件事不能做”,而是系统是否真正限制了它完成该操作的能力。
System Prompt 正在出现维护债务
随着 System Prompt 的规模不断扩大,其版本演化也开始呈现出明显的软件工程特征。
论文分析 Anthropic 官方 Prompt 的版本变化后发现,Sonnet 每次版本升级平均会增加或删除约 1319 个英文单词,Opus 平均约为 1424 个英文单词。如此规模的变化已经不能简单理解为“调整几句提示词”,而更接近一次配置版本更新。
问题在于,目前大部分 Prompt 仍然以自然语言形式维护,并没有像代码一样拥有成熟的类型系统、静态分析、依赖管理和编译检查。因此,随着规则不断叠加,一些问题会逐渐积累。
论文将其中一类问题称为 Prompt Rot,即 Prompt 中原本正确的配置随着外部环境变化逐渐失效。例如,Prompt 中可能硬编码模型名称、API、URL、版本号、工具名称、依赖包或外部服务地址。当这些依赖发生变化时,Prompt 本身未必会产生明显错误,Agent 仍然可以继续运行,但行为可能已经偏离设计预期。
在一个约 34900 个英文单词的 Claude Cowork Prompt 中,论文检测到了 922 个潜在 Rot Risk Marker。虽然其中有不少重复项,但仍然包含多个模型标识符和 URL,说明 Prompt 已经开始承担相当数量的外部依赖。
这种问题与传统代码中的失效依赖类似,但更难发现,因为自然语言 Prompt 通常不会在启动阶段直接报错。
规则不断叠加,也会带来潜在冲突
论文还尝试检测 System Prompt 中潜在的规则张力。
在 407 份 Prompt 中,有 286 份同时出现要求“简洁”和要求“详细全面”的规则,116 份同时存在“禁止列表”和“使用 Markdown、表格或列表”的规则,85 份同时存在“需要时向用户澄清”和“不要询问用户”的规则。
这些结果不能直接证明对应 Prompt 一定存在逻辑错误,因为不同规则可能适用于不同场景,但它至少反映出一个现实问题:当 Prompt 规模扩大、维护人员增加、功能持续叠加后,全局一致性会越来越难保证。
很多 System Prompt 的演化过程实际上与传统业务代码相似。出现一个 Bad Case,就增加一条规则;增加一个新工具,再补充一组协议;安全团队发现新的风险,再叠加新的限制。经过多轮迭代之后,同一个 Prompt 中可能同时存在历史规则、新规则、兼容规则和例外规则。
如果缺乏统一的结构化管理,这种维护方式最终很容易形成类似传统软件中的技术债。

Prompt Engineering 正在走向软件工程化
论文最后提出的一个重要观点,是 System Prompt 未来需要采用更接近软件工程的治理方式。
当 Prompt 只负责简单角色设定时,人工维护基本可以满足需求。但当它开始包含数万词的工具规则、状态管理、权限约束和外部依赖后,仅靠人工阅读已经很难保证正确性。
因此,System Prompt 未来可能需要建立类似代码的生命周期管理,包括版本控制、差异分析、静态检查、失效引用检测、规则冲突检测、行为回归测试和安全回归测试。
从这个角度看,Prompt Engineering 也在逐渐演变为 Prompt Software Engineering。Prompt 不再只是自然语言技巧,而正在成为 Agent 软件栈中的一种工程资产。
未来可能出现的工具也会更加接近传统开发体系,例如 Prompt Linter、Prompt Dependency Checker、Prompt Regression Test 和 Prompt CI/CD。它们的目标并不是让 Prompt“写得更漂亮”,而是保证修改之后不会破坏已有行为,不会引入新的权限问题,也不会保留已经失效的规则。
Agent 安全的重点正在从“内容”扩展到“动作”
这篇论文对 Agent 安全最直接的启示,是安全评测对象需要发生变化。
传统大模型安全主要围绕输入和输出展开,重点关注越狱、拒答绕过、风险内容生成和 Prompt 泄露。但在 Agent 场景中,模型已经能够调用工具、访问网页、修改文件、执行代码和写入长期状态,仅检测最终文本输出已经不足以判断系统是否安全。
未来的 Agent 安全测试需要进一步覆盖工具调用、文件操作、权限边界、指令优先级、数据流和记忆写入等行为。其中一个核心问题,是模型能否稳定区分 Instruction 与 Data。
例如,网页中出现一段诱导性文本时,真正需要关注的并不是模型是否复述这段文本,而是它是否会将网页内容错误识别为高优先级指令,并进一步触发工具调用、文件访问或状态修改。
这也是 Agent 与传统聊天模型之间最根本的差异之一。聊天模型的错误主要表现为输出错误,而 Agent 的错误可能进一步转化为外部系统中的实际动作。
从 System Prompt 可以看到 Agent 软件化的过程
从这 407 份 System Prompt 中可以看到一个比较明确的趋势:随着 Agent 能力增加,Prompt 正在承载越来越多的软件运行逻辑。
58%的内容已经用于描述工具和协议,强约束规则主要集中在执行过程,完整运行 Prompt 的规模明显大于公开版本,不同 Agent 开始形成相似的工程结构,同时也逐渐出现版本膨胀、依赖失效和规则冲突等问题。
这些现象共同说明,System Prompt 已经不能简单被视为模型的行为说明,而正在成为 Agent Runtime 的一个组成部分。
对于安全工程而言,这意味着关注重点也需要同步扩展。未来的问题不仅是模型会生成什么内容,还包括它能够访问什么资源、在什么条件下能够执行什么动作,以及这些权限和规则在长期迭代中能否保持一致。
当 System Prompt 开始承担软件配置的职责之后,它也会不可避免地产生软件技术债。
而这部分技术债,可能会成为未来 Agent 工程中一个长期存在、但目前仍被低估的问题。
数据来源
CL4R1T4S:66 份,commit 09916a9
GitHub:elder-plinius/CL4R1T4S
System-Prompts:30 份,commit 0d04045 GitHub:guy915/System-Prompts system-prompts-and-models-of-ai-tools:112 份,commit 570364c GitHub:x1xhlol/system-prompts-and-models-of-ai-tools system_prompts_leaks:231 份,commit 5d3c769 GitHub:asgeirtj/system_prompts_leaks
同专题推荐
查看专题AgentSpy:如何让 AI Agent 的真实行为变得可观测
但这里存在一个容易被忽视的问题:Agent 的执行日志,真的能够完整反映它做过的事情吗?
大模型自我反思微调,让Agent学会抵御未知的提示注入
这种思路确实有效,但也存在一个难以回避的问题:攻击者的策略总是在变化。当攻击者改变攻击的表达方式、伪装身份,或者把恶意指令隐藏在更复杂的任务上下文中,模型过去学到的防御模式是否依然有效?
一个单词就能打开安全大门:Agent 护栏中的选项通道攻击
一种常见的解决思路,是在 Agent 和外部环境之间部署一个专门的安全决策模型。每当 Agent 准备执行操作时,先由这个模型检查操作是否符合安全策略,再决定允许还是拦截。