基于LangChain与RAG技术构建智能客服问答系统:完整实现指南
本文介绍了基于LangChain框架和RAG技术的智能客服系统构建方法。该系统整合了Ollama本地语言模型服务和FAISS向量数据库,能够高效检索项目文档并生成准确回答。文章详细阐述了系统架构、核心组件及实现代码,包括知识库构建、文档检索和回答生成流程。该系统可显著提升客服效率,支持网络搜索、数学计算、节假日查询等多种功能,并提供了良好的可扩展性。通过本地部署Qwen2.5模型,实现了安全可靠的
引言
随着人工智能技术的快速发展,构建智能化的客服系统已成为企业提升服务质量的重要手段。传统的客服系统往往依赖人工处理,效率低下且成本高昂。而基于检索增强生成(Retrieval-Augmented Generation, RAG)技术的客服系统,能够有效结合大量知识库信息,提供准确、及时的自动回复。
本文将详细介绍如何使用LangChain框架和RAG技术构建一个智能客服问答系统,该系统能够基于项目文档自动回答用户问题,大大提升了客服效率和用户体验。
项目架构概述
本项目采用以下技术架构:
- LangChain框架: 用于构建语言模型应用
- RAG技术: 检索增强生成,结合知识库信息生成回答
- Ollama: 本地大语言模型服务
- FAISS: 高效的向量相似性搜索库
- Qwen2.5: 主要语言模型
项目包含以下核心组件:
- 知识库构建模块
- 向量数据库管理
- 问题检索与匹配
- 智能回答生成
项目依赖
首先,让我们看看项目的完整依赖配置:
langchain==1.2.0
langchain-classic==1.0.1
langchain-community==0.4.1
langchain-core==1.2.6
langchain-ollama==1.0.1
langchain-text-splitters==1.1.0
requests
PyYAML
faiss-cpu
这些依赖库是构建RAG客服系统的核心组件,其中LangChain用于构建应用框架,Ollama用于本地模型部署,FAISS用于向量存储和检索。
完整代码实现
下面是完整的RAG客服问答系统实现代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
RAG客服系统演示脚本
展示基于检索增强生成的客服问答功能
"""
from langchain_core.prompts import ChatPromptTemplate
from langchain_ollama import ChatOllama
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_ollama import OllamaEmbeddings
from langchain_core.documents import Document
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
import time
def format_docs(docs):
"""格式化文档"""
return "\n\n".join([doc.page_content for doc in docs])
def demo_rag_customer_service():
"""演示RAG客服系统"""
print("演示: 基于RAG的客服问答系统")
print("=" * 60)
# 项目相关的知识库文档
knowledge_base = [
Document(
page_content="""
项目名称: 基于LangChain与Ollama的Qwen2.5智能助手
项目功能: 构建一个支持网络搜索、数学计算、节假日查询的本地AI Agent
核心技术: LangChain, Ollama, Qwen2.5模型
项目目标: 提供一个功能丰富、可扩展的本地AI助手解决方案
""",
metadata={"source": "project_overview"}
),
Document(
page_content="""
agent.py - Agent核心创建模块
功能: 创建工具调用Agent,包含Qwen2.5模型初始化、提示模板定义、Agent执行器创建
主要函数: create_qwen_agent()
使用的模型: qwen2.5:7b
API端点: http://localhost:11434
作用: 定义AI Agent的核心逻辑和行为
""",
metadata={"source": "agent_module"}
),
Document(
page_content="""
tools.py - 工具函数模块
功能: 定义AI Agent可使用的各种工具
包含工具:
- 网络搜索工具 (DuckDuckGoSearchRun)
- 数学计算器 (calculator)
- 节假日查询工具 (get_today_holiday, get_date_holiday, get_month_holidays, get_year_holidays)
- Python代码解释器 (python_code_interpreter)
- 天气查询工具 (get_weather)
- 货币兑换工具 (currency_converter)
- 股票价格查询工具 (get_stock_price)
- YAML处理工具 (yaml_parser, yaml_generator, read_yaml_file, write_yaml_file)
""",
metadata={"source": "tools_module"}
),
Document(
page_content="""
run.py - 主运行模块
功能: 提供用户交互界面,启动Agent并处理用户输入
交互方式: 命令行输入输出
退出命令: exit, quit, bye
作用: 项目的入口点,负责用户交互循环
""",
metadata={"source": "run_module"}
),
Document(
page_content="""
LangChain框架介绍:
LangChain是一个强大的框架,用于构建语言模型驱动的应用程序。
核心组件:
- Prompts: 定义如何向语言模型提出问题
- LLMs: 语言模型接口
- Chains: 将多个组件链接在一起
- Agents: 使用工具的语言模型
- Memory: 在请求之间保持状态
- Tools: 允许Agent访问外部系统的功能
""",
metadata={"source": "langchain_intro"}
),
Document(
page_content="""
RAG系统 (Retrieval-Augmented Generation):
RAG代表检索增强生成,是一种结合检索和生成的技术。
工作原理:
1. 将文档转换为向量并存储在向量数据库中
2. 将用户问题转换为向量
3. 在向量数据库中搜索最相似的文档
4. 将检索到的文档与问题一起发送给语言模型
5. 语言模型基于上下文生成答案
优势: 提高回答的准确性和相关性
""",
metadata={"source": "rag_system"}
),
Document(
page_content="""
安装和部署:
1. 安装依赖: pip install -r requirements.txt
2. 启动Ollama服务: ollama serve
3. 下载模型: ollama pull qwen2.5:7b
4. 运行程序: python run.py
确保Ollama服务在 http://localhost:11434 运行
""",
metadata={"source": "installation"}
),
Document(
page_content="""
常见问题解答:
Q: 如何启动项目?
A: 首先运行 'ollama serve',然后下载模型 'ollama pull qwen2.5:7b',最后运行 'python run.py'
Q: 如何使用工具?
A: Agent会自动根据问题内容选择合适的工具,用户无需手动调用
Q: 支持哪些功能?
A: 支持网络搜索、数学计算、节假日查询、天气查询、货币兑换、股票价格查询、YAML处理等
Q: 如何扩展功能?
A: 可以通过在tools.py中添加新的工具函数来扩展功能
""",
metadata={"source": "faq"}
),
Document(
page_content="""
YAML处理功能:
项目支持YAML格式处理,包括:
- yaml_parser: 解析YAML内容
- yaml_generator: 将字典转换为YAML格式
- read_yaml_file: 读取YAML文件
- write_yaml_file: 写入YAML文件
依赖: PyYAML库
""",
metadata={"source": "yaml_features"}
)
]
print("步骤 1: 创建知识库...")
print(f" - 知识库包含 {len(knowledge_base)} 个文档片段")
# 分割文档
print("步骤 2: 分割文档...")
text_splitter = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=50)
split_docs = text_splitter.split_documents(knowledge_base)
print(f" - 分割后得到 {len(split_docs)} 个文档块")
# 创建嵌入和向量存储
print("步骤 3: 创建向量数据库...")
try:
embeddings = OllamaEmbeddings(model="nomic-embed-text", base_url="http://localhost:11434")
vectorstore = FAISS.from_documents(split_docs, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 2})
print(" - 向量数据库创建成功")
except Exception as e:
print(f" - 创建向量数据库时出错: {e}")
return
# 初始化语言模型
print("步骤 4: 初始化语言模型...")
try:
llm = ChatOllama(model="qwen2.5:7b", base_url="http://localhost:11434", temperature=0.2)
print(" - 语言模型初始化成功")
except Exception as e:
print(f" - 初始化语言模型时出错: {e}")
return
# 客服问答提示模板
customer_service_prompt = ChatPromptTemplate.from_messages([
("system", """你是一个 helpful 的客服助手,专门回答关于LangChain与Ollama Qwen2.5智能助手项目的问题。
使用以下上下文信息来回答用户的问题。如果上下文信息不足以回答问题,请说明你无法根据现有信息回答。
保持回答专业、准确且有帮助。
上下文信息:
{context}"""),
("human", "问题: {question}\n\n请提供详细且有用的回答。")
])
# 创建RAG链
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| customer_service_prompt
| llm
| StrOutputParser()
)
print("步骤 5: RAG链创建成功")
print()
# 演示常见问题的回答
print("步骤 6: 演示常见问题的回答")
print("-" * 40)
demo_questions = [
"这个项目是做什么的?",
"如何安装这个项目?",
"有哪些工具可以使用?",
"agent.py文件的作用是什么?"
]
for i, question in enumerate(demo_questions, 1):
print(f"问题 {i}: {question}")
# 检索相关文档
relevant_docs = retriever.invoke(question)
print(f" - 检索到 {len(relevant_docs)} 个相关文档片段")
# 生成回答
try:
print(" - 生成回答中...")
response = rag_chain.invoke(question)
print(f" - 客服回答: {response[:300]}...") # 显示前300个字符
except Exception as e:
print(f" - 生成回答时出错: {e}")
print()
time.sleep(1) # 短暂延迟,让演示更清晰
print("=" * 60)
print("RAG客服系统工作原理:")
print("1. 将项目文档存储在向量数据库中 (知识库)")
print("2. 当用户提问时,系统检索最相关的文档片段")
print("3. 将检索到的文档与用户问题一起发送给AI模型")
print("4. AI模型基于上下文生成准确的回答")
print("5. 这样可以确保回答基于项目的真实信息")
print()
print("系统优势:")
print("- 回答准确: 基于真实文档内容")
print("- 上下文感知: 结合检索信息生成回答")
print("- 可扩展: 可随时添加新的知识库文档")
print("- 专业性强: 针对特定领域优化")
def main():
"""主函数"""
print("RAG客服系统演示")
print("=" * 60)
# 检查Ollama服务
try:
import requests
response = requests.get("http://localhost:11434/api/tags", timeout=5)
if response.status_code != 200:
print("错误: 无法连接到Ollama服务")
return
print("✓ Ollama服务连接正常")
except requests.exceptions.ConnectionError:
print("错误: 无法连接到Ollama服务")
return
except Exception as e:
print(f"检查Ollama服务时出错: {e}")
return
# 检查所需模型
try:
import json
response = requests.get("http://localhost:11434/api/tags", timeout=5)
models = json.loads(response.text)["models"]
model_names = [model["name"] for model in models]
if "nomic-embed-text:latest" not in model_names:
print("⚠ 警告: 未找到 nomic-embed-text 模型")
else:
print("✓ 找到 nomic-embed-text 模型")
if "qwen2.5:7b" not in model_names:
print("⚠ 警告: 未找到 qwen2.5:7b 模型")
else:
print("✓ 找到 qwen2.5:7b 模型")
except Exception as e:
print(f"检查模型时出错: {e}")
print()
# 运行演示
demo_rag_customer_service()
if __name__ == "__main__":
main()
系统核心功能详解
1. 知识库构建
系统使用Document对象存储项目相关的知识信息,包括项目概述、各模块功能、安装部署指南等内容。这些文档会被分割并转换为向量存储在FAISS数据库中。
2. 向量检索机制
使用OllamaEmbeddings创建文档嵌入,通过FAISS实现高效的相似性搜索。当用户提问时,系统会将问题转换为向量,并在知识库中检索最相关的文档片段。
3. RAG链设计
通过LangChain的链式调用,将检索到的文档与用户问题结合,传递给语言模型生成最终回答。这种方式既保证了回答的准确性,又提高了生成质量。
运行环境配置
1. 环境准备
pip install -r requirements.txt
2. 启动Ollama服务
ollama serve
3. 下载所需模型
ollama pull qwen2.5:7b
ollama pull nomic-embed-text
4. 运行系统
python demo_rag_customer_service.py

系统优势
- 准确性高: 回答基于真实文档内容,避免幻觉
- 上下文感知: 结合检索信息生成回答
- 可扩展性强: 可随时添加新的知识库文档
- 领域专业: 针对特定领域优化
- 成本效益: 本地部署,无需云服务费用
扩展建议
- 增加记忆功能: 实现多轮对话管理
- 优化检索算法: 使用更高级的相似性搜索方法
- 引入评估指标: 量化系统性能
- 添加图形界面: 提升用户体验
- 集成其他数据源: 扩展知识库覆盖范围
总结
本文详细介绍了基于LangChain和RAG技术构建智能客服问答系统的完整实现过程。通过将项目文档作为知识库,系统能够准确回答用户问题,大大提升了客服效率。该系统具有高度的可扩展性和专业性,可作为构建更复杂客服系统的良好基础。
随着AI技术的不断发展,RAG技术将在更多领域发挥重要作用。掌握这一技术,对于开发智能化应用具有重要意义。希望本文能为您提供有价值的参考和启发。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)