共计 2477 个字符,预计需要花费 7 分钟才能阅读完成。
痛点分析:为什么你的 Agent 总在 ” 胡言乱语 ”?
开发过 AI Agent 的工程师都经历过这些场景:

- 回答漂移 :明明要求生成 JSON 格式输出,Agent 却开始写散文诗
- 多轮失忆 :第三次追问时完全忘记用户首轮设定的筛选条件
- 过度发挥 :回答保险产品时突然开始推荐不相关的加密货币
这些问题的核心往往在于提示词(Prompt)设计存在缺陷。就像给人类同事交代任务时模糊不清会导致执行偏差,低质量的提示词会让大模型 ” 误解 ” 你的真实意图。
设计原则:好提示词的三个黄金标准
- 明确性(Clarity)
- 避免开放式指令如 ” 请帮忙处理 ”,改用结构化要求
-
示例对比:
差:"告诉我关于汽车的信息" 好:"列举 3 款 2023 年销量最高的电动汽车,包含续航里程和售价" -
上下文感知(Context Awareness)
- 显式声明对话场景和角色身份
-
关键技巧:在系统指令中固化身份设定
SYSTEM_PROMPT = """ 你是一名资深保险顾问,擅长用通俗语言解释复杂条款。回答必须包含:1) 条款要点 2) 适用场景 3) 常见误区 """ -
容错性(Error Tolerance)
- 预判用户可能的错误输入并设计恢复路径
- 实战案例:当用户问 ” 怎么买 XX 保险 ” 时,先确认其是否已有目标产品
实现方案:分层提示架构实战
三层结构设计
from typing import List, Dict
class PromptBuilder:
def __init__(self):
self.system_prompt = "" # 固化角色和能力
self.user_instructions = [] # 当前用户指令
self.history = [] # 对话历史
def add_example(self, example: Dict[str, str]):
"""添加 few-shot 示例"""
self.history.append(f"示例输入:{example['input']}")
self.history.append(f"示例输出:{example['output']}")
def build(self) -> str:
return "\n".join([
"## 系统指令",
self.system_prompt,
"\n## 历史上下文",
"\n".join(self.history[-6:]), # 控制上下文长度
"\n## 当前指令",
"\n".join(self.user_instructions)
])
LangChain 集成示例
from langchain import LLMChain, PromptTemplate
from langchain.llms import OpenAI
context_aware_template = """
根据以下角色设定和对话历史回答问题:角色设定:{system_prompt}
近期对话:{history}
当前问题:{query}
请按照要求格式回答:1. 直接答案
2. 相关依据
3. 后续建议
"""
prompt = PromptTemplate(input_variables=["system_prompt", "history", "query"],
template=context_aware_template
)
chain = LLMChain(llm=OpenAI(temperature=0.3), # 降低随机性
prompt=prompt
)
性能优化:Token 使用的艺术
- 上下文窗口管理
- 采用滑动窗口机制,优先保留最近 3 轮对话
-
对历史消息进行摘要(可用 GPT-3.5-turbo 生成摘要)
-
响应延迟优化
- 设置 max_tokens 限制(通常 150-300)
-
使用流式响应(stream=True)提升感知速度
-
成本控制技巧
- 对长文档采用嵌入搜索(Embedding Search)替代全文输入
- 监控 Token 消耗 API:
def calculate_cost(response): """计算 OpenAI API 调用成本""" model_rates = {"gpt-4": (0.03, 0.06), # 输入 / 输出 每 1K tokens 价格 "gpt-3.5-turbo": (0.0015, 0.002) } input_cost = (response.usage.prompt_tokens / 1000) * model_rates[model][0] output_cost = (response.usage.completion_tokens / 1000) * model_rates[model][1] return input_cost + output_cost
避坑指南:来自生产环境的教训
- 幻觉响应预防
- 要求模型标明信息确定性(” 根据公开资料 …” vs “ 据我推测 …”)
-
对关键事实添加验证层:
def fact_check(response: str) -> bool: """调用事实核查 API""" required_phrases = ["根据 XX 报告", "如文档第 X 节所述"] return any(phrase in response for phrase in required_phrases) -
敏感内容过滤
- 双层过滤机制:
- 提示词中声明伦理约束
- 后处理正则匹配(如银行卡号、身份证号等)
延伸思考:提示词的生命周期管理
- 版本控制策略
- 使用 Git 管理不同环境的提示词
- 命名规范:
prompt_v{版本号}_{环境}.txt -
变更记录需包含:修改人、测试结果、影响范围
-
模型迭代迁移
- 新模型上线时进行 A / B 测试
- 常见适配模式:
- GPT-3 → GPT-4:可减少 few-shot 示例数量
- Text-Davinci → ChatGPT:需要调整停止序列(stop sequences)
实践检验:量化指标对比
| 优化策略 | 准确率提升 | 平均响应时间下降 |
|---|---|---|
| 分层提示架构 | +22% | -15% |
| 动态上下文管理 | +18% | -28% |
| 严格输出格式约束 | +31% | +5% |
(测试数据基于保险问答场景的 200 次对话样本)
写在最后
提示词工程就像教 AI 说人话——既要给出明确指示,又要留出发挥空间。经过三个月的生产环境迭代,我们最大的体会是:好的 Agent 不是调出来的,而是 ” 训 ” 出来的。建议每周收集 bad cases 持续优化提示词库,这才是提升可靠性的终极法宝。
正文完
