4.1 提示工程基础:角色设定与结构化提示模板设计
一、提示工程的价值
提示工程(Prompt Engineering)是通过优化输入文本来引导大语言模型产生预期输出的技术。在多数场景下,无需微调、无需额外训练,仅靠精心设计的提示即可显著提升效果。本节聚焦角色设定与结构化提示模板,为后续少样本、思维链等高级技巧打基础。《大模型应用开发极简入门》第4章 4.1.1 提示基础 要求掌握角色设定、上下文、任务描述、输出格式的结构化设计,本节与之一一对应,并给出可直接复用的模板与代码。
二、角色设定(Role Setting)
2.1 为什么需要角色设定
模型默认是"通用助手"。通过明确的角色设定,可以约束其风格、专业领域与行为边界,使输出更符合业务预期。
2.2 典型角色示例
| 角色 | 设定示例 | 适用场景 |
|---|---|---|
| 专业翻译 | 你是一名资深中英互译专家,擅长技术文档与商务信函 | 翻译 |
| 代码助手 | 你是一名Python专家,擅长简洁、可读的代码 | 代码生成 |
2.3 在API中的使用
messages = [
{"role": "system", "content": "你是一名资深技术文档翻译,擅长将英文技术文档翻译为准确、流畅的中文。"},
{"role": "user", "content": "请翻译:API rate limit exceeded."}
]
三、结构化提示模板
3.1 四要素框架
一个完整的提示通常包含:
- 角色:你是谁
- 上下文:背景信息、参考资料
- 任务:具体要做什么
- 输出格式:期望的格式、长度、风格
3.2 模板示例
角色:你是一名专业的{领域}专家。
上下文:{相关背景或参考内容}
任务:{具体指令}
输出要求:{格式、长度、禁忌等}
3.3 代码实现
def build_prompt(role: str, context: str, task: str, output_req: str = "") -> str:
template = f"""角色:{role}
上下文:{context}
任务:{task}
"""
if output_req:
template += f"输出要求:{output_req}"
return template.strip()
# 使用示例
prompt = build_prompt(
role="你是一名产品经理",
context="我们正在开发一款在线教育App",
task="请列出5个核心功能需求,并简要说明理由",
output_req="每条不超过50字,使用有序列表"
)
四、常见陷阱与改进
| 陷阱 | 改进 |
|---|---|
| 指令模糊 | 明确"用一句话"、"列出3条"等 |
| 缺少格式约束 | 指定JSON、Markdown、列表等 |
| 角色过于宽泛 | 细化到"Python后端"、"金融风控"等 |
五、角色设定的深度与边界
5.1 角色深度
浅层角色:"你是一个助手"。深层角色:"你是一名拥有10年经验的Python开发专家,擅长FastAPI与异步编程,代码风格遵循PEP8,注重类型注解与单元测试。"深度越细,模型越容易"入戏",但提示更长、成本更高。
5.2 角色边界
除正面定义外,可明确禁止行为:"不要生成代码以外的内容"、"不要编造不存在的API"。边界清晰可减少模型越界。
5.3 多角色切换
同一应用可预设多个角色(如"翻译"、"代码"、"写作"),用户选择后切换system消息。角色间互不干扰,每次请求独立。
六、结构化模板的进阶
6.1 条件分支
根据任务类型动态组装模板:
def build_prompt(task_type: str, **kwargs) -> str:
if task_type == "summary":
return f"请对以下内容进行摘要,不超过{kwargs.get('max_len', 200)}字:\n{kwargs['content']}"
elif task_type == "translate":
return f"请将以下内容翻译为{kwargs.get('target', '中文')}:\n{kwargs['content']}"
else:
return f"请处理:{kwargs.get('content', '')}"
6.2 模板复用与版本管理
将常用模板保存为常量或配置文件,便于统一修改与A/B测试。示例:
PROMPTS = {
"translator": "你是一名专业翻译。请将用户输入翻译为准确、流畅的中文。",
"coder": "你是Python专家。请根据用户需求生成简洁、可运行的代码。",
"summarizer": "你是摘要专家。请用不超过100字概括用户提供的内容。"
}
6.3 输出格式强制
在输出要求中明确格式,便于程序解析:
- JSON:
输出格式:{"key": "value"},仅输出JSON,不要其他说明 - 列表:
使用有序列表,每项一行 - Markdown:
使用Markdown格式,标题用##
七、实战:多场景提示模板库
# 可复用的提示模板库
def prompt_translate(text: str, target: str = "中文") -> str:
return f"""你是一名专业翻译。请将以下内容翻译为{target},保持专业术语准确。
内容:{text}
仅输出翻译结果,不要其他说明。"""
def prompt_summary(text: str, max_len: int = 200) -> str:
return f"""你是一名摘要专家。请对以下内容进行摘要,不超过{max_len}字,保留核心信息。
内容:{text}
仅输出摘要,不要其他说明。"""
def prompt_classify(text: str, categories: list) -> str:
cats = "、".join(categories)
return f"""你是一名分类专家。请将以下内容分类到以下类别之一:{cats}
内容:{text}
仅输出类别名称,不要其他说明。"""
八、与《大模型应用开发极简入门》4.1.1 的对应
本书第4章 4.1.1 提示基础 明确列出:角色设定、上下文、任务描述、输出格式 的结构化设计。本节与之一一对应:第二节「角色设定」对应书中角色设定;第三节「结构化提示模板」中的四要素(角色、上下文、任务、输出格式)对应书中任务描述与输出格式;常见陷阱与进阶(条件分支、模板复用、格式强制)对应提示基础的落地与扩展。掌握本节即可按书中框架设计绝大多数提示,并为 4.1.2 上下文学习、4.1.3 高级策略打基础。
九、小结与后续章节衔接
角色设定与结构化模板是提示工程的基础。掌握角色深度、边界、多角色切换,以及模板的条件分支、复用与格式强制,即可在多数场景下获得稳定、可控的输出。下一节将介绍少样本学习与上下文学习(4.1.2),再后续是高级策略与防御性提示(4.1.3、4.1.4),本节是这些进阶技巧的「底座」:没有清晰的角色与结构,少样本与 CoT 难以发挥最佳效果。建议在学完 4.2~4.5 后,回头用本节模板重新整理一两个真实业务的提示,巩固四要素框架。
十、模板版本管理与 A/B 测试
当团队内有多人维护提示或频繁迭代时,建议对提示模板做版本管理:将角色、任务、输出要求等存为配置或代码常量,修改时留注释或提交说明,便于回溯。对关键业务可做 A/B 测试:同一任务用两套提示(如不同角色描述或不同输出格式要求)分别调用,统计格式符合率、用户满意度或业务指标,用数据决定保留哪一版。书中 4.1.5「提示优化、迭代测试、版本管理」在本节即体现为模板复用、条件分支与版本化,是生产级提示工程的基础。
十一、与第 2、3 章 API 与架构的衔接
第 2 章:角色与结构化提示通过 messages 中的 system 与 user 传入,与 2.5 节消息结构一致;temperature、max_tokens 等参数与 2.1 节对应,事实类任务宜低 temperature。第 3 章:3.3 节能力集成时的「角色、任务描述」即本节四要素的落地;3.5 节示例项目中的新闻稿、问答、摘要均可套用本节模板。将本节模板与 2.5 多轮对话、3.6 四类应用结合,即可从单次提示到完整应用形成闭环。
十二、小结
角色设定与结构化模板是提示工程的基础。掌握角色深度、边界、多角色切换,以及模板的条件分支、复用与格式强制,即可在多数场景下获得稳定、可控的输出。下一节将介绍少样本学习与上下文学习(4.2),再后续是 CoT、格式强制与防御性提示(4.3~4.5),本节是这些进阶技巧的底座。与 2.5 节消息结构的关系:角色设定通常放在 messages 的首条 system 中,任务与输出要求可放在 system 或 user;多轮对话时 system 每次请求都会发送,user/assistant 为历史与当前轮次,与 2.5 的 messages 维护一致。将本节四要素与 2.5 的 API 调用结合,即可在代码中实现书中推荐的提示结构。
下一节预告:4.2 零样本与少样本学习:上下文学习提升推理能力