核心流程说明:
- 对用户的输入进行检验,验证其是否可以通过审核 API 的标准。
- 若输入顺利通过审核,我们将进一步对产品目录进行搜索。
- 若产品搜索成功,我们将继续寻找相关的产品信息。
- 我们使用模型针对用户的问题进行回答。
- 最后,我们会使用审核 API 对生成的回答进行再次的检验。
如果最终答案没有被标记为有害,那么我们将毫无保留地将其呈现给用户。
1、后台接入
import openai
import utils_zh
from tool import get_completion_from_messages
'''
注意:限于模型对中文理解能力较弱,中文 Prompt 可能会随机出现不成功,可以多次运行;也非常欢迎同学探究更稳定的中文 Prompt
'''
def process_user_message_ch(user_input, all_messages, debug=True):
"""
对用户信息进行预处理
参数:
user_input : 用户输入
all_messages : 历史信息
debug : 是否开启 DEBUG 模式,默认开启
"""
# 分隔符
delimiter = "```"
# 第一步: 使用 OpenAI 的 Moderation API 检查用户输入是否合规或者是一个注入的 Prompt
response = openai.Moderation.create(input=user_input)
moderation_output = response["results"][0]
# 经过 Moderation API 检查该输入不合规
if moderation_output["flagged"]:
print("第一步:输入被 Moderation 拒绝")
return "抱歉,您的请求不合规"
# 如果开启了 DEBUG 模式,打印实时进度
if debug: print("第一步:输入通过 Moderation 检查")
# 第二步:抽取出商品和对应的目录,类似于之前课程中的方法,做了一个封装
category_and_product_response = utils_zh.find_category_and_product_only(user_input, utils_zh.get_products_and_category())
#print(category_and_product_response)
# 将抽取出来的字符串转化为列表
category_and_product_list = utils_zh.read_string_to_list(category_and_product_response)
#print(category_and_product_list)
if debug: print("第二步:抽取出商品列表")
# 第三步:查找商品对应信息
product_information = utils_zh.generate_output_string(category_and_product_list)
if debug: print("第三步:查找抽取出的商品信息")
# 第四步:根据信息生成回答
system_message = f"""
您是一家大型电子商店的客户服务助理。\
请以友好和乐于助人的语气回答问题,并提供简洁明了的答案。\
请确保向用户提出相关的后续问题。
"""
# 插入 message
messages = [
{'role': 'system', 'content': system_message},
{'role': 'user', 'content': f"{delimiter}{user_input}{delimiter}"},
{'role': 'assistant', 'content': f"相关商品信息:\n{product_information}"}
]
# 获取 GPT3.5 的回答
# 通过附加 all_messages 实现多轮对话
final_response = get_completion_from_messages(all_messages + messages)
if debug:print("第四步:生成用户回答")
# 将该轮信息加入到历史信息中
all_messages = all_messages + messages[1:]
# 第五步:基于 Moderation API 检查输出是否合规
response = openai.Moderation.create(input=final_response)
moderation_output = response["results"][0]
# 输出不合规
if moderation_output["flagged"]:
if debug: print("第五步:输出被 Moderation 拒绝")
return "抱歉,我们不能提供该信息"
if debug: print("第五步:输出经过 Moderation 检查")
# 第六步:模型检查是否很好地回答了用户问题
user_message = f"""
用户信息: {delimiter}{user_input}{delimiter}
代理回复: {delimiter}{final_response}{delimiter}
回复是否足够回答问题
如果足够,回答 Y
如果不足够,回答 N
仅回答上述字母即可
"""
# print(final_response)
messages = [
{'role': 'system', 'content': system_message},
{'role': 'user', 'content': user_message}
]
# 要求模型评估回答
evaluation_response = get_completion_from_messages(messages)
# print(evaluation_response)
if debug: print("第六步:模型评估该回答")
# 第七步:如果评估为 Y,输出回答;如果评估为 N,反馈将由人工修正答案
if "Y" in evaluation_response: # 使用 in 来避免模型可能生成 Yes
if debug: print("第七步:模型赞同了该回答.")
return final_response, all_messages
else:
if debug: print("第七步:模型不赞成该回答.")
neg_str = "很抱歉,我无法提供您所需的信息。我将为您转接到一位人工客服代表以获取进一步帮助。"
return neg_str, all_messages
user_input = "请告诉我关于 smartx pro phone 和 the fotosnap camera 的信息。另外,请告诉我关于你们的tvs的情况。"
response,_ = process_user_message_ch(user_input,[])
print(response)
第一步:输入通过 Moderation 检查 第二步:抽取出商品列表 第三步:查找抽取出的商品信息 第四步:生成用户回答 第五步:输出经过 Moderation 检查 第六步:模型评估该回答 第七步:模型赞同了该回答. 关于SmartX ProPhone和FotoSnap相机的信息如下: SmartX ProPhone: - 品牌:SmartX - 型号:SX-PP10 - 屏幕尺寸:6.1英寸 - 存储容量:128GB - 相机:12MP双摄像头 - 网络:支持5G - 保修:1年 - 价格:899.99美元 FotoSnap相机系列: 1. FotoSnap DSLR相机: - 品牌:FotoSnap - 型号:FS-DSLR200 - 传感器:24.2MP - 视频:1080p - 屏幕:3英寸LCD - 可更换镜头 - 保修:1年 - 价格:599.99美元 2. FotoSnap无反相机: - 品牌:FotoSnap - 型号:FS-ML100 - 传感器:20.1MP - 视频:4K - 屏幕:3英寸触摸屏 - 可更换镜头 - 保修:1年 - 价格:799.99美元 3. FotoSnap即时相机: - 品牌:FotoSnap - 型号:FS-IC10 - 即时打印 - 内置闪光灯 - 自拍镜 - 电池供电 - 保修:1年 - 价格:69.99美元 关于我们的电视情况如下: 1. CineView 4K电视: - 品牌:CineView - 型号:CV-4K55 - 屏幕尺寸:55英寸 - 分辨率:4K - HDR支持 - 智能电视功能 - 保修:2年 - 价格:599.99美元 2. CineView 8K电视: - 品牌:
2、添加可视化页面
# 调用中文 Prompt 版本
def collect_messages_ch(debug=True):
"""
用于收集用户的输入并生成助手的回答
参数:
debug: 用于觉得是否开启调试模式
"""
user_input = inp.value_input
if debug: print(f"User Input = {user_input}")
if user_input == "":
return
inp.value = ''
global context
# 调用 process_user_message 函数
#response, context = process_user_message(user_input, context, utils.get_products_and_category(),debug=True)
response, context = process_user_message_ch(user_input, context, debug=False)
# print(response)
context.append({'role':'assistant', 'content':f"{response}"})
panels.append(
pn.Row('User:', pn.pane.Markdown(user_input, width=600)))
panels.append(
pn.Row('Assistant:', pn.pane.Markdown(response, width=600, style={'background-color': '#F6F6F6'})))
return pn.Column(*panels) # 包含了所有的对话信息
4、工具类
未完待续......
import requests
url = "http://192.168.20.113:9997/v1/chat/completions"
def get_completion_from_messages(message):
body = {
"messages": message,
"model": "llama3-8b-N68yvnUx",
}
headers = {'Content-Type': 'application/json'}
response = requests.post(url, headers=headers, json=body)
chat = response.json()
return chat['choices'][0]['message']['content']
def moderation(input):
return {"results": [{"flagged": False}]}
def find_category_and_product_only(user_input, param):
return None
def get_products_and_category():
return category
category = [{
"名称": "SmartX ProPhone",
"类别": "智能手机和配件",
"品牌": "SmartX",
"型号": "SX-PP10",
"保修期": "1 year",
"评分": 4.6,
"特色": [
"6.1-inch display",
"128GB storage",
"12MP dual camera",
"5G"
],
"描述": "一款拥有先进摄像功能的强大智能手机。",
"价格": 899.99
},
{
"名称": "FotoSnap DSLR Camera",
"类别": "相机和摄像机",
"品牌": "FotoSnap",
"型号": "FS-DSLR200",
"保修期": "1 year",
"评分": 4.7,
"特色": [
"24.2MP sensor",
"1080p video",
"3-inch LCD",
"Interchangeable lenses"
],
"描述": "使用这款多功能的单反相机,捕捉惊艳的照片和视频。",
"价格": 599.99
},
{
"名称": "FotoSnap Mirrorless Camera",
"类别": "相机和摄像机",
"品牌": "FotoSnap",
"型号": "FS-ML100",
"保修期": "1 year",
"评分": 4.6,
"特色": [
"20.1MP sensor",
"4K video",
"3-inch touchscreen",
"Interchangeable lenses"
],
"描述": "一款具有先进功能的小巧轻便的无反相机。",
"价格": 799.99
},
{
"名称": "FotoSnap Instant Camera",
"类别": "相机和摄像机",
"品牌": "FotoSnap",
"型号": "FS-IC10",
"保修期": "1 year",
"评分": 4.1,
"特色": [
"Instant prints",
"Built-in flash",
"Selfie mirror",
"Battery-powered"
],
"描述": "使用这款有趣且便携的即时相机,创造瞬间回忆。",
"价格": 69.99
},
{
"名称": "CineView 4K TV",
"类别": "电视和家庭影院系统",
"品牌": "CineView",
"型号": "CV-4K55",
"保修期": "2 years",
"评分": 4.8,
"特色": [
"55-inch display",
"4K resolution",
"HDR",
"Smart TV"
],
"描述": "一款色彩鲜艳、智能功能丰富的惊艳4K电视。",
"价格": 599.99
},
{
"名称": "CineView 8K TV",
"类别": "电视和家庭影院系统",
"品牌": "CineView",
"型号": "CV-8K65",
"保修期": "2 years",
"评分": 4.9,
"特色": [
"65-inch display",
"8K resolution",
"HDR",
"Smart TV"
],
"描述": "通过这款惊艳的8K电视,体验未来。",
"价格": 2999.99
},
{
"名称": "CineView OLED TV",
"类别": "电视和家庭影院系统",
"品牌": "CineView",
"型号": "CV-OLED55",
"保修期": "2 years",
"评分": 4.7,
"特色": [
"55-inch display",
"4K resolution",
"HDR",
"Smart TV"
],
"描述": "通过这款OLED电视,体验真正的五彩斑斓。",
"价格": 1499.99
},
{
"名称": "SoundMax Home Theater",
"类别": "电视和家庭影院系统",
"品牌": "SoundMax",
"型号": "SM-HT100",
"保修期": "1 year",
"评分": 4.4,
"特色": [
"5.1 channel",
"1000W output",
"Wireless subwoofer",
"Bluetooth"
],
"描述": "一款强大的家庭影院系统,提供沉浸式音频体验。",
"价格": 399.99
},
{
"名称": "SoundMax Soundbar",
"类别": "电视和家庭影院系统",
"品牌": "SoundMax",
"型号": "SM-SB50",
"保修期": "1 year",
"评分": 4.3,
"特色": [
"2.1 channel",
"300W output",
"Wireless subwoofer",
"Bluetooth"
],
"描述": "使用这款时尚而功能强大的声音,升级您电视的音频体验。",
"价格": 199.99
}]