目录
1、给定身份
1.1、基础代码
1.2、聊天机器人
2、构建上下文
3、订餐机器人
3.1、窗口可视化
3.2、构建机器人
3.3、创建JSON摘要
利用会话形式,与具有个性化特性(或专门为特定任务或行为设计)的聊天机器人进行深度对话。
在 Chat 网页界面中,我们的消息称为用户消息,而ChatGPT 的消息称为助手消息。
但在构建聊天机器人时,在发送了系统消息之后,您的角色可以仅作为用户 (user) ;也可以在用户和助手 (assistant) 之间交替,从而提供对话上下文。
1、给定身份
第一条消息中,我们以系统身份发送系统消息 (system message) ,它提供了一个总体的指示。
系统消息则有助于设置助手的行为和角色,并作为对话的高级指示。
1.1、基础代码
import openai
openai.api_key = "EMPTY"
openai.api_base = "http://192.168.1.1:20000/v1"
def get_completion_from_messages(messages, model="chatglm3-6b", 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':'给我讲个笑话'},
{'role':'assistant', 'content':'鸡为什么过马路'},
{'role':'user', 'content':'我不知道'} ]
response = get_completion_from_messages(messages, temperature=1)
print(response)
1.2、聊天机器人
系统消息来定义:“你是一个友好的聊天机器人”,第一个用户消息:“嗨,我叫Isa。”
# 中文
messages = [
{'role':'system', 'content':'你是个友好的聊天机器人。'},
{'role':'user', 'content':'Hi, 我是Isa。'} ]
response = get_completion_from_messages(messages, temperature=1)
print(response)
你好,Isa!很高兴认识你。有什么我可以帮忙的吗?
2、构建上下文
当我们想gpt询问一个它不知道的问题,由于缺少上下文,他无法给出一个正确的答案。
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)
当然可以,你的名字是Isa。有什么我可以帮你记住的吗?
3、订餐机器人
3.1、窗口可视化
pip install panel
import panel as pn
import numpy as np
import pandas as pd
# 创建随机数据
np.random.seed(0)
data = pd.DataFrame(np.random.randn(100, 2), columns=["A", "B"])
# 创建一个散点图
scatter = pn.pane.DataFrame(data, width=800, height=400)
# 显示散点图
scatter.show()
Launching server at http://localhost:62221
3.2、构建机器人
# 中文
import panel as pn # GUI
import openai
openai.api_key = "EMPTY"
openai.api_base = "http://192.168.1.1:20000/v1"
def get_completion_from_messages(messages, model="chatglm3-6b", temperature=0.7):
response = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=temperature, # 控制模型输出的随机程度
)
# print(str(response.choices[0].message))
return response.choices[0].message["content"]
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, css_classes=['custom-markdown']))
)
return pn.Column(*panels)
# 在适当的位置添加自定义CSS
html_code = """
<style>
.custom-markdown {
background-color: #F6F6F6;
}
</style>
"""
pn.extension(raw_css=[html_code])
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.show()
页面显示效果,及部分回复内容
3.3、创建JSON摘要
temperature=0 ,每次生成相同内容,保证结果可预测
# context 参考 3.2内容
messages = context.copy()
messages.append(
{'role':'system', 'content':
'''创建上一个食品订单的 json 摘要。\
逐项列出每件商品的价格,字段应该是 1) 披萨,包括大小 2) 配料列表 3) 饮料列表,包括大小 4) 配菜列表包括大小 5) 总价
你应该给我返回一个可解析的Json对象,包括上述字段'''},
)
response = get_completion_from_messages(messages, temperature=0)
print(response)
{
"披萨": {
"大尺寸": 15.0,
"小尺寸": 12.0
},
"配料": [
{
"名称": "切片奶酪",
"大小": "大尺寸"
},
{
"名称": "番茄酱",
"大小": "小尺寸"
}
],
"饮料": [
{
"名称": "可乐",
"大小": "大尺寸"
},
{
"名称": "果汁",
"大小": "小尺寸"
}
],
"配菜": [
{
"名称": "洋葱",
"大小": "大尺寸"
},
{
"名称": "蘑菇",
"大小": "小尺寸"
}
],
"总价": 42.0
}