你需要了解
ChatGPT
ChatGPT 是 OpenAI 开发的一种基于人工智能技术的自然语言处理模型。它可以通过对大量文本数据进行训练,自动生成高质量的回答和对话。ChatGPT 具有高效、准确、自然的特点,可以帮助人们更加高效地处理信息和交流。
ChatGPT 有很多应用场景,本文主要以简易客服场景来实现一个案例。
LangChain
[LangChain] 是一个用于开发由语言模型驱动的应用程序的框架。
他是让应用程序不仅可以通过 API 调用语言模型,而且可以数据感知(将语言模型连接到其他数据源),Be agentic(允许语言模型与其环境交互),最终让应用程序更强大和更具差异化。
开发部署能力
- Java
- Python
- docker
- …
功能分析
要在公众号实现一个客服,首先想到了微信的对话平台,但测试了下感觉不怎么友好,怎么也触发不了我自定义的能力,所有核心以公众号客服消息为对话方式。
- 公众号客服消息权限开通,这个需要认证过的公众号或者服务号,小猫惠充是服务号所以没问题;
- 要获取用户发来的消息,需要对接[普通消息推送],该功能集成到小猫惠充的后台,使用 Java 实现;
- 要给用户发送消息,需要对接[客服接口-发消息],该功能集成到小猫惠充的后台,使用 Java 实现;
- 要有客服资料库,用于给客服问答做依据,本文支持 .txt 文本文件(其他文档要支持只需更换文档加载器即可);
- 加载文档,利用 embeddings 模型把文档内容加载到矢量存储,用于相似性检索,本文采用 Chroma,使用 Python 实现(这里采用 OpenAI Embeddings 模型);
- 进行检索资料,调用 OpenAI gpt-3.5-turbo-0613 模型进行回答,使用 Python 实现;
- 部署采用 docker-compose 进行部署,并能挂载配置文件和资料库文件。
以上主要分为两个项目公众号消息收发使用 Java 实现,AI 相关逻辑基于 LangChain 使用 Python 实现。
公众号配置
在公众号后台基础配置中,我们需要进行相关配置。
在新的功能中,需要开通客服功能。
核心代码
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
客服资料库
只需要简单的文本即可。
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
演示成果
这里产生了两条数据就是因为没有进行异步请求。
当回答不了你的问题时,它也不会胡乱回答,如下它只会根据提供的资料进行回答。
结尾
如何学习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%免费】🆓