- 低成本构建:利用大语言模型,只需很少的工作量就能构建出定制的聊天机器人。
- 个性化与多轮交互:通过特定的聊天格式(接口),可以实现与机器人的延伸对话,使其能够针对特定任务或行为进行个性化定制。
一个优秀的 Chatbot 包含三种消息角色系统消息(System)、用户消息(User)和助手消息(Assistant):
- 用户和助手消息代表对话双方的交替发言。
- 系统消息用于设定助手的行为、角色和全局指令。它时刻引导模型,且对用户不可见,使开发者能在不干扰用户对话的前提下精准控制机器人的属性。
1. 基础对话:角色设定与上下文记忆
通过传入消息列表,让模型扮演特定角色,且不具备上下文记忆能力。如果想让模型引用或 "记住" 对话的早期部分,则必须在模型的输入中提供早期的交流。
python
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)
输出:

2. 复杂任务:构建业务型 Chatbot(如订餐机器人)
将 Chatbot 应用于实际业务,需要设定严格的业务流程和知识库(如菜单)。在 System Prompt 中详细规定机器人的行为准则(问候 -> 收集订单 -> 确认 -> 询问地址 -> 结算),并将完整的菜单数据直接写入系统消息中。
python
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)
Chatbot 收集完用户的自然语言需求后,通常需要将其转换为后端系统能处理的数据格式。在对话结束时,追加一条新的 System 消息,要求模型基于之前的对话生成 JSON 摘要。
关键点:此时必须将 temperature 设为 0,以确保输出格式的绝对稳定和可预测。