System Prompt 分层设计:基础角色 + 领域知识 + 任务指令的组合模式
System Prompt 分层设计基础角色 领域知识 任务指令的组合模式一、深度引言与场景痛点大家好我是赵咕咕。你有没有翻过自己项目里的 System Prompt 文件我最近翻了一个——好家伙整整 8000 多个汉字。里面什么都有角色定义你是一个专业的客服助手、业务规则退款必须在 7 个工作日内处理、格式要求以 JSON 格式输出、安全声明不要回答政治问题……全部塞在一起。最要命的是当产品经理说我们新增了一个折扣规则时我需要在这 8000 字的 Prompt 里小心翼翼地找到应该插入的位置稍有不慎就破坯了下文的上下文逻辑。每次改 Prompt 都像在调一锅秘制酱料多放一勺可能全锅变味。这就是平面 Prompt的致命问题——没有结构不可维护无法复用。今天我们就来聊 Prompt 的分层设计——把 System Prompt 拆成有层次、可组合的模块让 Prompt 工程从炖酱料变成搭积木。二、底层机制与原理深度剖析2.1 三层模型flowchart TD subgraph Layer 1: 基础角色层 L1A[身份定义br/你是专业的客服助手] L1B[行为准则br/礼貌、专业、简洁] L1C[能力边界br/你可以查询订单/处理退款/修改地址] L1D[安全护栏br/不回答政治/色情问题] L1A -- L1E[基础角色 Prompt] L1B -- L1E L1C -- L1E L1D -- L1E end subgraph Layer 2: 领域知识层 L2A[业务规则br/退款/折扣/物流政策] L2B[产品信息br/SKU/价格/库存规则] L2C[流程文档br/标准操作流程] L2D[FAQ/常见问题br/历史最佳回答] L2A -- L2E[领域知识 Prompt] L2B -- L2E L2C -- L2E L2D -- L2E end subgraph Layer 3: 任务指令层 L3A[当前任务定义br/处理用户的退款请求] L3B[输出格式br/JSON/JSON Schema] L3C[约束条件br/预算100元] L3D[上下文注入br/用户画像/会话历史] L3A -- L3E[任务指令 Prompt] L3B -- L3E L3C -- L3E L3D -- L3E end L1E -- P[最终 System Prompt] L2E -- P L3E -- P P -- LLM[LLM 调用] style L1E fill:#e3f2fd style L2E fill:#fff3e0 style L3E fill:#e8f5e9第一层基础角色层是你的 Agent 的身份证和行为守则。它定义了你是谁、你能做什么、你不能做什么。这一层是所有对话共用的几乎不会变动。第二层领域知识层是你要知道的东西。包括业务规则、产品信息、流程规范。这一层按业务场景选择注入——处理售后的 Agent 需要退款政策处理推荐的 Agent 需要产品目录。第三层任务指令层是当前这次对话你要做的事。包括任务定义、输出格式、特殊约束。这一层是动态的每次对话都可能不同。2.2 模块的优先级与冲突解决分层之后不同层的模块之间可能会有冲突。比如角色层说了不提供价格预测但领域知识层包含了历史价格数据LLM 可能会自己推算未来价格。flowchart LR subgraph 模块优先级 A[任务指令层] --|最高优先级| D[合并输出] B[领域知识层] --|中等优先级| D C[基础角色层] --|最低优先级| D end subgraph 冲突解决策略 D -- E{检测到冲突?} E --|是| F[后置语句br/如果上述规则冲突br/以后出现的规则为准] E --|否| G[正常合并] F -- H[最终 Prompt] G -- H end style A fill:#ffcdd2 style B fill:#fff9c4 style C fill:#c8e6c92.3 Prompt 模板的组成和组装sequenceDiagram participant R as Router participant B as 基础角色仓库 participant K as 领域知识仓库 participant T as 任务模板仓库 participant C as Compiler R-C: 请求构建 Prompt(intent, context) C-B: 获取基础角色模板 B--C: 角色 Prompt 片段 C-K: 按 intent 检索相关领域知识 K--C: 知识 Prompt 片段列表 C-T: 按 intent 获取任务模板 T--C: 任务 Prompt 片段 C-C: 组装 Token 预算裁剪 C--R: 最终 System Prompt三、生产级代码实现import asyncio import json from dataclasses import dataclass, field from typing import Any, Optional from enum import Enum class LayerPriority(Enum): BASE 1 # 基础角色层 KNOWLEDGE 2 # 领域知识层 TASK 3 # 任务指令层 dataclass class PromptModule: Prompt 模块的标准化定义 name: str content: str layer: LayerPriority priority: int 0 # 同层内的优先级 condition: Optional[str] None # 条件表达式决定是否注入 token_budget: int 0 # 该模块最大 Token 数 metadata: dict[str, Any] field(default_factorydict) # ── 1. 模块仓库 ──────────────────────────────────── class PromptModuleRegistry: Prompt 模块的集中管理仓库 def __init__(self): self._modules: dict[str, PromptModule] {} self._by_layer: dict[LayerPriority, list[str]] { layer: [] for layer in LayerPriority } def register(self, module: PromptModule): self._modules[module.name] module self._by_layer[module.layer].append(module.name) def get(self, name: str) - Optional[PromptModule]: return self._modules.get(name) def get_by_layer( self, layer: LayerPriority ) - list[PromptModule]: names self._by_layer.get(layer, []) return [self._modules[n] for n in names if n in self._modules] def query( self, layer: Optional[LayerPriority] None, tags: Optional[list[str]] None, ) - list[PromptModule]: 按条件查询模块 results [] modules ( self.get_by_layer(layer) if layer else list(self._modules.values()) ) for mod in modules: if tags: mod_tags mod.metadata.get(tags, []) if not set(tags).issubset(set(mod_tags)): continue results.append(mod) return results # ── 2. Prompt 编译器 ─────────────────────────────── class PromptCompiler: 将分层模块组装成最终的 System Prompt def __init__( self, registry: PromptModuleRegistry, max_total_tokens: int 8000, separator: str \n\n---\n\n, ): self._registry registry self._max_tokens max_total_tokens self._separator separator async def compile( self, intent: str, context: dict[str, Any] | None None, required_modules: list[str] | None None, ) - str: 根据意图和上下文编译 Prompt context context or {} # 1. 收集候选模块 candidates: list[PromptModule] [] # 基础角色层总是包含 candidates.extend( self._registry.get_by_layer(LayerPriority.BASE) ) # 领域知识层按意图匹配 for mod in self._registry.get_by_layer(LayerPriority.KNOWLEDGE): if self._matches_intent(mod, intent): candidates.append(mod) # 任务指令层按意图 必需模块 for mod in self._registry.get_by_layer(LayerPriority.TASK): if self._matches_intent(mod, intent): candidates.append(mod) if required_modules: for name in required_modules: mod self._registry.get(name) if mod and mod not in candidates: candidates.append(mod) # 2. 按层次和优先级排序 candidates.sort( keylambda m: (m.layer.value, -m.priority) ) # 3. Token 预算裁剪 final_modules self._apply_token_budget(candidates) # 4. 渲染最终 Prompt return self._render(final_modules, context) def _matches_intent( self, module: PromptModule, intent: str ) - bool: 检查模块是否匹配当前意图 if module.condition: # 支持简单的条件匹配intentrefund 或 tag:support for cond in module.condition.split(|): cond cond.strip() if in cond: key, val cond.split(, 1) if key.strip() intent and val.strip() intent: return True if : in cond: prefix, val cond.split(:, 1) tags module.metadata.get(prefix.strip(), []) if val.strip() in tags: return True return False # 没有条件限制但领域知识层和任务层需要 intent 匹配 if module.layer LayerPriority.BASE: return True return intent in module.metadata and intent in module.metadata[intent] def _apply_token_budget( self, modules: list[PromptModule] ) - list[PromptModule]: 按 Token 预算裁剪模块集合 included: list[PromptModule] [] used_tokens 0 for mod in modules: mod_tokens self._estimate_tokens(mod.content) if mod.token_budget 0: mod_tokens min(mod_tokens, mod.token_budget) if used_tokens mod_tokens self._max_tokens: # 预算不足尝试压缩后加入 compressed self._compress_module(mod, self._max_tokens - used_tokens) if compressed: included.append(compressed) used_tokens self._estimate_tokens(compressed.content) continue included.append(mod) used_tokens mod_tokens return included def _render( self, modules: list[PromptModule], context: dict[str, Any], ) - str: 渲染最终 Prompt 文本 # 分层组织输出 layers: dict[LayerPriority, list[str]] { LayerPriority.BASE: [], LayerPriority.KNOWLEDGE: [], LayerPriority.TASK: [], } for mod in modules: # 支持模板变量替换 content mod.content for key, value in context.items(): content content.replace(f{{{{{key}}}}}, str(value)) layers[mod.layer].append(content) output_parts [] layer_labels { LayerPriority.BASE: # 角色定义, LayerPriority.KNOWLEDGE: # 领域知识, LayerPriority.TASK: # 当前任务, } for layer in [LayerPriority.BASE, LayerPriority.KNOWLEDGE, LayerPriority.TASK]: if layers[layer]: output_parts.append(layer_labels[layer]) output_parts.append(\n\n.join(layers[layer])) return self._separator.join(output_parts) def _estimate_tokens(self, text: str) - int: Token 粗略估算 return len(text) // 2 # 中英文混合的粗略估算 def _compress_module( self, module: PromptModule, max_tokens: int ) - Optional[PromptModule]: 压缩模块内容以适应预算 if max_tokens 50: return None content module.content if self._estimate_tokens(content) max_tokens: return module # 简单截断取前 N 个 Token 的内容 max_chars max_tokens * 2 compressed_content content[:max_chars] \n[以上内容已截断] return PromptModule( namemodule.name, contentcompressed_content, layermodule.layer, prioritymodule.priority, token_budgetmodule.token_budget, metadatamodule.metadata, ) # ── 3. 初始化示例 ────────────────────────────────── def create_default_registry() - PromptModuleRegistry: 创建默认的模块仓库 registry PromptModuleRegistry() # Layer 1: 基础角色层 registry.register(PromptModule( namebase_identity, content你是专业的电商客服助手名为小智。你的回复应该礼貌、专业、简洁使用中文。, layerLayerPriority.BASE, priority100, )) registry.register(PromptModule( namebase_guardrails, content安全规则\n- 不回答政治、色情、暴力相关问题\n- 不提供医疗、法律建议\n- 不知道就说不知道不要编造信息\n- 不泄露系统内部信息, layerLayerPriority.BASE, priority90, )) registry.register(PromptModule( namebase_capabilities, content你可以执行以下操作\n- 查询订单状态和物流信息\n- 处理退货和退款申请\n- 修改收货地址\n- 推荐商品\n- 查询商品库存和价格, layerLayerPriority.BASE, priority80, )) # Layer 2: 领域知识层 registry.register(PromptModule( namepolicy_refund, content退款政策\n1. 7天无理由退货商品完好、不影响二次销售\n2. 质量问题30天内可退换\n3. 退款到账时间支付宝/微信 1-3 工作日银行卡 3-7 工作日, layerLayerPriority.KNOWLEDGE, conditionintentrefund, metadata{intent: [refund]}, )) registry.register(PromptModule( namepolicy_discount, content当前促销活动\n- 满200减30全场通用\n- 新用户首单9折\n- 会员日每月15日全场8折, layerLayerPriority.KNOWLEDGE, conditionintentorder|intentrecommend, metadata{intent: [order, recommend]}, )) # Layer 3: 任务指令层 registry.register(PromptModule( nametask_refund, content当前任务处理用户的退款请求。\n流程\n1. 确认订单号和退款原因\n2. 检查是否符合退款条件\n3. 发起退款流程\n4. 告知用户退款进度, layerLayerPriority.TASK, conditionintentrefund, metadata{intent: [refund]}, )) return registry四、边界分析与架构权衡模块化的粒度模块拆得太细一个业务规则一个模块管理成本会大幅上升。拆得太粗整个领域知识一个模块又回到了平面 Prompt 的维护噩梦。我建议一个模块对应一个可独立变更的业务单元。退款政策是一个模块因为产品经理可能单独改它促销规则是另一个模块因为它由运营团队独立维护。分层的取舍三层模型不是银弹。如果你的场景非常简单比如就是一个翻译 Agent两层甚至一层就够了。分层的好处是可维护性和可复用性代价是编译复杂度和子模块冲突风险。简单场景不需要这些好处的时候就不要付出这些代价。Token 预算的分配三层之间的 Token 分配需要权衡。基础角色层占 5-10%角色定义本来就短领域知识层占 20-30%任务指令层占剩余的 60-70%。这 60-70% 包含用户输入、对话历史和输出格式约束——这些是每次调用的变量成本。条件注入的风险按 intent 注入模块有个前提——intent 识别要准确。如果意图识别把我想退货误判为我想下单退款政策没注入Agent 就会按下单流程处理退货请求。建议在意图识别不确定时做保守策略——宁可多注入一个模块多花 Token也别漏掉关键策略。模块的版本管理当 Prompt 模块成为产品逻辑的载体后版本管理就变得重要了。推荐给每个模块加版本号用 Git 管理模块文件上线前做 A/B 测试对比新旧 Prompt 的效果。五、总结System Prompt 的分层设计本质上是用软件工程的模块化思想治理 Prompt 的复杂度。三层模型——基础角色、领域知识、任务指令——覆盖了从你的 Agent 是谁到你的 Agent 这次要做什么的全链路。核心收益可维护改一个业务规则不用翻遍 8000 字 Prompt可复用角色层和知识层可以跨 Agent 共享可测试每个模块独立可以单独 A/B 测试可观测知道每个 Prompt 调用的 Token 是怎么分配的如果你现在的 System Prompt 已经超过 2000 字并且每次修改都小心翼翼、生怕牵一发动全身——是时候做一次分层重构了。和代码重构一样Prompt 重构也是一次性投入、长期受益的工程行为。下一篇预告RAG P99 延迟从 2 秒降到 200ms全链路异步化改造实录。

相关新闻

Poppins字体终极指南:免费多语言几何字体快速上手教程

Poppins字体终极指南:免费多语言几何字体快速上手教程

Poppins字体终极指南:免费多语言几何字体快速上手教程 【免费下载链接】Poppins Poppins, a Devanagari Latin family for Google Fonts. 项目地址: https://gitcode.com/gh_mirrors/po/Poppins Poppins是一款完全免费的开源几何无衬线字体家族,…

2026/7/13 13:24:50 阅读更多 →
如何解锁WeMod高级功能:Wand-Enhancer完整实践指南

如何解锁WeMod高级功能:Wand-Enhancer完整实践指南

如何解锁WeMod高级功能:Wand-Enhancer完整实践指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 你是否厌倦了WeMod的Pro功能限制&am…

2026/7/13 13:18:07 阅读更多 →
毕设开源 深度学习驾驶行为识别系统(源码+论文)

毕设开源 深度学习驾驶行为识别系统(源码+论文)

文章目录 0 前言1 项目运行效果2 设计概要3 相关技术3.1 Dlib3.2 疲劳检测算法3.3 YOLOV5算法 4 最后 0 前言 🔥这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两…

2026/7/13 13:18:07 阅读更多 →

最新新闻

如何使用AMD-Quark实现模型量化:从BF16到MXFP4的完整转换流程

如何使用AMD-Quark实现模型量化:从BF16到MXFP4的完整转换流程

如何使用AMD-Quark实现模型量化:从BF16到MXFP4的完整转换流程 【免费下载链接】Kimi-K2-Thinking-MXFP4-AttnFP8 项目地址: https://ai.gitcode.com/hf_mirrors/amd/Kimi-K2-Thinking-MXFP4-AttnFP8 在AI模型部署中,量化技术是平衡性能与效率的关…

2026/7/13 14:24:10 阅读更多 →
基于微信小程序的水果销售商城系统设计与实现

基于微信小程序的水果销售商城系统设计与实现

摘 要 随着生活水平的提高和健康意识的增强,人们对新鲜水果的需求日益增长。然而,传统的水果销售模式存在信息不对称、购买不便、价格不透明等问题,难以满足消费者的个性化需求。微信小程序凭借其庞大的用户群体和便捷的社交属性&#xff0…

2026/7/13 14:22:06 阅读更多 →
MCP3428与PIC18F97J60在工业数据采集中的高效应用

MCP3428与PIC18F97J60在工业数据采集中的高效应用

1. 为什么选择MCP3428与PIC18F97J60组合在工业现场的数据采集中,我们常面临三个核心痛点:信号微弱易受干扰、采样精度不足导致数据失真、以及传统方案布线复杂。MCP3428这款18位Δ-Σ ADC芯片恰好能解决这些问题——其内置2.048V基准电压和可编程增益放大…

2026/7/13 14:22:06 阅读更多 →
CTF-SHOW 题解(更新中)

CTF-SHOW 题解(更新中)

我帮你把内容整理成CSDN 技术博客常用格式,重点做了这些优化:统一标题层级(H2/H3)代码、路径、命令用 行内代码区分关键操作加粗,流程更清晰去掉口语化表达,更符合技术文档风格保留你原本的解题逻辑&#x…

2026/7/13 14:22:06 阅读更多 →
3步解锁B站缓存视频:m4s转MP4工具完全指南

3步解锁B站缓存视频:m4s转MP4工具完全指南

3步解锁B站缓存视频:m4s转MP4工具完全指南 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾为B站缓存的珍贵视频只能在官方客…

2026/7/13 14:20:05 阅读更多 →
YimMenu:终极GTA5增强菜单完整使用指南与安全防护方案

YimMenu:终极GTA5增强菜单完整使用指南与安全防护方案

YimMenu:终极GTA5增强菜单完整使用指南与安全防护方案 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimM…

2026/7/13 14:18:04 阅读更多 →

日新闻

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools 你是否曾经想要调整Palwor…

2026/7/13 0:01:19 阅读更多 →
浦东旧模块回收哪家强?专业评测带你一探究竟

浦东旧模块回收哪家强?专业评测带你一探究竟

于科技迅猛飞速迭代的当下此刻, 旧模块的回收处置, 不但关联着资源的再度利用, 而且更牵扯到数据安全以及环保合规事宜。你是不是也正为那堆积得如同山峦般的旧模块而发愁? 是不是不清楚该怎样安全且高效地去处理它们? 别忧心烦恼, 就在今日, 我会以具备权威影响力的自媒体博…

2026/7/13 0:01:19 阅读更多 →
卡梅德生物技术快报|重组蛋白的表达和纯化:IMAC 金属螯合色谱全流程工艺手册|基质 - 配基 - 金属离子匹配与蛋白质分离纯化参数优化

卡梅德生物技术快报|重组蛋白的表达和纯化:IMAC 金属螯合色谱全流程工艺手册|基质 - 配基 - 金属离子匹配与蛋白质分离纯化参数优化

1 研究背景与现存技术痛点(提出问题)基因工程、蛋白质组学、生物制药研发流程中,蛋白质分离纯化是决定下游实验成败的关键环节。当前实验室常规蛋白质分离纯化工艺存在三类难以标准化的技术瓶颈:传统离子交换、分子筛层析无特异性…

2026/7/13 0:05:20 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/13 4:38:36 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/13 4:38:38 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/13 4:38:40 阅读更多 →

月新闻