一、引言:为什么静态Prompt不够用了?
"Prompt不就是写一段话告诉AI要做什么吗?"这是很多初学者对Prompt Engineering的理解。确实,对于一次性问答任务,一段写死的固定文本指令可能够用。但当AI应用进入Agent执行循环、多步骤工作流等复杂场景时,情况就完全不同了。
设想一个跨境AI客服场景:用户问"我买的显示器有坏点,怎么退货?"AI需要先查订单信息,再检索退货政策,然后判断是否符合条件,最后生成回复。每一步需要的信息都不一样------第一轮需要"用户身份+订单号",第二轮需要"退货政策文档",第三轮需要"审核规则"。如果从头到尾用同一段Prompt,上下文会迅速膨胀,关键信息被淹没,模型效率直线下降。
本文的核心观点是:企业级Prompt工程不是"写提示词",而是"设计Prompt模板系统"。我们将从静态模板、动态注入、Few-shot设计到多阶段编排,逐步展开一套可复用的工程化方案。
二、Prompt模板的分层设计
2.1 四类信息,不同生命周期
在Agent场景中,一次模型调用的输入通常由四类信息拼装而成:
| 类型 | 说明 | 生命周期 | 示例 |
|---|---|---|---|
| 稳定信息 | 贯穿整个任务的身份与规则 | 长期不变 | "你是跨境客服助手,必须礼貌专业" |
| 任务信息 | 本次任务的目标和约束 | 单次任务绑定 | "处理订单ORD-001的退货申请" |
| 状态信息 | 随执行推进不断刷新 | 动态变化 | "已查库存→剩余156件→需审批" |
| 外部信息 | 按需加载的临时内容 | 用完即弃 | 检索到的政策文档、工具返回结果 |
核心原则:在每次调用前判断"这四类信息中哪些该进、哪些不该进",而不是一股脑全塞进去。
2.2 跨境电商典型Prompt模板结构
基于跨境业务场景,我们设计一套标准模板结构:
python
# 基础模板结构(示例)
SYSTEM_TEMPLATE = """
# 角色
你是一位专业的{role_name},专门处理{domain}业务。
# 行为准则
1. {rule_1}
2. {rule_2}
3. {rule_3}
# 输出格式
{output_format}
"""
TASK_TEMPLATE = """
# 当前任务
{task_description}
# 任务约束
- 处理时效:{time_limit}
- 权限范围:{permission_scope}
"""
CONTEXT_TEMPLATE = """
# 当前状态
{current_status}
# 相关数据
{retrieved_context}
"""
三、基础:LangChain PromptTemplate实战
3.1 环境准备
bash
pip install langchain langchain-openai python-dotenv
环境变量(.env):
env
OPENAI_API_KEY=sk-xxxxx
OPENAI_BASE_URL=https://api.deepseek.com/v1
3.2 基础模板:变量注入
python
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
# 1. 定义模板------支持多角色消息
chat_prompt = ChatPromptTemplate([
("system", "你是一位专业的跨境电商客服助手,擅长用{language}处理买家咨询。"),
("human", "用户问题:{question}\n\n订单信息:{order_info}\n请给出专业回复。")
])
# 2. 变量填充
messages = chat_prompt.invoke({
"language": "英文",
"question": "我的订单ORD-001什么时候发货?",
"order_info": "商品:4K显示器,下单时间:2026-08-08"
})
# 3. 调用LLM
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.3)
response = llm.invoke(messages)
print(response.content)
关键要点:
ChatPromptTemplate支持system/human/ai等多角色消息- 用
{variable_name}定义动态变量,通过invoke(dict)填充 - 支持链式调用:
chain = chat_prompt | llm
四、进阶:Few-Shot模板驱动"模式学习"
4.1 为什么需要Few-Shot?
跨境电商中的"退货政策解读"场景:规则文本可能包含十几种例外条款,模型光靠System Prompt理解不深。给几个"输入-输出"示例,模型就能快速"学会"如何匹配规则。
python
from langchain_core.prompts import ChatPromptTemplate, FewShotChatMessagePromptTemplate
# 1. 定义示例格式
example_prompt = ChatPromptTemplate.from_messages([
("human", "用户咨询:{input}"),
("ai", "我的回复:{output}")
])
# 2. 准备示例数据
examples = [
{"input": "显示器到手有坏点,能退吗?",
"output": "根据退货政策第3.1条,质量问题支持7天内免费退货。请您提供订单号和坏点照片,我们将启动退货流程。"},
{"input": "我不喜欢这个颜色,可以换货吗?",
"output": "根据退货政策第2.2条,非质量问题换货需买家承担运费。建议您确认收货后重新下单购买心仪颜色。"},
{"input": "包裹被海关扣了怎么办?",
"output": "根据国际物流政策,清关问题属于目的地海关管辖。建议您联系当地海关,同时我们会提供清关所需文件模板。"},
]
# 3. 构建Few-Shot模板
few_shot_template = FewShotChatMessagePromptTemplate(
example_prompt=example_prompt,
examples=examples,
)
# 4. 组合最终Prompt
final_prompt = ChatPromptTemplate.from_messages([
("system", "你是一位退货政策专家,请参考以下示例的推理模式处理用户咨询。"),
few_shot_template,
("human", "用户咨询:{new_query}")
])
# 5. 调用
chain = final_prompt | llm
result = chain.invoke({"new_query": "手机屏幕有一条细线,刚收到货"})
print(result.content)
Few-Shot的核心价值:通过示例让模型"理解任务模式",而不只是"记住规则"。尤其在规则边界模糊的场景(如"是否属于质量问题"的判断),Few-Shot的效果显著优于纯规则描述。
五、高阶:动态Prompt拼装系统
5.1 多阶段任务中的动态组装
Agent执行多步骤任务时,每一轮需要的信息都不同。以"处理退款工单"为例:
python
from typing import Dict, List
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
class DynamicPromptComposer:
"""动态Prompt拼装器"""
def __init__(self):
# 稳定信息(长期不变)
self.system_prompt = """
你是一位跨境电商客服AI助手,负责处理退款/退货工单。
核心原则:
1. 必须基于政策文档提供依据
2. 涉及$500以上金额需要人工审批
3. 回复必须专业、礼貌、清晰
"""
# 任务信息(本次绑定)
self.task_prompt = """
任务目标:{task_goal}
任务约束:{task_constraints}
"""
def compose(self, stage: str, state: Dict) -> ChatPromptTemplate:
"""
根据当前执行阶段动态拼装Prompt
stage: 'intent_analysis' | 'policy_query' | 'decision_making' | 'reply_generation'
"""
messages = [
("system", self.system_prompt)
]
# 添加任务信息
messages.append(("system", self.task_prompt.format(
task_goal=state.get("goal", "处理退款工单"),
task_constraints=state.get("constraints", "无特殊约束")
)))
# 阶段专用信息
if stage == "intent_analysis":
messages.append(("human", """
请分析以下用户消息的意图和情绪:
用户消息:{user_message}
输出格式:
- 意图分类:[退款/换货/咨询/投诉]
- 情绪倾向:[正面/中性/负面]
- 紧急程度:[高/中/低]
- 关键实体提取:[订单号/产品名/问题描述]
"""))
elif stage == "policy_query":
messages.append(("human", """
请根据以下政策文档和用户情况,判断是否满足退款条件:
【政策文档】
{policy_docs}
【用户情况】
订单金额:${order_amount}
购买日期:{purchase_date}
问题描述:{issue_description}
历史退款次数:{refund_count}
请给出判断依据和结论。
"""))
elif stage == "decision_making":
messages.append(("human", """
基于以下信息做出处理决策:
【判断结论】
{policy_conclusion}
【审核规则】
- 金额>500:强制人工审批
- 退款次数>=3:建议人工复核
- 其他情况:自动处理
请输出决策结果(auto_approve / manual_review / reject)和理由。
"""))
elif stage == "reply_generation":
messages.append(("human", """
请根据决策结果生成回复邮件草稿。
【决策结果】
{decision_result}
【输出要求】
1. 英文邮件格式
2. 礼貌、专业
3. 明确说明处理方案和后续步骤
"""))
return ChatPromptTemplate.from_messages(messages)
5.2 上下文自适应裁剪
上下文长度有限,必须控制进入Prompt的信息量。核心策略:区分"必填信息"和"可裁剪信息"。
python
class ContextCutter:
"""上下文裁剪器"""
def __init__(self, max_tokens: int = 4096):
self.max_tokens = max_tokens
def estimate_tokens(self, text: str) -> int:
"""粗略估算:4字符≈1 token"""
return len(text) // 4
def smart_truncate(self, context: str, priority: str = "beginning") -> str:
"""
智能裁剪
priority: 'beginning'保留开头 | 'end'保留结尾 | 'middle'保留中间
"""
tokens = self.estimate_tokens(context)
if tokens <= self.max_tokens:
return context
# 按比例裁剪
if priority == "beginning":
cut_point = int(len(context) * (self.max_tokens / tokens))
return context[:cut_point] + "\n...[内容过长,已截断]..."
elif priority == "end":
cut_point = int(len(context) * (1 - self.max_tokens / tokens))
return "...[内容过长,已截断]...\n" + context[cut_point:]
else:
# 保留中间
keep = int(len(context) * (self.max_tokens / tokens))
start = (len(context) - keep) // 2
return context[:100] + "...[截断]...\n" + context[start:start+keep] + "\n...[截断]..." + context[-100:]
六、跨境业务场景模板库
基于搜索材料中整理的跨境AI运营指令合集,整理可直接使用的Prompt模板:
6.1 客服场景
python
# 差评回复模板
COMPLAINT_RESPONSE_TEMPLATE = """
请为以下情景生成差评回复话术和后续操作步骤:
情景:{complaint_scenario}
- 产品质量投诉
- 发错货/漏发
- 物流超时
要求:
1. 初次回复(24小时内):道歉+解决方案说明
2. 后续跟进(48-72小时):进度同步+满意度确认
3. 内部复盘要点:问题根因+改进措施
用户评价原文:{review_text}
订单信息:{order_info}
"""
6.2 广告优化场景
python
# 广告策略生成模板
AD_STRATEGY_TEMPLATE = """
请基于以下预算与目标生成广告投放计划:
日预算:${daily_budget}
目标ACOS:{target_acos}%
产品品类:{product_category}
目标市场:{market}
输出内容:
1. Campaign结构(自动/手动/品牌)
2. 关键词出价建议
3. 预算分配(新品期/稳定期)
4. 创意测试节奏
"""
6.3 Listing优化场景
python
# 标题生成模板
LISTING_TITLE_TEMPLATE = """
请为以下产品生成{num_variants}个符合亚马逊SEO的英文标题:
产品名:{product_name}
核心关键词:{keywords}
目标市场:{market}
要求:
- 包含核心关键词
- 控制在150-200个字符内
- 每个标题附带1-2句卖点解释
额外约束:{custom_constraints}
"""
七、工程化最佳实践
7.1 模板版本管理
建议将Prompt模板纳入代码版本管理,并建立A/B测试机制:同一场景配置多版模板,通过实验对比效果(如客服解决率、用户满意度),用数据驱动迭代。
7.2 模板性能监控
至少记录以下指标:
- 模板渲染耗时
- Token消耗(按模板类型分组)
- 各阶段Prompt触发频率
- 异常/Fallback触发次数
7.3 模板组合与继承
复杂场景下,一个业务任务的Prompt往往是多个子模板的组合:
RAG查询模板 = 系统角色模板 + 任务模板 + Few-Shot示例模板 + 检索上下文模板
建议设计模板继承体系:基础模板定义公共规则,业务模板继承并扩展具体任务指令。
八、小结
本文从"静态Prompt不够用"这个核心痛点出发,系统介绍了Prompt模板化的进阶方案:
- 分层设计:将信息分为稳定层、任务层、状态层、外部层,按生命周期管理
- 基础模板 :用LangChain
ChatPromptTemplate实现变量注入和多角色支持 - Few-Shot增强:通过示例驱动模型学习复杂业务模式
- 动态拼装:Agent多阶段任务中,按当前状态实时构造Prompt,避免上下文膨胀
- 跨境场景模板库:覆盖客服、广告、Listing优化的可复用模板
核心思想是:Prompt不再是"写一段文字",而是"设计一套按需组装的模板系统"。这套方案已在多个跨境AI项目中落地,有效解决了长上下文场景下的精度和效率问题。
关于Prompt效果评估、自动优化(如贝叶斯调参)等进阶话题,欢迎在评论区交流。