本文解决AI回答采集系统从本地原型迁移到云上生产环境的问题。使用阿里云ECS、DashScope API和OSS,实现一个可稳定运行、可监控、成本可控的采集系统。读者需具备Python基础、阿里云账号及API Key,并了解基本的ECS和OSS使用。本文不涉及高并发架构和分布式部署。
业务任务与云上约束
本地原型通常运行在个人电脑,依赖本地数据库和网络。迁移到云上后,需要解决:
环境一致性:本地Python版本、依赖库与云上环境对齐。
网络稳定性:云服务器到模型API的网络延迟和限流。
数据持久化:本地文件存储改为云存储。
成本控制:按需使用资源,避免闲置计费。
环境和资源准备
硬件与软件环境
操作系统:Ubuntu 22.04 LTS(ECS镜像)
Python版本:3.10+(建议使用pyenv或conda管理)
依赖:openai==1.12.0、requests==2.31.0、pandas==2.1.0、oss2==2.18.0、tenacity==8.2.3
安装命令示例:
pip install openai==1.12.0 requests==2.31.0 pandas==2.1.0 oss2==2.18.0 tenacity==8.2.3
阿里云资源
ECS实例:ecs.t6-c1m1.large(2核1G,按量付费,测试用)
OSS Bucket:用于存储采集结果
RAM用户:授予OSS读写权限,使用AccessKey
安全组:允许SSH(22端口)和出站流量
方案对比与选择
方案 优点 缺点
函数计算 无需管理服务器,自动伸缩 冷启动,执行时长限制
ECS + 定时任务 灵活可控,易于调试 需管理服务器,有闲置成本
容器服务 标准化部署 复杂度高,小规模不必要
本文选择ECS + 定时任务方案,适合中小规模采集任务。
核心实现
- 部署代码到ECS
将本地代码打包上传到ECS。示例使用scp:
scp -i your-key.pem -r ./collector ubuntu@:/home/ubuntu/
在ECS上创建虚拟环境并安装依赖:
cd /home/ubuntu/collector
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
- 配置API Key和环境变量
将DashScope API Key和OSS AccessKey保存在环境变量中,避免硬编码:
echo "export DASHSCOPE_API_KEY=''" >> ~/.bashrc
echo "export OSS_ACCESS_KEY_ID=''" >> ~/.bashrc
echo "export OSS_ACCESS_KEY_SECRET=''" >> ~/.bashrc
echo "export OSS_BUCKET=''" >> ~/.bashrc
source ~/.bashrc
- 核心采集代码片段(含重试)
以下为调用DashScope API并保存结果到OSS的示例伪代码,增加了基于tenacity的重试机制,并区分了超时和限流异常:
import os
import json
from openai import OpenAI, APIError, APITimeoutError, RateLimitError
import oss2
from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type
client = OpenAI(
api_key=os.environ["DASHSCOPE_API_KEY"],
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
@retry(
stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=2, max=10),
retry=retry_if_exception_type((APITimeoutError, RateLimitError))
)
def query_model(prompt: str) -> str:
response = client.chat.completions.create(
model="qwen-plus",
messages=[{"role": "user", "content": prompt}],
timeout=30
)
return response.choices[0].message.content
def save_to_oss(data: dict, object_name: str):
auth = oss2.Auth(
os.environ["OSS_ACCESS_KEY_ID"],
os.environ["OSS_ACCESS_KEY_SECRET"]
)
bucket = oss2.Bucket(auth, "https://oss-cn-hangzhou.aliyuncs.com", os.environ["OSS_BUCKET"])
bucket.put_object(object_name, json.dumps(data))
示例调用
prompt = "请介绍阿里云ECS的计费方式"
try:
result = query_model(prompt)
if result:
save_to_oss({"prompt": prompt, "response": result, "timestamp": "2025-07-22T10:00:00"}, "results/001.json")
except APIError as e:
print(f"API调用失败(非重试异常): {e}")
说明:
重试仅针对超时和限流异常,其他异常(如认证失败)直接抛出,避免无效重试。
实际使用时,建议将重试次数和等待策略根据业务容忍度调整。
- 定时任务配置
使用crontab每小时执行一次采集:
crontab -e
添加以下行,每小时执行一次
0 cd /home/ubuntu/collector && source venv/bin/activate && python main.py >> /var/log/collector.log 2>&1
验证方式
手动执行脚本,检查日志输出是否包含成功信息。
登录OSS控制台,查看指定目录下是否存在JSON文件。
检查ECS监控:CPU、内存、网络流量。
正常情况下应当看到:
日志输出:“采集完成,结果已保存到OSS”
OSS中出现以时间命名的JSON文件,内容包含模型回答。
成本、稳定性和安全分析
费用
ECS:ecs.t6-c1m1.large按量付费约0.1元/小时,每月约72元(按30天连续运行)。具体价格请以阿里云官方控制台和计费文档为准。
OSS:存储费用约0.12元/GB/月,请求费用极低。具体价格请以阿里云官方控制台和计费文档为准。
DashScope API:qwen-plus模型输入0.004元/千tokens,输出0.012元/千tokens,按实际调用量计费。具体价格请以阿里云官方控制台和计费文档为准。
公网流量:ECS到OSS内网免费,但ECS到DashScope API走公网,流量费约0.8元/GB。具体价格请以阿里云官方控制台和计费文档为准。
稳定性
网络抖动可能导致API超时,代码中已使用tenacity实现重试,最多重试3次,指数退避等待。
ECS意外重启后,crontab任务会自动恢复。
建议在ECS上配置开机自启脚本,确保服务自动拉起。
安全
API Key和AccessKey存储在环境变量,不写入代码仓库。
RAM用户仅授予OSS写入权限,遵循最小权限原则。
安全组仅开放SSH端口,并限制来源IP。
踩坑与适用边界
常见问题
API调用超时:检查ECS出站网络,确保能访问dashscope.aliyuncs.com。如果超时频繁,可适当增加超时时间或调整重试策略。
OSS权限不足:确认RAM用户已授权AliyunOSSFullAccess或自定义权限。
环境变量未生效:重启终端或执行source ~/.bashrc。
适用边界
本方案适用于日采集量在千次以内的场景。
若需高并发,建议使用函数计算或容器服务。
若需存储大量原始回答,建议使用RDS或MongoDB。
可复用清单
[x] 创建ECS实例并配置安全组
[x] 部署代码并安装依赖
[x] 配置环境变量
[x] 编写采集脚本并测试
[x] 配置定时任务
[x] 设置监控告警(可选)
[x] 检查费用和资源释放策略
总结
本文从本地原型到云上部署,完整介绍了AI回答采集系统的迁移过程。通过ECS、DashScope和OSS的组合,实现了稳定、可控、低成本的采集方案。读者可根据自身需求调整资源规格和代码逻辑,并注意定期清理测试资源以避免额外费用。