《ChatGPT Prompt Engineering for Developers》
本课程包含大量提示工程的场景示例,笔记中仅作简单记录
1 简介
LLM 的两种类型:
- 基础 LLM:基于文本训练数据,训练出预测下一个单词能力的模型
- 指令微调(Instruction Tuned)LLM:基于预训练好的LLM的,使用输入(指令)和理想输出(遵循这些指令的良好回答)来对LLM进行进一步的训练和微调(finetune)
后续课程重点:介绍针对指令微调 LLM 的最佳实践
提示工程的核心原则:清晰明确,并且给模型足够的时间思考
2 提示原则
原则一:编写清晰、具体的指令
- 使用分隔符清晰地表示输入的不同部分,比如引号,括号,分号,标签
\<tag> \</tag>
等 句式:针对大括号括起来的文本进行一句话总结。{text}
- 寻求结构化的输出(方便代码解析),比如Json,HTML等格式
句式:
请以JSON格式提供,其中包含键:book_id、title、author、genre
- 要求模型检查是否满足条件,注意考虑边缘情况
句式:
如果文本包含一系列的xx,则需要按照y格式重新编写,否则返回“未找到xx”
- 提供少量示例(少样本提示词,Few-shot prompting)
句式:
我说太阳,你说sun,我说月亮,你说:
原则二:给模型时间去思考(思维链 CoT)
- 指定完成任务所需的步骤
句式:
首先翻译成法语,之后提取关键词,最后以Json格式返回关键词及其注释
- 指导模型在下结论之前找出一个自己的解法
句式:
请先自行推理解决方案,之后再判断给定方案xx是否正确
大模型的幻觉:模型在训练过程中接触了大量的知识,但它并没有完全记住所见的信息,因此它不甚清楚自己知识的边界。这意味着它可能会尝试回答主题晦涩难懂的问题,并编造听起来合理但实际上并不正确的答案。我们称这些编造的想法为幻觉(Hallucination)
3 迭代优化
通过一个好的迭代过程来不断改进 Prompt,最终总会得到一个合适的 Prompt
示例:根据一份椅子的产品说明书生成一份营销产品描述
- 生成文本太长——限制文本长度(可能不精确,比如限制50但输出长度是51)
- 抓错文本细节——提醒目标受众更关心的点(比如技术细节和材料)
- 添加表格描述——提取产品尺寸信息并组织成表格(指定列名和格式)
最终的Prompt:
prompt = f"""
您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。
根据```标记的技术说明书中提供的信息,编写一个产品描述。
该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。
在描述末尾,包括技术规格中每个7个字符的产品ID。
在描述之后,包括一个表格,提供产品的尺寸。表格应该有两列。第一列包括尺寸的名称。第二列只包括英寸的测量值。
给表格命名为“产品尺寸”。
将所有内容格式化为可用于网站的HTML格式。将描述放在<div>元素中。
技术规格:```{fact_sheet_chair}```
"""
4 文本概括 Summarizing
场景示例:总结商品评论
单一文本(评论)概括:
- 限制文本长度为最多30词(规避海量的冗长评论)
- 设置关键角度侧重(比如快递服务、价格/质量)
- 关键信息提取(有侧重的选择) vs 概括(全面而简约)
多条文本(评论)概括:
- 使用循环的方式,将多条用户评价放进列表
- 使用文本概括(Summarize)提示词,将评价概括至小于 20 词
- 根据不同的关键角度侧重,将概括文本按顺序打印
- 可能需要考虑整合评论、分布式等方法提升运算效率
5 文本推断 Inferring
场景示例:从产品评论和新闻文章中推断情感和主题
- 情感分类(限定输出结果为 正向/负向)
- 情感类型识别(归纳为列表,可配置字典)
- 特定情绪(比如愤怒)识别及原因分析
- 商品信息提取(比如制造公司/品牌)
- 综合完成任务(汇总以上几种Prompt)
- 对新闻进行主题推断并用于新闻提醒
6 文本转换 Transforming
典型应用:
- 多语种文本翻译、语种识别、通用翻译器
- 语气转换(正式语气 vs 非正式语气)
- 写作风格调整(轻松口语化、书面用词、商务信函)
- 文本格式转换(Json,HTML,XML,Markdown)
- 拼写及语法纠正(Python包
Redlines
,能详细显示并对比纠错过程) - 综合使用(同时进行文本翻译+拼写纠正+风格调整+格式转换)
7 文本扩展 Expanding
扩展是将短文本(说明或主题)输入到LLM中并生成更长的文本(邮件或论文)
定制客户邮件(典型应用):根据客户评价和情感,针对性写自动回复邮件
引入温度系数:
- 温度 (Temperature) 作为LLM的参数,能够改变模型响应的多样性
- 当尝试构建一个可靠和可预测的系统时,推荐设置温度为零
- 当使用模型时,希望结果具有更多可能/创意时,推荐使用更高的温度
8 聊天机器人 ChatBot
角色设定:
- 系统(system):设置助手的行为和角色,并作为对话的高级指示
- 用户(user):普通的聊天使用者,提供信息的输入
- 助手(assistant):机器人,提供消息的返回
import openai # 导入第三方库
# 设置 API_KEY, 请替换成您自己的 API_KEY
openai.api_key = "sk-..."
# 将 Prompt 放入对话框,适用于单轮对话
def get_completion(prompt, model="gpt-3.5-turbo"):
messages = [{"role": "user", "content": prompt}]
response = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=0, # 控制模型输出的随机程度
)
return response.choices[0].message["content"]
# 传入一个消息列表,消息可以来自不同的角色 (roles)
def get_completion_from_messages(messages, model="gpt-3.5-turbo", temperature=0):
response = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=temperature, # 控制模型输出的随机程度
)
# print(str(response.choices[0].message))
return response.choices[0].message["content"]
messages = [
{'role':'system', 'content':'你是个友好的聊天机器人。'},
{'role':'user', 'content':'Hi, 我是Isa。'} ]
response = get_completion_from_messages(messages, temperature=1)
print(response)
# 嗨,Isa,很高兴见到你!有什么我可以帮助你的吗?
其他实践:订餐机器人
- 可考虑设置并运行 UI (比如Python的
panel
包)来显示订单机器人 - 相比普通聊天机器人,需要在初始的上下文中记录来自system的菜单信息
- 要求模型最终应该创建一个关于下单信息的 JSON 摘要,方便发送给订单系统
最后,希望大家能负责任地使用它们,并构建对他人有积极影响的东西