从零到一:部署基于 FastAPI + ChromaDB + DeepSeek 的 RAG 知识库问答小程序

前言

前段时间接到一个需求:为公司开发一款微信小程序,用户输入设备故障现象,系统能够自动匹配知识库并给出对应的原因分析和解决办法。简单说,就是做一个 AI 智能问答助手。

经过一个多月的开发,项目终于成功部署上线了。这篇文章记录了从本地开发到阿里云部署的完整过程,希望能给有类似需求的朋友一些参考。

技术选型

模块 技术 选型理由
后端框架 FastAPI 异步高性能,自动生成 API 文档
向量数据库 ChromaDB 轻量级,本地部署,无需额外服务
Embedding 阿里 DashScope 中文效果好,API 稳定
LLM DeepSeek API 性价比高,推理能力强
部署 阿里云轻量应用服务器 + Nginx + HTTPS 简单稳定,适合中小项目
前端 微信小程序原生 公司内部使用,无需跨平台

项目背景

公司产品种类较多,包括臭氧传感器、旁路配件、控制器等,每个产品都有大量的技术手册和故障处理经验。以往销售和售后遇到技术问题时,需要翻阅大量文档或咨询经验丰富的同事,效率低且容易遗漏。

我们的目标是:开发一个智能问答工具,用户输入故障现象,系统自动从知识库中检索相关信息,并给出结构化的答案(原因 + 解决办法)。

一、后端开发

1.1 核心架构

复制代码
用户提问 → 问题向量化(DashScope) → 混合检索(关键词 + 向量) 
    → 相关性过滤 → LLM生成答案(DeepSeek) → 返回结果

1.2 混合检索设计

纯向量检索在匹配精准关键词时效果不理想,比如用户问"灯不亮"时,向量检索可能匹配到一些语义相近但内容不相关的文档。所以我们采用了混合检索的策略:

  • 关键词检索:通过 jieba 分词 + 倒排索引,精确匹配文档中的关键词

  • 向量检索:通过 Embedding 模型,检索语义相似的文档

  • 合并排序:两种结果按相似度统一排序,取 Top-K 返回

复制代码
# 混合检索核心逻辑
def hybrid_search(question, knowledge, keyword_index, vector_search_func, top_k=3):
    # 1. 关键词检索
    keyword_results = keyword_search(question, knowledge, keyword_index, top_k)
    
    # 2. 向量检索
    vector_results = vector_search_func(question, top_k)
    
    # 3. 合并去重,按相似度排序
    all_results = keyword_results + vector_results
    all_results.sort(key=lambda x: -x['similarity'])
    
    return all_results[:top_k]

1.3 知识库准备

将产品技术手册中的关键信息提取为结构化的 JSON 格式,每条记录包含 idtitlecontent 三个字段:

复制代码
{
  "id": "001",
  "title": "产品名称",
  "content": "DULCOTEST臭氧传感器,型号:OZR 1-mA-2ppm。是一种覆盖隔膜的电流型双电极传感器,可用于测定水中臭氧的浓度。"
}

最终我们整理了 409 条知识条目,涵盖了臭氧传感器、旁路配件、控制器等产品的技术参数、安装说明和故障诊断。

二、部署到阿里云

2.1 服务器配置

在阿里云买一台轻量应用服务器(2核2G,Ubuntu 22.04,约 79 元/年),性价比极高。

2.2 环境安装

登录服务器后安装基础环境:

复制代码
# 更新系统
sudo apt update && sudo apt upgrade -y

# 安装 Python 和 pip
sudo apt install python3-pip python3-venv git -y

# 安装系统依赖(ChromaDB 需要)
sudo apt install build-essential cmake g++ -y

2.3 上传代码并安装依赖

复制代码
# 在本地电脑上传代码
scp -r ./message root@你的服务器IP:/home/admin/

# 在服务器上安装 Python 依赖
cd /home/admin/message
pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

2.4 配置 Nginx 反向代理 + HTTPS

微信小程序要求 API 接口必须使用 HTTPS,所以需要给域名配置 SSL 证书。

Nginx 配置文件

复制代码
server {
    listen 443 ssl;
    server_name api.your-domain.com;

    ssl_certificate /etc/nginx/ssl/your-cert.pem;
    ssl_certificate_key /etc/nginx/ssl/your-cert.key;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

server {
    listen 80;
    server_name api.your-domain.com;
    return 301 https://$server_name$request_uri;
}

2.5 后台运行服务

使用 nohup 让服务在后台持续运行:

复制代码
cd /home/admin/message
nohup python3 main.py > /dev/null 2>&1 &

2.6 小程序配置

在微信公众平台配置服务器域名:

配置项
request 合法域名 https://api.your-domain.com

三、部署过程中的坑

3.1 虚拟主机不支持 Python

一开始我以为公司已有的虚拟主机(支持 PHP/HTML)能跑 Python 服务,结果发现完全不行。虚拟主机只能运行 PHP 和静态页面,不支持 Python 后端。解决方案是单独购买轻量应用服务器。

3.2 防火墙端口未开放

服务器默认只开放了 22 端口,8000 端口默认是关闭的。需要在阿里云控制台 → 轻量应用服务器 → 防火墙中手动添加 8000 端口规则。

3.3 SSL 证书申请

一开始选了 OV 证书(几千块一年),后来发现可以申请免费 DV 证书(有效期 90 天,到期自动提醒续期)。在阿里云数字证书管理服务中搜"个人测试证书"即可。

3.4 .env 文件配置

.env 文件中的 ALLOWED_ORIGINS 要设置为小程序的实际域名,而不是 *,否则跨域请求会有问题。

3.5 服务后台运行权限

nohup 启动服务时遇到了 Permission denied 问题,原因是 logs 目录权限不够。使用 sudo chown -R admin:admin logs/ 解决。

四、效果展示

小程序端用户输入"数值不稳定",系统自动返回:

复制代码
【可能原因及解决办法】
1. 膜冒内电解液有气泡 → 重新添加电解液
2. 膜上有气泡 → 临时增加流量,敲击流通池排气泡
3. 压力波动 → 减少压力变化
4. 缺少电隔离 → 模拟传感器需要进行电隔离
5. 参比电极耗尽或被污染 → 返厂重新镀层
6. 膜冒胶圈老化 → 更换胶圈

用户输入"灯不亮",系统返回:

复制代码
【可能原因及解决办法】
1. 供电错误 → 提供正确电源
2. 传感器故障 → 返厂检测维修

五、项目总结

5.1 技术栈总结

层级 技术
后端框架 FastAPI
向量数据库 ChromaDB
Embedding 阿里 DashScope
LLM DeepSeek API
部署环境 Ubuntu 22.04 + Nginx
前端 微信小程序原生

5.2 成本总结

项目 费用
阿里云轻量服务器 2核2G 79 元/年
SSL 证书 免费
DeepSeek API 约 0.0001 元/次
DashScope API 约 0.00001 元/次
知识库文件 免费整理

六、未来优化方向

  1. 知识库自动更新:建立机制定期同步最新的产品手册和故障案例

  2. 用户反馈闭环:收集用户对答案的评价,持续优化检索效果

  3. 多轮对话能力:支持追问和澄清,提升用户体验

  4. 监控告警:接入日志分析工具,及时发现服务异常