开发记录:从零搭建 RAG 系统的踩坑与解决

RAG 智能问答系统 - SOLO 挑战赛作品

开发记录:从零搭建 RAG 系统的踩坑与解决

背景

作为一个 Python 初学者,我想搭建一个基于本地知识库的智能问答系统。在开发过程中遇到了不少问题,这里记录一下我的解决思路。


问题一:Embedding 模型下载失败

问题描述
最初使用 sentence-transformers 库下载 HuggingFace 模型,但下载速度极慢,经常超时失败。

解决思路

  • 设置 HF_ENDPOINT 环境变量指向国内镜像
  • 代码中添加:os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"

问题二:lmstudio embedding API 格式不兼容

问题描述
一开始想让 Embedding 也走 lmstudio 本地 API,配置如下:

EMBEDDING_MODEL = "text-embedding-bce-embedding-base_v1"
EMBEDDING_API_BASE = "http://localhost:1234/v1"

运行时遇到错误:

openai.BadRequestError: 'input' field must be a string or an array of strings

解决思路
lmstudio 的 embedding API 与 OpenAI 格式略有差异,对于 LangChain 兼容性不好。改用本地 HuggingFaceEmbeddings,使用 BAAI/bge-large-zh-v1.5 中文优化模型,效果更好。


问题三:向量库维度不匹配

问题描述
更换 Embedding 模型后,运行时报错:

chromadb.errors.InvalidArgumentError: Collection expecting embedding with dimension of 384, got 1024

这是因为之前用旧模型创建的 chroma_db 向量库是 384 维,新模型是 1024 维,维度不匹配。

解决思路

  • 删除旧的向量库目录:Remove-Item -Recurse -Force chroma_db
  • 重新运行程序,自动用新模型重新向量化

问题四:API Key 安全存储

问题描述
.env 文件中直接明文存储 API Key 不安全,特别是在分享代码时容易泄露。

解决思路

  • 编写 encrypt_decrypt.py,使用 Fernet (AES-256) 对 API Key 加密
  • 加密密钥与配置分离(密钥 2026 不存入文件)
  • 运行时自动解密,不在控制台输出

最终架构

组件 技术选择 理由
Embedding BAAI/bge-large-zh-v1.5 中文优化,效果好
向量库 Chroma 轻量易用
LLM qwen3-max 国产大模型
API Key 加密存储 保护隐私

快速运行

# 安装依赖
pip install -r requirements.txt

# 运行
python rag_demo.py

效果演示

命令行显示:


项目文件

rag-demo/
├── rag_demo.py          # 主程序
├── encrypt_decrypt.py   # 加密解密模块
├── requirements.txt     # 依赖
├── .env                 # 加密后的配置
└── chroma_db/           # 向量数据库(运行后生成)

心得体会

  1. 善用镜像:国内访问 HuggingFace 一定要用镜像
  2. 本地优先:Embedding 本地运行更稳定,成本更低
  3. 安全意识:API Key 一定要加密,不能明文存储
  4. 国产方案:DashScope + qwen 组合效果不错