前言
前段时间接到一个需求:为公司开发一款微信小程序,用户输入设备故障现象,系统能够自动匹配知识库并给出对应的原因分析和解决办法。简单说,就是做一个 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 格式,每条记录包含id、title、content三个字段:
{ "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 元/次 |
| 知识库文件 | 免费整理 |
六、未来优化方向
知识库自动更新:建立机制定期同步最新的产品手册和故障案例
用户反馈闭环:收集用户对答案的评价,持续优化检索效果
多轮对话能力:支持追问和澄清,提升用户体验
监控告警:接入日志分析工具,及时发现服务异常