一、最重要的心智模型

把模型想象成一个极其听话但字面理解能力极强的新员工。你说"帮我写个好的回答",它不知道"好"是什么意思。你说"用中文回答,分三点,每点不超过两句话,语气正式",它就能做到。

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 工程指南

platform.openai.com/docs/guides/prompt-engineering

Anthropic Prompt 文档

docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/overview

Prompting Guide

promptingguide.ai/zh

学 Prompt Engineering 最快的方式是在你的项目里实践——把 Task Manager 的 /tasks/summarize 接口的 system prompt 改五次,每次记录输出结果的差异,一下午就能建立直觉

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐