Files
2026-07-20 19:49:27 +08:00

173 lines
6.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 餐智库后端服务
餐饮行业知识库后端,提供采集管道、结构化引擎和 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`。后端不可用时,前端显示加载失败或空状态。