LLM开发者教程——提示词工程
提示词设计原则
在LLM开发中,通常将LLM的输入称为Prompt,将LLM的输出称为Completion
提示词(Prompt)设计的两个关键原则
- 编写清晰、具体的指令
- 给予模型充足的思考时间
编写清晰、具体的指令
通常,使用更长、更复杂的prompt会取得更好的效果,因为复杂的prompt中包含了更丰富的上下文信息
在编写prompt时,有以下编写技巧
使用分隔符清晰地表示输入的不同部分
可以使用任何标点符号作为分隔符来分隔输入的不同部分,如````,””“`等
使用分隔符还可以防止提示词注入,即用户的输入内容与prompt模板发生冲突,导致模型产生不好的输出
要求模型输出结构化的内容
可以要求模型生成json、html等格式的内容,便于后续处理
要求模型检查是否满足条件
如果任务包含不一定能满足的假设(条件),我们可以告诉模型先检查这些假设,如果不满足,则会指出并停止执行后续的完整流程。您还可以考虑可能出现的边缘情况及模型的应对,以避免意外的结果或错误发生
提供少量示例
也称为少样本提示(Few-shot Prompting),在要求模型执行实际任务之前,给模型一两个已完成的样例,让模型了解我们的要求和期望的输出样式
给予模型充足的思考时间
可以通过prompt来引导模型进行深入思考,要求其先列出对问题的各种看法,说明推理依据,然后再得出最终结论。在 prompt中添加逐步推理的要求,能让语言模型投入更多时间逻辑思维,输出结果也将更可靠准确
可以使用以下技巧引导模型深入思考
指定完成任务所需的步骤
对于一个复杂任务,可以给模型指定完成任务需要的步骤,要求模型严格按照步骤执行
指导模型在给出结论之前自主思考解法
在prompt中先要求模型自己尝试解决这个问题,思考出自己的解法,然后再与提供的解答进行对比,判断正确性,这种先让语言模型自主思考的方式,能帮助它更深入理解问题,做出更准确的判断
e.g.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
prompt = f""" 请判断学生的解决方案是否正确,请通过如下步骤解决这个问题: 步骤: 首先,自己解决问题。 然后将您的解决方案与学生的解决方案进行比较,对比计算得到的总费用与学生计算的总费用是否一致,并评估学生的解决方案是否正确。 在自己完成问题之前,请勿决定学生的解决方案是否正确。 使用以下格式: 问题:问题文本 学生的解决方案:学生的解决方案文本 实际解决方案和步骤:实际解决方案和步骤文本 学生计算的总费用:学生计算得到的总费用 实际计算的总费用:实际计算出的总费用 学生计算的费用和实际计算的费用是否相同:是或否 学生的解决方案和实际解决方案是否相同:是或否 学生的成绩:正确或不正确 问题: 我正在建造一个太阳能发电站,需要帮助计算财务。 - 土地费用为每平方英尺100美元 - 我可以以每平方英尺250美元的价格购买太阳能电池板 - 我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元; 作为平方英尺数的函数,首年运营的总费用是多少。 学生的解决方案: 设x为发电站的大小,单位为平方英尺。 费用: 1. 土地费用:100x美元 2. 太阳能电池板费用:250x美元 3. 维护费用:100,000+100x=10万美元+10x美元 总费用:100x美元+250x美元+10万美元+100x美元=450x+10万美元 实际解决方案和步骤: """ response = get_completion(prompt) print(response)
迭代优化
通常在设计prompt时,很难一次设计出效果好的prompt,此时需要对prompt进行迭代优化
- 在prompt中添加长度限制以控制生成内容的长度,生成内容长度并不严格等于限制长度
- 检查是否捕捉到正确的细节,逐步优化prompt,使语言模型生成的文本更加符合预期的样式和内容要求
LLM功能
基本功能
利用LLM的零样本能力,设计prompt,LLM可以轻易地完成以下基本功能
零样本能力:指LLM在未经特定任务训练或微调的情况下,直接利用预训练阶段积累的知识完成任务的能力。例如,模型无需情感分析训练数据,即可通过理解文本上下文判断情感倾向
- 文本概括和提取
- 推断
- 情感推断
- 信息提取
- 主题推断
- 文本转换
- 文本翻译
- 语气与写作风格调整
- 文本格式转换
- 拼写及语法纠正
文本扩展
LLM中的temperature温度参数可以控制模型生成内容的随机性,temperature取值为0到1,temperature值越大,模型更倾向于输出更随机的文本,temperature值越小,模型更倾向于输出高概率文本
聊天机器人
在多轮对话中,包含不同的角色,通常设置三种角色,分别是System、User、Assistant,在多轮对话的消息列表中,通常以System消息作为第一条消息,之后的消息在User和Assistant之间交替
- System:System消息给模型提供一个总体的指示来引导模型,优先级比User消息高
- User消息:用户输入
- Assistant消息:模型输出
与LLM的每次交互都是独立的,因此有时我们需要给LLM提供一些信息,以便LLM在生成completion时能够引用,这些信息称为上下文(Context),上下文可能是我们提供给LLM的背景信息,也可能是过去与LLM交互的对话
1
2
3
4
5
6
7
messages = [
{'role':'system', 'content':'你是个友好的聊天机器人。'},
{'role':'user', 'content':'Hi, 我是Isa'},
{'role':'assistant', 'content': "Hi Isa! 很高兴认识你。今天有什么可以帮到你的吗?"},
{'role':'user', 'content':'是的,你可以提醒我, 我的名字是什么?'} ]
response = get_completion_from_messages(messages, temperature=1)
print(response) # 当然可以!您的名字是Isa。