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