一、引言
- 大型语言模型:可以用来构建定制聊天机器人,工作量小。
- 聊天模型:以消息序列为输入,返回模型生成的消息作为输出,适用于多轮对话和单轮任务。
from zhipuai import ZhipuAI
# 导入第三方库
key = " "
client = ZhipuAI(api_key = key)
二、身份与上下文构建
- 辅助函数:
get_completion
和 get_completion_from_messages
。
- 系统消息:设置助手的行为和角色,不显示给用户。
- 角色扮演:开发者可以在用户和助手之间交替,提供对话上下文。
- 上下文(Context):为了使模型能够引用对话的早期部分,必须在输入中提供早期交流。
def get_completion(prompt, model="glm-3-turbo"):
messages = [{"role": "user", "content": prompt}]
response = client.chat.completions.create(
model=model,
messages=messages,
temperature=0, # 控制模型输出的随机程度
)
return response.choices[0].message.content
def get_completion_from_messages(messages, model="glm-3-turbo", temperature=0):
response = client.chat.completions.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':'给我讲个笑话'},
{'role':'assistant', 'content':'鸡为什么过马路'},
{'role':'user', 'content':'我不知道'} ]
response = get_completion_from_messages(messages, temperature=1)
print(response)
# 中文
messages = [
{'role':'system', 'content':'你是个友好的聊天机器人。'},
{'role':'user', 'content':'Hi, 我是Isa。'} ]
response = get_completion_from_messages(messages, temperature=1)
print(response)
# 中文
messages = [
{'role':'system', 'content':'你是个友好的聊天机器人。'},
{'role':'user', 'content':'好,你能提醒我,我的名字是什么吗?'} ]
response = get_completion_from_messages(messages, temperature=1)
print(response)
# 中文
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)
三、订餐机器人
- 自动收集用户信息:接受比萨饼店订单。
- 函数
collect_messages
:收集用户消息,避免手动输入,维护上下文列表。
- GUI(图形用户界面):使用
panel
库创建,展示订单机器人。
- 系统消息:包含菜单信息,每次调用时使用。
- 上下文增长:随着对话进行,上下文不断增长,包含用户消息和模型消息。
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)
3.1 创建JSON摘要
- 额外系统消息:指示模型创建订单的JSON摘要。
- 字段要求:包括披萨(含尺寸)、配料列表、饮料列表(含尺寸)、辅菜列表(含尺寸)和总价。
- 温度设置:使用较低温度以获得更可预测的输出。
# 中文
import panel as pn # GUI
pn.extension()
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
messages = context.copy()
messages.append(
{'role':'system', 'content':'创建上一个食品订单的 json 摘要。\
逐项列出每件商品的价格,字段应该是 1) 披萨,包括大小 2) 配料列表 3) 饮料列表,包括大小 4) 配菜列表包括大小 5) 总价'},
)
response = get_completion_from_messages(messages, temperature=0)
print(response)
总结
- 聊天机器人构建:通过系统消息和上下文构建,可以创建具有特定身份和行为的聊天机器人。
- 上下文的重要性:提供完整的上下文信息,以便模型能够理解和引用对话历史。
- 交互式界面:通过GUI与用户交互,收集和展示对话。
- JSON摘要:为订单系统提供结构化数据,便于处理和记录。