解密 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"请输入用户姓名"…

Spring Boot 常用 Starter

Spring Boot Starter 是 Spring Boot 提供的一系列预定义的依赖集合&#xff0c;旨在帮助开发者快速构建应用。这些 Starter 包含了常见的依赖和配置&#xff0c;极大地简化了项目的初始化和开发过程。本文将介绍一些常用的 Spring Boot Starter&#xff0c;并通过实际示例展示…

机器学习实现自然语言处理的背后技术详解

引言 自然语言处理&#xff08;NLP&#xff09;是机器学习领域中的一个重要分支&#xff0c;它涉及到让计算机理解和生成人类语言。随着深度学习技术的快速发展&#xff0c;NLP在许多应用领域取得了显著的成果&#xff0c;如机器翻译、情感分析、文本摘要等。本文将深入探讨机…

全网最简单的Java设计模式【五】Java单例模式 饿汉式详解

Java单例模式 饿汉式详解 【创作】 不易&#xff0c;【点赞】 是情义&#xff0c;【关注】 是动力&#xff0c;【收藏】 是回忆。 示例代码地址&#xff1a;https://gitee.com/code-in-java/csdn-blog.git 一、概念与原理 Java中的单例模式是一种确保一个类只有一个实例&#…

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

怎么把图片的宣传海报做成二维码呢&#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;用户可以浏览到全球设计师的优秀作品&…

Python中的生成器表达式与列表推导式的不同点。

Python中的生成器表达式&#xff08;Generator Expressions&#xff09;和列表推导式&#xff08;List Comprehensions&#xff09;在功能上相似&#xff0c;但它们在内存使用和处理方式上有着显著的不同。 列表推导式&#xff08;List Comprehensions&#xff09; 列表推导式…

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

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

面试官:说说你项目中的单点登录?

单点登录&#xff08;SSO&#xff09;概念 定义&#xff1a;用户仅需一次登录&#xff0c;即可访问所有相互信任的应用程序或系统。目的&#xff1a;提升用户体验&#xff0c;简化登录流程&#xff0c;降低忘记密码和登录疲劳问题&#xff0c;提高系统安全性。 SSO实现技术 O…

【探索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…

优化旅游服务热线系统以满足多样化需求

一、引言 在全球化与数字化的时代背景下&#xff0c;旅游业得到了前所未有的发展。旅游服务热线系统作为连接旅游企业与游客的重要桥梁&#xff0c;其服务质量与效率直接关系到企业的声誉、市场地位以及游客的满意度。然而&#xff0c;随着旅游市场的日益成熟和游客需求的多样…

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

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

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

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

MySQL 中 SQL 查询语句的执行顺序

在 MySQL 中&#xff0c;SQL 查询的执行顺序通常按照以下顺序进行&#xff1a; FROM&#xff1a;从指定的表中选择数据。WHERE&#xff1a;对数据进行筛选&#xff0c;只选择满足条件的行。GROUP BY&#xff1a;按照指定的列对数据进行分组。SELECT&#xff1a;选择要返回的列或…

使用springboot 配置一个websocket客户端

要在 Spring Boot 应用程序中实现一个 WebSocket 客户端&#xff0c;您可以使用 Spring 的 WebSocketClient 接口。这里&#xff0c;我们将使用标凑的 StandardWebSocketClient 进行示例。客户端将被 Spring 管理&#xff0c;允许你注入任何需要的依赖&#xff0c;并支持向 Web…