在上一篇文章中我们讨论了提示词模板引擎的整体架构。今天我们要深入其中最基础也最实用的核心技术——变量化提示词。掌握它你的提示词将从一次性用品变成可复用的资产。这就像编程中从硬编码到使用变量的飞跃——一次设计处处使用。一、什么是变量化提示词1.1 从一个真实痛点说起我先讲一个真实场景。我的朋友小张是一名跨境电商运营每天要给不同国家的客户写产品介绍邮件。他最开始是这样做的——每次复制粘贴一份邮件模板然后手动修改里面的国家名、产品名、价格、促销截止日期等信息。一天改几十封不仅枯燥还经常出错——有一次把给日本客户的邮件里写成了Dear American Customer场面一度非常尴尬。后来他学会了变量化思维——设计一个邮件模板把所有会变化的部分用占位符标记邮件模板 --- Dear {{customer_name}} 感谢你对我们{{product_name}}的关注 目前{{product_name}}在{{country_name}}地区的售价为{{price}}促销活动将于{{promotion_end_date}}截止。 如有任何问题请随时联系我们的{{customer_service_email}}。 Best regards {{sender_name}} ---每次使用时只需要把占位符替换成实际内容。效率提升了10倍错误率降到零。变量化提示词的核心思想就是把提示词中不变的结构和可变的内容分离用占位符变量标记可变部分使用时再填充具体值。1.2 变量化提示词的三个核心要素任何一个变量化提示词系统都由三个核心要素构成要素一模板骨架。提示词中固定不变的部分——结构、指令逻辑、角色设定、输出格式要求等。模板骨架决定了提示词的基因和能力边界。要素二变量定义。哪些部分是可变的每个变量的名称、类型、可选值范围、默认值是什么清晰地定义变量是整个系统的基础。要素三变量填充规则。变量值从哪里来是人工填写、从数据库读取、还是由另一个AI自动生成填充时机是什么填充前需要做哪些校验变量化提示词 模板骨架 变量定义 变量填充规则1.3 变量化与普通模板的本质区别你可能会问这和普通的模板有什么区别区别在于结构化程度和可编程性。普通模板只是简单的查找替换——把A替换成B。而变量化提示词中的变量具备以下特征类型约束变量是有类型的文本、数字、日期、枚举等不同类型有不同的处理逻辑校验规则填充的变量值必须满足一定的条件比如价格必须大于0依赖关系变量之间可以有关联比如选择了产品A相应的价格变量自动确定默认值机制当某个变量没有被填充时系统使用预设的默认值⚠️ 很多初学者会把变量化提示词等同于CtrlH查找替换这大大低估了它的能力。变量化提示词是一种提示词编程思维它赋予提示词可配置、可组合、可扩展的能力。二、变量化的四个层次——从简单到智能2.1 第一层静态文本替换这是最基础的层次。把提示词中的固定占位符替换为具体文本值。原始模板 请为{{company_name}}写一份关于{{product_name}}的产品介绍篇幅约{{word_count}}字。 填充后 请为字节跳动写一份关于飞书的产品介绍篇幅约800字。这种层次的变量化实现起来非常简单——在代码中用一个字典存储变量名和值的映射关系然后用字符串替换函数处理即可。# Python实现简单变量替换template请为{{company_name}}写一份关于{{product_name}}的产品介绍篇幅约{{word_count}}字。variables{company_name:字节跳动,product_name:飞书,word_count:800}prompttemplateforkey,valueinvariables.items():promptprompt.replace({{key}},str(value))print(prompt) 这种层次的变量化虽然简单但已经能解决80%的日常场景。对于个人使用来说这一层就足够了。2.2 第二层条件变量替换在第二层变量的填充不再是一对一的直接映射而是可以根据变量的值选择不同的内容片段。如果 {{user_level}} vip 称呼 尊敬的VIP会员 优惠信息 您享有专属8折优惠 否则如果 {{user_level}} new 称呼 欢迎新朋友 优惠信息 首单立减20元 否则 称呼 亲爱的用户 优惠信息 全场满200减30这种条件下的变量替换让提示词具备了决策能力。一个典型的实现方式defget_greeting(user_level):ifuser_levelvip:return{salutation:尊敬的VIP会员,offer:您享有专属8折优惠}elifuser_levelnew:return{salutation:欢迎新朋友,offer:首单立减20元}else:return{salutation:亲爱的用户,offer:全场满200减30}defbuild_prompt(template,user_data):greeting_infoget_greeting(user_data[user_level])prompttemplate promptprompt.replace({{salutation}},greeting_info[salutation])promptprompt.replace({{offer}},greeting_info[offer])# 替换其他变量...returnprompt 在实际提示词工程中条件变量替换主要用于根据用户画像专业程度、使用场景、偏好语言等来动态调整提示词的语气、深度和风格。2.3 第三层上下文感知的智能变量注入到了第三层变量值不再需要人工指定而是由系统根据上下文自动推断和注入。举个例子你设计了一个通用问答助手的提示词模板。当用户问这个函数怎么用时系统自动识别出{{topic}} “编程”从用户历史对话推断{{expertise_level}} “中级”从用户之前的问题难度推断{{language_preference}} “中文”从用户的语言设置获取{{code_language}} “Python”从当前对话上下文提取然后自动组装出提示词你是一位{{expertise_level}}水平的{{topic}}专家。请用{{language_preference}}回答以下问题并提供{{code_language}}代码示例。 问题{{user_question}}这种智能注入的核心技术包括对话历史分析从历史对话中提取用户特征和偏好意图识别理解用户当前问题的真实意图知识图谱查询根据当前问题从知识库中检索相关背景信息用户画像匹配根据用户画像调整回答策略2.4 第四层自适应变量进化最高层次——变量系统能够根据使用反馈自动优化变量的取值逻辑。比如你有一个邮件标题生成器提示词其中有一个变量{{title_style}}可选值为正式/活泼/悬念/数据驱动。系统会追踪每种风格的邮件打开率然后自动调整{{title_style}}的默认值和推荐值——哪个风格效果好就更多地使用哪个风格。自适应变量系统的工作流程 1. 记录每次变量填充后的实际效果如打开率、回复率、满意度评分 2. 分析不同变量值组合与效果之间的相关性 3. 自动调整变量的默认值和推荐策略 4. 在下次填充时优先推荐历史效果最好的变量值⚠️ 第四层目前还比较前沿大多数实际项目还停留在第二层和第三层之间。但理解这个演进方向很重要——它代表了提示词工程的智能化趋势。三、变量化提示词的设计方法论3.1 第一步识别变化点设计变量化提示词的第一步是识别变化点——提示词中哪些部分在实际使用中会发生变化我总结了一个变化点识别清单用户相关的变化用户名、用户等级、用户偏好语言、用户所在地区、用户专业程度内容相关的变化产品名、价格、日期、促销信息、库存状态任务相关的变化任务类型分析/创作/总结/翻译、输出格式JSON/表格/Markdown环境相关的变化当前时间、季节、节日、热点事件质量相关的变化输出篇幅、详细程度、创意程度、保守程度 一个实用技巧把你现有的10个最常用的提示词拿出来用不同颜色标出每次都要改的部分和永远不变的部分。标出来的每次都要改的部分就是你的第一批变量。3.2 第二步变量命名与分类识别出变化点之后给每个变量起一个清晰、有意义的名字。我建议遵循以下命名规范使用描述性名称见名知义{{customer_name}}而不是{{var1}}保持一致的命名风格全小写下划线连接snake_case或双括号包裹对枚举型变量在名称中体现其类型{{user_level_enum}}对必填变量可以用特殊标记{{REQUIRED:customer_name}}常见的变量分类变量类别说明示例变量名身份变量标识用户或对象身份{{user_name}},{{company_name}}内容变量任务的具体内容描述{{topic}},{{question}},{{document}}配置变量控制输出的行为和格式{{output_format}},{{word_limit}}风格变量控制语言风格和语气{{tone}},{{style}},{{language}}上下文变量从环境中自动获取的信息{{current_date}},{{user_location}}3.3 第三步设计变量约束一个好的变量系统必须有明确的约束规则否则就会出现垃圾进、垃圾出的问题。变量约束通常包括以下几类类型约束变量值必须符合特定的数据类型。{{price}}数字类型精确到小数点后两位 {{date}}日期类型格式为YYYY-MM-DD {{email}}字符串类型必须符合邮箱格式范围约束变量值必须在合理的取值范围内。{{word_count}}整数范围[100, 5000] {{temperature}}浮点数范围[0.0, 1.0]表示AI的创意程度 {{user_age}}整数范围[0, 150]枚举约束变量值只能从预定义的选项中选择。{{output_format}}枚举可选值[JSON, Markdown, 纯文本, 表格] {{tone}}枚举可选值[正式, 友好, 幽默, 严肃, 热情] {{language}}枚举可选值[中文, English, 日本語]依赖约束某些变量的取值依赖于其他变量。如果 {{language}} 中文则 {{min_word_count}} 默认 800 如果 {{language}} English则 {{min_word_count}} 默认 300 约束设计得越清晰变量填充时的错误就越少最终生成的提示词质量就越高。3.4 第四步建立默认值和回退机制⚠️ 变量设计中有一个重要原则永远不要让变量为空。每个变量都应该有一个合理的默认值这样当某个场景下忘了填充时系统不至于崩溃。默认值设计策略统计型默认值选择最常使用的值作为默认值比如大部分用户偏好中文默认语言就设为中文安全型默认值选择最安全的值作为默认值比如语调默认为专业友好既不过于正式也不过于随意上下文推断型默认值根据其他已填充的变量推断默认值比如用户所在地是北京默认语言推断为中文# 带有默认值和回退机制的变量填充VARIABLE_DEFAULTS{language:中文,tone:专业友好,output_format:Markdown,word_count:800,temperature:0.7,expertise_level:中级,}deffill_variable(var_name,provided_valueNone):填充变量如果未提供值则使用默认值ifprovided_valueisnotNoneandprovided_value!:# 进行约束校验ifvalidate_variable(var_name,provided_value):returnprovided_value# 使用默认值returnVARIABLE_DEFAULTS.get(var_name,[未设置])四、实战案例构建一个变量化的客户服务提示词系统4.1 场景描述假设你是一家SaaS公司的客户成功经理你需要一个可以处理多种客户服务场景的提示词系统。不同场景下用户身份不同新用户、付费用户、VIP用户、流失用户问题类型不同技术问题、账单问题、功能咨询、投诉沟通渠道不同邮件、在线聊天、电话脚本紧急程度不同普通、紧急、危机4.2 设计变量定义表变量名类型可选值/范围默认值说明{{customer_name}}文本任意字符串“尊敬的用户”客户名称{{customer_level}}枚举new/paying/vip/churned“paying”客户等级{{issue_type}}枚举tech/billing/inquiry/complaint“inquiry”问题类型{{channel}}枚举email/chat/phone“email”沟通渠道{{urgency}}枚举normal/urgent/crisis“normal”紧急程度{{tone}}枚举formal/friendly/empathetic/authoritative“friendly”回复语气{{response_length}}数字100-1000300回复字数{{include_knowledge_base}}布尔true/falsetrue是否引用知识库{{agent_name}}文本任意字符串“客服小智”客服署名4.3 构建条件化的模板骨架你是一名专业的SaaS客服代表名字叫{{agent_name}}。 【当前场景】 - 客户姓名{{customer_name}} - 客户类型{{customer_level}} - 问题类型{{issue_type}} - 沟通渠道{{channel}} - 紧急程度{{urgency}} 【回复要求】 请以{{tone}}的语气回复客户回复篇幅控制在{{response_length}}字以内。 {{#if customer_level vip}} 请注意该客户为VIP客户回复中需要体现对其特殊身份的尊重优先处理其诉求 并主动提供增值服务选项。 {{/if}} {{#if customer_level new}} 请注意该客户为新用户回复中需要包含产品使用引导信息帮助他们快速上手。 语气应更加热情和鼓励。 {{/if}} {{#if customer_level churned}} 请注意该客户为流失用户回复的目标是挽留。语气应更加真诚主动询问流失原因 并提供回归优惠。 {{/if}} {{#if issue_type complaint}} 请注意这是一条投诉处理优先级最高。首先表达诚挚的歉意然后给出明确的解决方案 和时间节点最后提供补偿方案。 {{/if}} {{#if issue_type tech}} {{#if include_knowledge_base true}} 参考以下知识库内容回答技术问题 {{knowledge_base_content}} {{/if}} 在回复中要提供清晰的操作步骤如果问题复杂建议分步骤说明。 {{/if}} {{#if channel chat}} 回复风格简短、口语化、即时感。使用短句适当使用表情符号。 {{/if}} {{#if channel email}} 回复风格正式但不死板有适当的开头和结尾。使用标准邮件格式。 {{/if}} {{#if channel phone}} 回复风格这是一个电话沟通脚本。使用口语化表达包含问候、确认问题、 解决方案、确认满意、结束语等环节。标注每部分的预计时长。 {{/if}} {{#if urgency crisis}} ⚠️ 最高优先级立即安抚客户情绪告知已启动紧急处理流程 给出明确的处理时间线精确到小时并提供直达联系人的联系方式。 {{/if}} 【客户原始消息】 {{customer_message}} 请生成回复内容。4.4 实际填充示例场景一VIP用户的技术紧急问题在线聊天填充变量后生成的提示词你是一名专业的SaaS客服代表名字叫客服小智。 【当前场景】 - 客户姓名张总 - 客户类型vip - 问题类型tech - 沟通渠道chat - 紧急程度urgent 【回复要求】 请以friendly的语气回复客户回复篇幅控制在300字以内。 请注意该客户为VIP客户回复中需要体现对其特殊身份的尊重优先处理其诉求 并主动提供增值服务选项。 参考以下知识库内容回答技术问题 [知识库中关于该技术问题的解决方案] 在回复中要提供清晰的操作步骤如果问题复杂建议分步骤说明。 回复风格简短、口语化、即时感。使用短句适当使用表情符号。 ⚠️ 最高优先级立即安抚客户情绪告知已启动紧急处理流程 给出明确的处理时间线精确到小时并提供直达联系人的联系方式。 【客户原始消息】 张总系统后台完全打不开了我们正在给董事会做季度汇报半小时内必须解决 看到没有通过变量化设计一个模板骨架可以适应几十种不同的客户服务场景。这就是变量化提示词的威力——用一套逻辑覆盖海量变化。五、变量化提示词的工程实现5.1 基于Python的轻量实现对于个人或小团队一个简单的Python脚本就能实现变量化提示词系统importrefromdatetimeimportdatetimefromtypingimportDict,Any,OptionalclassPromptVariableEngine:轻量级提示词变量引擎def__init__(self):# 系统内置变量self.builtin_vars{current_date:datetime.now().strftime(%Y-%m-%d),current_time:datetime.now().strftime(%H:%M:%S),current_datetime:datetime.now().strftime(%Y-%m-%d %H:%M:%S),current_year:str(datetime.now().year),current_month:str(datetime.now().month),}# 变量默认值self.defaults{}# 条件分支规则self.conditions{}defset_default(self,var_name:str,default_value:str):设置变量的默认值self.defaults[var_name]default_valuedefadd_condition(self,var_name:str,condition_fn,value_fn):添加条件变量规则ifvar_namenotinself.conditions:self.conditions[var_name][]self.conditions[var_name].append((condition_fn,value_fn))defrender(self,template:str,variables:Dict[str,Any]None)-str:渲染模板替换所有变量ifvariablesisNone:variables{}# 合并内置变量、默认值和用户提供的变量all_vars{**self.defaults,**self.builtin_vars}# 用户提供的变量优先级最高all_vars.update(variables)# 处理条件变量forvar_name,condition_listinself.conditions.items():forcondition_fn,value_fnincondition_list:ifcondition_fn(all_vars):all_vars[var_name]value_fn(all_vars)break# 执行变量替换defreplace_var(match):var_namematch.group(1).strip()# 支持 {{var_name:default_value}} 语法if:invar_name:var_name,fallbackvar_name.split(:,1)returnstr(all_vars.get(var_name,fallback))returnstr(all_vars.get(var_name,f{{{{{var_name}}}}}))resultre.sub(r\{\{(.?)\}\},replace_var,template)returnresult# 使用示例enginePromptVariableEngine()# 设置默认值engine.set_default(language,中文)engine.set_default(tone,专业友好)engine.set_default(word_count,800)# 添加条件规则VIP用户使用更正式的语气engine.add_condition(tone,lambdavars:vars.get(user_level)vip,lambdavars:正式专业)# 渲染提示词template 你是一位专业的写作助手。 请用{{language}}以{{tone}}的语气回答以下问题。 回答篇幅约{{word_count}}字。 用户等级: {{user_level:普通}} 问题{{question}} promptengine.render(template,{user_level:vip,question:如何提升团队协作效率})print(prompt)5.2 使用Jinja2实现高级变量化对于更复杂的需求我推荐使用成熟的模板引擎如Jinja2Python或HandlebarsJavaScript。它们天生支持条件判断、循环、过滤器等高级功能。fromjinja2importTemplate,Environment# 创建Jinja2环境envEnvironment()# 自定义过滤器deflevel_to_title(level):mapping{vip:尊敬的VIP客户,paying:亲爱的付费用户,new:欢迎新朋友,churned:我们想念你}returnmapping.get(level,亲爱的用户)env.filters[level_to_title]level_to_title# 提示词模板template_str 你是一名专业的客户服务代表名叫{{ agent_name }}。 你的回复对象{{ customer_name | level_to_title }} {% if customer_level vip %} ️ VIP专属要求 - 最高优先级处理 - 专属折扣码{{ vip_discount_code }} - 直达技术支持热线{{ vip_hotline }} {% elif customer_level new %} 新用户引导要求 - 包含基础功能引导 - 提供新手教程链接 - 赠送新手礼包码{{ new_user_gift_code }} {% elif customer_level churned %} 流失用户召回要求 - 真诚询问离开原因 - 提供回归专属优惠 - 展示最新的产品改进 {% else %} 标准服务要求 - 高效专业地解决问题 - 适时推荐相关功能 {% endif %} {% if urgency crisis %} 【紧急处理模式】 请立即安抚客户并告知预计解决时间{{ estimated_resolution_time }} {% endif %} 回复语气{{ tone }} 回复篇幅{{ response_length }}字以内 【客户消息】 {{ customer_message }} 请生成回复。 templateenv.from_string(template_str)resulttemplate.render(agent_name小智,customer_name张总,customer_levelvip,vip_discount_codeVIP2025,vip_hotline400-888-9999,urgencynormal,tone专业友好,response_length300,customer_message我想了解一下你们新出的数据分析功能。)print(result) Jinja2的强大之处在于它提供了完整的编程语言能力——条件、循环、宏定义、模板继承等让你可以构建非常复杂的变量化提示词系统。5.3 变量的安全处理⚠️ 变量化提示词有一个重要的安全考量——注入攻击防护。如果你的提示词系统接受外部用户输入比如让用户设置{{customer_name}}恶意用户可能会输入特殊内容来破坏提示词的结构。常见的安全措施importredefsanitize_variable(value:str,max_length:int200)-str:对变量值进行安全清洗# 截断过长内容valuevalue[:max_length]# 移除可能的模板注入字符dangerous_patterns[r\{\{,# 防止嵌套变量注入r\}\},r{%,# 防止Jinja2代码注入r%},r{%-,# 防止Jinja2代码注入带空格控制r-%},]forpatternindangerous_patterns:valuere.sub(pattern,,value)# 移除控制字符valuere.sub(r[\x00-\x08\x0b\x0c\x0e-\x1f\x7f],,value)returnvalue.strip() 安全处理是可复用提示词系统的底线要求。尤其是在多用户共享的提示词平台上变量安全校验绝不能省略。六、变量化提示词的最佳实践6.1 变量粒度原则变量的粒度应该恰到好处——太粗一个变量覆盖太多变化灵活性不足太细每个细节都是一个变量维护成本太高。我的经验法则是一个变量只控制一个维度的变化。比如不要把语气和称呼放在一个变量里而是用{{tone}}控制语气、{{salutation}}控制称呼。6.2 变量命名规范好的变量命名能让模板的可读性大幅提升。我推荐的命名规范✅ 好的命名 {{customer_full_name}} — 清晰描述内容 {{product_price_cny}} — 包含单位和货币信息 {{output_language_code}} — 明确是代码而非全称 {{max_response_length}} — max前缀明确了这是上限 ❌ 不好的命名 {{var1}} — 完全不知道是什么 {{name}} — 太泛哪个name {{x}} — 太短没有信息量 {{shangpijiage}} — 拼音国际化不友好6.3 变量文档化每一个变量都应该有清晰的文档说明。我推荐为每个变量记录以下信息变量名称{{user_expertise_level}} 变量类型枚举 可选值beginner / intermediate / advanced / expert 默认值intermediate 说明用户在该领域的专业程度。影响回答的深度、术语使用和技术细节的详细程度。 示例beginner → 用通俗语言解释避免术语提供基础概念说明 expert → 使用专业术语深入技术细节可引用学术文献 影响范围主要影响【角色设定】和【回答深度】部分6.4 逐步演进原则⚠️ 不要试图一开始就设计一个完美的变量系统。我见过太多人花了几个月设计了一个超级复杂的变量化框架结果发现大部分变量根本用不上。正确的做法是从最简单的静态替换开始在实际使用中发现这个地方如果能根据情况变化就好了把那个地方改造成一个变量重复步骤2和3逐步演进✅ 本文核心要点总结变量化提示词的核心将不变的结构与可变的内容分离用占位符标记可变部分四个演进层次静态文本替换 → 条件变量替换 → 上下文感知智能注入 → 自适应变量进化设计方法论四步走识别变化点 → 变量命名与分类 → 设计变量约束 → 建立默认值和回退机制变量约束包括类型约束、范围约束、枚举约束、依赖约束——约束越清晰质量越高工程实现可从Python脚本起步逐步升级到Jinja2等成熟模板引擎安全处理不可忽视对用户输入的变量值进行清洗防止注入攻击最佳实践合理的变量粒度、清晰的命名规范、完善的变量文档、渐进式演进本文是《提示词工程教程》系列的第101篇。掌握了变量化思维你就拥有了让提示词活起来的能力。下一篇我们将学习条件分支提示词——让提示词根据输入动态调整自身结构。