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

news2024/12/28 10:50:11

核心流程说明:

  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 检查用户输入是否合规或者是一个注入的 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
    }]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1972087.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ : namespace,输入与输出,函数重载,缺省参数

一,命名空间(namespace) 1.1命名空间的作用与定义 我们在学习c的过程中,经常会碰到命名冲突的情况。就拿我们在c语言中的一个string函数来说吧: int strncat 0; int main() {printf("%d", strncat);return 0; } 当我们运行之后&…

内网横向——常见系统传递攻击(1)

文章目录 一、哈希传递1.1 利用Mimikatz进行PTH1.2 利用Impacket进行PTH1.3 使用crackmapexec进行PTH1.4 使用PowerShell1.5 使用MSF进行哈希传递1.6 利用哈希传递登录远程桌面 二、票据传递2.1 MS14-068漏洞2.2 使用kekeo进行票据传递 网络拓扑: 攻击机kali IP&…

windows内存泄漏检查汇总

VLD(Visual Leak Detector) 下载 官方下载地址2.5 另一分支2.7 安装 点击运行安装

重装系统之前,如何保护自己的微信聊天记录?

前言 有个小伙伴想要重装系统,但又怕自己的电脑微信聊天记录全没了。于是就一直拖着不重装系统,直到有一天系统崩溃之后…… 今天咱们要讲讲:重装系统之前,如何保护自己的社交软件聊天记录。这个话题其实不仅仅是微信聊天记录&am…

喜讯|华院计算Uni-law法律大模型成功入选《2024中国数据智能产业AI大模型先锋企业》

7月24日,“2024企业数智化转型升级发展论坛——暨AI大模型趋势论坛”在北京圆满落幕。此次论坛由数据猿主办,IDC协办,新华社中国经济信息社、上海大数据联盟、上海市数商协会及上海超级计算中心作为支持单位。大会以“数智新质力拓未来”为主…

Springboot学习-day17

Springboot学习-day17 1. AOP AOP (Aspect Orient Programming),直译过来就是 面向切面编程,AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。 面向切面编程,实现在不修改源代码的情况下给程序动态统…

大模型学习路线图:从入门到精通,我说这是全网详细的,谁赞成谁反对?

随着人工智能技术的飞速发展,大模型(Large-Scale Models)已经成为推动自然语言处理(NLP)、计算机视觉(CV)等领域进步的关键因素。本文将为您详细介绍从零开始学习大模型直至成为专家的全过程&am…

吴恩达机器学习WEEK1

COURSE 1 WEEK 1 机器学习的应用 当我们有一个目标,不知道如何显示地写出来一个程序时,例如自动驾驶等,这时候就需要制定某些规则,让计算机自己去学习,即机器学习 机器学习就是沿用人脑学习的过程,逐步对…

目录文件;链接文件;函数stat/lstat

1.目录文件的操作: 1. mkdir int mkdir(const char *pathname, mode_t mode); 功能: 创建目录 参数: pathname:目录文件的路径 mode:目录文件的权限 返回值: …

6581 Number Triangle

这个问题可以通过动态规划来解决。我们可以从三角形的顶部开始,然后逐行向下计算每个位置的最大和。对于三角形中的每个位置,我们可以选择从其上方或左上方的位置移动到该位置,所以该位置的最大和就是其上方或左上方位置的最大和加上该位置的…

动态规划---观察优化枚举(股票系列问题)

121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09; public class Code01_Stock1 {public static int maxProfit(int[] prices) {int ans 0;for (int i 1, min prices[0]; i < prices.length; i) {// min : 0...i范围上的最小值min Math.min(min, prices…

Android图像显示SurfaceFlinger总结

1 介绍 1.1 框架中位置 ​​ 上图为Android的图形显示系统框架图。 首先上层应用通过ViewRoot的scheduleTraversals函数发起绘制任务&#xff0c;并通过HWUI调用OpenGL接口将绘制数据传递给GPU处理&#xff1b;SF会接收所有应用更新的绘制数据&#xff0c;并根据Z-Order、透明…

实现一个自定义前端脚手架

一、背景 什么前端脚手架&#xff1f; 前端脚手架是一种工具&#xff0c;用于快速搭建前端项目的基础结构&#xff0c;提供了一套约定和标准&#xff0c;帮助开发人员快速启动项目开发。常见的前端脚手架包括Create React App、Vue CLI、Angular CLI、nestjs/cli等。 我为什么…

C语言——二维数组和字符数组

二维数组 二维数组本质上是一个行列式的组合&#xff0c;也就是二维数组是有行和列两部分构成。二维数组数据是通过行列进行解读。 定义形式&#xff1a; 类型&#xff08;说明符&#xff09; 数组名[行数&#xff08;常量表达式1&#xff09;][列数&#xff08;常量表达式…

nginx负载均衡、java、tomcat装包

一、nginx 七层负载均衡 1、七层负载均衡基础配置 2、负载均衡状态 [rootserver]# vim /usr/local/nginx/conf/nginx.confworker_processes 1;event {worker_connections 1024&#xff1b;}http { # 七层负载均衡支持http、ftp协议include mime.types;default_type app…

T3学员领取资料通知0803

T3学员领取资料通知0803 各位学员∶本周MF系列VBA技术资料增加671-680讲&#xff0c;T3学员看到通知后请免费领取,领取时间8月2日晚上19:00-8月3日12:00。本次增加内容&#xff1a; MF671:Shell命令输出计算机的详细信息 MF672:Shell命令输出网络配置信息 MF673:解锁和启用…

QtQuick Text-文本省略

效果 import QtQuickColumn{spacing: 20Text{width: 200text: qsTr("1使文本在单行中对于超出部分不要进行省略")font.pointSize: 20}Text{width: 200elide: Text.ElideLefttext: qsTr("2使文本在单行中对于超出部分从左边进行省略")font.pointSize: 20}Te…

【协作提效 Go - gin ! swagger】

什么是swagger Swagger 是一个用于设计、构建、记录和使用 RESTful Web 服务的工具集。它的主要作用包括&#xff1a; API 文档生成&#xff1a;Swagger 可以自动生成详细的 API 文档&#xff0c;包括每个端点的请求和响应格式、参数、状态码等。这使得开发者和用户可以轻松理…

【香橙派系列教程】(五)Linux的热拔插UDEV机制

【五】Linux的热拔插UDEV机制 在上一篇中我们发现&#xff0c;当手机接入开发板时&#xff0c;系统并不认识&#xff0c;当我们在/etc/udev目录下创建一个规则后&#xff0c;就可以通过adb访问到手机了&#xff0c;这里到底是怎么回事&#xff1f; 文章目录 【五】Linux的热拔插…

【Python】数据类型(上)

本篇文章将讲解&#xff1a; &#xff08;1&#xff09;整型 &#xff08;2&#xff09;布尔类型 一&#xff1a;整型 整型其实就是十进制整数的统称&#xff0c;例如&#xff1a;1 666 都属于整型。 &#xff08;1&#xff09;定义 num11 age45 &#xff08…