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/ # 向量数据库(运行后生成)
心得体会
- 善用镜像:国内访问 HuggingFace 一定要用镜像
- 本地优先:Embedding 本地运行更稳定,成本更低
- 安全意识:API Key 一定要加密,不能明文存储
- 国产方案:DashScope + qwen 组合效果不错



