怎么本地搭建RAG
首先,我需要确认用户的需求。RAG系统通常包括文档处理、嵌入模型、向量数据库和生成模型这几个部分。用户可能是在本地环境搭建,比如个人电脑或者公司服务器,所以需要考虑资源限制,比如是否需要GPU,模型的大小,以及部署的复杂度。
用户之前对嵌入模型有了解,可能需要选择合适的嵌入模型,比如之前提到的BGE-Zh或者M3E。接着是向量数据库的选择,常见的有FAISS、Chroma、Milvus等,需要根据用户的技术栈和资源来选择。例如,FAISS适合快速搭建,而Milvus适合分布式环境,但可能更复杂。
然后是生成模型部分,用户可能需要一个中文生成模型,比如ChatGLM、Qwen或者百川。需要考虑到模型的大小,比如7B参数的模型可能需要较高的显存,如果用户只有CPU,可能需要推荐量化版本或者更小的模型。
接下来是文档处理部分,需要将用户的文档转换为向量并存储到数据库中。这一步可能需要文本分割,比如按段落或固定长度分块,确保语义连贯。然后使用嵌入模型生成向量,并建立索引。
用户可能在实际操作中遇到问题,比如如何安装依赖库,如何处理不同格式的文档(PDF、Word、网页等),如何优化检索效果,以及如何集成生成模型。需要给出具体的步骤和示例代码,帮助用户一步步搭建。
此外,用户可能关心性能优化,比如如何处理长文本,如何提高检索速度,或者如何调整生成模型的参数以获得更好的回答。可能需要提到一些调优技巧,比如调整top-k检索数量,使用重排序模型,或者对生成模型进行温度参数调整。
还需要注意一些常见问题,比如中文分词的准确性,嵌入模型和生成模型的兼容性,向量数据库的持久化存储,以及系统的可扩展性。可能用户的应用场景是企业知识库、客服系统或者个人学习工具,不同的场景可能需要不同的配置建议。
最后,用户可能需要验证搭建的系统是否有效,可以建议使用示例数据进行测试,检查检索结果的相关性和生成回答的准确性。如果有问题,可能需要调试各个模块,比如检查嵌入是否正确,向量索引是否构建成功,或者生成模型是否正常加载。以下是本地搭建RAG(Retrieval-Augmented Generation)系统的分步指南,涵盖从环境准备到代码实现的关键环节:
一、核心组件及工具选择
模块 | 推荐方案 | 替代方案 |
---|---|---|
文本嵌入模型 | BGE-Zh / M3E | text2vec / Ernie |
向量数据库 | FAISS(轻量) / Chroma(易用) | Milvus(分布式高性能) |
生成模型 | ChatGLM3-6B / Qwen-7B | Baichuan2-7B / Mistral |
文档处理工具 | LangChain / LlamaIndex | 自定义Python脚本 |
二、详细搭建步骤
步骤1:环境准备
# 创建虚拟环境
conda create -n rag python=3.9
conda activate rag
# 安装核心依赖
pip install langchain faiss-cpu transformers torch sentence-transformers
步骤2:文档处理流水线
from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 加载文档(支持PDF/TXT/Word等)
loader = DirectoryLoader('./docs/', glob="**/*.pdf")
documents = loader.load()
# 中文文本分割(建议块大小256-512字)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=300,
chunk_overlap=50,
separators=["\n\n", "\n", "。", "!", "?"]
)
splits = text_splitter.split_documents(documents)
步骤3:向量数据库构建
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
# 加载中文嵌入模型
embed_model = HuggingFaceEmbeddings(model_name="BAAI/bge-base-zh-v1.5")
# 创建向量库
vector_db = FAISS.from_documents(
documents=splits,
embedding=embed_model
)
# 持久化存储
vector_db.save_local("faiss_index")
步骤4:检索增强生成整合
from langchain.llms import HuggingFacePipeline
from transformers import AutoModelForCausalLM, AutoTokenizer
# 加载生成模型(示例使用ChatGLM3)
model_path = "THUDM/chatglm3-6b"
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_path, device_map="auto")
# 创建生成管道
llm = HuggingFacePipeline(pipeline=transformers.pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
max_new_tokens=512
))
# 构建RAG链
retriever = vector_db.as_retriever(search_kwargs={"k": 3})
rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
步骤5:查询测试
query = "如何申请年度休假?"
response = rag_chain.invoke(query)
print(f"Answer: {response}")
三、关键优化技巧
检索优化
- 混合检索:结合关键词(BM25)+语义检索
- 重排序:使用bge-reranker-base优化Top结果
from FlagEmbedding import FlagReranker reranker = FlagReranker('BAAI/bge-reranker-base')
生成控制
- 添加系统提示词:
prompt = """基于以下上下文回答问题: {context} 问题:{question} 要求:用中文简洁回答,拒绝编造信息"""
- 设置生成参数:
temperature=0.3
,top_p=0.85
- 添加系统提示词:
性能提升
- 量化部署:使用
llama.cpp
或gptq
量化模型 - 硬件加速:通过
vLLM
提升推理速度
- 量化部署:使用
四、硬件需求参考
组件 | 最低配置 | 推荐配置 |
---|---|---|
CPU | Intel i5 8代 | Xeon Silver 4210R |
内存 | 16GB DDR4 | 64GB DDR4 ECC |
GPU | 无(CPU推理) | RTX 3090 (24GB显存) |
存储 | 50GB HDD | 1TB NVMe SSD |
五、常见问题排查
显存不足 → 启用量化加载:
model = AutoModelForCausalLM.from_pretrained( model_path, load_in_4bit=True, # 4位量化 device_map="auto" )
中文乱码 → 设置编码格式:
import locale locale.setlocale(locale.LC_ALL, 'zh_CN.utf8')
检索不相关 → 检查:
- 文档分块是否合理
- 嵌入模型是否适配领域
- 相似度阈值设置(建议cosine>0.6)
如果需要更详细的配置方案(如Docker部署/集群扩展),可提供具体场景需求~
相关推荐


















