3.1. RAG (检索增强生成) 系统
RAG (Retrieval-Augmented Generation) 是一种将检索系统与大语言模型结合的技术,通过检索相关知识来增强模型的回答能力。RAG 系统通过将大语言模型与外部知识库相结合,实现了知识的实时更新和精确控制。
相比传统的模型微调方法,RAG 具有显著的优势:它无需重新训练模型就能够更新知识库内容,可以精确控制模型使用的知识来源,能够清晰地追踪模型回答的知识来源,并且在成本效益方面比微调更具优势。这种技术已经在多个重要场景中得到了广泛应用,包括企业知识库问答系统的构建、智能客服系统的开发、海量文档的检索与总结,以及个性化助手服务的实现等。
在实际应用中,RAG 技术面临着几个关键性的技术挑战需要解决:
如何设计合理的文档分块策略,在保持文档语义完整性的同时实现高效的检索;
检索质量的优化问题,需要不断提高系统对相关文档的召回率和准确率;
上下文融合的问题,即如何有效地将多个检索到的文档片段信息进行整合;
答案生成的质量问题,系统需要基于检索到的内容生成准确、连贯且符合上下文的回答。
Tianji 在 RAG 技术上进行了深入探索,提供了一套完整的入门demo。我们基于 LangChain 和 LlamaIndex 两大主流框架,实现了包括文档处理、知识库构建、检索优化等全流程的功能。
3.1.1. Tianji 的 RAG 实现思路
3.1.1.1. 核心特点
多框架支持:
同时支持 LangChain 和 LlamaIndex 两大主流框架
提供不同复杂度的实现示例,方便学习和使用
全流程优化:
数据预处理:使用 LLM 辅助数据清洗和负样本生成
知识库构建:支持多种数据源,包括本地文件和网页内容
检索增强:实现了重排序、文档扩展等优化技术
场景定制:针对不同业务场景提供专门的知识库和处理流程
工程最佳实践:
模块化设计:各组件高度解耦,便于扩展和维护
性能优化:使用 FAISS 向量索引,支持大规模知识库
易用性:提供完整的命令行工具和示例代码
3.1.1.2. 扩展功能
高级检索技术:
混合检索:结合关键词和语义检索
重排序:对检索结果进行二次排序
上下文扩展:自动扩展相关文档片段
数据处理增强:
智能分块:基于语义的文档分块策略
数据清洗:自动识别和过滤低质量内容
知识聚类:使用 K-means 优化知识组织
3.1.2. 快速开始
3.1.2.1. 环境准备
安装依赖:
pip install -r requirements.txt
pip install llama-index llama-index-readers-web
pip install llama-index-vector-stores-faiss
配置环境变量: 在项目根目录创建
.env文件并设置:
SILICONFLOW_API_KEY=your_api_key # siliconflow API密钥
ZHIPUAI_API_KEY=your_api_key # zhipuai API密钥
3.1.2.2. 运行演示
基础版本(基于LangChain):
python run/demo_rag_langchain_onlinellm.py
通过Gradio界面使用:
访问 http://localhost:7860
选择Embedding模型(HuggingFace或ZhipuAI)
设置文本块大小(建议800-1000)
配置数据源(本地文件夹或网页URL)
点击”初始化数据库”开始对话
3.1.3. 入门指南
3.1.3.1. 什么是 RAG?
RAG 系统主要包含以下核心组件:
文档加载器:从不同来源加载文档
文本分割器:将文档分割成适当大小的块
向量数据库:存储文档块的向量表示
检索器:根据查询检索相关文档
大语言模型:结合检索到的上下文生成回答
3.1.3.2. 基本工作流程
准备阶段:
加载文档
文档分块
生成嵌入向量
存储到向量数据库
查询阶段:
接收用户问题
检索相关文档
结合上下文生成回答
3.1.4. 实现方式
3.1.4.1. LangChain 实现
在 Tianji 项目中,我们提供了基于 LangChain 的 RAG 实现示例:
# 基本组件
from langchain_community.document_loaders import DirectoryLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_chroma import Chroma
# 核心流程
1. 加载文档
loader = DirectoryLoader(data_path, glob="*.txt")
2. 文本分割
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=chunk_size,
chunk_overlap=200
)
3. 创建向量数据库
vectordb = Chroma.from_documents(
documents=split_docs,
embedding=embedding_func,
persist_directory=persist_directory,
)
3.1.4.2. LlamaIndex 实现
我们同时提供了基于 LlamaIndex 的实现方式:
# 基本组件
from llama_index.core import SimpleDirectoryReader, VectorStoreIndex
from llama_index.vector_stores.faiss import FaissVectorStore
# 核心流程
1. 加载文档
documents = SimpleDirectoryReader(data_dir).load_data()
2. 创建索引
index = VectorStoreIndex.from_documents(
documents,
storage_context=storage_context
)
3. 创建检索器
retriever = VectorIndexRetriever(index=index)
3.1.5. Tianji 项目中的测试文件
您可以通过以下测试文件学习 RAG 的实现:
核心实现:
run/demo_rag_langchain_all.py: 完整的多场景 RAG 系统示例,基于 LangChaintest/knowledges/llamaindex/test_RAG_zhipuai_simple.py: 基于 LlamaIndex 的简单 RAG 实现test/knowledges/llamaindex/test_RAG_zhipuai_advanced.py: 高级 RAG 实现,包含重排序等功能
数据处理工具:
tools/rag/0-data_llm_filter.py: 使用 LLM 过滤和清洗训练数据tools/rag/0-data_llm_filter_negative.py: 生成负样本数据tools/rag/0-data_llm_filter_lesswords.py: 处理短文本数据tools/rag/1-get_rag_knowledges.py: 知识库构建工具tools/rag/2-jsonknowledges_kmeans.py: 使用 K-means 聚类处理知识库tools/rag/3-json2txt.py: JSON 格式转换为文本格式
文档处理工具:
tools/rag/article2chunk..js: 文章分块工具tools/rag/url2article.md: 网页内容抓取指南
这些文件涵盖了 RAG 系统的完整流程:
数据收集和清洗
知识库构建和优化
文本分块和向量化
检索和问答实现
高级功能(如重排序、聚类等)
3.1.6. 特色功能
多场景支持:
敬酒礼仪文化
请客礼仪文化
送礼礼仪文化
如何说对话
化解尴尬场合
矛盾&冲突应对
高级功能:
文档重排序
FAISS 向量索引
多种数据源支持(本地文件、网页)
持久化存储
3.1.7. 使用示例
运行 LangChain 版本:
python run/demo_rag_langchain_all.py --chunk_size 896 --force
运行 LlamaIndex 简单版本:
python test/knowledges/llamaindex/test_RAG_zhipuai_simple.py
运行 LlamaIndex 高级版本:
python test/knowledges/llamaindex/test_RAG_zhipuai_advanced.py
3.1.8. 注意事项
使用前请确保安装所需依赖:
pip install llama-index llama-index-readers-web
pip install llama-index-vector-stores-faiss
需要配置相应的环境变量和 API 密钥:
在项目根目录创建
.env文件配置 SiliconFlow API 密钥:
SILICONFLOW_API_KEY=your_api_key # 从 SiliconFlow 平台获取的 API 密钥
如果使用其他模型,需要配置对应的环境变量,具体参考各模型的文档说明
建议根据实际需求调整文档分块大小和检索参数