编写清晰指令的技巧:定角色、用分隔符、给示例
核心知识点讲解
为什么清晰的指令如此重要?
在构建AI智能体时,清晰的指令是成功的关键。LLM(大语言模型)虽然强大,但它们不会读心术。如果你的指令模糊不清,模型很可能会产生偏离预期的输出。
清晰指令的好处:
- 提高输出的相关性和准确性
- 减少模型的幻觉(hallucination)
- 节省反复调整的时间
- 使智能体行为更加可预测
技巧一:设定明确的角色
为AI智能体设定一个明确的角色,就像给它穿上一件专业的“制服”,让它知道自己应该如何思考和回应。
角色设定的重要性:
- 帮助模型调整语气和专业度
- 明确模型的知识边界和职责范围
- 提供上下文框架,使回答更符合场景
示例:
# 不设定角色
prompt = "解释什么是量子计算"
# 设定角色
prompt = "你是一位专业的量子物理学家,擅长用通俗易懂的语言解释复杂概念。请解释什么是量子计算,包括其基本原理和潜在应用。"技巧二:使用分隔符组织信息
分隔符是提示词工程中的“语法糖”,它们帮助模型更好地理解输入的不同部分。
常用的分隔符:
- 三引号:
"""或''' - 三重反引号:
``` - XML标签:
<input>、<context>、<output> - 其他符号:
=====、------、>>>>>
分隔符的作用:
- 明确区分指令、上下文和输入
- 防止提示词注入攻击
- 提高模型对边界的识别能力
示例:
# 使用三引号分隔上下文
prompt = """你是一位专业的影评人。请基于以下电影简介,撰写一篇500字左右的影评。
电影简介:
"""在未来的2154年,人类开始在潘多拉星球开采一种名为“unobtanium”的珍贵矿物。为了与当地的纳美人沟通,人类创造了基因工程人类-纳美人混合体,称为“阿凡达”。前海军陆战队员杰克·萨利被派往潘多拉,他的任务是说服纳美人离开他们的家园。但在与纳美人的接触中,杰克逐渐爱上了这个星球和它的人民,最终站在了纳美人一边,与人类军队对抗。"""
请从剧情、视觉效果、主题思想三个方面进行评价,并给出你对这部电影的总体评分(1-10分)。"""
# 使用XML标签
prompt = "<role>专业的产品经理</role>
<task>基于以下用户需求,生成一份产品需求文档</task>
<user_requirement>
我需要一个能够帮助学生管理学习时间的应用,包括任务提醒、番茄钟功能、学习数据分析等。
</user_requirement>
<output_format>
产品需求文档应包含:产品概述、核心功能、用户流程、界面设计建议四个部分。
</output_format>"技巧三:提供示例(少样本学习)
为模型提供示例是一种强大的技术,称为“少样本学习”(Few-Shot Learning)。通过展示输入和期望输出的配对,你可以引导模型理解任务的具体要求。
示例的类型:
- 输入-输出对:展示完整的任务示例
- 格式示例:仅展示期望的输出格式
- 部分示例:展示任务的开始部分
示例的最佳实践:
- 使用2-3个高质量示例
- 示例应覆盖不同的情况
- 示例应与目标任务高度相关
- 保持示例的一致性和简洁性
示例:
# 少样本学习示例:情感分析
prompt = """请分析以下电影评论的情感倾向,判断是积极还是消极。
示例1:
评论:这部电影太精彩了!演员的表演非常出色,剧情跌宕起伏,特效也很震撼。我已经看了三遍了,每次都有新的发现。
情感:积极
示例2:
评论:这部电影让我非常失望。剧情混乱,角色塑造单薄,两个小时的观影体验简直是煎熬。我不建议任何人浪费时间看这部电影。
情感:消极
现在请分析以下评论:
评论:这部电影的特效做得不错,但剧情发展有点缓慢,演员的表演中规中矩。整体来说,是一部可以一看的电影,但没有什么特别出彩的地方。
情感:"""技巧四:明确输出格式要求
告诉模型你期望的输出格式,就像给它一个“模板”,让它按照你的要求组织信息。
常见的输出格式:
- 段落文本
- 列表(有序/无序)
- 表格
- JSON
- 代码
- 特定结构(如问答、摘要等)
示例:
# 要求输出为JSON格式
prompt = """请将以下产品信息转换为JSON格式,包含id、name、price、category四个字段。
产品信息:
名称:智能手表
价格:1299元
类别:可穿戴设备
产品ID:PROD-2024-001
"""
# 要求输出为表格格式
prompt = """请将以下学生成绩转换为Markdown表格格式,包含姓名、数学、语文、英语、总分五列。
学生成绩:
张三:数学95,语文88,英语92
李四:数学87,语文91,英语85
王五:数学92,语文89,英语94
"""技巧五:控制输出长度
明确指定输出的长度范围,避免模型输出过长或过短的内容。
长度控制的方法:
- 指定具体的字数或句数
- 使用相对描述(简短、详细、中等长度)
- 提供长度的上下限
示例:
# 指定具体字数
prompt = "请用不超过100字的篇幅,简要介绍人工智能的发展历程。"
# 使用相对描述
prompt = "请详细解释什么是机器学习,包括其基本原理、主要算法类型和应用场景。"
# 提供长度范围
prompt = "请为以下产品撰写一条30-50字的营销文案:智能恒温杯,支持APP远程控制温度,内置锂电池可续航8小时。"实用案例分析
案例一:构建专业的客户服务智能体
场景描述:
你需要构建一个客户服务智能体,用于回答用户关于产品的问题。智能体需要保持专业、友好的语气,并提供准确的信息。
提示词设计:
prompt_template = """你是[公司名称]的专业客户服务代表,你的名字叫[智能体名称]。你非常熟悉公司的所有产品和服务,并且善于用友好、专业的语气回答客户的问题。
请记住以下几点:
1. 始终保持礼貌和专业
2. 尽可能提供详细、准确的信息
3. 如果不确定答案,不要猜测,而是告诉客户你会查询相关信息后回复
4. 结束对话时,邀请客户提供反馈
现在,请回答以下客户问题:
客户问题:{customer_question}
回答:"""应用效果:
- 智能体始终保持专业的客户服务语气
- 回答内容更加准确和相关
- 客户体验得到显著提升
案例二:创建高效的内容摘要工具
场景描述:
你需要构建一个内容摘要智能体,能够将长文本压缩为简洁的摘要,同时保留核心信息。
提示词设计:
prompt_template = """你是一位专业的内容编辑,擅长将长文本提炼为简洁的摘要。请基于以下文本,生成一个不超过200字的摘要,确保包含所有核心信息。
文本:
{long_text}
摘要:"""应用效果:
- 生成的摘要长度适中,符合要求
- 核心信息得到有效保留
- 摘要语言流畅,逻辑清晰
案例三:开发智能的代码解释器
场景描述:
你需要构建一个代码解释智能体,能够分析代码并解释其功能、逻辑和潜在问题。
提示词设计:
prompt_template = """你是一位资深的软件工程师,擅长分析和解释代码。请分析以下代码,然后提供:
1. 代码的功能和用途
2. 代码的核心逻辑
3. 代码中可能存在的问题或优化空间
4. 代码的执行流程(可选)
代码:
```python
{code}解释:"""
**应用效果**:
- 代码解释全面、准确
- 能够识别潜在的问题和优化空间
- 解释语言通俗易懂,适合不同层次的开发者
## 代码示例
### 示例1:使用分隔符和角色设定构建提示词
```python
from langchain import PromptTemplate
# 定义提示词模板
prompt_template = PromptTemplate(
input_variables=["topic", "audience"],
template="""你是一位专业的{audience}领域专家,擅长用通俗易懂的语言解释复杂概念。
请基于以下主题,撰写一篇500字左右的科普文章,要求结构清晰,内容准确,语言生动。
主题:{topic}
文章应包含:
1. 概念介绍
2. 工作原理
3. 应用场景
4. 未来发展
文章:"""
)
# 生成提示词
prompt = prompt_template.format(
topic="人工智能中的神经网络",
audience="计算机科学"
)
print(prompt)示例2:使用少样本学习进行情感分析
from langchain import LLMChain, PromptTemplate
from langchain_openai import OpenAI
# 初始化LLM
llm = OpenAI(temperature=0)
# 定义情感分析提示词模板
prompt_template = PromptTemplate(
input_variables=["examples", "review"],
template="""请分析以下产品评论的情感倾向,判断是积极、消极还是中性。
示例:
{examples}
现在请分析以下评论:
评论:{review}
情感:"""
)
# 准备示例
examples = """
示例1:
评论:这个产品质量非常好,功能齐全,价格也很合理。我非常满意这次购买。
情感:积极
示例2:
评论:这个产品让我非常失望,做工粗糙,功能也不完善。我不会推荐给朋友。
情感:消极
示例3:
评论:这个产品中规中矩,没有特别出彩的地方,也没有明显的缺点。
情感:中性
"""
# 创建LLMChain
chain = LLMChain(llm=llm, prompt=prompt_template)
# 测试评论
reviews = [
"这款手机的续航能力很强,一天下来还有40%的电量,拍照效果也不错。",
"这家餐厅的服务态度很差,食物也不新鲜,不会再来了。",
"这部电影的特效做得不错,但剧情有点老套。"
]
for review in reviews:
result = chain.run(examples=examples, review=review)
print(f"评论:{review}")
print(f"情感:{result}")
print("---")总结与思考
关键要点回顾
- 角色设定:为智能体设定明确的角色,帮助它调整语气和专业度。
- 分隔符使用:使用分隔符组织信息,提高模型对边界的识别能力。
- 示例提供:通过少样本学习,引导模型理解任务的具体要求。
- 格式要求:明确输出格式,让模型按照你的要求组织信息。
- 长度控制:指定输出长度范围,避免模型输出过长或过短的内容。
实践建议
- 循序渐进:从简单的提示词开始,逐步添加更多技巧。
- 持续测试:不断测试和调整提示词,找到最适合特定任务的版本。
- 记录模板:建立提示词模板库,方便后续重复使用和改进。
- 学习优秀示例:研究他人的优秀提示词,学习其中的技巧和思路。
未来学习方向
- 思维链(Chain-of-Thought):引导模型进行逐步推理。
- 思维树(Tree of Thoughts):处理更复杂的问题分解。
- 提示词优化工具:探索使用工具辅助提示词设计和测试。
- 多语言提示词:学习如何针对不同语言优化提示词。
通过掌握这些编写清晰指令的技巧,你将能够构建更加智能、可靠的AI智能体,为各种应用场景提供更好的解决方案。在接下来的课程中,我们将深入探讨更多高级提示词工程技术,帮助你进一步提升智能体的性能和能力。