
在大模型应用开发的实际过程中,你可能也遇到过这样一个令人哭笑不得的尴尬场景:比如在 Cherry Studio 、Dify 或 Coze 等智能体平台上,我们通常会为 Agent 配置两个最基本的规则通道:user(用户输入)+ system(系统提示词/角色设定)。
┌────────────────────────────────────────────────────────┐
│ System: 你是一个严谨、高冷的"数学专家",只用数学公式回答。 │
├────────────────────────────────────────────────────────┤
│ User: 帮我看看今晚的西红柿炒鸡蛋怎么做? │
└────────────────────────────────────────────────────────┘
但是用户的问题可能是不可预见的,比如她现在就问了一个西红柿炒鸡蛋怎么做!!
此时,由于 system 提示词的刚性限制,模型可能会返回极其怪异的错误:要么傲慢地拒绝回答非数学问题,要么强行用数学公式去推导"炒蛋的受热面积和盐的配比"。
这种"静态 System Prompt 导致的角色冲突与答非所问",是早前 LLM 应用最核心的痛点。而行业内给出的终极解决方案正是动态 Prompt 生成技术(Dynamic Prompt Generation)。
一、 核心解法:基于当前意图的"按需检索与动态注入"
动态 Prompt 生成的本质,绝不是无脑地先去扫描全部历史,而是以用户当前提问为靶向,进行"意图判定 ->关联记忆检索 ->实时 System 组装"
其完整的运行流程如下:
python
1. 用户提问 (User Query): "今晚西红柿炒蛋怎么做?"
│
▼
2. 前置元模型 (LLM) 分析当前问题 ────────────────────────┐
│ │
├─► 提取检索关键词/意图 (如: "烹饪新手", "西红柿炒蛋") │
│ │
▼ │
3. 精确检索关联记忆/画像 (Memory & Profile Search) │
│ (在历史对话向量库中,仅检索与"烹饪/生活"相关的上下文) │
▼ │
召回核心背景 (如: "用户是个烹饪新手") │
│ │
├──────────────────────────────────────────────────────┘
▼
4. 现场动态组装 System Prompt
│ (组装为: "针对厨房新手的温柔大厨",彻底卸载"数学专家")
▼
5. 最终执行模型 (Target LLM) ──► 呈现最自然、贴切的答案 (Answer)
具体的三个核心步骤:
-
前置意图识别与检索词提取(LLM): 当用户输入新问题时,一个响应极快、极轻量的"元模型"会在后台优先阅读这个问题。这个模型的system prompt
yaml你是专业的用户意图分类模型。 任务:精准识别用户输入的核心意图,仅输出预设分类,禁止冗余解释。 规则: 1. 只判断用户真实诉求,忽略语气、助词、无关闲聊内容。 2. 模糊语句优先匹配最贴合的单一主意图。 3. 严格JSON格式输出,无多余内容。 输出格式: {"intent":"意图名称","confidence":"置信度0-1","reason":"简短依据"}就是判断,它会敏锐地发现:"烹饪,西红柿炒鸡蛋。" 同时,它会提炼出用于检索历史记忆的 Key Word(如"烹饪"、"做菜")。
-
关联信息精准检索(Recall & Filter): 系统拿着提炼出的检索词,去用户画像数据库或历史多轮对话(Vector DB)中进行语义相关性检索。
- 为什么必须这一步? 如果用户历史聊过 Python,也聊过煎牛排。当前问题是"西红柿炒蛋",系统通过语义检索,只会精准召回"煎牛排(烹饪新手)"相关的背景,而自动剔除、忽略完全不相关的"Python 学习记录",从而保证了 Context 的绝对纯净。 而且从历史画像中检索内容,可以增强用户的粘度,让它知道你是懂她的,而不是随便进行推荐的。
-
动态 System 组装: 元模型会结合"精准检索回来的用户背景(以前做过西红柿炒鸡蛋)"和"当前的烹饪意图",在后台现场重新起草 一份全新的
System Prompt。
这样,发送给执行模型的最终 Payload 就不再是死板的"数学专家",而是量身定制的"针对厨房新手的温柔大厨"。
二、 范式:运行时动态合成 (Runtime Meta-Prompting)
这种模式完全发生在用户发起请求的当下(Real-time / 毫秒级响应) 。
User Query→Meta-LLM 分析Query-driven Retrieval (精确检索相关历史/画像)→动态合成Task-Specific System Prompt→Target LLM→Answer \text{User Query} \xrightarrow{\text{Meta-LLM 分析}} \text{Query-driven Retrieval (精确检索相关历史/画像)} \xrightarrow{\text{动态合成}} \text{Task-Specific System Prompt} \xrightarrow{} \text{Target LLM} \xrightarrow{} \text{Answer} User QueryMeta-LLM 分析 Query-driven Retrieval (精确检索相关历史/画像)动态合成 Task-Specific System Prompt Target LLM Answer
为什么我们必须需要它?
1. 真正实现"千人千面",尤其是像豆包这样的智能助手
单一的静态模板(One-size-fits-all)永远无法应对极端多样化的用户请求,有时一轮对话用户就可能会有多个意图存在,如果都是相同的system prompt会导致回到的数据错误率急剧提升。
当用户在同一个对话框里,前一秒问数学题,后一秒问情感问题,再下一秒写代码时,大模型在后台的"思考路径(System SOP)"和"语气约束"应该像变色龙一样,随着意图的改变而实时动态改变。
2. 缩减prompt的长度(省钱呀)
极大缩减 System Prompt 的长度(省 Token)并提高大模型的执行专注度。只有当用户真的说"我要查数据库"时,系统才动态把 2000 字的数据库操作规范(SOP)"展开"塞进 System,用完立刻"折叠"收起。 这样大模型在日常闲聊或做简单任务时,就不需要背着沉重的几十万字规则包,只有在干专业活的一瞬间,才临时"加载"详细说明书。
三、 生产环境下的真实运行实例
我们以一个复杂的技术任务为例,看看后台是如何在运行时"无感"组装的。
1. 用户的原始输入:
"帮我写一段 Python 代码,自动把 Excel 里的脏数据清洗掉,主要是去重和格式化日期。"
2. 系统后台(LLM)前置分析:
系统先让一个快速模型(如 GPT-4o-mini)进行前置分析:
- 判定意图: Python 数据清洗任务。
- 提取检索 Key: "Python"、"Pandas"、"数据清洗"。
- 检索关联历史: 从向量库中检索出该用户之前的关联记录------"该用户目前在自学 Python 基础,容易混淆 Pandas 的 inplace 参数"(剔除了用户昨天检索过"北京天气"等无关信息)。
3. 后台现场生成的动态 System Prompt:
结合当前的"数据清洗"意图和检索到的"用户常犯 inplace 错误"画像,元模型在几毫秒内生成了专属于本次提问的 System 内容:
yaml
# 角色
你现在是一个精通 Pandas 的资深数据工程师。
# 任务
编写高可用、健壮的 Python 数据清洗脚本。由于该用户是 Python 初学者,请在代码注释中详细解释每一步的作用,并特别注意说明为什么不推荐使用 inplace=True。
# 硬性约束
1. 必须使用 pandas.to_datetime 进行日期格式化,并妥善处理 NaT 异常。
2. 必须使用 drop_duplicates 并保留第一次出现的数据(keep='first')。
3. 代码必须模块化,包含清晰的 try-except 异常捕获和中文注释。
4. 最终调用与执行:
系统将这个现场量身定制的专用 System Prompt,与用户的原始问题进行拼接,发送给性能最强悍的推理模型(如 Claude 3.5 Sonnet)进行最终的代码生成。
四、 总结:Agent 拟人化的"底层秘密"
在现代 AI Agent 的工程落地中,人工手写的 System Prompt 正在退居二线。
文章看完了,所以动态prompt是什么? 其实通过引入"Query 驱动的前置意图分析"与 "精准记忆检索组装",Agent 获得了根据上下文"看人下菜碟"和"因地制宜"的能力。
ღ( ´・ᴗ・` )比心
这不仅完美解决了"数学专家面对西红柿炒蛋"的尴尬角色冲突,更让大模型能够针对用户的每一次提问,以最完美、最匹配、也最省 Token 的角色姿态给出回答。这正是现代 AI Agent 表现得越来越像一个"真人专家"的底层技术秘密。