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

news2024/9/28 3:39:34

你需要了解

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.0
    volumes:
      - ./app/.env:/app/.env
      - ./app/static/:/app/static/
    ports:
      - 18880:18880
    networks:
      - 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.coloradmin.cn/o/1914134.html

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

相关文章

硅纪元视角 | 电信公司出招!AI机器人全面反击AI诈骗电话

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

基于GWO-CNN-BiLSTM数据回归预测(多输入单输出)-灰狼优化算法优化CNN-BiLSTM

基于GWO-CNN-BiLSTM数据回归预测(多输入单输出)-灰狼优化算法优化CNN-BiLSTM 1.数据均为Excel数据&#xff0c;直接替换数据就可以运行程序。 2.所有程序都经过验证&#xff0c;保证程序可以运行。 3.具有良好的编程习惯&#xff0c;程序均包含简要注释。 获取方式 https:/…

强化学习中的蒙特卡洛算法和时序差分算法

在强化学习&#xff08;Reinforcement Learning, RL&#xff09;中&#xff0c;价值函数的估计是核心任务之一。蒙特卡洛&#xff08;Monte Carlo, MC&#xff09;方法和时序差分&#xff08;Temporal Difference, TD&#xff09;方法是两种常用的策略&#xff0c;用于估计状态…

儿童房灯具什么牌子好?几款儿童房灯具款式墙裂分享

随着科技的不断发展和生活方式的改变&#xff0c;儿童青少年近视率的增长趋势引起了人们的关注。近视不仅对孩子们的视力健康构成威胁&#xff0c;还可能对他们的学习和日常生活带来不便。因此&#xff0c;如何有效地预防和改善儿童青少年的视力问题成为了一个亟待解决的课题。…

NodeJS校园快递智能互助平台-计算机毕业设计源码58554

摘 要 随着校园人口的增加和生活节奏的加快&#xff0c;校园快递成为一个重要的服务需求。然而&#xff0c;传统的校园快递方式存在一些问题&#xff0c;例如无法满足快速和高效的需求&#xff0c;易发生丢失或损坏的情况&#xff0c;同时也给快递人员和用户带来不便。因此&am…

AI转绘_animatediff-cli-prompt-travel

这个工具有两种主要模式&#xff1a;它可以直接通过提示创建视频&#xff0c;或者它可以对现有视频进行风格化。还有方法可以提高视频的分辨率。 正如工具名称所示&#xff0c;它的一个主要特点是"提示旅行"。这意味着你可以例如使用特定的提示用于前20帧&#xff0…

多个标签页中复用同一 QTableView

在 PyQt 中实现在多个标签页中复用同一个 QTableView 实例&#xff0c;复用同一个 QTableView 实例可以减少内存和资源的使用。每个 QTableView 实例都会消耗一定的内存和处理资源&#xff0c;如果每个标签页都创建一个新的实例&#xff0c;会增加系统的负担。通过复用实例&…

TQZC706开发板教程:在ZC706+ADRV9009硬件平台运行ADI Linux

本教程使用2024-06-18的ADI镜像文件&#xff0c;创建ZC706ADRV9009的linux工程进行测试。 首先需要下载ADI的镜像文件下载地址如所示&#xff1a; https://wiki.analog.com/resources/tools-software/linux-software/adi-kuiper_images/release_notes#r2_patch_1 烧写完成后若…

JavaSE 面向对象程序设计进阶 IO流 字节流详解 抛出异常

input output 像水流一样读取数据 存储和读取数据的解决方案 内存中数据不能永久化存储 程序停止运行 数据消失 File只能对文件本身进行操作 不能读写文件里存储的数据 读写数据必须要有IO流 可以把程序中的数据保存到文件当中 还可以把本地文件中的数据读取到数据当中 分…

Kubelet 认证

当我们执行kubectl exec -it pod [podName] sh命令时&#xff0c;apiserver会向kubelet发起API请求。也就是说&#xff0c;kubelet会提供HTTP服务&#xff0c;而为了安全&#xff0c;kubelet必须提供HTTPS服务&#xff0c;且还要提供一定的认证与授权机制&#xff0c;防止任何知…

手撕算法拿捏八大神经网络!叫我机器学习大师

八大神经网络通常指的是在深度学习领域具有里程碑意义的八种神经网络模型或架构。这些模型在特定任务上取得了显著的性能&#xff0c;或者在深度学习的发展中起到了关键作用。 以下是这八大神经网络的一个简要概述及其学习建议&#xff1a; 多层感知器 (MLP)&#xff1a;最基本…

mysql判断时间段是否重合

mysql判断时间段是否重合 SELECT CASE WHEN t1.start_time < t2.end_time AND t1.end_time > t2.start_time THEN ‘重合’ ELSE ‘不重合’ END AS result FROM table_name t1, table_name t2 WHERE t1.id <> t2.id;

如何计算多路复用器的建立时间和采样速率

简介 计算开关或多路复用器建立时间的基本方法是计算器件的RC(即&#xff0c;Ron * Cd)&#xff0c;并乘以所需系统精度的时间常数数量&#xff0c;再加上开关或多路复用器的开关定时Ton、Toff或Ttransition。 建立时间 开关定时 (Ron * CD * 时间常数数量) 其中&#xff1a…

【TI毫米波雷达】IWR6843AOP的3D人员检测、人员计数及其Python上位机开发

【TI毫米波雷达】IWR6843AOP的3D人员检测、人员计数及其Python上位机开发 文章目录 人员检测上位机附录&#xff1a;结构框架雷达基本原理叙述雷达天线排列位置芯片框架Demo工程功能CCS工程导入工程叙述Software TasksData PathOutput information sent to hostList of detect…

Python不使用元类的ORM实现

不使用元类的简单ORM实现 在 Python 中&#xff0c;ORM&#xff08;Object-Relational Mapping&#xff09;是一种将对象和数据库之间的映射关系进行转换的技术&#xff0c;使得通过面向对象的方式来操作数据库更加方便。通常&#xff0c;我们使用元类&#xff08;metaclass&a…

MT3044 造房子

1.思路&#xff1a; 使用单调栈继承的思想。维护一个单调递减栈&#xff0c;如果有要继承的格子&#xff0c;则继承栈顶元素&#xff0c;而不是上一个元素。 2.代码&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define node pai…

基于与STM32的加湿器之雾化片驱动

基于与STM32的加湿器之雾化片驱动 加湿器是一种由电力驱动&#xff0c;用于增加环境湿度的家用电器。加湿器通过特定的方式&#xff08;如蒸发、超声波振动或加热&#xff09;将水转化为水蒸气&#xff0c;并将这些水蒸气释放到空气中&#xff0c;从而增加空气中的湿度。主要功…

图片管理不再愁,一文带你玩转图床世界

在数字化时代&#xff0c;图片已经成为我们日常生活中不可或缺的一部分。无论是社交媒体上的自拍分享&#xff0c;还是工作中的文档插图&#xff0c;图片都扮演着重要角色。 然而&#xff0c;你是否曾经遇到过这样的问题&#xff1a;如何在网络上方便地存储、分享和管理这些图…

3、视图和模板

续上一篇&#xff0c;这一篇 着重于创建公共接口——“视图” 第三部分——3、视图和模板 1、概述2、编写更多视图原理——django依次访问了什么文件 3、写一个真正有用的视图一个快捷函数 render() render——渲染 4、抛出404错误一个快捷函数 get_object_or_404() 5、使用模…

qq动态删了怎么恢复?五分钟找回您的QQ动态

在使用QQ空间时&#xff0c;我们经常会发现自己误删了一些重要的动态。这可能是由于手指滑动不慎或者误操作引起的。无论是珍贵的回忆还是重要的信息&#xff0c;一旦被删除&#xff0c;我们都希望能够找回来。那么&#xff0c;qq动态删了怎么恢复&#xff1f; 在本文中&#…