修改说明

This commit is contained in:
poiuy
2026-07-12 20:21:41 +08:00
parent 59fd36f895
commit dc5daa955c
+134 -46
View File
@@ -1,6 +1,6 @@
# 军事科技每日资讯推送系统 # 军事科技每日资讯推送系统
基于大模型的军事/科技新闻采集、评分、整合与推送系统。自动抓取 RSS 订阅源,经 LLM 评分筛选与实体聚类后,生成日报并推送到飞书群。 基于大模型的军事/科技新闻采集、评分、整合与推送系统。自动抓取 RSS 订阅源,经 LLM 评分筛选与实体聚类后,生成日报并推送到飞书群,同时提供 Web 归档站点浏览历史推送
## 系统架构 ## 系统架构
@@ -10,6 +10,7 @@
│ RSS 抓取 → 中英翻译 → LLM 评分 → 硬约束过滤 → 动态阈值 │ │ RSS 抓取 → 中英翻译 → LLM 评分 → 硬约束过滤 → 动态阈值 │
│ → 实体提取 + 角度分类 → 实体归一化 → 实体聚类 │ │ → 实体提取 + 角度分类 → 实体归一化 → 实体聚类 │
│ → 广告过滤 → 缓存 → 簇热度计算 → 即时推送(≥90 分) │ │ → 广告过滤 → 缓存 → 簇热度计算 → 即时推送(≥90 分) │
│ → 自动清理过期缓存(60 天) │
└──────────────────┬────────────────────────────────────────────┘ └──────────────────┬────────────────────────────────────────────┘
┌───────────────────────────────────────────────────────────────┐ ┌───────────────────────────────────────────────────────────────┐
@@ -19,6 +20,12 @@
│ 推送 2: 📰 军事科技每日精选(单篇视图) │ │ 推送 2: 📰 军事科技每日精选(单篇视图) │
│ 网摘 Top3 + 分类概览(5 类 × 5 条) │ │ 网摘 Top3 + 分类概览(5 类 × 5 条) │
│ 推送 3: 🖼️ 网摘图片(PNG 合并长图,图床上传后推送) │ │ 推送 3: 🖼️ 网摘图片(PNG 合并长图,图床上传后推送) │
└──────────────────┬────────────────────────────────────────────┘
┌───────────────────────────────────────────────────────────────┐
│ Web 归档站点(http://0.0.0.0:8080
│ 按日期浏览历史推送:簇视图 + 单篇视图 + 网摘图片 │
│ 支持分类筛选、全文搜索、评分排序 │
└───────────────────────────────────────────────────────────────┘ └───────────────────────────────────────────────────────────────┘
``` ```
@@ -32,8 +39,10 @@
| 簇热度 | 四维评分(最高分 + 传播 + 角度 + 优先)+ LLM 精评融合,热度簇提升为热点 | | 簇热度 | 四维评分(最高分 + 传播 + 角度 + 优先)+ LLM 精评融合,热度簇提升为热点 |
| 簇记忆 | SQLite 持久化已推送簇 ID,24h 内同簇不重复推送 | | 簇记忆 | SQLite 持久化已推送簇 ID,24h 内同簇不重复推送 |
| 广告过滤 | 四层防御纵深(tag 黑名单 → 动态阈值 → 空角度 → 空实体) | | 广告过滤 | 四层防御纵深(tag 黑名单 → 动态阈值 → 空角度 → 空实体) |
| 增量缓存 | SQLite 三级缓存(文章/网摘/分类摘要),二次运行几乎零 token 消耗 | | 增量缓存 | SQLite 三级缓存(文章/网摘/分类摘要),60 天自动清理,二次运行几乎零 token 消耗 |
| 飞书推送 | 即时热点推送(≥90 分)+ 每日早报三波(热点速览 + 每日精选 + 网摘图片) | | 飞书推送 | 即时热点推送(≥90 分)+ 每日早报三波(热点速览 + 每日精选 + 网摘图片) |
| Web 归档 | Flask 站点,按日期浏览历史推送,支持分类筛选和全文搜索 |
| 日志系统 | 终端输出实时写入 `logs/YYYYMMDD-HHmmSS.log``[管线]`/`[Web]` 前缀区分来源 |
| 双视角洞察 | LLM 一次调用输出精炼摘要 + 结构化洞察(事件脉络/多角度分析/影响与展望) | | 双视角洞察 | LLM 一次调用输出精炼摘要 + 结构化洞察(事件脉络/多角度分析/影响与展望) |
| 分类概览 | 5 类军事新闻分类(装备技术/地区安全/军事改革/产业观察/其他热点),每类 top 5 | | 分类概览 | 5 类军事新闻分类(装备技术/地区安全/军事改革/产业观察/其他热点),每类 top 5 |
| 网摘图片 | PIL 渲染网摘为 PNG 合并长图,自适应高度 + 动态文本换行,图床 API 上传后推送飞书 | | 网摘图片 | PIL 渲染网摘为 PNG 合并长图,自适应高度 + 动态文本换行,图床 API 上传后推送飞书 |
@@ -42,12 +51,30 @@
## 快速开始 ## 快速开始
> 详细指南见 [QUICKSTART.md](QUICKSTART.md)
### 环境要求 ### 环境要求
- Python 3.10+ - Python 3.10+(或 Docker
- 能访问 OpenAI 兼容 APIDeepSeek / 火山引擎 / OpenAI 等) - 能访问 OpenAI 兼容 APIDeepSeek / 火山引擎 / OpenAI 等)
### 安装 ### Docker 部署(推荐)
```bash
# 1. 准备配置
mkdir -p docker/prompts docker/data docker/logs
cp .env docker/.env
cp config.json docker/config.json
cp -r prompts/* docker/prompts/
# 2. 构建并启动
docker compose up -d --build
# 3. 访问 Web 归档站点
# http://localhost:8080
```
### 本地安装
```bash ```bash
# 1. 进入项目目录 # 1. 进入项目目录
@@ -159,6 +186,48 @@ python main.py <command> [options]
## 部署 ## 部署
### Docker(推荐,适用于绿联云 NAS / 任何 Linux 主机)
```bash
# 1. 准备配置目录
mkdir -p docker/prompts docker/data docker/logs
cp .env docker/.env
cp config.json docker/config.json
cp -r prompts/* docker/prompts/
# 2. 构建并启动
docker compose up -d --build
# ── 运维 ──────────────────────────────────────
docker compose logs -f # 查看实时日志
docker compose restart # 重启
docker compose down # 停止并删除容器
docker compose up -d --build # 更新代码后重建并启动
```
#### 镜像导出(本地打包 → NAS 导入)
```bash
# 本地构建并导出
docker compose build
docker save -o military-digest.tar my-daily-military-digest:latest
# NAS 上导入
docker load -i military-digest.tar
# 使用 docker-compose.nas.yml 启动
docker compose -f docker-compose.nas.yml up -d
```
#### 文件映射
| NAS 目录 | 容器内路径 | 用途 |
|----------|-----------|------|
| `docker/.env` | `/app/.env` | API Key、Webhook |
| `docker/config.json` | `/app/config.json` | 调度、评分参数 |
| `docker/prompts/` | `/app/prompts/` | LLM 提示词 |
| `docker/data/` | `/app/data/` | 运行时数据 |
| `docker/logs/` | `/app/logs/` | 运行日志 |
### Linuxsystemd ### Linuxsystemd
```bash ```bash
@@ -181,9 +250,11 @@ scripts\setup_service.bat uninstall # 卸载计划任务
### Docker(推荐,适用于绿联云 NAS / 任何 Linux 主机) ### Docker(推荐,适用于绿联云 NAS / 任何 Linux 主机)
```bash ```bash
# 1. 准备目录和配置 # 1. 准备配置目录
mkdir -p docker/data docker/cache mkdir -p docker/prompts docker/data docker/logs
cp .env docker/.env cp .env docker/.env
cp config.json docker/config.json
cp -r prompts/* docker/prompts/
# 2. 构建并启动 # 2. 构建并启动
docker compose up -d --build docker compose up -d --build
@@ -195,40 +266,29 @@ docker compose down # 停止并删除容器
docker compose up -d --build # 更新代码后重建并启动 docker compose up -d --build # 更新代码后重建并启动
``` ```
#### 目录结构(Docker 部署 #### 镜像导出(本地打包 → NAS 导入
```
my-daily/
├── docker/ # Docker 持久化目录
│ ├── .env # 配置文件(API Key, Webhook 等)
│ ├── data/ # 运行时数据(fetch/push/image 文件)
│ └── cache/ # SQLite 缓存(避免重复消费 API)
├── Dockerfile # 镜像构建文件
├── docker-compose.yml # Docker Compose 配置
└── .dockerignore # 构建忽略文件
```
#### 在绿联云 NAS 上的操作
```bash ```bash
# 方案 A:SSH 直接操作(NAS 开启 SSH 后) # 本地构建并导出
# 将 my-daily 目录上传到 NAS,进入目录执行: docker compose build
docker compose up -d --build docker save -o military-digest.tar my-daily-military-digest:latest
# 方案 B:绿联云 Docker 管理器(图形界面) # NAS 上导入
# 1. 在本机构建镜像并导出: docker load -i military-digest.tar
docker save -o military-digest.tar military-digest:latest # 使用 NAS 专用配置启动
docker compose -f docker-compose.nas.yml up -d
# 2. 将 tar 文件上传到 NAS
# 3. 在绿联云 Docker > 镜像管理 > 导入镜像
# 4. 创建容器时挂载卷:
# - /path/to/docker/.env → /app/.env(只读)
# - /path/to/docker/data → /app/data
# - /path/to/docker/cache → /app/cache
# 5. 设置重启策略:always
# 6. 启动容器
``` ```
#### 文件映射
| NAS 目录 | 容器内路径 | 用途 |
|----------|-----------|------|
| `docker/.env` | `/app/.env` | API Key、Webhook |
| `docker/config.json` | `/app/config.json` | 调度、评分参数 |
| `docker/prompts/` | `/app/prompts/` | LLM 提示词 |
| `docker/data/` | `/app/data/` | 运行时数据 |
| `docker/logs/` | `/app/logs/` | 运行日志 |
## 运维工具 ## 运维工具
| 脚本 | 平台 | 功能 | | 脚本 | 平台 | 功能 |
@@ -253,15 +313,28 @@ python scripts/check_sources.py --concurrency 20 # 自定义并发数
## 数据与输出 ## 数据与输出
```
data/
├── fetch/ # fetch-YYYY-MM-DD.json(当日抓取结果)
├── hotalert/ # hotalert-YYYYMMDD-HHmmSS.md(即时推送快讯)
├── cluster/ # cluster-YYYYMMDD-HHmmSS.md(热点速览)
├── digest/ # digest-YYYYMMDD-HHmmSS.md(每日精选)
├── images/ # 网摘 PNG 图片
│ └── YYYYMMDD/
│ ├── webzine_{N}_{timestamp}.png
│ └── webzine_combined_{timestamp}.png
└── cache/ # article_cache.dbSQLite
```
| 目录/文件 | 说明 | 保留策略 | | 目录/文件 | 说明 | 保留策略 |
|-----------|------|:---:| |-----------|------|:---:|
| `data/fetch-YYYY-MM-DD.json` | 当日 Fetch 结果(含评分、摘要) | 7 天 | | `data/fetch/` | 当日 Fetch 结果(含评分、摘要) | 7 天 |
| `data/hotalert-YYYYMMDD-HHmmSS.md` | 军事科技快讯(即时推送) | 7 天 | | `data/hotalert/` | 军事科技快讯(即时推送) | 7 天 |
| `data/cluster-YYYYMMDD-HHmmSS.md` | 热点速览(簇视图推送) | 7 天 | | `data/cluster/` | 热点速览(簇视图推送) | 7 天 |
| `data/digest-YYYYMMDD-HHmmSS.md` | 军事科技每日精选(单篇视图推送) | 7 天 | | `data/digest/` | 军事科技每日精选(单篇视图推送) | 7 天 |
| `data/images/YYYYMMDD/` | 网摘 PNG 图片 | 7 天 | | `data/images/` | 网摘 PNG 图片 | 7 天 |
| `data/article_cache.db` | SQLite 三级缓存(文章/网摘/分类摘要 | 7 天自动清理 | | `data/cache/` | SQLite 缓存(文章/簇记忆/反馈 | 60 天自动清理 |
| `logs/YYYYMMDD-HHmmSS.log` | 运行日志(终端输出完整记录 | 手动清理 | | `logs/` | 运行日志(YYYYMMDD-HHmmSS.log | 手动清理 |
## 评价管线详解 ## 评价管线详解
@@ -424,17 +497,18 @@ clamp[clamp_min, clamp_max]
```text ```text
my-daily/ my-daily/
├── main.py # 入口 + 双循环架构 ├── main.py # 入口 + 双循环架构
├── start.py # 一键启动(含日志记录 ├── start.py # 一键启动(管线 + Web + 日志
├── config.json # 用户配置(不入库) ├── config.json # 用户配置(不入库)
├── .env # API 密钥(不入库) ├── .env # API 密钥(不入库)
├── config.json.example # 配置模板 ├── config.json.example # 配置模板
├── .env.example # 环境变量模板 ├── .env.example # 环境变量模板
├── requirements.txt # Python 依赖 ├── requirements.txt # Python 依赖
├── QUICKSTART.md # 快速上手指南
├── CONFIG.md # 配置参数完整说明 ├── CONFIG.md # 配置参数完整说明
├── Dockerfile # Docker 镜像构建 ├── Dockerfile # Docker 镜像构建
├── docker-compose.yml # Docker Compose 配置 ├── docker-compose.yml # Docker Compose 配置(本地)
├── docker-compose.nas.yml # Docker Compose 配置(NAS 部署)
├── .dockerignore # Docker 构建忽略 ├── .dockerignore # Docker 构建忽略
├── logs/ # 运行日志(YYYYMMDD-HHmmSS.log
├── prompts/ # LLM 提示词(10 个) ├── prompts/ # LLM 提示词(10 个)
│ ├── score_batch.md # 批量评分 │ ├── score_batch.md # 批量评分
│ ├── digest.md # RSS Digest 生成 │ ├── digest.md # RSS Digest 生成
@@ -497,13 +571,24 @@ my-daily/
│ └── sections/ # 内容板块 │ └── sections/ # 内容板块
│ ├── rss/section.py # RSS Digest 板块 │ ├── rss/section.py # RSS Digest 板块
│ └── webzine/section.py # 网摘生成板块 │ └── webzine/section.py # 网摘生成板块
├── web_archive/ # Web 归档站点
│ ├── server.py # Flask 应用
│ ├── data_parser.py # 数据解析
│ ├── static/ # 静态资源
│ └── templates/ # HTML 模板
├── templates/ # 推送模板
│ ├── cluster_view.md # 簇视图模板
│ ├── article_view.md # 单篇视图模板
│ └── immediate_push.md # 即时推送模板
├── CHANGELOG.md # 更新日志 ├── CHANGELOG.md # 更新日志
├── PROGRESS.md # 开发进展追踪
└── README.md # 本文件 └── README.md # 本文件
``` ```
## 常见问题 ## 常见问题
**Q: 如何在 NAS 上部署?**
A: 推荐使用 Docker 部署。本地构建镜像导出 → 上传到 NAS 导入 → 使用 `docker-compose.nas.yml` 启动。详见上方「部署 → Docker」章节。
**Q: 为什么英文源抓不到文章?** **Q: 为什么英文源抓不到文章?**
A: 英文军事源(如 The War Zone、Defense One)更新频率低,可能 2-3 天无新文章。中文微信公众号源更新频繁,扩大 `--lookback` 可覆盖更多时间窗口。 A: 英文军事源(如 The War Zone、Defense One)更新频率低,可能 2-3 天无新文章。中文微信公众号源更新频繁,扩大 `--lookback` 可覆盖更多时间窗口。
@@ -513,5 +598,8 @@ A: OPML 文件管理为主。临时追加用 `config.json` 的 `sources.add`
**Q: 如何修改定时计划?** **Q: 如何修改定时计划?**
A: 在 `.env` 中设置 `FETCH_INTERVAL_MINUTES`(拉取间隔)和 `PUSH_CRON`(推送定时,cron 表达式),重启服务即可生效。 A: 在 `.env` 中设置 `FETCH_INTERVAL_MINUTES`(拉取间隔)和 `PUSH_CRON`(推送定时,cron 表达式),重启服务即可生效。
**Q: 如何查看运行日志?**
A: 本地运行:`logs/` 目录下按时间戳命名的日志文件。Docker 运行:`docker compose logs -f` 或查看 `docker/logs/` 目录。
**Q: 内存/CPU 占用如何?** **Q: 内存/CPU 占用如何?**
A: 异步抓取 + 并发控制(默认 10 并发),翻译/评分均分批处理。137 源全量抓取峰值内存约 200MB,日常运行稳定在 100MB 以内。 A: 异步抓取 + 并发控制(默认 10 并发),翻译/评分均分批处理。137 源全量抓取峰值内存约 200MB,日常运行稳定在 100MB 以内。