修改说明
This commit is contained in:
@@ -61,6 +61,31 @@ python start.py
|
|||||||
Get-Content logs\*.log -Tail 50
|
Get-Content logs\*.log -Tail 50
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 代码同步(Gitea)
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# 修改代码后,同步到 Gitea 代码库
|
||||||
|
git add .
|
||||||
|
git commit -m "修改说明"
|
||||||
|
git push
|
||||||
|
```
|
||||||
|
|
||||||
|
## 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. 查看日志
|
||||||
|
docker compose logs -f
|
||||||
|
```
|
||||||
|
|
||||||
## 配置要点
|
## 配置要点
|
||||||
|
|
||||||
- **抓取间隔**:`.env` 中 `FETCH_INTERVAL_MINUTES=30`(每 30 分钟)
|
- **抓取间隔**:`.env` 中 `FETCH_INTERVAL_MINUTES=30`(每 30 分钟)
|
||||||
|
|||||||
+136
-48
@@ -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 兼容 API(DeepSeek / 火山引擎 / OpenAI 等)
|
- 能访问 OpenAI 兼容 API(DeepSeek / 火山引擎 / 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/` | 运行日志 |
|
||||||
|
|
||||||
### Linux(systemd)
|
### Linux(systemd)
|
||||||
|
|
||||||
```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.db(SQLite)
|
||||||
|
```
|
||||||
|
|
||||||
| 目录/文件 | 说明 | 保留策略 |
|
| 目录/文件 | 说明 | 保留策略 |
|
||||||
|-----------|------|:---:|
|
|-----------|------|:---:|
|
||||||
| `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 # 网摘生成板块
|
||||||
├── CHANGELOG.md # 更新日志
|
├── web_archive/ # Web 归档站点
|
||||||
├── PROGRESS.md # 开发进展追踪
|
│ ├── server.py # Flask 应用
|
||||||
└── README.md # 本文件
|
│ ├── data_parser.py # 数据解析
|
||||||
|
│ ├── static/ # 静态资源
|
||||||
|
│ └── templates/ # HTML 模板
|
||||||
|
├── templates/ # 推送模板
|
||||||
|
│ ├── cluster_view.md # 簇视图模板
|
||||||
|
│ ├── article_view.md # 单篇视图模板
|
||||||
|
│ └── immediate_push.md # 即时推送模板
|
||||||
|
├── CHANGELOG.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 以内。
|
||||||
Reference in New Issue
Block a user