简介
在这篇博文中,我们将探讨如何使用 LangGraph 结合 RAG(Retrieval-Augmented Generation)技术来构建一个响应客户邮件的电子邮件智能系统。LangGraph 是一个强大的框架,专为构建和部署基于图的语言应用而设计。它支持复杂的查询处理和信息检索任务,使得我们可以实现一个智能的邮件响应系统。我们的目标是创建一个系统,能够理解和分类客户邮件,然后生成回答问题的最佳策略,最终撰写出符合查询需求的回复邮件。
背景
RAG 技术通过结合检索(Retrieval)和生成(Generation)来提升语言模型的效果。在处理客户邮件时,我们可以借此技术来提升回复的准确性和相关性。此外,通过自定义的事实数据库来增强模型,使其能够引用和生成更精确的信息。
开发环境
- Python 3.8+
- LangChain
- Hugging Face Transformers
实施步骤
-
数据准备和预处理
- 我们从一个 CSV 文件加载相关事实数据。这些数据将被用来构建我们的 RAG 系统。
-
系统架构
- 邮件分类:首先,系统需要能够理解并分类进来的客户邮件。
- 问题生成:根据邮件的类别和内容,系统将生成一些具体的问题,用于从 RAG 检索相关信息。
- 检索和生成:利用 RAG 技术,系统将从预先构建的事实数据库中检索信息,并生成回复内容。
- 邮件撰写:最后,系统将结合检索到的信息和原始邮件内容,撰写一封妥当的回复邮件。
-
代码实现
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 的配置来进一步提升系统的性能。此外,也可以探索将此技术应用于其他类型的客户服务系统中,以提升整体的服务质量和效率。