173 lines
6.2 KiB
Markdown
173 lines
6.2 KiB
Markdown
# 餐智库后端服务
|
||
|
||
餐饮行业知识库后端,提供采集管道、结构化引擎和 RAG 问答 API。
|
||
|
||
## 目录结构
|
||
|
||
```
|
||
backend/
|
||
├── app.py # Flask API 服务(端口 8788)
|
||
├── crawler.py # 采集管道:公众号文章抓取 + 视频号 ASR
|
||
├── video_downloader.py # 视频号批量下载管理器(调用 wx_channels_download API)
|
||
├── structurer.py # 结构化引擎:LLM 打标签/摘要/要点/品牌识别
|
||
├── daily_pipeline.py # 每日增量流水线:备份/采集/分析/向量/行业信号
|
||
├── rag.py # RAG 问答:向量检索 + LLM 生成
|
||
├── schema.sql # SQLite 数据库 schema
|
||
├── requirements.txt # Python 依赖
|
||
├── .env.example # 环境变量模板
|
||
├── video_config.json # 视频源配置(账号、finder、下载目录)
|
||
├── video_sources.json # 旧格式视频源(兼容)
|
||
├── run.sh # 一键启动脚本
|
||
└── data/ # SQLite 数据库目录(自动创建)
|
||
```
|
||
|
||
## 快速开始
|
||
|
||
### 1. 安装依赖
|
||
|
||
```bash
|
||
cd backend
|
||
python3 -m venv venv
|
||
source venv/bin/activate
|
||
pip install -r requirements.txt
|
||
playwright install chromium
|
||
```
|
||
|
||
### 2. 配置环境变量
|
||
|
||
```bash
|
||
cp .env.example .env
|
||
# 编辑 .env,填入你的 DASHSCOPE_API_KEY
|
||
```
|
||
|
||
### 3. 启动服务
|
||
|
||
```bash
|
||
# 方式一:一键启动前后端
|
||
./run.sh
|
||
|
||
# 方式二:仅启动后端
|
||
python app.py
|
||
```
|
||
|
||
### 4. 数据采集与分析流程
|
||
|
||
```bash
|
||
# 步骤1:采集公众号文章
|
||
python crawler.py --source-type 公众号
|
||
|
||
# 步骤2:视频号批量下载(需要先启动 wx_channels_download 工具)
|
||
# 2a. 启动下载工具(另开终端)
|
||
# sudo networksetup -setv6off Wi-Fi # 禁用 IPv6(关键!)
|
||
# sudo <工具路径>/wx_video_download # 以管理员启动
|
||
# # 然后重启微信,打开视频号
|
||
#
|
||
# 2b. 自动检测新视频并下载
|
||
python video_downloader.py
|
||
# # 下载完成后自动触发 ASR 转写入库
|
||
#
|
||
# 2c. 仅下载不转写
|
||
python video_downloader.py --no-transcribe
|
||
#
|
||
# 2d. 仅检查工具是否运行
|
||
python video_downloader.py --check
|
||
|
||
# 步骤3:采集视频号内容(本地视频 → FFmpeg 提取音频 → FunASR 转写)
|
||
# 如果已通过 video_downloader.py 自动转写,可跳过此步
|
||
# 需要先配置 video_config.json 指定视频文件所在目录
|
||
# 需要本地安装 FFmpeg 和 FunASR
|
||
python crawler.py --source-type 视频号
|
||
|
||
# 步骤4:批量结构化分析
|
||
python structurer.py analyze
|
||
|
||
# 步骤5:提取跨文章行业信号
|
||
python structurer.py signals --days 30
|
||
|
||
# 步骤6:生成向量嵌入(用于 RAG 检索)
|
||
python structurer.py embed
|
||
```
|
||
|
||
### 5. 每日自动流水线
|
||
|
||
```bash
|
||
python3 daily_pipeline.py status
|
||
python3 daily_pipeline.py daily
|
||
python3 daily_pipeline.py full --skip-crawl
|
||
```
|
||
|
||
`daily` 仅处理新增或变化内容;`full` 强制重新分析和重建向量。任务包含数据库备份、运行锁、步骤日志和最近14份备份保留。运行前必须在 `.env` 配置 `DASHSCOPE_API_KEY`。
|
||
|
||
macOS 定时任务模板为 `com.cibank.daily-pipeline.plist`,默认每天 02:00 运行。安装后可用以下命令检查:
|
||
|
||
```bash
|
||
launchctl print gui/$(id -u)/com.cibank.daily-pipeline
|
||
```
|
||
|
||
### 6. 视频号下载工具配置
|
||
|
||
视频号内容获取使用 [wx_channels_download](https://github.com/ltaoo/wx_channels_download) 工具,
|
||
详细配置指南参考 [微信视频号批量下载工具配置指南.md](../../VIBank/微信视频号批量下载工具配置指南.md)。
|
||
|
||
**关键步骤**:
|
||
1. 下载工具预编译版本(macOS arm64)
|
||
2. `xattr -d com.apple.quarantine wx_video_download` 去除隔离标记
|
||
3. 禁用 IPv6:`sudo networksetup -setv6off Wi-Fi`(macOS 必做!)
|
||
4. 关闭 VPN / 代理软件
|
||
5. `sudo wx_video_download` 以管理员启动
|
||
6. 重启微信,打开视频号
|
||
7. 配置 `video_config.json` 指定视频号账号和下载目录
|
||
8. 运行 `python video_downloader.py` 自动检测并下载新视频
|
||
|
||
**使用完毕后恢复**:
|
||
```bash
|
||
sudo networksetup -setv6automatic Wi-Fi # 恢复 IPv6
|
||
```
|
||
|
||
## API 接口
|
||
|
||
| 方法 | 路径 | 说明 |
|
||
|------|------|------|
|
||
| GET | `/api/health` | 健康检查 |
|
||
| GET | `/api/stats` | 概览统计 |
|
||
| GET | `/api/dashboard` | 仪表盘数据 |
|
||
| GET | `/api/intel` | 情报流列表(支持 type/category/q 筛选) |
|
||
| GET | `/api/intel/<id>` | 情报详情 |
|
||
| GET | `/api/brands` | 品牌库列表 |
|
||
| GET | `/api/brands/<id>` | 品牌详情 |
|
||
| GET | `/api/analysis` | 赛道分析数据 |
|
||
| GET | `/api/reports` | 报告列表 |
|
||
| POST | `/api/qa/ask` | RAG 问答 |
|
||
| POST | `/api/crawl/run` | 触发采集 |
|
||
| POST | `/api/analyze/run` | 触发结构化分析 |
|
||
| GET | `/api/crawl/runs` | 采集运行记录 |
|
||
| GET | `/api/sources?type=` | 信源列表(支持按类型筛选) |
|
||
| POST | `/api/sources` | 添加信源 |
|
||
| PUT | `/api/sources/<id>` | 编辑信源 |
|
||
| DELETE | `/api/sources/<id>` | 删除信源 |
|
||
| POST | `/api/sources/<id>/toggle` | 启用/停用信源 |
|
||
|
||
## 环境变量
|
||
|
||
| 变量 | 说明 | 默认值 |
|
||
|------|------|--------|
|
||
| `DASHSCOPE_API_KEY` | 阿里云通义千问 API Key | 必填 |
|
||
| `QWEN_MODEL` | 使用的千问模型 | `qwen-plus` |
|
||
| `EMBEDDING_MODEL` | 文本向量模型 | `text-embedding-v3` |
|
||
| `PORT` | Flask 服务端口 | `8765` |
|
||
| `CRAWL_ARTICLE_PAUSE` | 文章采集间隔(秒) | `2.0` |
|
||
| `CRAWL_LIST_PAUSE` | 列表页滚动间隔(秒) | `1.5` |
|
||
| `CRAWL_MAX_SCROLLS` | 列表页最大滚动次数 | `15` |
|
||
| `CRAWL_LOOKBACK_DAYS` | 回溯天数 | `7` |
|
||
| `FFMPEG_PATH` | FFmpeg 可执行文件路径 | `/usr/local/bin/ffmpeg` |
|
||
| `FFPROBE_PATH` | ffprobe 可执行文件路径 | `/usr/local/bin/ffprobe` |
|
||
| `FUNASR_PATH` | FunASR 可执行文件路径 | `/usr/local/bin/funasr` |
|
||
| `ASR_MODEL` | ASR 模型名称 | `sensevoice` |
|
||
| `ASR_HOTWORDS` | ASR 热词(提升餐饮术语识别率) | 餐饮行业热词 |
|
||
| `VIDEO_AUDIO_ROOT` | 提取的音频文件存储目录 | `backend/data/audio` |
|
||
| `WX_VIDEO_API` | wx_channels_download 工具 API 地址 | `http://127.0.0.1:2022` |
|
||
|
||
## 前端集成
|
||
|
||
前端通过 Vite 代理将 `/api` 请求转发到后端 `http://127.0.0.1:8788`。后端不可用时,前端显示加载失败或空状态。
|