使用 LangGraph 实现邮件智能处理系统来处理客户咨询【附代码】

简介

在这篇博文中,我们将探讨如何使用 LangGraph 结合 RAG(Retrieval-Augmented Generation)技术来构建一个响应客户邮件的电子邮件智能系统。LangGraph 是一个强大的框架,专为构建和部署基于图的语言应用而设计。它支持复杂的查询处理和信息检索任务,使得我们可以实现一个智能的邮件响应系统。我们的目标是创建一个系统,能够理解和分类客户邮件,然后生成回答问题的最佳策略,最终撰写出符合查询需求的回复邮件。

背景

RAG 技术通过结合检索(Retrieval)和生成(Generation)来提升语言模型的效果。在处理客户邮件时,我们可以借此技术来提升回复的准确性和相关性。此外,通过自定义的事实数据库来增强模型,使其能够引用和生成更精确的信息。

开发环境
  • Python 3.8+
  • LangChain
  • Hugging Face Transformers
实施步骤
  1. 数据准备和预处理

    • 我们从一个 CSV 文件加载相关事实数据。这些数据将被用来构建我们的 RAG 系统。
  2. 系统架构

    • 邮件分类:首先,系统需要能够理解并分类进来的客户邮件。
    • 问题生成:根据邮件的类别和内容,系统将生成一些具体的问题,用于从 RAG 检索相关信息。
    • 检索和生成:利用 RAG 技术,系统将从预先构建的事实数据库中检索信息,并生成回复内容。
    • 邮件撰写:最后,系统将结合检索到的信息和原始邮件内容,撰写一封妥当的回复邮件。
  3. 代码实现

3.1. 环境设置与依赖安装

首先,我们需要准备环境并安装必要的库。

pip install langchain-groq
pip install -U langchain_community tiktoken langchainhub
pip install -U langchain langgraph
pip install -U langchain langchain-community langchainhub
pip install langchain-chroma bs4
pip install huggingface_hub unstructured sentence_transformers

这段代码主要完成以下功能:

  • 从网络下载数据文件。
  • 安装LangGraph和相关库,这些库将支持后续的文本处理和机器学习任务。

3.2 数据加载与处理

接下来,我们使用CSVLoader来加载数据,并准备合并数据源。

from langchain_community.document_loaders.csv_loader import CSVLoaderloader_csv = CSVLoader(file_path="/content/facts.csv")
docs_all = loader_csv.load()

这里,CSVLoader用于从CSV文件中加载数据,这些数据将用作后续RAG处理的基础。

from langchain_community.document_loaders.merge import MergedDataLoaderloader_all = MergedDataLoader(loaders=[loader_csv])
docs_all = loader_all.load()

MergedDataLoader允许我们将来自不同源的数据合并起来,尽管在这里我们只加载了CSV数据。

3.3 文本分割与向量嵌入

由于文档可能非常长,我们使用RecursiveCharacterTextSplitter来分割文档。

from langchain.text_splitter import RecursiveCharacterTextSplittertext_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
texts = text_splitter.split_documents(docs_all)

接下来,使用HuggingFaceBgeEmbeddings对文本进行向量嵌入,以便进行有效的相似性搜索。

from langchain.embeddings import HuggingFaceBgeEmbeddingsmodel_name = "BAAI/bge-base-en"
encode_kwargs = {'normalize_embeddings': True}bge_embeddings = HuggingFaceBgeEmbeddings(model_name=model_name,model_kwargs={'device': 'cuda'},encode_kwargs=encode_kwargs
)

3.4 创建向量数据库与检索器

我们使用Chroma来创建一个向量数据库,该数据库将支持信息检索。

from langchain_chroma import Chromapersist_directory = 'db'
vectordb = Chroma.from_documents(documents=texts, embedding=embedding, persist_directory=persist_directory)

创建检索器,用于从向量数据库中检索相关文档。

retriever = vectordb.as_retriever(search_kwargs={"k": 5})

3.5. RAG提示与查询执行

定义一个RAG提示模板,用于生成问题的回答。

from langchain_core.prompts import PromptTemplate
from langchain_groq import ChatGroq
from langchain_core.output_parsers import StrOutputParserGROQ_LLM = ChatGroq(model="llama3-70b-8192")
rag_prompt = PromptTemplate(template="Your prompt template here", input_variables=["question","context"])
rag_prompt_chain = rag_prompt | GROQ_LLM | StrOutputParser()

执行一个查询,得到结果。

QUESTION = """What can I do in the Westworld Park?"""
CONTEXT = retriever.invoke(QUESTION)
result = rag_prompt_chain.invoke({"question": QUESTION, "context": CONTEXT})
print(result)

这个过程中,我们构建了一个完整的查询处理

流,从生成查询到获取答案。

3.6 构建完整的邮件智能系统

最后,我们将前面的组件整合起来,构建一个完整的电子邮件回复系统,包括邮件分类、查询生成、信息检索和回复生成等步骤。

from langchain.schema import Document
from langgraph.graph import END, StateGraph
from typing_extensions import TypedDict
from typing import Listclass GraphState(TypedDict):initial_email: stremail_category: strdraft_email: strfinal_email: strresearch_info: List[str]info_needed: boolnum_steps: intdraft_email_feedback: dictrag_questions: List[str]

我们定义了状态图和不同的处理节点,每个节点执行特定的任务,如邮件分类、信息检索、邮件草稿撰写等。

通过这种方式,我们确保了系统的灵活性和可扩展性,能够适应不同的业务需求和未来的技术变革。

结论

通过使用 LangGraph 和 RAG,我们成功构建了一个功能强大的邮件智能系统,它可以有效地处理和回复客户咨询。这种技术的应用不仅提升了客户服务的效率,还能够提供更加个性化和准确的信息,增强客户体验。

未来方向

未来我们可以通过引入更多的数据源和优化 RAG 的配置来进一步提升系统的性能。此外,也可以探索将此技术应用于其他类型的客户服务系统中,以提升整体的服务质量和效率。

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

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

相关文章

【Linux】centos7安装软件(rpm、yum、编译安装),补充:查找命令的相关文件路径,yum安装mysql

【Linux】技术上,Linux是内核。而术语上,我们通常说的Linux是完整的操作系统,其实称为"Linux发行版",是将Linux内核和应用系统打包,由不同的发行家族发行了不同版本。Linux发行版众多,主要有RedH…

职校智慧校园现状及问题分析

各大中职院校及高职院校是校园信息化的先行者和开拓者,很早就开始注重信息化基础设施建设和信息化人文素养的提升。在过去几年里,随着国家大力发展与扶植职校教育,学校投入相当的经费进行了校园信息通信网络、计算机等基础硬件设备建设&#…

Python3 笔记:help()查看函数的用法

一些不常用的函数或是模块的用法记不清了怎么办? Python的内置函数help()可以查看函数或模块用途的详细说明。 操作方法很简单,直接在help()括号内填写参数,然后运行就可以看到结果了。 举例: help(input) # 查询input()函数的…

RabbitMQ 面试题(一)

1. 简述为什么要使用 RabbitMQ ? 使用 RabbitMQ 的主要原因包括以下几点: 解耦:在复杂的系统中,不同的服务或组件之间往往需要通信和协作。RabbitMQ 作为消息队列,允许这些组件或服务通过发送和接收消息来交互,而无…

CLion 写 Rust 报Project directory `/Users/.../rsheets` does not exist.

每次打开CLion都会看到像下面这样的报错,Project directory /Users/.../rsheets does not exist.,虽然不会影响你写代码,但每次看到还是不舒服,所以研究一下怎么解决。 原因是这样的,每当我们创建一个 Cargo 项目&…

PDF Squeezer for Mac,让PDF压缩更高效

还在为PDF文件过大而烦恼吗?试试PDF Squeezer for Mac吧!它拥有强大的压缩功能,可以快速将PDF文件压缩至更小的体积,让你的文件传输更快捷。同时,它还支持多种压缩方式,满足你的不同需求。赶快下载体验吧&a…

革新机器人任务规划:TREE-PLANNER引领高效、准确的机器人动作生成新趋势

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享,与你一起了解前沿深度学习信息! 引言 任务规划在机器人技术中扮演着至关重要的角色。它涉及到为机器人设计一系列中级动作(技能),使其能够完成复杂的高级任…

C语言基础-枚举类型

C语言中的枚举类型(enum)是一种用户定义的数据类型,它允许为整数常量指定一个名称,使得代码更易于阅读和维护。枚举类型本质上是一种特殊的整数类型,但每个枚举值都有一个名字,而不是直接使用整数。 枚举类…

掌握 Linux Crontab:完整指南与实用案例

一.简介 1. 什么是 Crontab? Crontab 是一个在 Unix 和类 Unix 操作系统上用来定期执行任务的工具。它是从 “cron table” 衍生而来的,“cron” 是一个 Unix 系统自带的后台守护进程,用于定期执行预定的任务或命令,比如备份文件…

电视剧电影原声背景音乐,经典影视配乐片段音效合集

一、素材描述 本套影视配乐素材,大小1.89G,27个压缩文件。 二、素材目录 宰相刘罗锅配乐片段.rar 影视配乐65首.rar 太极张三丰原声.rar 东邪西毒原声配乐15首.rar 东方不败之风云再起配乐24首.rar 东方不败原声配乐16首.rar 电影大话西游原声配…

python绘制圣诞树 如何用python绘制一个圣诞树

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.使用 四.总结 一.前言 圣诞树,是指用灯烛和装饰品把枞树或洋松装点起来的常青树。作为是圣诞节重要的组成元素之一,近代圣诞树起源于德国,后来逐步在世界范围内流行起来

聊聊Mysql锁问题

聊聊Mysql锁问题 一、 Mysql锁概述二、Myisam锁问题2. 1 表级锁的锁模式2.2 如何加表锁2.3 并发插入2.4 Myisam的锁调度 三、InnoDB锁问题3.1 事务及ACID属性3.2 并发事务处理带来的问题3.3 事务隔离级别3.4 获取InnoDB行锁争用情况3.5 InnoDB行锁模式及加锁方法3.6 InnoDB行锁…

sql-行转列(转置)

- 行转列的常规做法是,group bysum(if())【或count(if())】 例题: 已知 yearmonthamount199111.1199121.2199131.3199141.4199212.1199222.2199232.3199242.4 查成这样一个结果 yearm1m2m3m419911.11.21.31.419922.12.22.32.4 解答: us…

串转并74hC595控制流水灯

#include <reg51.h> //重新定义系统数据类型 typedef unsigned int u16; typedef unsigned char u8; //宏定义数据端口 #define LEDDZ_COL_PORT P0 #define SER_AP_PORT P1 //定义数据存储端口 sbit SERP3^4; sbit SRCLKP3^6; sbit RCLKP3^5; //依次闪烁…

WPS表格:对比少于1万的两列数据

当我们需要对于A、B两列乱序的数据&#xff0c;找出A列中某一项B列有没有&#xff0c;或者找出B列中的某一项A列有没有&#xff0c;都可以先将这两列数据放入WPS表格中&#xff1a; 1.选中C列的第一行的单元格&#xff0c;在函数区输入函数 如果我们以A为基准&#xff0c;找A中…

SQL语句优化技巧

目录 1、sql语句规范 2、sql语句优化 1、sql语句规范 MySQL在Linux系统下数据库名&#xff0c;表名&#xff0c;存储过程名&#xff0c;函数名称&#xff0c;触发器名称等区分大小写&#xff0c;列名不区分大小写&#xff0c;原因是这些操作系统下文件名称区分大小写。 MySQL…

19、案例实战:上亿请求轻松应对,老年代垃圾回收参数调整技巧大公开

19.1、前文回顾 在上一篇文章中,我们已经向大家介绍了一个日活跃用户百万级别,处理请求量上亿的电商系统案例。我们选择了这个中型电商系统在大促期间的瞬时高峰下单场景,作为我们的JVM优化分析的场景。通过预测,我们得出在大促高峰期,每台机器每秒需要处理300个订单请求…

蓝桥杯-线性动态规划问题背包问题进阶策略详解-

题目&#xff1a;蓝桥云课-青蛙吃虫 解题代码&#xff1a; #include <iostream> #include<cstring> #include<algorithm> using namespace std;const int N106;int f[N][N]; int a[N]; int t,l,r,k,n;int main() {cin>>t;while(t--){scanf("%d%…

云计算第十二课

安装虚拟机 第一步新建虚拟机 选择自定义安装 下一步 选择稍后安装操作系统 选择系统类型和版本 选择虚拟机文件路径&#xff08;建议每台虚拟机单独存放并且路径不要有中文&#xff09;点击下一步 选择bios下一步 选择虚拟机处理器内核数量 默认硬盘或者自行调大硬盘 选择虚…

win10建立共享文件夹和ipad共享文件

win10端设置 查看自己的局域网IP 在任意地方新建一个文件夹 打开文件夹的属性,点到共享的地方 点击高级共享 然后点击应用,确认 再回到之前哪个地方,点击共享 把Everyone的权限改为读取/写入 最后点击共享就欧克了 失败的可能原因 ipad端设置 然后回出现一个要输入用户名和…