🧠AI Prompt 与上下文
Prompt设计原则
面试回答
常见问法
Prompt 应该怎么设计,才能让模型更稳定地完成任务?
回答
好的 Prompt 关键不是写得长,而是写得清楚。通常要明确任务目标、输入输出格式、边界条件和失败时该怎么做。对于生产场景,Prompt 还要尽量降低歧义,避免把太多互相冲突的要求塞在一起。
# 不好的Prompt:模糊且复杂
bad_prompt = """
帮我处理一下这份文档,提取重要信息,
然后总结成简洁的报告。如果文档太复杂,
就挑主要的说。报告要专业一些,但不要太长。
"""
# 好的Prompt:清晰且结构化
good_prompt = """
你是一个专业的文档分析助手。
## 任务目标
从以下文档中提取关键信息,生成结构化的执行摘要。
## 输入格式
文档内容以```分隔
## 输出格式
JSON格式,包含以下字段:
- title: 文档标题
- key_points: 不超过5个关键点
- summary: 100字以内的摘要
- risk_level: 风险等级(高/中/低)
## 边界条件
- 如果文档不包含足够信息,返回空JSON
- 如果内容过于专业,用通俗语言解释
## 示例
输入:
项目计划:2024年Q1完成产品设计 预算:100万 团队:15人 风险:技术方案未验证
输出:
{
"title": "项目计划摘要",
"key_points": ["2024年Q1完成产品设计", "预算100万", "团队15人", "技术方案未验证"],
"summary": "项目计划在2024年Q1完成产品设计,预算100万,团队15人,主要风险是技术方案未验证。",
"risk_level": "高"
}
现在开始处理以下文档:
{document_content}
"""
使用示例
def generate_with_prompt(model, document): formatted_prompt = good_prompt.format(document_content=document) return model.generate(formatted_prompt)
### 追问
- 为什么结构化输出要求很重要?(解析稳定性)
- 示例驱动和规则驱动什么时候各自更有效?(复杂任务vs简单任务)
- Prompt 写得越长为什么不一定越稳定?(信息过载)
## 原理展开
模型是按上下文做条件生成的,所以 Prompt 本质上是在构造一个更容易被正确续写的条件分布。明确的角色、格式约束和示例,会让模型更容易收敛到你希望的输出模式。
工程里要避免把 Prompt 当成"魔法咒语"。很多效果问题其实来自检索质量、工具返回质量和系统边界设计,而不只是 Prompt 文案本身。
```python
# Prompt组成要素的层次设计
def build_structured_prompt():
# 1. 角色定义(可选但推荐)
role = """
你是一个专业的金融分析师助手。
你的任务是从报告中提取关键财务指标。
"""
# 2. 任务目标(必须明确)
task = """
从提供的财务报告中提取以下信息:
- 收入增长率
- 利润率变化
- 主要风险因素
"""
# 3. 输入格式(必须)
input_format = """
财务报告内容以XML标签包裹:
<report>
{content}
</report>
"""
# 4. 输出格式(必须)
output_format = """
输出为JSON格式:
{
"growth_rate": "X%",
"profit_margin": "Y%",
"risks": ["风险1", "风险2"]
}
"""
# 5. 边界条件(推荐)
boundaries = """
如果报告中找不到相关信息,返回null。
如果数据有歧义,选择最可能的值并备注。
"""
# 6. 示例(强烈推荐)
examples = """
示例输入:
<report>2023年收入增长15%,利润率从20%降到18%</report>
示例输出:
{
"growth_rate": "15%",
"profit_margin": "-2%",
"risks": ["利润率下降"]
}
"""
return f"{role}\n{task}\n{input_format}\n{output_format}\n{boundaries}\n{examples}"
易错点
- 把 Prompt 优化当成无限调参
- 不写失败策略,只要求”务必正确”
- 忽略不同模型对Prompt的敏感性差异
- 在Prompt中包含矛盾要求
记忆技巧
记住Prompt设计六要素:
- 角色 = “你是什么身份”
- 任务 = “做什么具体事情”
- 输入 = “数据格式是什么”
- 输出 = “结果格式是什么”
- 边界 = “特殊情况怎么办”
- 示例 = “给个具体例子”
典型应用场景:
- 问答系统:明确任务+格式约束
- 代码生成:示例驱动+边界条件
- 文本分析:角色+结构化输出
- 创意写作:创造性Prompt+温度控制