Prompt 工程基础

Prompt 是用户和 LLM 之间最重要的接口。好的 Prompt 可以将模型效果从 60% 提升到 90%。


核心原则

1
2
3
4
5
1. 清晰:指令无歧义,模型不会"猜"
2. 具体:细节越多,输出越符合预期
3. 结构化:用 Markdown / XML / JSON 结构化输出
4. 渐进:复杂任务分步骤,不要一步到位
5. 示例:Few-shot 比纯描述更有效

Zero-shot Prompt(直接命令)

适用于简单明确的任务:

1
2
3
4
5
6
prompt = """
将以下文本分类为 positive/negative/neutral:

文本:"这个产品非常好用,强烈推荐!"
分类:
"""

Few-shot Prompt(示例引导)

适用于需要特定格式或风格的任务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
prompt = """
将电影评论分类为 positive/negative/neutral:

示例1:
文本:"烂片一部,完全浪费时间"
分类:negative

示例2:
文本:"还行,但没有达到预期"
分类:neutral

示例3:
文本:"太震撼了!这是我看过最好的电影!"
分类:positive

现在分类:
文本:"剧情紧凑,就是结尾有点仓促"
分类:
"""

Chain-of-Thought(思维链)

引导模型一步步推理,适用于数学、逻辑、代码分析:

1
2
3
4
5
6
7
8
9
prompt = """
计算:25 × 17 + 84 ÷ 7 - 13

请按以下步骤计算:
1. 先算乘法
2. 再算除法
3. 然后加减
4. 写出最终答案
"""

Zero-shot CoT(无需示例)

1
2
3
4
prompt = """
给一个12岁学生解释什么是通货膨胀。
请先想清楚再解释,确保逻辑清晰。
"""

Tree-of-Thought(思维树)

探索多个推理路径,适用于复杂决策:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
prompt = """
我需要选择一款数据库,有三个选项:
A: PostgreSQL - 关系型,功能强
B: MongoDB - 文档型,灵活性高
C: Redis - 内存型,速度快

请从以下维度分析每个选项的优缺点:
1. 你的具体使用场景
2. 数据结构特点
3. 团队技术储备
4. 扩展性需求

最后给出推荐。
"""

Role Prompting(角色设定)

指定专业身份,提升专业度:

1
2
3
4
5
6
7
prompt = """
你是一位有10年经验的资深 Java 架构师,专注于微服务设计。

请评审以下代码的问题:

(代码块)
"""

Structured Output Prompt(结构化输出)

指定 JSON 格式

1
2
3
4
5
6
7
8
9
10
11
12
13
prompt = """
用户问了一个问题,请判断类型并提取关键信息。

要求输出JSON格式:
{
"type": "weather" | "news" | "general",
"entities": ["提取的实体列表"],
"sentiment": "positive" | "neutral" | "negative",
"needs_action": true | false
}

用户问题:「明天北京会不会下雨?」
"""

使用 Output Parser 强制解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from langchain_core.output_parsers import JsonOutputParser
from pydantic import BaseModel

class QueryIntent(BaseModel):
type: str
entities: list[str]
sentiment: str
needs_action: bool

parser = JsonOutputParser(pydantic_object=QueryIntent)

chain = prompt | llm | parser
result = chain.invoke({"query": "明天北京会不会下雨?"})
# result = {'type': 'weather', 'entities': ['北京', '明天'], ...}

System Prompt 工程

组合技巧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
system_prompt = """
# 角色
你是一个{language}编程助手。

# 能力边界
- 擅长:{strengths}
- 不擅长:{weaknesses}

# 输出格式
回答时:
1. 先说明思路
2. 再给出代码
3. 最后解释关键点

# 约束
- 代码必须有注释
- 只使用 LTS 版本的技术栈
- 不推荐商业付费组件
"""

分步骤 Prompt(渐进式)

阶段 1:理解问题

1
2
3
4
step1_prompt = """
用户的问题是:「我应该选择哪个云服务商?」
请先分析用户的潜在需求,列出需要考虑的因素。
"""

阶段 2:具体分析

1
2
3
4
5
6
7
step2_prompt = """
基于以下用户需求分析:

需求因素:{factors}

请针对每个因素评估 AWS/Azure/阿里云的优缺点。
"""

阶段 3:给出建议

1
2
3
4
5
6
7
step3_prompt = """
基于以下分析结果:

{full_analysis}

请给出最终推荐,并说明理由。
"""

Prompt 优化 checklist

  • 指令是否清晰无歧义?
  • 是否给了足够的上下文信息?
  • 格式要求是否明确(JSON/XML/Markdown)?
  • 是否有足够的示例(Few-shot)?
  • 是否需要 CoT 引导推理?
  • 角色设定是否有助于提升专业度?
  • 输出长度是否合理?
  • 是否有避免幻觉的约束(如”不知道就说不知道”)?