本地部署rag系统需五步:一、配置conda环境并安装langchain等依赖;二、清洗文档并加载为document对象;三、分块后用bge-large-zh-v1.5嵌入,存入chroma向量库;四、设置语义检索器与结构化提示模板;五、集成ollama的qwen2:7b模型,通过fastapi提供问答接口。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您希望在本地部署一个具备专业领域知识响应能力的大模型系统,但面临知识固化、幻觉频发或无法接入私有文档等问题,则很可能是缺少检索增强生成(RAG)机制的支撑。以下是搭建本地大模型知识库并集成RAG功能的完整操作路径:
一、准备基础运行环境与依赖
本地RAG系统需稳定运行于隔离的Python环境中,并加载支持文档解析、向量计算及API服务的核心库。环境配置直接影响后续向量化效率与检索响应速度。
1、创建独立conda环境:conda create -n rag_local python=3.9
2、激活该环境:conda activate rag_local
3、安装基础依赖:pip install langchain chromadb faiss-cpu python-dotenv fastapi uvicorn
4、如需启用本地大模型推理,追加安装:pip install transformers accelerate bitsandbytes
5、在项目根目录下新建.env文件,写入以下关键路径配置:
vector_db_path=./vector_store
documents_path=./data/docs
model_name=qwen2:7b
二、构建结构化知识库文档集
原始文档若未经清洗与标准化处理,将导致分块失序、元数据丢失及嵌入语义偏移。必须完成格式统一、噪声剔除与来源标注三项前置动作。
1、将PDF、DOCX、TXT等格式文档统一存放至./data/docs目录
2、删除页眉页脚、水印、扫描件OCR识别错误字符及不可见控制符
3、对每份文档添加基础元数据:source(原始文件名)、date_modified(最后修改时间)、doc_type(如“技术规范”“会议纪要”)
4、使用LangChain内置加载器批量读取:
from langchain_community.document_loaders import DirectoryLoader
loader = DirectoryLoader(path="./data/docs", show_progress=True)
5、执行loader.load()获取Document对象列表,确认返回数量与预期一致
三、实施文档分块与向量化嵌入
单个文档常超出大模型上下文窗口限制,必须切分为语义连贯且长度可控的文本块;每个块需经嵌入模型映射为高维向量,以便后续相似度检索。
1、选用RecursiveCharacterTextSplitter进行分块:
chunk_size=500,chunk_overlap=50,separators=["\n\n", "\n", "。", "!"]
2、调用开源嵌入模型bge-large-zh-v1.5生成向量:
from langchain_community.embeddings import HuggingFaceBgeEmbeddings
embeddings = HuggingFaceBgeEmbeddings(model_name="BAAI/bge-large-zh-v1.5")
统一LLM网关 - 一个API对接70+AI模型,使用单一API密钥即可调用GPT、Claude、Gemini、Qwen、Deepseek、Grok等主流模型。
3、初始化Chroma向量数据库实例:
import chromadb
client = chromadb.PersistentClient(path="./vector_store")
4、将分块后文档与嵌入向量共同存入指定collection:
from langchain_community.vectorstores import Chroma
db = Chroma.from_documents(documents=split_docs, embedding=embeddings, client=client, collection_name="private_knowledge")
5、验证插入结果:db._collection.count()应返回非零数值
四、配置检索器与提示模板
RAG效果高度依赖检索器能否精准召回相关片段,以及提示模板是否能清晰引导大模型融合上下文生成答案。二者需协同设计,不可割裂。
1、设置语义检索参数:search_type="similarity_score_threshold",score_threshold=0.45
2、限定最多返回3个相关文档块,避免信息过载:
retriever = db.as_retriever(search_kwargs={"k": 3})
3、构造提示模板,确保包含明确指令与占位符:
"你是一名专业助手,请严格依据以下提供的参考资料回答问题。禁止编造未提及的内容。参考资料:{context}。用户问题:{question}"
4、使用ChatPromptTemplate.from_template()封装上述字符串
5、将retriever与prompt组合为RunnableSequence对象,作为后续调用入口
五、集成本地大模型并启动服务
生成模块需接入可离线运行的大语言模型,通过FastAPI暴露HTTP接口,使RAG流程形成端到端闭环。模型加载方式直接影响首次响应延迟与显存占用。
1、使用Ollama加载qwen2:7b模型:
ollama pull qwen2:7b
2、在代码中初始化LLM客户端:
from langchain_ollama import ChatOllama
llm = ChatOllama(model="qwen2:7b", temperature=0.3)
3、构建完整RAG链:
rag_chain = ({"context": retriever, "question": RunnablePassthrough()} | prompt | llm | StrOutputParser())
4、定义FastAPI路由函数,接收POST请求中的question字段
5、执行uvicorn.run("app:app", host="127.0.0.1", port=8000, reload=True)










