《提示工程架构师实战:从零搭建适配多场景的AI提示系统》
引言:你为什么需要一套“多场景提示系统”?
你有没有过这样的经历?
- 为客服场景写了一套完美提示,换成交互式问答场景,生成的回复要么太机械要么跑题;
- 好不容易调好的营销文案提示,用到产品推荐场景,输出的内容完全不符合用户画像;
- 每次新增场景,都要从头写提示,重复劳动不说,还总踩“上下文漏传”“格式错误”的坑。
零散的提示就像散落的乐高零件——你有很多好用的“模块”,但没有“说明书”和“架构图”,永远拼不出能应对不同场景的“机器人”。
而提示工程架构师的核心能力,就是把“零散提示”升级为“可复用的提示系统”:通过组件化设计,让一套系统适配N个场景,让AI从“一次性工具”变成“能应对复杂业务的助手”。
本文将以**“从0到1构建多场景提示系统”为线索,用真实业务场景+可运行代码**,帮你掌握:
- 如何拆解多场景的核心需求?
- 如何设计“可复用”的提示组件?
- 如何让提示系统“自适应”不同场景?
- 如何用反馈循环优化系统效果?
目标读者 & 准备工作
目标读者
- 有AI应用基础(用过ChatGPT/Claude,调用过LLM API);
- 想从“写单条提示”升级到“设计提示系统”的产品经理/算法工程师/AI开发者;
- 面临“多场景提示复用”痛点的业务负责人(比如同时要做客服、营销、工具调用的AI产品)。
准备工作
- 知识储备:了解LLM基础能力(上下文理解、生成、推理),懂基本的系统设计思维;
- 工具环境:
- Python 3.8+(推荐用虚拟环境);
- 安装LLM SDK(比如
openai/anthropic); - 可选:Postman(测试API)、Notion(梳理需求)。
核心实战:手把手搭建多场景提示系统
我们的目标是构建一个能适配“客服投诉”“营销文案”“工具调用”三大场景的提示系统。整个流程分为5步:
- 需求拆解:明确每个场景的“输入-场景-输出”边界;
- 组件设计:构建“原子提示库+场景规则引擎”;
- 动态生成:根据场景和输入拼接最终提示;
- 场景调试:用反馈循环优化提示效果;
- 系统落地:集成API并监控稳定性。
步骤一:需求拆解——先搞清楚“每个场景要什么”
做什么?
用“三要素法”拆解每个场景的核心需求:
- 输入:用户/系统给的信息(比如订单号、用户画像);
- 场景特征:该场景的“特殊要求”(比如客服要共情,营销要口语化);
- 输出:AI需要生成的内容格式(比如结构化回复、短文案)。
为什么?
很多人做提示系统的第一个坑,就是“没明确场景边界”——比如把“客服”和“营销”的提示混在一起,导致AI回复要么太生硬(营销场景用了客服的共情模板),要么太随意(客服场景用了营销的创意模板)。
实战示例:三大场景的需求拆解
我们以“电商APP的AI助手”为例,拆解三个核心场景:
| 场景 | 输入示例 | 场景特征 | 输出要求 |
|---|---|---|---|
| 客服投诉 | 用户问题:“快递3天没到”;订单号:12345 | 需要共情+解决问题+结构化回复 | 先道歉→查订单→给解决方案 |
| 营销文案生成 | 产品:无糖饮料;卖点:0卡0糖;用户画像:健身人群 | 口语化+场景化+突出卖点 | 短文案(≤50字)+emoji |
| 工具调用(查天气) | 用户问题:“北京明天能露营吗?” | 需要调用天气API→根据结果生成建议 | 先查天气→给露营建议 |
步骤二:组件设计——构建“原子提示库+场景规则引擎”
做什么?
把提示拆成可复用的“原子组件”(比如“共情模板”“工具调用模板”),再用场景规则引擎定义“什么时候用哪些组件”。
这一步是提示系统的核心架构——就像乐高的“积木+说明书”:原子提示是积木,规则引擎是说明书,组合起来就能搭出不同的“造型”(场景)。
组件1:原子提示库——可复用的“提示积木”
定义:原子提示是不可再拆分的通用提示模块,包含“模板内容”和“必填参数”。
设计原则:
- 单一职责(一个原子提示只做一件事);
- 参数化(用
{变量}代替固定内容,适配不同输入); - 易扩展(新增场景时,只需组合已有原子提示)。
实战示例:构建原子提示库
我们用Python类封装原子提示(方便复用和维护):
fromtypingimportList,Dict,CallableclassAtomPrompt:"""原子提示组件:封装可复用的提示模板"""def__init__(self,name:str,# 组件名称(唯一标识)template:str,# 提示模板(含{变量})required_params:List[str]=None,# 必填参数(确保模板能渲染)description:str=""# 组件描述(方便团队协作)):self.name=name self.template=template self.required_params=required_paramsor[]self.description=descriptiondefrender(self,params:Dict)->str:"""渲染模板:用参数替换变量"""# 检查必填参数是否齐全missing=[pforpinself.required_paramsifpnotinparams]ifmissing:raiseValueError(f"原子提示[{self.name}]缺少参数:{missing}")# 渲染模板(用format替换变量)returnself.template.format(**params)# -------------------------- 实战:创建常用原子提示 --------------------------# 1. 共情模板(客服场景通用)empathy_prompt=AtomPrompt(name="empathy",template="很抱歉让你遇到这样的问题,我完全理解你的{emotion}——换做是我也会着急的。",required_params=["emotion"],description="用于客服场景,安抚用户情绪")# 2. 工具调用模板(需要实时数据的场景通用)tool_call_prompt=AtomPrompt(name="tool_call",template="请调用「{tool_name}」工具,参数为{params}(JSON格式),获取结果后再生成回复。",required_params=["tool_name","params"],description="用于需要调用外部工具的场景(比如查订单、查天气)")# 3. 营销创意模板(营销场景通用)marketing_creative_prompt=AtomPrompt(name="marketing_creative",template="请用{target_audience}的口语化表达,突出产品的「{selling_point}」,比如:「{example}」。",required_params=["target_audience","selling_point","example"],description="用于生成营销文案,适配不同用户画像")# 4. 结构化输出模板(需要固定格式的场景通用)structured_output_prompt=AtomPrompt(name="structured_output",template="请按照以下格式输出:\n1. 问题原因:\n2. 解决方案:\n3. 预计时间:",description="用于需要结构化回复的场景(比如客服投诉)")组件2:场景规则引擎——定义“积木的组合方式”
定义:场景规则是**“场景类型→触发条件→原子提示组合”**的映射,告诉系统“在什么场景下,用哪些原子提示”。
设计原则:
- 明确触发条件(比如“输入包含‘投诉’→ 触发客服规则”);
- 顺序化组合(原子提示的顺序决定了AI的思考逻辑);
- 可配置(支持动态调整组合方式,无需改代码)。
实战示例:定义三大场景的规则
我们用SceneRule类封装场景规则:
classSceneRule:"""场景规则:定义场景与原子提示的映射关系"""def__init__(self,scene_type:str,# 场景类型(唯一标识,比如"customer_service")trigger:Callable,# 触发条件(函数,输入用户数据返回布尔值)prompt_sequence:List[Dict],# 原子提示组合顺序(含参数)description:str=""# 场景描述):self.scene_type=scene_type self.trigger=trigger self.prompt_sequence=prompt_sequence# 格式:[{"name": "empathy", "params": {"emotion": "着急"}}]self.description=description# -------------------------- 实战:创建场景规则 --------------------------# 1. 客服投诉场景规则customer_service_rule=SceneRule(scene_type="customer_service",# 触发条件:输入包含“投诉”“没到”“延迟”等关键词trigger=lambdainput_data:any(keywordininput_data["user_input"]forkeywordin["投诉","没到","延迟"]),# 原子提示组合顺序:共情→工具调用→结构化输出prompt_sequence=[{"name":"empathy","params":{"emotion":"着急"}},{"name":"tool_call","params":{"tool_name":"order_query","params":{"order_id":"{order_id}"}}},{"name":"structured_output","params":{}}],description="处理用户快递延迟、订单投诉等问题")# 2. 营销文案生成规则marketing_rule=SceneRule(scene_type="marketing",# 触发条件:输入包含“文案”“推广”“宣传”等关键词trigger=lambdainput_data:any(keywordininput_data["user_input"]forkeywordin["文案","推广","宣传"]),# 原子提示组合顺序:营销创意→短文案要求prompt_sequence=[{"name":"marketing_creative","params":{"target_audience":"{target_audience}","selling_point":"{selling_point}","example":"夏天健身完喝这个,比奶茶健康10倍!"}},# 新增一个“短文案要求”的原子提示(需提前定义){"name":"short_text_requirement","params":{"max_length":50}}],description="生成适配用户画像的营销短文案")# 3. 工具调用(查天气)场景规则weather_tool_rule=SceneRule(scene_type="weather_tool",# 触发条件:输入包含“天气”“露营”“下雨”等关键词trigger=lambdainput_data:any(keywordininput_data["user_input"]forkeywordin["天气","露营","下雨"]),# 原子提示组合顺序:工具调用→建议生成prompt_sequence=[{"name":"tool_call","params":{"tool_name":"weather_api","params":{"city":"{city}"}}},{"name":"advice_generator","params":{"activity":"{activity}"}}],description="调用天气API,给用户露营/出行建议")关键说明:
- 触发条件用
lambda函数实现,灵活判断输入是否匹配场景; - 原子提示的参数支持动态占位符(比如
{order_id}),后续会用用户输入的数据替换; - 顺序很重要:比如客服场景先“共情”再“解决问题”,符合用户的心理预期。
步骤三:动态生成——让提示“自适应”不同场景
做什么?
根据用户输入和场景类型,自动拼接原子提示,生成最终的LLM提示。
这一步是“从组件到系统”的关键——就像组装乐高:输入是“用户想要的造型(场景)”和“零件参数(用户数据)”,系统自动按照说明书(规则)把积木拼起来。
核心组件:动态提示生成器
我们用DynamicPromptGenerator类实现这一功能,核心逻辑是:
- 根据场景类型找到对应的规则;
- 检查输入是否满足触发条件;
- 按顺序渲染每个原子提示;
- 拼接成最终提示。
classDynamicPromptGenerator:"""动态提示生成器:根据场景和输入生成最终提示"""def__init__(self,atom_prompts:List[AtomPrompt],scene_rules:List[SceneRule]):# 将原子提示和场景规则存入字典,方便快速查询self.atom_prompts_map={prompt.name:promptforpromptinatom_prompts}self.scene_rules_map={rule.scene_type:ruleforruleinscene_rules}defgenerate(self,scene_type:str,input_data:Dict)->str:""" 生成最终提示 :param scene_type: 场景类型(比如"customer_service") :param input_data: 用户输入数据(比如{"user_input": "快递没到", "order_id": "12345"}) :return: 最终的LLM提示字符串 """# 1. 检查场景是否存在ifscene_typenotinself.scene_rules_map:raiseValueError(f"未找到场景类型:{scene_type}")rule=self.scene_rules_map[scene_type]# 2. 检查输入是否满足触发条件ifnotrule.trigger(input_data):raiseValueError(f"输入不符合场景[{scene_type}]的触发条件")# 3. 按顺序渲染每个原子提示final_prompt_parts=[]forprompt_infoinrule.prompt_sequence:prompt_name=prompt_info["name"]# 检查原子提示是否存在ifprompt_namenotinself.atom_prompts_map:raiseValueError(f"未找到原子提示:{prompt_name}")atom_prompt=self.atom_prompts_map[prompt_name]# 合并参数:原子提示的默认参数 + 用户输入数据# 注意:用户输入数据会覆盖默认参数(比如{order_id}会被input_data["order_id"]替换)merged_params={**prompt_info["params"],**input_data}# 渲染原子提示rendered_prompt=atom_prompt.render(merged_params)final_prompt_parts.append(rendered_prompt)# 4. 拼接成最终提示(用换行分隔,增强可读性)return"\n\n".join(final_prompt_parts)实战:生成第一个动态提示
我们用客服投诉场景测试生成器:
# -------------------------- 初始化生成器 --------------------------# 1. 收集所有原子提示all_atom_prompts=[empathy_prompt,tool_call_prompt,marketing_creative_prompt,structured_output_prompt,# 新增“短文案要求”和“建议生成”的原子提示(需提前定义)AtomPrompt(name="short_text_requirement",template="请将文案控制在{max_length}字以内,加1个相关emoji。",required_params=["max_length"]),AtomPrompt(name="advice_generator",template="根据天气结果,给{activity}的用户提1条具体建议。",required_params=["activity"])]# 2. 收集所有场景规则all_scene_rules=[customer_service_rule,marketing_rule,weather_tool_rule]# 3. 初始化生成器generator=DynamicPromptGenerator(all_atom_prompts,all_scene_rules)# -------------------------- 测试客服场景 --------------------------# 用户输入数据input_data={"user_input":"我的快递3天没到,订单号12345","order_id":"12345"# 对应原子提示中的{order_id}}# 生成最终提示try:final_prompt=generator.generate("customer_service",input_data)print("最终提示:\n",final_prompt)exceptValueErrorase:print("生成失败:",e)输出结果:
最终提示: 很抱歉让你遇到这样的问题,我完全理解你的着急——换做是我也会着急的。 请调用「order_query」工具,参数为{"order_id": "12345"}(JSON格式),获取结果后再生成回复。 请按照以下格式输出: 1. 问题原因: 2. 解决方案: 3. 预计时间:为什么这很重要?
- 无需手动写提示:不管是客服、营销还是工具调用场景,只需传入场景类型和输入数据,系统自动生成提示;
- 可复用性高:新增场景时,只需定义新的
SceneRule,无需修改原子提示; - 一致性强:所有场景都用统一的原子提示,避免“同一场景不同提示”的问题。
步骤四:场景调试——用反馈循环优化提示效果
做什么?
通过**“生成→评估→调整”**的反馈循环,优化提示系统在不同场景的效果。
很多人做提示系统的第二个坑,就是“写完就上线”——忽略了不同场景的“隐性需求”(比如客服场景的“共情程度”,营销场景的“用户画像匹配度”)。
核心方法:A/B测试+用户反馈
1. 定义评估指标
不同场景的评估指标不同:
- 客服场景:用户满意度(1-5分)、问题解决率;
- 营销场景:文案转化率(点击/曝光)、用户点赞数;
- 工具调用场景:工具调用成功率、建议实用性。
2. 用A/B测试优化原子提示
比如营销场景,我们想优化“营销创意模板”,可以做两组测试:
- A组模板:“请用{target_audience}的口语化表达,突出产品的「{selling_point}」,比如:「{example}」。”
- B组模板:“请站在{target_audience}的角度,讲一个使用产品的场景,比如:「{example}」。”
用同一批输入数据生成文案,对比两组的转化率:如果B组转化率更高,就把B组模板替换到原子提示库中。
实战示例:优化客服场景的共情模板
问题:初始的共情模板生成的回复太“机械”,用户反馈“没有温度”。
初始模板:“很抱歉让你遇到这样的问题,我完全理解你的{emotion}——换做是我也会着急的。”
优化思路:增加“具体场景描述”,让共情更真实。
优化后模板:“很抱歉让你等了3天还没收到快递——我之前买的生日礼物也延迟过,那种期待落空的感觉真的很糟。”
测试结果:用户满意度从3.2分提升到4.5分。
步骤五:系统落地——集成API并监控稳定性
做什么?
把提示系统包装成API,集成到业务系统中,并监控系统的性能和效果。
1. 包装成API(用FastAPI)
我们用FastAPI快速实现一个提示生成接口:
fromfastapiimportFastAPI,HTTPExceptionfrompydanticimportBaseModel# 初始化FastAPI应用app=FastAPI(title="多场景提示系统API",version="1.0")# 定义请求体格式classPromptRequest(BaseModel):scene_type:str# 场景类型input_data:Dict# 用户输入数据# 初始化动态提示生成器(复用之前的代码)# ...(省略all_atom_prompts和all_scene_rules的初始化)...generator=DynamicPromptGenerator(all_atom_prompts,all_scene_rules)# 定义提示生成接口@app.post("/generate-prompt")asyncdefgenerate_prompt(request:PromptRequest):try:final_prompt=generator.generate(request.scene_type,request.input_data)return{"scene_type":request.scene_type,"final_prompt":final_prompt}exceptValueErrorase:raiseHTTPException(status_code=400,detail=str(e))# 启动服务:uvicorn main:app --reload2. 监控系统效果
关键监控指标:
- 接口性能:QPS(每秒请求数)、响应时间(P95/P99);
- 场景使用情况:各场景的调用次数、占比;
- 提示效果:各场景的用户满意度、转化率、错误率(比如工具调用失败次数)。
工具推荐:
- 性能监控:Prometheus + Grafana;
- 用户反馈:问卷星、产品内埋点;
- 错误监控:Sentry。
进阶探讨:多场景提示系统的扩展方向
当你掌握了基础架构,可以尝试以下进阶方向:
1. 多模态场景的提示设计
如果你的系统需要处理图片+文本的输入(比如“识别图片中的商品,生成营销文案”),可以扩展原子提示库:
# 多模态原子提示:图片识别+文案生成multimodal_prompt=AtomPrompt(name="multimodal_creative",template="请先识别图片中的商品({image_url}),然后根据商品类型生成{target_audience}的营销文案。",required_params=["image_url","target_audience"])2. 跨场景的迁移学习
比如把“客服场景”的“共情模板”迁移到“售后场景”,只需修改场景规则的触发条件:
# 售后场景规则(复用客服的共情模板)after_sale_rule=SceneRule(scene_type="after_sale",trigger=lambdainput_data:"退货"ininput_data["user_input"]or"退款"ininput_data["user_input"],prompt_sequence=[{"name":"empathy","params":{"emotion":"失望"}},# 复用客服的共情模板{"name":"refund_process","params":{}}# 新增售后流程模板])3. 自动提示优化
用LLM自身来优化原子提示——比如让GPT-4帮你生成更优的模板:
fromopenaiimportOpenAI client=OpenAI()defauto_optimize_prompt(original_prompt:str,feedback:str)->str:"""用GPT-4自动优化原子提示"""response=client.chat.completions.create(model="gpt-4",messages=[{"role":"system","content":"你是提示工程专家,擅长根据反馈优化提示模板。"},{"role":"user","content":f"原始提示:{original_prompt}\n用户反馈:{feedback}\n请优化这个提示。"}])returnresponse.choices[0].message.content# 示例:优化共情模板original_empathy="很抱歉让你遇到这样的问题,我完全理解你的着急。"feedback="回复太机械,没有温度。"optimized_empathy=auto_optimize_prompt(original_empathy,feedback)print("优化后的共情模板:",optimized_empathy)总结:从“写提示”到“设计系统”的思维转变
通过本文的实战,你应该已经掌握了多场景提示系统的核心逻辑:
- 需求拆解:用“三要素法”明确每个场景的边界;
- 组件设计:用“原子提示库+场景规则引擎”实现可复用;
- 动态生成:让系统自动拼接提示,适配不同场景;
- 反馈优化:用A/B测试和用户反馈提升效果;
- 系统落地:包装成API并监控稳定性。
最核心的思维转变:
- 从“追求单条提示的完美”,转向“设计可复用的系统”;
- 从“手动写提示”,转向“用组件化思维搭建提示”;
- 从“一次性使用”,转向“持续迭代优化”。
行动号召:动手搭建你的第一个多场景提示系统!
现在,你已经有了完整的方法论和代码示例,接下来请:
- 从自己的业务中选2-3个核心场景(比如客服、营销);
- 用本文的方法拆解需求、构建原子提示库;
- 实现动态生成器,并测试效果;
- 收集用户反馈,持续优化。
如果你在实践中遇到问题,或者有更好的方法,欢迎在评论区留言讨论!
最后送你一句话:提示工程的本质,是“用系统思维让AI理解你的业务”——而多场景提示系统,就是你和AI之间的“翻译器”。
祝你早日搭建出能应对复杂业务的提示系统! 🚀