超详细
一、硬件准备(最低配置)
计算设备
- CPU:Intel i7 12代 / AMD Ryzen 7 5800X 或更高
- RAM:32GB DDR4(建议64GB+以提升大模型推理效率)
- 存储:1TB NVMe SSD(存储大模型权重和知识库)
- 网络:千兆局域网
关键优化建议
- 尽量增加内存,CPU推理比GPU更依赖RAM
- 使用高性能SSD,减少加载模型的I/O瓶颈
- 多线程优化,确保Python运行时能最大化利用CPU核心
二、软件环境搭建
1. 操作系统
# Ubuntu 22.04 LTS 安装
sudo apt update && sudo apt upgrade -y
sudo apt install build-essential zlib1g-dev libssl-dev libffi-dev wget curl
2. Python环境
# 安装 Miniconda
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
# 创建专用 Python 环境
conda create -n knowledge_base python=3.10
conda activate knowledge_base
3. 安装关键依赖
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
pip install transformers==4.32.0 sentence-transformers faiss-cpu langchain
pip install llama-cpp-python # 轻量化 CPU 运行
4. 安装编译工具
# 安装 GCC 编译器和 libgomp 库(用于 OpenMP 支持)
conda install -c anaconda gcc_linux-64 gxx_linux-64
conda install -c conda-forge libgomp
三、模型选择与部署(仅支持CPU)
1. 适合CPU运行的模型
| 模型 | 适用场景 | 最低RAM需求 |
|—————|———–|————-|
| ChatGLM3-6B-CPU
| 中文问答 | 32GB |
| Mistral-7B-Instruct-v0.2-GGUF
| 轻量级LLM | 16GB |
| Llama-3-8B-Instruct-GGUF
| 通用智能 | 64GB |
| Qwen-1.8B-Chat
| 超低资源环境 | 8GB |
注意:GGUF 格式是优化后的低资源推理模型格式。
2. 下载并转换模型
编译的时候要使用cmake来编译才行,现在不支持make了。
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp && make -j$(nproc)
下载的时候要配置登录huggingface并且获取token来配置。
# 下载并转换模型(以 Mistral 7B 为例)
from huggingface_hub import snapshot_download
snapshot_download(repo_id="mistralai/Mistral-7B-Instruct-v0.2", local_dir="./mistral")
# 转换为 GGUF 格式
python llama.cpp/convert-hf-to-gguf.py mistral/ --outfile mistral.gguf
3. 运行CPU推理
# 4-bit 量化(减少RAM占用)
./llama.cpp/quantize mistral.gguf mistral-q4_0.gguf q4_0
# 启动模型服务(启用CPU优化)
./llama.cpp/server -m mistral-q4_0.gguf --port 8000 --threads $(nproc)
四、知识库构建
1. 数据预处理
from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
loader = DirectoryLoader('./docs', glob="**/*.txt")
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, chunk_overlap=50, separators=["\n\n", "\n", "。", "!", "?"]
)
splits = text_splitter.split_documents(documents)
2. 构建向量数据库
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh-v1.5") # 适合CPU
vectorstore = FAISS.from_documents(splits, embeddings)
vectorstore.save_local("faiss_index")
五、RAG增强实现
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
prompt_template = """基于以下上下文和你的知识,用中文回答:
上下文:{context}
问题:{question}
答案:"""
QA_CHAIN_PROMPT = PromptTemplate.from_template(prompt_template)
qa_chain = RetrievalQA.from_chain_type(
llm, retriever=vectorstore.as_retriever(), chain_type_kwargs={"prompt": QA_CHAIN_PROMPT}
)
六、API系统部署
1. API接口(FastAPI)
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Query(BaseModel):
question: str
user_id: str
@app.post("/ask")
async def ask(query: Query):
result = qa_chain({"query": query.question})
return {"answer": result["result"], "sources": result["source_documents"]}
# 启动
uvicorn main:app --host 0.0.0.0 --port 7860 --workers 2
2. 反向代理(Nginx)
server {
listen 443 ssl;
server_name knowledge.example.com;
ssl_certificate /etc/ssl/certs/knowledge.pem;
ssl_certificate_key /etc/ssl/private/knowledge.key;
location / {
proxy_pass http://localhost:7860;
proxy_set_header X-Real-IP $remote_addr;
}
}
七、优化与监控
1. 推理性能优化
# 使用 CPU 计算库
sudo apt install libopenblas-dev libomp-dev
# 启用 Pytorch 线程优化
export OMP_NUM_THREADS=$(nproc)
export MKL_NUM_THREADS=$(nproc)
2. 监控系统(Prometheus + Grafana)
docker run -d --name prometheus -p 9090:9090 -v ./prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
docker run -d --name grafana -p 3000:3000 grafana/grafana-enterprise
八、增量知识库更新
def update_knowledge(file_path):
new_docs = loader.load(file_path)
new_splits = text_splitter.split_documents(new_docs)
vectorstore.add_documents(new_splits)
vectorstore.save_local("faiss_index")
九、扩展方案
1. 分布式部署
# Ray CPU 集群优化
ray start --head --port=6379 --dashboard-port=8265
ray start --address='192.168.1.100:6379'
2. 浏览器插件
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request.action === "query") {
fetch('https://knowledge-base/api/ask', {
method: 'POST',
headers: {'Authorization': 'Bearer ' + token},
body: JSON.stringify({question: request.question})
}).then(response => sendResponse(response.json()))
}
});
总结
- 优化了 CPU 运行的 LLM 模型(使用 GGUF 格式+Llama.cpp)
- 减少了RAM占用(量化推理+优化的embeddings模型)
- 增强了知识库增量更新机制
- 提供了 API 部署、监控、浏览器集成方案
这样,你的 CPU 服务器 也能稳定运行大模型并搭建 RAG 知识库 🎯
版权声明: 如无特别声明,本文版权归 sshipanoo 所有,转载请注明本文链接。
(采用 CC BY-NC-SA 4.0 许可协议进行授权)
本文标题:《 Python本地部署知识库|仅CPU运行的模型 》
本文链接:http://0.0.0.0:3015/ai/Python%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2%E7%9F%A5%E8%AF%86%E5%BA%93.html
本文最后一次更新为 天前,文章中的某些内容可能已过时!