以下是「本地 RAG 知识库快速部署清单」,按「环境准备→核心组件安装→数据处理→检索生成测试→优化」5 个阶段整理,包含工具下载、关键代码、操作截图提示,个人用户 2 小时内可完成基础版本:
一、环境准备(10 分钟)
1. 硬件要求(最低配置)
|
设备 |
最低要求 |
推荐配置(流畅运行) |
|
CPU |
4 核(如 Intel i5/Ryzen 5) |
8 核(如 Intel i7/Ryzen 7) |
|
GPU |
8GB 显存(如 RTX 3060/4060) |
16GB 显存(如 RTX 4070/4080) |
|
内存 |
16GB RAM |
32GB RAM |
|
硬盘 |
100GB 空闲空间(模型 + 数据) |
500GB SSD(加快模型加载速度) |
|
系统 |
Windows 10+/macOS 12+/Linux |
Windows 11/macOS Ventura |
说明:无 GPU 可用 CPU 运行(速度较慢,适合测试),需确保系统已安装 Python 3.8+(官网下载:
https://www.python.org/downloads/)。
2. 必备工具安装
|
工具名称 |
作用 |
安装命令 / 步骤 |
|
Git |
拉取开源模型 / 代码 |
官网下载: |
|
Python 依赖包 |
运行 RAG 脚本 |
打开终端(CMD/PowerShell),执行: pip install chromadb transformers torch sentencepiece pypdf2 ollama |
|
Ollama |
本地部署大模型(简化版) |
官网下载: |
二、核心组件部署(30 分钟)
1. 向量数据库:Chroma(轻量本地版)
- 作用:存储知识片段的向量,支持语义检索。
- 启动步骤:新建文件夹(如 D:local_rag,后续操作均在此目录);打开终端,进入该文件夹,执行启动命令:
- bash
- python -c “import chromadb; chromadb.PersistentClient(path='./chroma_db')”
- (会自动创建 chroma_db 文件夹,代表数据库初始化成功)
2. Embedding 模型:腾讯 Youtu-Embedding(中文优先)
- 作用:将文本转为向量,支持语义匹配。
- 下载与验证:终端执行以下代码(自动下载模型,约 2GB):
- python
- 运行
- # 新建脚本:download_embedding.py,放入D:local_rag from transformers import AutoModel, AutoTokenizer model = AutoModel.from_pretrained(“tencent-ailab/youtu-embedding”) tokenizer = AutoTokenizer.from_pretrained(“tencent-ailab/youtu-embedding”) print(“模型下载成功!”)
- 运行脚本:python download_embedding.py,输出 “模型下载成功” 即完成。
3. 本地大模型:Llama 3 8B(通用问答)
- 作用:基于检索到的知识生成回答,避免幻觉。
- 部署步骤:打开终端,执行 Ollama 命令(自动下载模型,约 4GB):
- bash
- ollama run llama3:8b
- 首次运行会显示 “pulling”,等待进度 100% 后,输入 hello 测试,模型回复即成功(按 Ctrl+C 退出交互)。
三、数据处理:导入本地知识库(30 分钟)
1. 准备文档(示例:导入 PDF 技术手册)
- 新建 docs 文件夹(D:local_ragdocs),放入需要导入的文档(支持 PDF/Word/ 纯文本,示例用 Youtu-Embedding手册.pdf)。
2. 文档拆分与向量入库(关键脚本)
- 新建 process_docs.py 脚本,复制以下代码(自动处理 docs 文件夹下的所有 PDF):
- python
- 运行
- import chromadb from transformers import AutoModel, AutoTokenizer from PyPDF2 import PdfReader import os # 1. 初始化Chroma数据库 client = chromadb.PersistentClient(path=”./chroma_db”) collection = client.get_or_create_collection(name=”knowledge_base”) # 2. 加载Embedding模型 tokenizer = AutoTokenizer.from_pretrained(“tencent-ailab/youtu-embedding”) model = AutoModel.from_pretrained(“tencent-ailab/youtu-embedding”) # 3. 处理PDF文档:提取文本→拆分片段 def process_pdf(file_path): reader = PdfReader(file_path) text = “” for page in reader.pages: text += page.extract_text() or “” # 按1000字符拆分片段(可根据内容调整) chunks = [text[i:i+1000] for i in range(0, len(text), 1000)] return chunks # 4. 遍历docs文件夹,批量入库 docs_dir = “./docs” for filename in os.listdir(docs_dir): if filename.endswith(“.pdf”): file_path = os.path.join(docs_dir, filename) chunks = process_pdf(file_path) # 生成向量并入库 for i, chunk in enumerate(chunks): inputs = tokenizer(chunk, return_tensors=”pt”, padding=True, truncation=True) embedding = model(**inputs).last_hidden_state.mean(dim=1).detach().numpy() # 用文件名+片段索引作为唯一ID doc_id = f”{filename}_chunk_{i}” collection.add( documents=[chunk], metadatas=[{“source”: filename}], embeddings=embedding, ids=[doc_id] ) print(f”成功处理 {len(os.listdir(docs_dir))} 个文档,已入库!”)
- 运行脚本:python process_docs.py,显示 “成功处理 X 个文档” 即完成。
四、检索 + 生成测试(20 分钟)
1. 编写问答脚本(rag_qa.py)
python
运行
import chromadb
import requests
import json
from transformers import AutoModel, AutoTokenizer
# 1. 初始化组件
client = chromadb.PersistentClient(path="./chroma_db")
collection = client.get_collection(name="knowledge_base")
tokenizer = AutoTokenizer.from_pretrained("tencent-ailab/youtu-embedding")
model = AutoModel.from_pretrained("tencent-ailab/youtu-embedding")
# 2. 检索函数:获取相关知识片段
def retrieve_context(query, top_k=3):
inputs = tokenizer(query, return_tensors="pt", padding=True, truncation=True)
query_embedding = model(** inputs).last_hidden_state.mean(dim=1).detach().numpy()
results = collection.query(query_embeddings=query_embedding, n_results=top_k)
return "
".join(results["documents"][0])
# 3. 生成函数:调用本地Llama 3回答
def generate_answer(context, query):
prompt = f"""
仅基于以下上下文回答问题,不编造信息。
上下文:{context}
问题:{query}
回答:
"""
response = requests.post(
"http://localhost:11434/api/generate",
json={"model": "llama3:8b", "prompt": prompt, "stream": False}
)
return json.loads(response.text)["response"]
# 4. 测试:用户提问
if __name__ == "__main__":
user_query = input("请输入问题:") # 示例:"Youtu-Embedding如何处理长文本?"
context = retrieve_context(user_query)
answer = generate_answer(context, user_query)
print("
回答:
", answer)
2. 运行测试
- 确保 Ollama 服务已启动(未启动可在终端执行 ollama serve);
- 终端运行:python rag_qa.py,输入问题(如文档中包含的内容),查看是否生成基于文档的回答。
成功标志:回答内容与导入的 PDF 手册一致,无编造信息。
五、优化与扩展(可选,按需配置)
1. 提升检索速度
- 给 Chroma 建立索引:在 process_docs.py 中添加索引配置(默认已优化,无需额外操作);
- 减少片段长度:将 1000 字符改为 500 字符(适合短句多的文档)。
2. 降低显存占用
- 模型量化:用 Ollama 部署 4-bit 量化版大模型(终端执行 ollama run llama3:8b-q4_0,显存需求降至 6GB);
- 关闭不必要程序:确保 GPU 仅运行 RAG 相关进程。
3. 扩展功能
- 支持 Word/Markdown:在 process_docs.py 中添加 python-docx(处理 Word)、python-markdown(处理 Markdown)的解析代码;
- 可视化界面:用 Streamlit 搭建 Web 界面(代码示例:streamlit run app.py,app.py调用 rag_qa.py 的函数)。
六、常见问题解决
|
问题现象 |
解决方法 |
|
模型下载慢 / 失败 |
切换网络(如手机热点),或手动下载模型文件(参考 HuggingFace 模型页的下载链接) |
|
显存不足(OOM 错误) |
改用 4-bit 量化模型,或减少每次处理的文档数量 |
|
检索结果不相关 |
调整片段拆分长度(如改为 800 字符),或换用更优的 Embedding 模型(如 Qwen-Embedding) |
|
Ollama 启动失败 |
重启电脑,或在任务管理器中结束 ollama.exe 进程后重新启动 |
按此清单操作,即可搭建一个支持 “本地文档导入→语义检索→智能问答” 的 RAG 知识库,所有数据和模型均存储在本地,无需联网或依赖云端服务。

















暂无评论内容