【Prompt Engineering】7 聊天机器人

devtools/2024/12/22 14:39:15/

一、引言

  • 大型语言模型:可以用来构建定制聊天机器人,工作量小。
  • 聊天模型:以消息序列为输入,返回模型生成的消息作为输出,适用于多轮对话和单轮任务。
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.contentdef 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_inputinp.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 messagesinp = 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摘要:为订单系统提供结构化数据,便于处理和记录。

http://www.ppmy.cn/devtools/144397.html

相关文章

数据结构(Java版)第六期:LinkedList与链表(一)

目录 一、链表 1.1. 链表的概念及结构 1.2. 链表的实现 专栏:数据结构(Java版) 个人主页:手握风云 一、链表 1.1. 链表的概念及结构 链表是⼀种物理存储结构上⾮连续存储结构,数据元素的逻辑顺序是通过链表中的引⽤链接次序实现的。与火车…

srping2.0+升级到spring3.0+遇到的问题,es部分记录一下

最近公司项目,在做版本升级,首先srping2.0升级到spring3.0,目前无漏洞版本是springBoot3.2.12springClould2023.0.3,升级完spring,紧接着升级es,原来我们使用的es客户端版本是7.9.3,升级到无漏洞版本是7.17.23 <elasticsearch.version>7.17.23</elasticsearch.version…

玩安卓-鸿蒙版 二 首页横幅、搜索、跳转链接功能

本篇涉及组件TextInput、Image、Menu、Swiper、Web、自定义组件、路由跳转传参、POST请求 1.首页横幅 Swiper组件内部需要放其他内容组件&#xff0c;且需要设置宽高100%。 Image显示网络图片&#xff0c;直接设置图片链接即可。 Swiper(){ForEach(this.bannerData,(data:Dat…

MQTT实现集群分布式消费

今天被问到启用多个应用消费时&#xff0c;每个消费者都会受到订阅消息的事。很久前用过&#xff0c;这里梳理记录一下&#xff1a; MQTT协议本身是支持共享订阅功能。 这里这个共享订阅比较特殊&#xff0c;他有点类似kafka的消费组的概念。但是设计和实现上区别比较大。 设…

算法日记 49 day 图论(A*算法)

这算是算法的最后一篇了&#xff0c;原本A*之前还有一些相关的最短路径算法的&#xff0c;比如dijkstra的堆优化&#xff0c;SPFA等等&#xff0c;但是有些我没看懂&#xff0c;就不写了&#xff0c;用A*做个结尾。 题目&#xff1a;骑士的攻击 127. 骑士的攻击 (kamacoder.co…

35. Three.js案例-创建带阴影的球体与平面

35. Three.js案例-创建带阴影的球体与平面 实现效果 知识点 WebGLRenderer WebGLRenderer 是Three.js中用于渲染场景的主要类之一&#xff0c;它负责将场景中的对象渲染到画布上。 构造器 new THREE.WebGLRenderer(parameters : Object) 参数类型描述parametersObject可选…

CPU性能优化-磁盘空间和解析时间

即使考虑了跟踪文件的压缩格式&#xff0c;编码后的数据仍然会占用很大的磁盘空间。通常&#xff0c;每条指令不超过1字节&#xff0c;但是考虑到CPU执行指令的速度&#xff0c;数据仍然非常多。根据负载&#xff0c;CPU编码以100MB/s的速度处理PT跟踪文件的情况是很常见的&…

怎么给视频加上背景音乐和文字?适合新手

在当今的视频创作领域&#xff0c;给视频添加背景音乐和文字能够极大地提升视频的吸引力与表现力。下面就为大家详细介绍如何借助便捷的剪辑工具&#xff0c;完成视频的背景音乐与文字添加工作。 工具&#xff1a;影忆 1.前期筹备要点 1.1背景音乐的筛选 背景音乐与视频主题及情…