大模型应用:基于Golang + 大模型构建简易的电商售前对话服务

在这里插入图片描述

1.背景

某X互联网电商公司为了解决当前大量用户的售前咨询问题,需要建设一个不需要客服介入的简易电商售前机器人,用于回答用户的售前问题,并给出基本可靠的咨询回答。
当前大模型如gpt、baichuan、文心等均有开放使用的OpenAPI接口,且调用费用低廉。可以基于大模型来构建简易的电商售前对话服务。
本文介绍一种基于Golang + gpt-3.5-turbo构建对话服务的方案。

2.概要设计

2.1.核心需求

对话服务的核心接口为Chat,即自动对话接口:

  • 输入:用户咨询文本
  • 输出:咨询结果

核心要求:

  1. 能够判断咨询内容是否与售卖商品相关
  2. 能够简单回答用户对于商品的咨询问题,如价格、材质、用途
  3. 能够以友好的语气回答用户问题
  4. 对于非商品售卖问题、暴力血腥问题等, 不给予回答

2.2.核心流程

在这里插入图片描述

3.详细设计

核心实现代码:https://github.com/pbrong/llm_hub/tree/master/module/chatbot

3.1.内容审查

OpenAI提供了内容审查的能力,可用于检查文本是否具有潜在危险内容,如暴力、血腥、性等输入内容。

  • 接口:v1/moderations
  • 入参:
{"input": "我要去轰炸米国"    
}
- 响应:- flagged:是否存在违规词- categories:文本违规分类- category_scores:文本违规分类得分
{"id": "modr-9Xh7J5zoVHoyb4rokiDHHvd1CYdPD","model": "text-moderation-007","results": [{"flagged": true,"categories": {"sexual": false,"hate": true,"harassment": true,"self-harm": false,"sexual/minors": false,"hate/threatening": false,"violence/graphic": false,"self-harm/intent": false,"self-harm/instructions": false,"harassment/threatening": true,"violence": true},"category_scores": {"sexual": 0.00008100192644633353,"hate": 0.5908858776092529,"harassment": 0.6599222421646118,"self-harm": 1.1431256297100845e-7,"sexual/minors": 9.379126595376874e-7,"hate/threatening": 0.09888827055692673,"violence/graphic": 0.000004452876964933239,"self-harm/intent": 1.831264739848848e-8,"self-harm/instructions": 1.7390346107593047e-10,"harassment/threatening": 0.8955895900726318,"violence": 0.9563981294631958}}]
}

对于本次对话服务,直接按flagged来判断是否存在违规词即可。但对于某些儿童教育等应用,需直接判断违规分数,大于一定阈值即认定违规。

3.2.角色链拆分

一次对话流程如果都在一个Prompt中完成,那么这个Prompt会非常复杂且不利于维护和评估,可以按按照“角色链”来对复杂的Prompt进行拆分。
内容审查没问题后开始进入真正的问答环节,第一步是前置校验,会对用户的输入进行辨别,判断是否与电商咨询相关,如果询问的问题与咨询无关,则不进入下一步。
在前置校验完成后,确定是咨询问题,第二步进行真正的推理回答,回答过程中需要加载商品信息至Prompt输入中(即fewshot),让LLM能够根据商品信息进行推理回答。
在回答完成后,第三步将推理的回答进行语句优化,给出更良好体验的客服回答。

抽象接口

module
│   └── chatbot
│       ├── core_infer_role.go
│       ├── helper.go
│       ├── output_opt_role.go
│       └── pre_check_role.go

抽象出角色及角色链接口,方便扩展:

  • module/chatbot/helper.go
package chatbotimport "context"var (// 前置校验角色PreCheckRole ChatRole// 核心对话推理角色CoreInferRole ChatRole// 对话输出优化角色OutputOptRole ChatRole
)type ChatRole interface {Chat(ctx context.Context, input string, optArgs *OptArg) (output string, err error)
}type OptArg struct {Products []string
}type ChatChain []ChatRolefunc NewChatChain(roles ...ChatRole) ChatChain {chain := ChatChain{}chain = append(chain, roles...)return chain
}func (chain ChatChain) Run(ctx context.Context, input string, optArg *OptArg) (output string, err error) {for _, role := range chain {output, err = role.Chat(ctx, input, optArg)if err != nil {return "", err}if output == "N" {return "请咨询相关问题", nil}if output != "" && output != "Y" {input = output}}return output, nil
}func Init() {PreCheckRole = NewPreCheckRole()CoreInferRole = NewCoreInferRole()OutputOptRole = NewOutputOptRole()
}

前置校验角色

  • module/chatbot/pre_check_role.go
package chatbotimport ("context""fmt""llm_hub/pkg/llm_caller"
)type preCheckRole struct{}func NewPreCheckRole() ChatRole {return &preCheckRole{}
}func (role *preCheckRole) Chat(ctx context.Context, input string, optArg *OptArg) (output string, err error) {systemPrompt := `请仔细检查{}括起来的用户输入文本,判断该输入文本是否与电商咨询/售前咨询问题相关。你只可以输出Y或N,分别代表是相关咨询问题和不是相关咨询问题。
`gptCaller, err := llm_caller.NewGptLLMCaller(ctx, systemPrompt, 0, 1024)if err != nil {return "", err}completion, err := gptCaller.Call(ctx, fmt.Sprintf("用户输入:{%v}", input))if err != nil {return "", err}return completion, nil
}

推理回答角色

  • module/chatbot/core_infer_role.go
package chatbotimport ("context""errors""fmt""llm_hub/pkg/llm_caller"
)type coreInferRole struct{}func NewCoreInferRole() ChatRole {return &coreInferRole{}
}func (role *coreInferRole) Chat(ctx context.Context, input string, optArg *OptArg) (output string, err error) {if len(optArg.Products) == 0 {return "", errors.New("product not exist")}systemPrompt := `请仔细阅读并理解{}括起来的用户咨询问题,给出你的咨询回答。请严格遵循以下过程判断和回答:1-首先判断用户咨询的问题中,是否存在商品相关信息2-若存在商品相关信息,则结合{}括起来的商品信息进行回答
`gptCaller, err := llm_caller.NewGptLLMCaller(ctx, systemPrompt, 0, 2048)if err != nil {return "", err}completion, err := gptCaller.Call(ctx, fmt.Sprintf("用户咨询问题:{%v}\n商品信息:{%v}", input, optArg.Products))if err != nil {return "", err}return completion, nil
}

语句优化角色

  • module/chatbot/output_opt_role.go
package chatbotimport ("context""fmt""llm_hub/pkg/llm_caller"
)type outputOptRole struct{}func NewOutputOptRole() ChatRole {return &outputOptRole{}
}func (role *outputOptRole) Chat(ctx context.Context, input string, optArg *OptArg) (output string, err error) {systemPrompt := `你是一个友好的客服机器人,现在需要对{}括起来的原始回答信息进行优化,并输出优化后的回答。要求:1-优化后的回答不能与原始回答存在歧义2-优化后的回答需要显示出耐心、友好和语句通顺3-将原始回答中的JSON格式优化为可以阅读的自然语言格式输出4-输出的优化回答中,不要带有经过优化等字样
`gptCaller, err := llm_caller.NewGptLLMCaller(ctx, systemPrompt, 0, 2048)if err != nil {return "", err}completion, err := gptCaller.Call(ctx, fmt.Sprintf("原始回答信息:{%v}", input))if err != nil {return "", err}return completion, nil
}

对话服务测试

  • service/chatbot/chatbot_service.go
package chatbot_serviceimport ("context""llm_hub/module/chatbot"
)var ChatBotServiceV1 = chatBotServiceV1{}type ChatBotService interface {Chat(ctx context.Context, message string) (output string, err error)
}type chatBotServiceV1 struct{}func (service *chatBotServiceV1) Chat(ctx context.Context, message string) (output string, err error) {// 初始化角色链chain := chatbot.NewChatChain(chatbot.PreCheckRole,chatbot.CoreInferRole,chatbot.OutputOptRole)// 检索商品信息(RAG)products := retrievalProducts(ctx)// 调用llmoutput, err = chain.Run(ctx, message, &chatbot.OptArg{Products: products,})if err != nil {return "", err}return output, nil
}func retrievalProducts(ctx context.Context) []string {// Mock一批数据,这里其实是一段RAG搜索逻辑(by向量匹配)return []string{`{"名称": "SoundMax Soundbar","类别": "电视和家庭影院系统","品牌": "SoundMax","型号": "SM-SB50","保修期": "1 year","评分": 4.3,"特色": ["2.1 channel","300W output","Wireless subwoofer","Bluetooth"],"描述": "使用这款时尚而功能强大的声音,升级您电视的音频体验。","价格": 199.99}`,`{"名称": "SoundMax Home Theater","类别": "电视和家庭影院系统","品牌": "SoundMax","型号": "SM-HT100","保修期": "1 year","评分": 4.4,"特色": [3.3 生成用户查询的答案"5.1 channel","1000W output","Wireless subwoofer","Bluetooth"],"描述": "一款强大的家庭影院系统,提供沉浸式音频体验。","价格": 399.99}`,`{"名称": "CineView OLED TV","类别": "电视和家庭影院系统","品牌": "CineView","型号": "CV-OLED55","保修期": "2 years","评分": 4.7,"特色": ["55-inch display","4K resolution","HDR","Smart TV"],"描述": "通过这款OLED电视,体验真正的五彩斑斓。","价格": 1499.99}`,`{"名称": "CineView 8K TV","类别": "电视和家庭影院系统","品牌": "CineView","型号": "CV-8K65","保修期": "2 years","评分": 4.9,"特色": ["65-inch display","8K resolution","HDR","Smart TV"],"描述": "通过这款惊艳的8K电视,体验未来。","价格": 2999.99}`,`{"名称": "CineView 4K TV","类别": "电视和家庭影院系统","品牌": "CineView","型号": "CV-4K55","保修期": "2 years","评分": 4.8,"特色": ["55-inch display","4K resolution","HDR","Smart TV"],"描述": "一款色彩鲜艳、智能功能丰富的惊艳4K电视。","价格": 599.99}`,}
}
  • service/chatbot/chatbot_service_test.go
package chatbot_serviceimport ("context""github.com/stretchr/testify/require""llm_hub/conf""llm_hub/module/chatbot""testing""time"
)func Test_chatBotServiceV1_Chat(t *testing.T) {conf.Init()chatbot.Init()ctx := context.Background()chatbotService := &chatBotServiceV1{}// 模拟用户咨询userConsults := []string{"你们有哪些产品?","我可以咨询下现在天气怎么样?","电视相关的产品有哪些?","CineView OLED TV和SoundMax Home Theater有什么区别,介绍一下?",}for idx, consult := range userConsults {output, err := chatbotService.Chat(ctx, consult)require.Nil(t, err)t.Logf("用户咨询%v:%v\n机器人回答:%v", idx+1, consult, output)time.Sleep(time.Minute)}
}
  • 输出:
用户咨询1:你们有哪些产品?
机器人回答:我们有以下产品供您选择:1. **SoundMax Soundbar**- 类别:电视和家庭影院系统- 品牌:SoundMax- 型号:SM-SB50- 保修期:1- 评分:4.3- 特色:2.1声道、300W输出、无线低音炮、蓝牙- 描述:这款时尚而功能强大的声音系统可升级您电视的音频体验。- 价格:199.992. **SoundMax Home Theater**- 类别:电视和家庭影院系统- 品牌:SoundMax- 型号:SM-HT100- 保修期:1- 评分:4.4- 特色:5.1声道、1000W输出、无线低音炮、蓝牙- 描述:这款强大的家庭影院系统提供沉浸式音频体验。- 价格:399.993. **CineView OLED TV**- 类别:电视和家庭影院系统- 品牌:CineView- 型号:CV-OLED55- 保修期:2- 评分:4.7- 特色:55英寸显示屏、4K分辨率、HDR、智能电视- 描述:这款OLED电视让您体验真正的五彩斑斓。- 价格:1499.994. **CineView 8K TV**- 类别:电视和家庭影院系统- 品牌:CineView- 型号:CV-8K65- 保修期:2- 评分:4.9- 特色:65英寸显示屏、8K分辨率、HDR、智能电视- 描述:这款惊艳的8K电视让您体验未来。- 价格:2999.995. **CineView 4K TV**- 类别:电视和家庭影院系统- 品牌:CineView- 型号:CV-4K55- 保修期:2- 评分:4.8- 特色:55英寸显示屏、4K分辨率、HDR、智能电视- 描述:这款色彩鲜艳、智能功能丰富的惊艳4K电视让您体验视觉盛宴。- 价格:599.99以上是我们目前提供的产品列表,希望能满足您的需求。用户咨询2:我可以咨询下现在天气怎么样?
机器人回答:请咨询相关问题用户咨询3:电视相关的产品有哪些?
机器人回答:根据您的咨询,这里有一些与电视相关的产品信息供您参考:1. **SoundMax Soundbar**- 类别: 电视和家庭影院系统- 品牌: SoundMax- 型号: SM-SB50- 保修期: 1- 评分: 4.3- 特色: 2.1声道、300W输出、无线低音炮、蓝牙- 描述: 这款时尚而功能强大的声音设备可提升您电视的音频体验。- 价格: 199.99美元2. **SoundMax Home Theater**- 类别: 电视和家庭影院系统- 品牌: SoundMax- 型号: SM-HT100- 保修期: 1- 评分: 4.4- 特色: 5.1声道、1000W输出、无线低音炮、蓝牙- 描述: 这款强大的家庭影院系统可提供沉浸式音频体验。- 价格: 399.99美元3. **CineView OLED TV**- 类别: 电视和家庭影院系统- 品牌: CineView- 型号: CV-OLED55- 保修期: 2- 评分: 4.7- 特色: 55英寸显示屏、4K分辨率、HDR、智能电视- 描述: 这款OLED电视让您体验真正的五彩斑斓。- 价格: 1499.99美元4. **CineView 8K TV**- 类别: 电视和家庭影院系统- 品牌: CineView- 型号: CV-8K65- 保修期: 2- 评分: 4.9- 特色: 65英寸显示屏、8K分辨率、HDR、智能电视- 描述: 这款惊艳的8K电视让您体验未来。- 价格: 2999.99美元5. **CineView 4K TV**- 类别: 电视和家庭影院系统- 品牌: CineView- 型号: CV-4K55- 保修期: 2- 评分: 4.8- 特色: 55英寸显示屏、4K分辨率、HDR、智能电视- 描述: 这款色彩鲜艳、智能功能丰富的惊艳4K电视让您享受视听盛宴。- 价格: 599.99美元以上是一些与电视相关的产品信息,希望这些信息能帮助您根据自己的需求和预算选择适合的产品。如果您有任何疑问或需要进一步帮助,请随时告诉我。用户咨询4:CineView OLED TV和SoundMax Home Theater有什么区别,介绍一下?
机器人回答:根据提供的商品信息,CineView OLED TV和SoundMax Home Theater有以下区别:1. **品牌和产品类型**- CineView OLED TV是CineView品牌的电视产品,专注于高清晰度和色彩表现。- SoundMax Home Theater是SoundMax品牌的家庭影院系统,致力于提供沉浸式音频体验。2. **功能和特点**- CineView OLED TV是一款55英寸的OLED电视,支持4K分辨率、HDR技术和智能电视功能,旨在提供优质的视觉体验。- SoundMax Home Theater采用5.1声道设计,具有1000W输出功率、无线低音炮和蓝牙连接,旨在提供沉浸式的音频体验。3. **价格和保修**- CineView OLED TV售价为1499.99美元,保修期为2年。- SoundMax Home Theater售价为399.99美元,保修期为1年。综上所述,CineView OLED TV注重提供优质的视觉体验,而SoundMax Home Theater专注于带来更加沉浸式的音频体验。用户可根据个人需求和预算选择适合的产品。

3.3.检索增强生成

检索增强生成(RAG)是一种通过在检索对话所需相关上下文信息,并将其与Prompt结合,一起输入给大模型以得到更加准确回答结果的技术。上文中chatbot_service的retrievalProducts方法,其实就是一个Mock的RAG。
检索增强生成一般用于复杂的需要依赖上下文信息的推理需求中使用,比如这次商品问答,必须有商品相关的信息给到LLM,LLM才能根据这部分信息,给出准确的回答。
在Fewshot(少样本提示)中,也会需要使用检索增强生成:
在这里插入图片描述

检索增强生成的关键技术是数据向量化、向量数据存储、向量数据检索召回:
在这里插入图片描述

后续有时间会发一篇检索增强生成系统的详细设计。

3.4.系统评估体系

这次拆分了三个角色来对问答系统进行支持,但如果后续Prompt语句需要调整,要如何验证是否能回答得更好,以及对比之前的回答表现呢?
这就涉及到系统评估系统的建设,一般来说每个LLM角色都需要建立对应的验证集,去验证每次Prompt调整后在验证集中的表现。
对于简单的LLM评估,如前置校验角色,我们可以通过拟定好的Y/N来计算评估得分,但对于复杂的LLM评估,如推理回答角色,其给出的回答并没有完全准确的“Y/N”,所以要如何来评估新的回答是否更好?现在流行的一种思路是通过另一个“评估专家LLM角色”,来对新旧回答做一次对比,由它来决定哪个回答更好。

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

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

相关文章

ROS学习记录:栅格地图格式

一、机器人导航所使用的地图数据,就是ROS导航软件包里的map_server节点在话题 /map 中发布的消息数据,消息类型是nav_msgs消息包中的OccupancyGrid,它的中文意思的占据栅格,是一种正方形小格子组成的地图。 二、对障碍物进行俯视&…

1-什么是护网行动

1.什么是护网行动 2016年,公安部会同民航局、国家电网组织开展了“护网2016”网络安全攻防演习活动。同年,《网络安全法》颁布,出台网络安全演练相关规定:关键信息基础设施的运营者应“制定网络安全事件应急预案,并定期进行演练”…

Django框架中Ajax GET与POST请求的实战应用

系列文章目录 以下几篇侧重点为JavaScript内容0.0 JavaScript入门宝典:核心知识全攻略(上)JavaScript入门宝典:核心知识全攻略(下)Django框架中Ajax GET与POST请求的实战应用VSCode调试揭秘:L…

电子电气架构——车载诊断DTC一文通

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标…

springcloud第4季 springcloud-gateway网关filter案例场景

一 filter作用 1.1 filter搭建流程 1.1.1 网关配置 1.1.2 服务提供者 1.1.3 测试验证 1.启动consul 2.启动zipkin 3.启动应用微服务 4.进行访问: http://localhost:6666/pay/wg/filter 1.2 其他常见API RemoveRequestHeadersec-fetch-site # 删除请求…

[word] word表格如何设置外框线和内框线 #媒体#笔记

word表格如何设置外框线和内框线 点击表格的左上角按钮从而选中表格 点击边框按钮边上的下拉箭头,选择边框和底纹 点击颜色边上的下拉箭头,选择红色 点击取消掉中间的边框,只保留外围边框 点击颜色边上的下拉箭头,选择另外一个颜…

Linux CGroup资源限制(概念限制进程CPU使用)

Linux CGroup资源限制(详解) 最近客户认为我们程序占用cpu过高,希望我们限制,排查之后发现是因为程序频繁gc导致,为了精细化、灵活的的限制,想到了使用Linux CGroup。 0 前置知识 ①概念及作用 官网&#…

Llama模型家族之使用 ReFT技术对 Llama-3 进行微调(三)为 ReFT 微调准备模型及数据集

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…

逻辑这回事(四)----时序分析与时序优化

基本时序参数 图1.1 D触发器结构 图1.2 D触发器时序 时钟clk采样数据D时,Tsu表示数据前边沿距离时钟上升沿的时间,MicTsu表示时钟clk能够稳定采样数据D的所要求时间,Th表示数据后边沿距离时钟上升沿的时间,MicTh表示时钟clk采样…

Nginx(openresty) 查看连接数和并发送

1 通过浏览器查看 #修改nginx配置文件 location /status {stub_status on;access_log off;allow 192.168.50.0/24;deny all;} #重新加载 sudo /usr/local/openresty/nginx/sbin/nginx -s reloadActive connections //当前 Nginx 当前处理的活动连接数。 server accepts handl…

如何在springboot项目中使用Mybatisplus

文章目录 1.mybatisplus的作用2.mybatisplus使用流程2.1pom.xml文件中增加依赖(点击右上角蓝色按钮下载依赖)2.2navicat新建数据库,增加application.properties数据库配置2.3 启动类添加注解,增加mapper包操作数据库2.5添加实体类…

【python报错】TypeError: dict.get() takes no keyword arguments

【Python报错】TypeError: dict.get() takes no keyword arguments 在Python中,字典(dict)是一种非常灵活的数据结构,用于存储键值对。dict.get()方法是用来从字典中获取与给定键(key)相关联的值&#xff0…

【安装笔记-20240608-Linux-免费空间之三维主机免费空间】

安装笔记-系列文章目录 安装笔记-20240608-Linux-免费空间之三维主机免费空间 文章目录 安装笔记-系列文章目录安装笔记-20240608-Linux-免费空间之三维主机免费空间 前言一、软件介绍名称:三维主机免费空间主页官方介绍 二、安装步骤测试版本:openwrt-…

03-3.5.1~4 特殊矩阵的压缩存储

👋 Hi, I’m Beast Cheng👀 I’m interested in photography, hiking, landscape…🌱 I’m currently learning python, javascript, kotlin…📫 How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以订…

HarmonyOS(二十三)——HTTP请求实战一个可切换的头条列表

在前一篇文章,我们已经知道如何实现一个http请求的完整流程,今天就用官方列子实战一个简单的新闻列表。进一步掌握ArkTS的声明式开发范式,数据请求,常用系统组件以及touch事件的使用。 主要包含以下功能: 数据请求。…

Spark 性能调优——分布式计算

前言 分布式计算的精髓,在于如何把抽象的计算流图,转化为实实在在的分布式计算任务,然后以并行计算的方式交付执行。今天这一讲,我们就来聊一聊,Spark 是如何实现分布式计算的。分布式计算的实现,离不开两个…

2024 年最新 Python 基于百度智能云实现短语音识别详细教程

百度智能云语音识别 采用国际领先的流式端到端语音语言一体化建模算法,将语音快速准确识别为文字,支持手机应用语音交互、语音内容分析、机器人对话等场景。百度短语音识别可以将 60 秒以下的音频识别为文字。适用于语音对话、语音控制、语音输入等场景…

【kubernetes】k8s集群中的ingress(对外服务)规则详解

目录 一、Ingress 简介 1.1service的作用 1.2外部访问方案 (四种)🌹🌹🌹 部署externalIPs 1.3Ingress 是什么 二、Ingress 组成🌹🌹🌹 三、Ingress 工作原理🐱&#x1f…

STM32F103C8T6基于HAL库完成uC/OS-III多任务程序

一、在STM32CubeMX中建立工程 配置RCC 配置SYS 配置PC13为GPIO_Output 配置USART1 生成代码 二、获取uC/OS-III源码 官网下载地址:Micrium Software and Documentation - Silicon Labs 网盘下载:百度网盘 请输入提取码 提取码:lzjl 三、复…

【QT5】<应用> 小游戏:贪吃蛇

文章目录 一、项目要求 二、需求分析 三、实现效果 四、代码 一、项目要求 【1】主要实现:游戏界面存在一条蛇🐍,使用键盘wsad或者↑↓←→键盘可以控制蛇的行走方向。同时界面中会随机出现食物,蛇可以吃食物,然后…