Profeto — 给 LLM 提供数据,让 LLM 预测足球比分。 核心模块: - FastAPI 后端 + PostgreSQL (SQLAlchemy async) - 多 Agent LLM 预测 (5 专家 + 终裁) - 数据采集 (bzzoiro / understat / injuries) - React 前端 (Vite + Tailwind) 包含: - 数据源抽象 (DataSource 协议 + 注册表) - Alembic 数据库迁移 - Prompt 模板 (单/多 Agent) - 核心路径单元测试
149 lines
3.3 KiB
Markdown
149 lines
3.3 KiB
Markdown
# 06 · 部署
|
|
|
|
## 前置要求
|
|
|
|
- Docker & Docker Compose
|
|
- bzzoiro API Key(必填)
|
|
- LLM API Key(必填,OpenAI / Deepseek / 兼容接口)
|
|
|
|
## Docker Compose 部署(推荐)
|
|
|
|
```bash
|
|
# 1. 配置环境变量
|
|
cp .env.example .env
|
|
# 编辑 .env: 填 LLM_API_KEY / BZZOIRO_KEY
|
|
|
|
# 2. 启动(自动建表)
|
|
docker compose up -d --build
|
|
|
|
# 3. 验证
|
|
curl http://localhost:8000/health
|
|
```
|
|
|
|
`docker-compose.yml` 仅 2 个服务:
|
|
|
|
| 服务 | 端口 | 说明 |
|
|
|---|---|---|
|
|
| `postgres` | 5432 | PostgreSQL 16 |
|
|
| `api` | 8000 | FastAPI 应用 |
|
|
|
|
数据卷 `pgdata` 持久化数据库,重启不丢数据。
|
|
|
|
## 本地开发部署
|
|
|
|
```bash
|
|
# 1. 安装依赖
|
|
pip install -e ".[dev]"
|
|
|
|
# 2. 启动 PostgreSQL(单独)
|
|
docker run -d --name profeto-pg \
|
|
-e POSTGRES_USER=football -e POSTGRES_PASSWORD=football -e POSTGRES_DB=football \
|
|
-p 5432:5432 postgres:16-alpine
|
|
|
|
# 3. 配置 .env
|
|
cp .env.example .env
|
|
|
|
# 4. 建表
|
|
alembic upgrade head
|
|
|
|
# 5. 启动 API
|
|
uvicorn src.api.app:app --reload
|
|
|
|
# 6. 启动前端(另一个终端)
|
|
cd frontend && npm install && npm run dev
|
|
```
|
|
|
|
访问:
|
|
- API 文档: http://localhost:8000/docs
|
|
- 前端界面: http://localhost:5173
|
|
|
|
## 环境变量
|
|
|
|
| 变量 | 必需 | 默认值 | 说明 |
|
|
|---|---|---|---|
|
|
| `APP_ENV` | ❌ | `development` | `production` / `development` |
|
|
| `LOG_LEVEL` | ❌ | `INFO` | 日志级别 |
|
|
| `DATABASE_URL` | ✅ | — | PostgreSQL 连接 URL |
|
|
| `LLM_PROVIDER` | ❌ | `openai` | 提供商名(仅标记) |
|
|
| `LLM_API_KEY` | ✅ | — | API Key |
|
|
| `LLM_BASE_URL` | ❌ | `https://api.openai.com/v1` | 接口地址(Ollama/Deepseek 用) |
|
|
| `LLM_MODEL` | ❌ | `gpt-4o` | 默认模型 |
|
|
| `LLM_TIMEOUT` | ❌ | `60` | 单次调用超时(秒) |
|
|
| `LLM_SPECIALIST_MODEL` | ❌ | — | 专家模型(回落 `LLM_MODEL`) |
|
|
| `LLM_AGGREGATOR_MODEL` | ❌ | — | 终裁模型(回落 `LLM_MODEL`) |
|
|
| `BZZOIRO_KEY` | ✅ | — | bzzoiro 数据源 Key |
|
|
| `BZZOIRO_BASE` | ❌ | `https://sports.bzzoiro.com/api/v2` | bzzoiro 接口地址 |
|
|
| `API_FOOTBALL_KEY` | ❌ | — | 伤停数据源 Key |
|
|
| `CORS_ORIGINS` | ❌ | `http://localhost:5173,...` | 允许的跨域来源 |
|
|
|
|
## LLM 提供商配置示例
|
|
|
|
### OpenAI
|
|
```bash
|
|
LLM_API_KEY=sk-xxxx
|
|
LLM_BASE_URL=https://api.openai.com/v1
|
|
LLM_MODEL=gpt-4o
|
|
```
|
|
|
|
### Deepseek
|
|
```bash
|
|
LLM_API_KEY=sk-xxxx
|
|
LLM_BASE_URL=https://api.deepseek.com/v1
|
|
LLM_MODEL=deepseek-chat
|
|
```
|
|
|
|
### Ollama(本地)
|
|
```bash
|
|
LLM_API_KEY=ollama
|
|
LLM_BASE_URL=http://localhost:11434/v1
|
|
LLM_MODEL=llama3.1
|
|
```
|
|
|
|
### 分档配置(专家用便宜模型)
|
|
```bash
|
|
LLM_MODEL=gpt-4o
|
|
LLM_SPECIALIST_MODEL=gpt-4o-mini
|
|
LLM_AGGREGATOR_MODEL=gpt-4o
|
|
```
|
|
|
|
## 数据库迁移
|
|
|
|
Alembic 管理 schema 变更:
|
|
|
|
```bash
|
|
# 查看当前版本
|
|
alembic current
|
|
|
|
# 升级到最新
|
|
alembic upgrade head
|
|
|
|
# 回退一级
|
|
alembic downgrade -1
|
|
|
|
# 生成新迁移(改 models.py 后)
|
|
alembic revision --autogenerate -m "描述"
|
|
|
|
# 空迁移(手动写 SQL)
|
|
alembic revision -m "描述"
|
|
```
|
|
|
|
已有迁移:
|
|
- `0001_initial`: 初始 5 张表
|
|
- `0002_agent_outputs`: predictions 加 `mode` + `agent_outputs`
|
|
|
|
## 备份与恢复
|
|
|
|
```bash
|
|
# 备份
|
|
docker exec profeto-postgres pg_dump -U football football > backup.sql
|
|
|
|
# 恢复
|
|
cat backup.sql | docker exec -i profeto-postgres psql -U football football
|
|
```
|
|
|
|
## 监控
|
|
|
|
- `/health`: 存活检查
|
|
- 日志:容器 stdout(`docker compose logs -f api`)
|
|
- 评估汇总:`GET /api/v1/eval/summary`(准确率/RMSAE/校准度)
|