想要在Windows系统上构建一个完全本地化的RAG(检索增强生成)应用,却对高昂成本和复杂部署望而却步?本文将为你提供一套详尽、零成本的解决方案,手把手教你从零搭建一个功能完整的本地知识库问答系统。该方案基于LlamaIndex + ChromaDB + Ollama技术栈,全程无需联网、无需API密钥,确保数据隐私与安全。
一、环境准备(使用Conda管理)
首先,我们需要创建一个独立的Python环境来管理项目依赖,避免版本冲突。推荐使用Anaconda或Miniconda。
1. 创建虚拟环境
打开Anaconda Prompt或系统命令行工具,执行以下命令来创建并激活一个名为“rag”的虚拟环境:
# 创建Python 3.11的虚拟环境
conda create -n rag python=3.11 -y
# 激活环境
conda activate rag
2. 安装核心依赖(一次性复制粘贴)
激活环境后,一次性安装所有必要的Python库。以下版本经过测试,兼容性良好。
# 核心框架
pip install llama-index==0.12.0
# 向量存储集成包(自0.10版本起独立)
pip install llama-index-vector-stores-chroma
# 本地向量数据库
pip install chromadb==0.5.20
# 本地中文嵌入模型
pip install llama-index-embeddings-huggingface==0.4.0
# 本地大模型调用接口
pip install llama-index-llms-ollama==0.5.0
# 文档解析支持
pip install pypdf # 用于PDF文件
pip install python-docx # 用于Word文件
# 辅助工具
pip install tiktoken # 用于Token计数
二、安装与配置Ollama(本地大模型引擎)
Ollama是简化本地大模型运行和管理的工具,支持多种开源模型。
步骤
- 下载安装包:访问Ollama官方网站(ollama.com),下载适用于Windows的安装程序并完成安装。建议使用默认路径。
- 拉取模型文件:安装完成后,打开CMD或PowerShell,拉取一个适合你硬件配置的模型。例如:
# 拉取轻量级模型(约3GB,内存8G以上可用)
ollama pull llama3.2
# 或拉取对中文优化更好的模型(约4GB)
ollama pull qwen2.5:7b
安装完成后,运行以下命令验证模型是否拉取成功:
ollama list
# 成功后会显示已下载的模型列表,如:llama3.2 或 qwen2.5:7b
三、项目目录结构规划
合理的项目结构有助于代码管理和维护。建议按以下方式组织你的本地RAG项目文件夹:
rag_project/
├── data/ # 存放待处理的原始文档(支持PDF/Word/TXT等)
│ ├── 员工手册.pdf
│ └── 产品说明.docx
├── chroma_db/ # Chroma向量数据库的本地存储目录(程序自动创建)
├── app.py # 主应用程序(可选,用于Web集成)
├── query.py # 交互式查询脚本
└── rebuild.py # 索引重建工具
四、核心代码实现
以下是构建本地RAG系统的关键代码文件,请将它们保存到你的项目目录中。
1. 配置文件 `config.py`
集中管理所有路径和参数,方便后续调整。
"""配置参数 - 全部免费,零API Key"""
import os
# 路径配置
DATA_DIR = "./data" # 文档文件夹
CHROMA_PATH = "./chroma_db" # 向量库本地存储
COLLECTION_NAME = "my_knowledge" # 集合名称
# 模型配置(完全本地,无需网络)
EMBED_MODEL = "BAAI/bge-small-zh-v1.5" # 中文嵌入模型,约100MB
LLM_MODEL = "llama3.2" # 或 "qwen2.5:7b"
# RAG参数
CHUNK_SIZE = 500 # 文本分块大小(字符)
CHUNK_OVERLAP = 50 # 块间重叠字符数(用于保持上下文连贯)
TOP_K = 3 # 检索最相关的Top K个文本片段
2. 核心引擎 `rag_engine.py`
这是RAG系统的核心,封装了初始化、索引构建和查询的所有功能。
"""RAG引擎 - 封装所有逻辑"""
import os
import chromadb
from config import *
from llama_index.core import (VectorStoreIndex, SimpleDirectoryReader,
Settings, StorageContext, Document)
from llama_index.core.node_parser import SentenceSplitter
from llama_index.vector_stores.chroma import ChromaVectorStore
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.llms.ollama import Ollama
class RAGEngine:
def __init__(self):
"""初始化:加载模型、连接数据库"""
print("