Prompt Engineering核心技巧有哪些
一、最重要的心智模型
把模型想象成一个极其听话但字面理解能力极强的新员工。你说"帮我写个好的回答",它不知道"好"是什么意思。你说"用中文回答,分三点,每点不超过两句话,语气正式",它就能做到。
Prompt 的本质:减少模型的"猜测空间",让它的行为符合你的预期。
二、System Prompt 的四要素
一个好的 system prompt 按这个顺序写:
① 角色定义 → 你是谁,有什么背景
② 能力范围 → 你能做什么
③ 输出格式 → 怎么回答(语言、结构、长度)
④ 边界规则 → 不能做什么
差的 system prompt(太模糊):
python
system = "你是一个助手,帮用户解答问题。"
# 问题:什么类型的助手?什么问题?什么格式?
好的 system prompt(四要素齐全):
python
system = """你是一个企业内部 HR 政策助手。
【能力范围】
- 回答员工关于年假、病假、报销、薪资发放的问题
- 解释公司规章制度
【回答格式】
- 使用中文,语气专业但亲切
- 直接给出结论,再解释原因
- 超过 3 个要点时用编号列表
- 回答控制在 200 字以内
【边界规则】
- 只基于公司政策回答,不做个人判断
- 不确定时说:"建议直接联系 HR 团队确认"
- 不讨论薪资谈判、绩效申诉等敏感话题"""
三、六个核心技巧
技巧 1:Few-shot(给例子)
不要只描述你要什么,直接给几个输入输出的例子。模型会模仿格式:
python
messages = [
{"role": "system", "content": "将用户反馈分类为:功能请求 / Bug 报告 / 使用咨询 / 其他"},
# 三个示例(few-shot)
{"role": "user", "content": "登录按钮点击没反应"},
{"role": "assistant", "content": "Bug 报告"},
{"role": "user", "content": "能不能支持暗黑模式?"},
{"role": "assistant", "content": "功能请求"},
{"role": "user", "content": "怎么导出数据到 Excel?"},
{"role": "assistant", "content": "使用咨询"},
# 真正要分类的
{"role": "user", "content": "上传文件后页面白屏了"},
]
Few-shot 对格式控制特别有效——当你要模型按特定格式输出时,给一两个例子比描述强十倍。
技巧 2:Chain of Thought(让模型先想再答)
复杂推理任务(数学、逻辑、多步判断)里,让模型"展示思考过程"能显著提升准确率:
python
# 普通提问(容易出错)
{"role": "user", "content": "这个合同条款是否符合劳动法?[条款内容]"}
# CoT 提问(让模型一步步推理)
{"role": "user", "content": """
请分析这个合同条款是否符合劳动法。
请按以下步骤思考:
1. 条款的核心主张是什么?
2. 相关劳动法条文是什么?
3. 条款是否与法条冲突?
4. 最终结论
[条款内容]
"""}
也可以在 system prompt 里直接要求思维链:
python
system = """回答问题前,先用 <思考> 标签写出你的推理过程,再给出最终回答。
示例格式:
<思考>
1. 问题涉及...
2. 需要考虑...
3. 因此...
</思考>
最终回答:..."""
技巧 3:用 XML 标签隔离内容
当 prompt 里混合了"指令"和"数据"时,用 XML 标签清晰分隔。这在 RAG 场景里尤其重要,防止文档内容被当作指令:
python
def build_rag_prompt(question: str, docs: list[dict]) -> str:
context = "\n\n".join([
f"<document id='{i+1}' source='{d['filename']}'>\n{d['content']}\n</document>"
for i, d in enumerate(docs)
])
return f"""你是知识库问答助手,只基于以下文档回答问题。
<documents>
{context}
</documents>
<question>
{question}
</question>
回答要求:
- 只使用文档中的信息
- 引用时标注来源,格式:[文档1]
- 文档中没有答案时说"根据现有文档,未找到相关信息"
"""
技巧 4:输出格式约束
明确指定格式,减少解析失败的概率:
python
# 要求 JSON 输出
system = """分析用户反馈,以 JSON 格式返回结果。
输出格式(严格遵守,不要输出其他内容):
{
"category": "功能请求|Bug报告|使用咨询|其他",
"sentiment": "positive|neutral|negative",
"priority": "high|medium|low",
"summary": "一句话摘要(不超过30字)",
"requires_human": true或false
}"""
# 配合 Structured Outputs 更稳定(见阶段2)
技巧 5:正面描述 > 负面描述
告诉模型"做什么"比告诉它"不要做什么"效果更好:
python
# 差(负面描述)
"不要废话,不要重复问题,不要用太多形容词"
# 好(正面描述)
"直接给出答案,一句话结论在前,细节在后,语言精练"
技巧 6:角色扮演提升专业性
赋予模型具体的专业角色,输出质量会提升:
python
# 普通
system = "帮我审查代码"
# 有角色
system = """你是一位有 10 年经验的 Python 后端工程师,专注于 API 设计和性能优化。
代码审查时重点关注:
- 安全漏洞(SQL注入、认证缺失、敏感信息泄漏)
- 性能问题(N+1 查询、不必要的同步调用)
- 代码可维护性(命名、拆分、重复逻辑)
发现问题时给出具体的修改建议和代码示例。"""
四、AI 应用里最常用的三类 Prompt 模板
模板 1:RAG 问答
python
RAG_SYSTEM = """你是企业知识库助手。
规则:
1. 只使用 <context> 标签中的信息回答
2. 引用时用 [来源N] 标注,例如:根据公司规定[来源1],...
3. 信息不足时说:"根据现有文档,未找到相关信息。"
4. 不要编造文档中没有的内容
输出格式:
- 先给结论,再给依据
- 超过 3 点时用编号列表"""
def make_rag_messages(question: str, chunks: list[dict]) -> list[dict]:
context = "\n\n".join([
f"[来源{i+1}] {c['filename']}:\n{c['content']}"
for i, c in enumerate(chunks)
])
return [
{"role": "system", "content": RAG_SYSTEM},
{"role": "user", "content": f"<context>\n{context}\n</context>\n\n问题:{question}"},
]
模板 2:结构化信息提取
python
EXTRACT_SYSTEM = """从文本中提取结构化信息,以 JSON 返回。
只输出 JSON,不要任何解释或 markdown 代码块。
如果某个字段在文本中找不到,填 null。"""
def make_extract_messages(text: str, schema_desc: str) -> list[dict]:
return [
{"role": "system", "content": EXTRACT_SYSTEM},
{"role": "user", "content": f"提取以下字段:{schema_desc}\n\n文本:{text}"},
]
模板 3:多步任务分解
python
AGENT_SYSTEM = """你是一个任务执行助手。
处理用户请求时:
1. 先分析需要哪些步骤
2. 说明你打算调用哪个工具,以及原因
3. 根据工具返回结果判断是否继续
4. 所有信息齐全后给出最终回答
如果工具返回了错误,解释错误原因并说明替代方案。"""
五、测试和迭代的方法
Prompt 不是写一次就完的,要系统地测试:
python
# 建立测试集:准备 10-20 个有代表性的问题
test_cases = [
{"input": "年假有多少天?", "expected_keywords": ["15天", "带薪"]},
{"input": "明天天气怎么样?", "should_answer": False}, # 知识库没有
{"input": "报销上限是多少?", "expected_keywords": ["500元", "审批"]},
]
# 改了 prompt 后,跑一遍测试集,看通过率有没有提升
# 不要凭感觉,要数据说话
调优顺序:先确保"该回答的都能回答"(召回率)→ 再优化"回答的格式对不对"(精确率)→ 最后优化"回答的质量够不够好"(质量)。
六、常见坑
Prompt 太长导致模型"遗忘"前面的指令 — 把最重要的规则放在 system prompt 的开头和结尾,中间放细节。
格式要求写了但模型不遵守 — 加 few-shot 示例,光靠描述有时不够。
多语言混乱 — 在 system prompt 里明确写"始终用中文回答,即使用户用其他语言提问"。
模型"创造"了文档里没有的内容 — 在 system prompt 里加"如果不确定,直接说不知道,不要猜测",并在 RAG prompt 里用 XML 标签清晰隔离文档内容和指令。
推荐资料
|
资料 |
链接 |
|
OpenAI Prompt 工程指南 |
|
|
Anthropic Prompt 文档 |
docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/overview |
|
Prompting Guide |
学 Prompt Engineering 最快的方式是在你的项目里实践——把 Task Manager 的 /tasks/summarize 接口的 system prompt 改五次,每次记录输出结果的差异,一下午就能建立直觉
更多推荐



所有评论(0)