文章目录
1. 前言
前情提要:
《LLM指令微调Prompt的最佳实践(一):Prompt原则
》
《LLM指令微调Prompt的最佳实践(二):Prompt迭代优化》
《LLM指令微调Prompt的最佳实践(三):编写文本摘要的Prompt》
《LLM指令微调Prompt的最佳实践(四):编写推理的Prompt》
《LLM指令微调Prompt的最佳实践(五):文本转换Prompt》
本文根据《面向开发者的LLM入门教程》 ,总结凝练核心内容,加深印象,同时方便快速查阅浏览。
2. Prompt定义
Prompt 是给语言模型提供的输入文本或问题,用于引导模型生成相应的输出或回答。Prompt 可以看作是一个提示或引导,帮助模型理解用户的需求或意图,并生成相关的响应。
主要特点:
(1)引导模型行为:Prompt 用于引导和控制模型的生成行为。通过设计不同的 Prompt,可以让模型生成不同类型的输出,例如回答问题、完成句子、生成故事等。
(2)上下文提供:Prompt 通常包括上下文信息或问题陈述,以帮助模型更好地理解生成任务。例如,给定一段文本让模型续写或提出一个问题让模型回答。
(4)灵活性和适应性:Prompt 可以根据具体任务进行调整和优化,从而提高模型在特定任务上的性能。良好的 Prompt 设计可以显著改善模型输出的质量和相关性。
3. 搭建聊天机器人Chatbot
3.1 角色定义
在构建聊天机器人或使用语言模型进行对话时,通常会涉及三个不同的角色:system
、assistant
、user
。这些角色在对话中扮演不同的功能和作用。
1. system
(1)定义和引导对话的框架:system
提供对话的初始设定和规则,设定聊天机器人的角色、行为和限制。
(2)设置上下文和目标:可以用来说明对话的目标、限制和期望的行为。例如,可以指示聊天机器人应该礼貌、简洁、具体等。
示例:
{
"role": "system",
"content": "You are a helpful assistant that answers questions about programming."
}
在这个例子中,system
角色定义了聊天机器人的角色(一个有用的编程助手)。
2. assistant
(1)代表聊天机器人:assistant
角色是聊天机器人的发言者,负责生成响应并与用户进行互动。
(2)提供信息和解决问题:根据用户的输入和系统的指示,生成有用的回答或建议。
示例:
{
"role": "assistant",
"content": "Sure, I can help you with that. What specific programming question do you have?"
}
在这个例子中,assistant
角色提供了响应,并询问用户的具体问题。
3. user
(1)代表人类用户:user
角色是与聊天机器人进行互动的人类用户。
(2)提出问题和请求:用户输入问题、请求帮助或提供信息,以便聊天机器人做出响应。
示例:
{
"role": "user",
"content": "Can you explain what a binary search algorithm is?"
}
在这个例子中,user
角色提出了一个关于二分搜索算法的问题。
4. 总结
(1)system
:设定对话的框架和规则,定义聊天机器人的角色和目标。
(2)assistant
:代表聊天机器人,生成响应并提供帮助。
(3)user
:代表人类用户,提出问题和请求。
完整示例:
[
{
"role": "system",
"content": "You are a helpful assistant that answers questions about programming."
},
{
"role": "user",
"content": "Can you explain what a binary search algorithm is?"
},
{
"role": "assistant",
"content": "Sure! A binary search algorithm is a search method that finds the position of a target value within a sorted array. It compares the target value to the middle element of the array. If they are not equal, it determines whether the target value is in the left or right half of the array, and then repeats the process on that half. This process continues until the target value is found or the subarray is empty."
}
]
3.2 初始函数
定义两个函数:
get_completion
,适用于单轮对话。将 Prompt 放入某种类似用户消息的对话框中;get_completion_from_messages
,传入一个消息列表,这些消息可以来自大量不同的角色。
import openai
# 下文第一个函数即tool工具包中的同名函数,此处展示出来以便于读者对比
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"]
def get_completion_from_messages(messages, model="gpt-3.5-turbo", temperature=0):
response = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=temperature, # 控制模型输出的随机程度
)
return response.choices[0].message["content"]
3.3 讲笑话机器人
# 中文
messages = [
{'role':'system', 'content':'你是一个像莎士比亚一样说话的助手。'},
{'role':'user', 'content':'给我讲个笑话'},
{'role':'assistant', 'content':'鸡为什么过马路'},
{'role':'user', 'content':'我不知道'} ]
response = get_completion_from_messages(messages, temperature=1)
print(response)
让我用一首莎士比亚式的诗歌来回答你的问题:
当鸡之心欲往前, 马路之际是其选择。 驱车徐行而天晴, 鸣笛吹响伴交错。
问之何去何从也? 因大道之上未有征, 而鸡乃跃步前进, 其决策毋需犹豫。
鸡之智慧何可言, 道路孤独似乌漆。 然其勇气令人叹, 勇往直前没有退。
故鸡过马路何解? 忍受车流喧嚣之困厄。 因其鸣鸣悍然一跃, 成就夸夸骄人壁画。
所以笑话之妙处, 伴随鸡之勇气满溢。 笑谈人生不畏路, 有智有勇尽显妙。
希望这个莎士比亚风格的回答给你带来一些欢乐!
3.4 订餐机器人
pip install panel
# 中文
import panel as pn # GUI
pn.extension()
# 收集我们的用户消息,避免手动输入
# 这个函数将从我们下面构建的用户界面中收集 Prompt
# 然后将其附加到一个名为上下文( context )的列表中
# 并在每次调用模型时使用该上下文,模型的响应也会添加到上下文中。
# 所以用户消息和模型消息都被添加到上下文中,上下文逐渐变长。
# 这样,模型就有了需要的信息来确定下一步要做什么。
def collect_messages(_):
prompt = inp.value_input
inp.value = ''
context.append({'role':'user', 'content':f"{prompt}"})
response = get_completion_from_messages(context)
context.append({'role':'assistant', 'content':f"{response}"})
panels.append(
pn.Row('User:', pn.pane.Markdown(prompt, width=600)))
panels.append(
pn.Row('Assistant:', pn.pane.Markdown(response, width=600, style={'background-color': '#F6F6F6'})))
return pn.Column(*panels)
panels = [] # collect display
context = [{'role':'system', 'content':"""
你是订餐机器人,为披萨餐厅自动收集订单信息。
你要首先问候顾客。然后等待用户回复收集订单信息。收集完信息需确认顾客是否还需要添加其他内容。
最后需要询问是否自取或外送,如果是外送,你要询问地址。
最后告诉顾客订单总金额,并送上祝福。
请确保明确所有选项、附加项和尺寸,以便从菜单中识别出该项唯一的内容。
你的回应应该以简短、非常随意和友好的风格呈现。
菜单包括:
菜品:
意式辣香肠披萨(大、中、小) 12.95、10.00、7.00
芝士披萨(大、中、小) 10.95、9.25、6.50
茄子披萨(大、中、小) 11.95、9.75、6.75
薯条(大、小) 4.50、3.50
希腊沙拉 7.25
配料:
奶酪 2.00
蘑菇 1.50
香肠 3.00
加拿大熏肉 3.50
AI酱 1.50
辣椒 1.00
饮料:
可乐(大、中、小) 3.00、2.00、1.00
雪碧(大、中、小) 3.00、2.00、1.00
瓶装水 5.00
"""} ] # accumulate messages
inp = pn.widgets.TextInput(value="Hi", placeholder='Enter text here…')
button_conversation = pn.widgets.Button(name="Chat!")
interactive_conversation = pn.bind(collect_messages, button_conversation)
dashboard = pn.Column(
inp,
pn.Row(button_conversation),
pn.panel(interactive_conversation, loading_indicator=True, height=300),
)
dashboard
4. 参考
https://datawhalechina.github.io/llm-cookbook/#/
欢迎关注本人,我是喜欢搞事的程序猿; 一起进步,一起学习;
欢迎关注知乎/CSDN:SmallerFL
也欢迎关注我的wx公众号(精选高质量文章):一个比特定乾坤