当前位置: 首页 > news >正文

【LLM】-14-搭建问答系统

核心流程说明:

  1. 对用户的输入进行检验,验证其是否可以通过审核 API 的标准。
  2. 若输入顺利通过审核,我们将进一步对产品目录进行搜索。
  3. 若产品搜索成功,我们将继续寻找相关的产品信息。
  4. 我们使用模型针对用户的问题进行回答。
  5. 最后,我们会使用审核 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 检查用户输入是否合规或者是一个注入的 Promptresponse = 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"""您是一家大型电子商店的客户服务助理。\请以友好和乐于助人的语气回答问题,并提供简洁明了的答案。\请确保向用户提出相关的后续问题。"""# 插入 messagemessages = [{'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 来避免模型可能生成 Yesif debug: print("第七步:模型赞同了该回答.")return final_response, all_messageselse:if debug: print("第七步:模型不赞成该回答.")neg_str = "很抱歉,我无法提供您所需的信息。我将为您转接到一位人工客服代表以获取进一步帮助。"return neg_str, all_messagesuser_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_inputif debug: print(f"User Input = {user_input}")if user_input == "":returninp.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 requestsurl = "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 Nonedef get_products_and_category():return categorycategory = [{"名称": "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}]

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 天气曲线echarts
  • PHP常用函数
  • Opencv学习-LUT函数
  • 人工智能未来展望
  • 基于域名的虚拟主机、多虚拟主机的配置、基于ip的虚拟主机及上线静态的前端系统(商城系统)
  • jenkins服务器重启,构建记录消失
  • 结构型设计模式:适配器/代理
  • Qt——QTCreater ui界面如何统一设置字体
  • 设计用户登录与注册界面切换的HTML+CSS+JS代码
  • 达梦数据库的系统视图v$cachers
  • 智能语音转Markdown的神器
  • 系统架构设计师 - 知识产权与标准化
  • KubeSphere 部署的 Kubernetes 集群使用 GlusterFS 存储实战入门
  • 建筑业数据挖掘:Scala爬虫在大数据分析中的作用
  • 56_AOP
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • 10个确保微服务与容器安全的最佳实践
  • 2017 年终总结 —— 在路上
  • Android交互
  • css选择器
  • gf框架之分页模块(五) - 自定义分页
  • Hibernate【inverse和cascade属性】知识要点
  • javascript面向对象之创建对象
  • Mac转Windows的拯救指南
  • MobX
  • PHP 7 修改了什么呢 -- 2
  • Quartz初级教程
  • spring + angular 实现导出excel
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 成为一名优秀的Developer的书单
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 七牛云假注销小指南
  • 通过git安装npm私有模块
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 中文输入法与React文本输入框的问题与解决方案
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 积累各种好的链接
  • ​MySQL主从复制一致性检测
  • ​用户画像从0到100的构建思路
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (007)XHTML文档之标题——h1~h6
  • (04)odoo视图操作
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (5)STL算法之复制
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (纯JS)图片裁剪
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (十一)c52学习之旅-动态数码管
  • (一) storm的集群安装与配置
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介