LangChain实战(二十一):构建自动化AI客服系统

本文是《LangChain实战课》系列的第二十一篇,将带领您构建一个完整的自动化AI客服系统。通过结合对话记忆、工具调用和业务知识库,我们将创建一个能够处理复杂客户查询的智能客服解决方案。

前言

在现代商业环境中,客户服务是企业成功的关键因素之一。传统客服系统往往面临响应速度慢、人力成本高、服务时间有限等挑战。通过结合LangChain的先进技术,我们可以构建一个智能的自动化客服系统,提供24/7的高效服务,同时保持人性化的交互体验。

系统架构设计

核心组件

我们的自动化AI客服系统包含以下核心组件:

  1. 对话管理:处理多轮对话,维护对话上下文

  2. 工具调用:集成外部系统和API,执行具体操作

  3. 知识库检索:从企业文档中检索相关信息

  4. 意图识别:理解用户查询的真实意图

  5. 响应生成:生成自然、准确的回复

系统架构图

用户接口 → 对话管理器 → 意图识别器 → 工具执行器↓           ↓知识库检索   外部系统集成↓           ↓响应生成器 ← 结果处理器

环境准备与安装

首先安装必要的依赖包:

# 安装核心库
pip install langchain openai python-dotenv# 安装向量数据库和嵌入模型
pip install chromadb sentence-transformers# 安装文档处理工具
pip install pymupdf python-pptx python-docx# 安装Web框架(可选,用于API接口)
pip install flask fastapi# 安装其他工具库
pip install requests beautifulsoup4

设置环境变量:

export OPENAI_API_KEY="your-openai-api-key"

构建核心组件

1. 对话记忆管理

from langchain.memory import ConversationBufferWindowMemory, CombinedMemory
from langchain.schema import BaseMemory
from typing import Dict, List, Any
import jsonclass EnhancedConversationMemory:def __init__(self, k=10):# 短期记忆:保存最近k轮对话self.short_term_memory = ConversationBufferWindowMemory(memory_key="short_term",k=k,return_messages=True)# 长期记忆(简化实现,实际应用中可以使用数据库)self.long_term_memory = {}# 用户信息记忆self.user_profile_memory = {}def save_conversation(self, user_id: str, query: str, response: str):"""保存对话记录"""# 更新短期记忆self.short_term_memory.save_context({"input": query},{"output": response})# 更新长期记忆if user_id not in self.long_term_memory:self.long_term_memory[user_id] = []self.long_term_memory[user_id].append({"timestamp": self._get_timestamp(),"query": query,"response": response})def get_conversation_history(self, user_id: str, limit: int = 5) -> List[Dict]:"""获取对话历史"""if user_id in self.long_term_memory:return self.long_term_memory[user_id][-limit:]return []def update_user_profile(self, user_id: str, key: str, value: Any):"""更新用户信息"""if user_id not in self.user_profile_memory:self.user_profile_memory[user_id] = {}self.user_profile_memory[user_id][key] = valuedef get_user_profile(self, user_id: str) -> Dict:"""获取用户信息"""return self.user_profile_memory.get(user_id, {})def get_memory_context(self, user_id: str) -> str:"""获取记忆上下文"""context_parts = []# 添加用户信息profile = self.get_user_profile(user_id)if profile:context_parts.append("用户信息:")for key, value in profile.items():context_parts.append(f"- {key}: {value}")# 添加对话历史history = self.get_conversation_history(user_id)if history:context_parts.append("对话历史:")for i, item in enumerate(history[-3:], 1):  # 最近3条context_parts.append(f"{i}. 用户: {item['query']}")context_parts.append(f"   助手: {item['response']}")return "\n".join(context_parts) if context_parts else "无历史记录"def _get_timestamp(self):"""获取时间戳"""from datetime import datetimereturn datetime.now().isoformat()# 使用示例
memory_manager = EnhancedConversationMemory(k=8)# 模拟对话
user_id = "user_123"
memory_manager.save_conversation(user_id, "你好,我想查询订单状态", "好的,请提供您的订单号")
memory_manager.save_conversation(user_id, "订单号是ORD123456", "正在查询订单ORD123456...")# 获取记忆上下文
context = memory_manager.get_memory_context(user_id)
print("记忆上下文:\n", context)

2. 业务知识库构建

from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import TextLoader, DirectoryLoader
import osclass BusinessKnowledgeBase:def __init__(self, persist_directory: str = "./knowledge_db"):self.embeddings = OpenAIEmbeddings()self.persist_directory = persist_directoryself.vectorstore = Noneself.text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000,chunk_overlap=200)def build_knowledge_base(self, data_directory: str):"""构建知识库"""# 加载文档loader = DirectoryLoader(data_directory,glob="**/*.txt",loader_cls=TextLoader)documents = loader.load()# 分割文档texts = self.text_splitter.split_documents(documents)# 创建向量存储self.vectorstore = Chroma.from_documents(documents=texts,embedding=self.embeddings,persist_directory=self.persist_directory)self.vectorstore.persist()print(f"知识库构建完成,包含 {len(texts)} 个文档块")def load_knowledge_base(self):"""加载已有知识库"""self.vectorstore = Chroma(persist_directory=self.persist_directory,embedding_function=self.embeddings)def search_relevant_info(self, query: str, k: int = 3) -> List[str]:"""搜索相关信息"""if self.vectorstore is None:return ["知识库未初始化"]results = self.vectorstore.similarity_search(query, k=k)return [doc.page_content for doc in results]def add_document(self, document_path: str):"""添加新文档到知识库"""if self.vectorstore is None:self.load_knowledge_base()loader = TextLoader(document_path)documents = loader.load()texts = self.text_splitter.split_documents(documents)self.vectorstore.add_documents(texts)self.vectorstore.persist()print(f"添加了 {len(texts)} 个新文档块")# 使用示例
knowledge_base = BusinessKnowledgeBase()# 构建知识库(第一次运行)
# knowledge_base.build_knowledge_base("./knowledge_documents")# 加载已有知识库
knowledge_base.load_knowledge_base()# 搜索信息
results = knowledge_base.search_relevant_info("退货政策是什么?")
print("相关知识:", results[0] if results else "未找到相关信息")

3. 工具集成系统

from langchain.tools import BaseTool
from pydantic import BaseModel, Field
from typing import Type, Optional
import requests
import jsonclass OrderQueryInput(BaseModel):order_id: str = Field(description="订单编号")class 

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

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

相关文章

一人公司智能管理系统概述

系统概述 项目结构 Al_Compny系统采用前后端分离的全栈架构,项目根目录下包含两个主要子目录:Al_Compny_backend(后端服务)和Al_Compny_frontend(前端应用)。核心功能模块 Al_Compny系统是一个面向"一…

OpenWrt | 在 PPP 拨号模式下启用 IPv6 功能

文章目录一、WAN 口配置二、LAN 口配置三、IPv6 测试本文将详细介绍 将光猫的网络模式改成桥接之后使用路由器拨号的上网方式的情况下,在 OpenWrt 上使用 PPP 拨号模式上网时,启用 IPv6 功能的方法。 一、WAN 口配置 首先,我们需要在 网络 …

Java如何实现一个安全的登录功能?

安全登录系统完整教程 📋 目录 项目概述技术栈安全特性项目结构核心组件详解安全实现原理部署和运行安全最佳实践常见问题解答进阶扩展 🎯 项目概述 这是一个基于Spring Boot和Spring Security的完整安全登录系统,专为初学者设计&#xff…

星辰诞愿——生日快乐

前言 今天这篇博客并非技术文章,而是庆祝我可爱的妹妹18岁生日以及介绍我半年以来的学习经历 祝生网站:星辰诞愿(用户列表里第一位就是我妹妹,希望大家能献上自己的祝福,能分享转发更好,我在此感谢大家。如果使用手机&…

基于STM32单片机的智能粮仓温湿度检测蓝牙手机APP设计

基于STM32单片机的智能粮仓温湿度检测蓝牙手机APP设计 1 系统功能介绍 本系统是一款基于STM32单片机的智能粮仓环境监测与控制装置,核心目标是通过传感器实时采集粮仓内的温度和湿度信息,并结合蓝牙通信模块将数据传输至手机端,实现对粮仓环境…

简单视频转换器 avi转mp4

直接上代码package com.example.videoconverter;import ws.schild.jave.Encoder; import ws.schild.jave.EncoderException; import ws.schild.jave.MultimediaObject; import ws.schild.jave.encode.AudioAttributes; import ws.schild.jave.encode.EncodingAttributes; impor…

Kafka 与 RocketMQ 核心概念与架构对比

Kafka 与 RocketMQ 核心概念与架构对比DeepSeek生成,便于记忆大概逻辑核心概念对比图 #mermaid-svg-dEbo1XpAjfzOjvUW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-dEbo1XpAjfzOjvUW .error-icon{fill…

30分钟深度压测cuBLAS:从FP64到INT8全精度性能剖析

在深度学习和高性能计算领域,GPU的矩阵运算性能是衡量系统算力的核心指标之一。NVIDIA的cuBLAS库作为CUDA平台上最基础的线性代数计算库,其性能表现直接影响着上层应用的运行效率。本文将详细介绍如何使用cublasmatmulbench工具对多GPU进行全面的性能基准…

超越模仿:探寻智能的本源

引言:超越模仿,探寻智能的本源近年来,以大语言模型(LLM)为代表的自然语言处理(NLP)技术,在模仿人类语言生成方面取得了令人瞩目的成就。从流畅的对话到精炼的文本摘要,机…

ROS/ROS2课程笔记00-大纲-25-26-1

大纲 AI版 以下是基于第四代高校课程核心理念设计的《ROS2机器人程序设计(ROS2 Jazzy版)》课程大纲,突出智能互联、跨学科融合、终身学习等特征,并融入技术赋能、生态重塑、素养导向等要求: 课程名称:ROS…

Linux内核进程管理子系统有什么第四十六回 —— 进程主结构详解(42)

接前一篇文章:Linux内核进程管理子系统有什么第四十五回 —— 进程主结构详解(41) 本文内容参考: Linux内核进程管理专题报告_linux rseq-CSDN博客 《趣谈Linux操作系统 核心原理篇:第三部分 进程管理》—— 刘超 《…

Linux网络连接不上?NetworkManager提示“device not managed“!

#操作系统 #Linux #NetworkManager适用环境kylin v10Centos 8Redhat 8一、故障现象在CentOS/RHEL(同样适用于kylin v10)系统中,管理员执行 nmcli connection up ens160 命令尝试激活名为 ens160 的网络连接时,遇到以下错误:[roo…

【系统分析师】第2章-基础知识:数学与工程基础(核心总结)

更多内容请见: 备考系统分析师-专栏介绍和目录 文章目录 一、数学统计基础 1.1 概率论基础 1.2 数理统计基础 1.3 常用统计分析方法 二、图论应用 2.1 基本概念 2.2 核心算法与应用 三、预测与决策 3.1 预测方法 3.2 决策方法 四、数学建模 4.1 建模过程 4.2 常用模型类型 五、…

StrUtil.isBlank()

这段代码是一个条件判断,用于检查变量 shopJson 是否为空或空白,如果是,就直接返回 null。我们来逐句讲解:原始代码: if(StrUtil.isBlank(shopJson)) {// 3.存在,直接返回return null; }逐句解释&#xff1…

mysql 回表查询(二次查询,如何检查,如何规避)

h5打开以查看 “回表查询”通常发生在使用二级索引(Secondary Index)的查询中。当查询所需的数据列并不全部包含在二级索引中时,即使使用了索引,MySQL 也需要根据索引记录中的主键值,回到聚簇索引(Cluster…

深度学习(二):神经元与神经网络

在人工智能的浪潮中,神经网络(Neural Networks)无疑是驱动核心技术的引擎,它赋予了计算机前所未有的学习和识别能力。而这一切的起点,是受到生物大脑中基本单元——神经元(Neurons)的深刻启发。…

JavaScript 行为型设计模式详解

1. 观察者模式1.1. 使用场景观察者模式用于对象间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都能收到通知并自动更新。常用于事件处理、通知系统。在前端中,观察者模式用于实现事件监听、数据绑定等功能。1.2. 代码实现…

指令查找表LUT

本文整理自22. FlexSPI—读写外部SPI NorFlash — [野火]i.MX RT库开发实战指南——基于i.MXRT1052 文档 用作个人学习和分享 指令查找表LUT 访问FLASH存储器通常包含一些读写功能的的控制指令,主控设备可通过这些指令访问FLASH存储器。 为了适应这种需求&#…

uv使用指南

🚀 Python 打包工具 UV 使用指南 UV 是一个用 Rust 编写的极速 Python 包管理器和解析器,旨在成为 pip、pip-tools、virtualenv 等工具的单一替代方案。 📋 目录 核心概念与设计哲学安装与配置基础使用方法项目管理与工作流高级功能与技巧…

安卓学习 之 图片控件和图片按钮

今天学习的是ImageView 和 ImageButton这两个控件还是比较简单的:先来看看最后的样式图片吧:从图片中可以看到ImageView中的图片要大很多,这是因为中的ImageView中的图片跟ImageView控件的大小而自动调整。Imag…