解密 AI 客服:LangChain+ChatGPT 打造智能客服新时代

你需要了解

ChatGPT

ChatGPT 是 OpenAI 开发的一种基于人工智能技术的自然语言处理模型。它可以通过对大量文本数据进行训练,自动生成高质量的回答和对话。ChatGPT 具有高效、准确、自然的特点,可以帮助人们更加高效地处理信息和交流。

ChatGPT 有很多应用场景,本文主要以简易客服场景来实现一个案例。

LangChain

[LangChain] 是一个用于开发由语言模型驱动的应用程序的框架。

他是让应用程序不仅可以通过 API 调用语言模型,而且可以数据感知(将语言模型连接到其他数据源),Be agentic(允许语言模型与其环境交互),最终让应用程序更强大和更具差异化。

开发部署能力

  • Java
  • Python
  • docker

功能分析

要在公众号实现一个客服,首先想到了微信的对话平台,但测试了下感觉不怎么友好,怎么也触发不了我自定义的能力,所有核心以公众号客服消息为对话方式。

  1. 公众号客服消息权限开通,这个需要认证过的公众号或者服务号,小猫惠充是服务号所以没问题;
  2. 要获取用户发来的消息,需要对接[普通消息推送],该功能集成到小猫惠充的后台,使用 Java 实现;
  3. 要给用户发送消息,需要对接[客服接口-发消息],该功能集成到小猫惠充的后台,使用 Java 实现;
  4. 要有客服资料库,用于给客服问答做依据,本文支持 .txt 文本文件(其他文档要支持只需更换文档加载器即可);
  5. 加载文档,利用 embeddings 模型把文档内容加载到矢量存储,用于相似性检索,本文采用 Chroma,使用 Python 实现(这里采用 OpenAI Embeddings 模型);
  6. 进行检索资料,调用 OpenAI gpt-3.5-turbo-0613 模型进行回答,使用 Python 实现;
  7. 部署采用 docker-compose 进行部署,并能挂载配置文件和资料库文件。

以上主要分为两个项目公众号消息收发使用 Java 实现,AI 相关逻辑基于 LangChain 使用 Python 实现。

公众号配置

在公众号后台基础配置中,我们需要进行相关配置。

image-20230629225244484

在新的功能中,需要开通客服功能。

image-20230629225409382

核心代码

Java 实现用户消息接受

这个 URL 就是上面微信公众号配置的服务器地址URL。

 /*** 事件接收处理接口** @return*/@PostMapping(value = "/notifyUrl")public String notifyUrl(WXNotifyReqVO reqVO) throws Exception {log.info("接入成功,正在处理逻辑,reqVO:{}", JSONUtil.toJsonPrettyStr(reqVO));// 获取HTTP请求的输入流// 已HTTP请求输入流建立一个BufferedReader对象BufferedReader br = new BufferedReader(new InputStreamReader(getRequest().getInputStream(), "UTF-8"));String buffer;// 存放请求内容StringBuilder xml = new StringBuilder();while ((buffer = br.readLine()) != null) {// 在页面中显示读取到的请求参数xml.append(buffer);}WXBizMsgCrypt pc = new WXBizMsgCrypt(token, encodingAesKey, AppSecretEnum.XMHC.getAppId());// 第三方收到公众号平台发送的消息String mingwen = pc.decryptMsg(reqVO.getSignature(), reqVO.getTimestamp(), reqVO.getNonce(), xml.toString());log.info("解密后明文: " + mingwen);Map<String, String> params = XmlUtils.xml2Map(mingwen);return wxOffiAccountLogic.handleNotify(params);}

Java 实现消息接受处理,异步转发给 AI 客服

以下代码是服务端接受到用户发送的消息后,立即异步转发消息给 AI 客服。

为什么要异步?微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次,这会导致向 AI 客服发送的消息也会重复。

假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。

  private ExecutorService executor = Executors.newFixedThreadPool(5);/*** 处理微信公众号事件通知** @param params* @return*/public String handleNotify(Map<String, String> params) {log.info("WXOffiAccountLogic,handleNotify,params:{}", JSONUtil.toJsonPrettyStr(params));String msgType = params.get("MsgType");switch (msgType) {case "event":return handlerNotifyEvent(params);case "text":executor.submit(() -> {// 异步处理逻辑handlerNotifyText(params);});return null;default:return null;}}
​private String handlerNotifyText(Map<String, String> params) {String fromUser = params.get("FromUserName");String content = params.get("Content");Map<String, Object> reqParams = new HashMap<>();reqParams.put("content", content);String result = HttpUtil.post("https://{your ai custom service}/xmhc/kf", JSONUtil.toJsonPrettyStr(reqParams));JSONObject response = JSONUtil.parseObj(result);if (response.get("err_code").equals(0)) {CustomMessageSendRequest request = new CustomMessageSendRequest();request.setAccessToken(getAccessToken());request.setToUser(fromUser);request.setMessageType("text");JSONArray dataList = response.getJSONArray("data_list");if (dataList.size() > 0) {request.setContent(dataList.getJSONObject(0).getStr("content"));} else {request.setContent("亲,请详细描述一下您的问题~");}wxOffiAccountApi.sendCustomMessage(request);} else {CustomMessageSendRequest request = new CustomMessageSendRequest();request.setAccessToken(getAccessToken());request.setToUser(fromUser);request.setMessageType("text");request.setContent("亲,请详细描述一下您的问题~");wxOffiAccountApi.sendCustomMessage(request);}return null;}

其中 https://{your ai custom service}/xmhc/kf 为 AI 客服服务的请求地址。

请求 content-type 为 application/json

请求参数格式:

{"content": "充值后多久到账?"
}

响应参数格式:

{"data_list": [{"content": "根据提供的充值须知,话费优惠充值的到账时间为0-6小时或0-72小时,具体取决于产品类型和充值时段。一般情况下,产品会在6小时内或72小时内到账。但在高峰期,可能需要96小时甚至更长的时间才能到账。少数情况下,到账时间可能延迟至120小时。如果超过规定的到账时间仍未到账,则会全额退款。"}],"err_code": 0
}

AI 客服实现 app.py

import os
​
from flask import Flask, request
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI
from langchain.document_loaders import TextLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
from openai import InvalidRequestError
​
from utils import get_env
​
os.environ["OPENAI_API_KEY"] = get_env('OPENAI_API_KEY')
os.environ["OPENAI_API_BASE"] = get_env('OPENAI_API_BASE')
​
app = Flask(__name__)
​
# 获取当前脚本所在的目录
base_dir = os.path.dirname(os.path.abspath(__file__))
# 构建doc.txt文件的路径
doc_path = os.path.join(base_dir, 'static', 'doc.txt')
​
loader = TextLoader(doc_path)
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
​
embeddings = OpenAIEmbeddings()
docsearch = Chroma.from_documents(texts, embeddings)
​
qa = RetrievalQA.from_chain_type(llm=ChatOpenAI(model_name='gpt-3.5-turbo-0613'), chain_type="stuff",retriever=docsearch.as_retriever())
​
​
@app.route("/xmhc/kf", methods=['POST'])
def hello_world():  # put application's code here# 接口请求参数json_data = request.get_json()try:answer = qa.run(json_data['content'])except InvalidRequestError:return {"err_code": -1,"data_list": []}return {"err_code": 0,"data_list": [{"content": answer}]}
​
​
if __name__ == '__main__':app.run(host='0.0.0.0', port=18880, debug=True)
​

相关依赖 requirements.txt

Flask==2.2.3
langchain==0.0.215
python-dotenv==1.0.0
openai~=0.27.4
chromadb~=0.3.26
tiktoken~=0.4.0
SQLAlchemy~=2.0.17

安装依赖

pip install -r requirements.txt

客服资料库

只需要简单的文本即可。

image-20230629232125265

AI 客服部署

我这里采用 Docker 部署。先创建一个简单 Dockerfile 用于构建镜像,Dockerfile 与上面的 app.py 和 requirements.txt 同一目录。

FROM python:3.9.17
​
ENV GIT_SSL_NO_VERIFY=1
​
WORKDIR /app
​
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
​
COPY . .
​
CMD [ "python3", "app.py" ]

在 Terminal 中执行如下命令,完成镜像构建。

docker build -t xunlu-kf:1.0.0 .
docker images # 获取镜像ID cc07f3641130

我这里采用阿里云进行镜像管理。

docker tag 35949b43ad7a registry.cn-hangzhou.aliyuncs.com/zwqh/xunlu-kf:1.0.0
docker push registry.cn-hangzhou.aliyuncs.com/zwqh/xunlu-kf:1.0.0

编写 docker-compose.yaml 部署脚本。

version: '3.9'
services:chatbot:image: registry.cn-hangzhou.aliyuncs.com/zwqh/xunlu-kf:1.0.0volumes:- ./app/.env:/app/.env- ./app/static/:/app/static/ports:- 18880:18880networks:- xunlu
​
networks:xunlu:external: true

在服务器上 docker-compose.yaml 目录下,通过以下命令完成部署。

docker-compose up -d

演示成果

这里产生了两条数据就是因为没有进行异步请求。

image-20230629231208172 image-20230629231237733

当回答不了你的问题时,它也不会胡乱回答,如下它只会根据提供的资料进行回答。

image-20230629231621930

结尾

如何学习AI大模型?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

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

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

相关文章

el-from中校验,如果某一项需要另一项填写才能校验

使用validateField <el-form:model"params":rules"rules":scroll-to-error"true"ref"refrom"v-else><el-form-item label"用户姓名" prop"name"><el-input placeholder"请输入用户姓名"…

图片海报怎么做成二维码展示?二维码分享图片的制作技巧

怎么把图片的宣传海报做成二维码呢&#xff1f;在做活动或者产品宣传时&#xff0c;都会制作精美的图片海报&#xff0c;除了打印传单或者制作展板的方式来展示外&#xff0c;将海报图片生成二维码&#xff0c;通过分享二维码来实现图片海报的快速传播&#xff0c;能够有效提升…

大话光学原理:2.最短时间原理、“魔法石”与彩虹

一、最短时间原理 1662年左右&#xff0c;费马在一张信纸的边角&#xff0c;用他那著名的潦草笔迹&#xff0c;随意地写下了一行字&#xff1a;“光在两点间选择的路&#xff0c;总是耗时最少的。”这句话&#xff0c;简单而深邃&#xff0c;像是一颗悄然种下的种子&#xff0c…

After Detailer让图像自动修复

After Detailer&#xff08;简称adetailer&#xff09;是一个Stable Diffusion的自动Web-UI扩展&#xff0c;它能够自动化修复图像中的不完整部分&#xff0c;例如模糊的人脸等常见问题。在这篇文章中&#xff0c;你将了解它的工作原理、如何使用它&#xff0c;以及一些常见的使…

品牌策划学习资源全攻略:从入门到精通的推荐清单!

这里再分享一些网站书籍和杂志给大家。 TOPYS创意内容平台&#xff1a; 专注于创意内容分享&#xff0c;涵盖广告、设计、艺术等多个领域&#xff0c;是广告设计人寻找创意灵感的好去处。 Dribbble&#xff1a; 设计师社区&#xff0c;用户可以浏览到全球设计师的优秀作品&…

使用webrtc-streamer查看rtsp实时视频

1.下载webrtc-streamer 2.解压运行webrtc-streamer.exe 在浏览器访问127.0.0.1:8000&#xff0c;点击窗口可以看到本机上各窗口实时状态&#xff0c;点击摄像头可以显示摄像头画面。 5.安装phpstudy&#xff0c;并建立网站。&#xff08;具体过程自己网上搜&#xff09; 6.打开…

【探索Linux】P.38(传输层 —— TCP协议通信连接管理机制简介 | TCP连接状态转换)

阅读导航 引言一、TCP协议通信连接管理机制二、连接状态转换1. TCP状态转换图2. 状态转换过程3. 理解TIME_WAIT状态&#xff08;1&#xff09;目的和作用&#xff08;2&#xff09;状态转换&#xff08;3&#xff09;特殊情况&#xff08;4&#xff09;影响和优化 4. 理解 CLOS…

多模态大模型时代下的文档图像智能分析与处理_多模态ocr

0. 前言1. 人工智能发展历程 1.1 传统机器学习1.2 深度学习1.3 多模态大模型时代 2. CCIG 文档图像智能分析与处理论坛 2.1 文档图像智能分析与处理的重要性和挑战2.2 文档图像智能分析与处理高峰论坛2.3 走进合合信息 3. 文档图像智能分析与处理 3.1 文档图像分析与预处理3.2 …

牛市中途深度调整,一览下半场值得关注的 Solana 生态五大潜力项目

近期有关加密货币的利空消息让市场行情一度陷入了恐慌之中&#xff0c;短期利空的落地也将伴随着接下来市场的蓄势。对于投资者来说&#xff0c;现在布局超跌潜力项目不失为一个不错的机会。作为本轮牛市值得关注的两大生态&#xff0c;Solana和TON的快速发展和吸金效应&#x…

微米级触觉感知的紧凑视触觉机器人皮肤

视触觉皮肤&#xff08;VTS&#xff09;分为涂层型、标记型和热致变色型。涂层的耐磨性和空间分辨率是涂层型VTS的核心问题。近期&#xff0c;北京邮电大学方斌教授联合中国地质大学&#xff08;北京&#xff09;杨义勇教授&#xff0c;在传感器领域Q1期刊IEEE Sensors Journal…

存储相关基本知识:oss\s3\文件存储\块存储\

存储 常见的存储格式 文件存储会以文件和文件夹的层次结构来整理和呈现数据&#xff1b;块存储会将数据拆分到任意划分且大小相同的卷中;对象存储会管理数据并将其链接至关联的元数据。 DAS和SAN是基于物理块的存储方式&#xff0c;而NAS是基于文件的存储方式。 在DAS和SAN中…

Conformal low power-2.电源感知等效性检查

电源感知等效性检查 ■ 第24页&#xff1a;电源感知等效性检查概述 ■ 第24页&#xff1a;启动低功耗&#xff08;等效性检查&#xff09;软件 ■ 第25页&#xff1a;电源感知等效性检查流程 ■ 第28页&#xff1a;电源感知等效性检查示例Do文件 电源感知等效性检查概述…

亚马逊关键词优化全攻略:自养号测评让你的产品跃居首页

常常听到亚马逊运营吐槽&#xff1a; 为啥我的产品就是上不了首页呢&#xff1f; 我的关键词要怎么优化才能排名靠前啊&#xff1f; 的确&#xff0c;每天都有无数个卖家在想方设法让自己的产品排到首页&#xff0c;所以产品的竞争激烈程度不言而喻。 我们在亚马逊运营中&a…

昇思MindSpore学习笔记6-03计算机视觉--ResNet50图像分类

摘要&#xff1a; 记录MindSpore AI框架使用ResNet50神经网络模型&#xff0c;选择Bottleneck残差网络结构对CIFAR-10数据集进行分类的过程、步骤和方法。包括环境准备、下载数据集、数据集加载和预处理、构建模型、模型训练、模型测试等。 一、概念 1.图像分类 最基础的计算…

用6000万茅台案,了解什么是外挂?

近日&#xff0c;一起涉案金额高达6000余万元的案件出现在人们视野中。此前浙江丽水云和县公安局侦破了一起非法利用软件抢购电商平台茅台酒案。 据了解&#xff0c;犯罪嫌疑人以非法牟利为目的&#xff0c;开发了抢购软件&#xff0c;以有偿原价抢购电商平台飞天茅台酒为噱头&…

Raspberry Pi 使用 Halio 实现 13Top/s AI 加速

Raspberry Pi 5 现在可以选择用于神经网络、人工智能和机器学习的 AI 协处理器。 AI 套件包含最近宣布的用于容纳 NVMe 内存驱动器的相同 M.2 HAT&#xff0c;但装载了 13Top/s Hailo-8L AI 处理器。 据 Raspberry Pi 介绍&#xff0c;连接是通过其单通道“以 8Gbit/s 的速度…

PyCharm在线版,一周使用总结!!!

前言 过去一周&#xff0c;对pycharm在线版进行了使用&#xff0c;对云原生开发工具有了全新的认识&#xff0c;云原生开发是一种现代化的软件开发和部署方法&#xff0c;它充分利用了云计算的优势&#xff0c;特别是容器化、微服务、持续集成/持续部署&#xff08;CI/CD&…

Finalshell如何使用ssh秘钥连接服务器

[TOC](Finalshell如何使用ssh秘钥连接服务器)背景 最近在开发项目&#xff0c;需要部署到客户服务器&#xff0c;且不好暴露我们的gitlab地址去下载部署&#xff0c;只好回到解放前&#xff0c;使用工具上传文件到客户服务器部署&#x1f602; 但是手写scp命令太麻烦&#x…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第58集-agent机器人助理自动群发短信

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第58集-agent机器人助理自动群发短信 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写…

20个实验数据创造AI蛋白质里程碑!上海交大联合上海AI Lab发布FSFP,有效优化蛋白质预训练模型

蛋白质&#xff0c;这些微小而强大的生物分子&#xff0c;是生命活动的基础&#xff0c;在生物体内扮演着多种角色。然而&#xff0c;要精确地调整和优化蛋白质功能&#xff0c;以适应特定的工业或医疗需求&#xff0c;却是一项极具挑战性的任务。传统上&#xff0c;科学家们依…