作者:北枳
链接:https://zhuanlan.zhihu.com/p/2005062101211820607
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

前言

每天早上想了解AI圈的最新动态,要打开十几个网站:量子位、机器之心、TechCrunch、VentureBeat…刷半天看得眼花缭乱,还容易错过重要新闻。

有没有办法让AI自动帮我整理日报?

经过几天的开发,我用 Python + Ollama 做了个完全本地化的AI新闻自动化系统,每天早上自动抓取+筛选+摘要,最后推送到邮箱。

今天分享这个项目的实现思路和核心技术。


项目地址

🔗 GitHub: github.com/zuowen7/ai_n

⭐ 如果觉得有用,求个Star!


系统架构

整体分为三层:

┌─────────────────────────────────────────────────┐
│           数据采集层              │
│  100+ 新闻源 | GitHub Trending | Hugging Face │
└────────────┬────────────────────────────────────┘
             │
┌────────────▼────────────────────────────────────┐
│         AI处理层 (Ollama本地模型)          │
│  智能筛选 | 摘要生成 | 趋势分析         │
└────────────┬────────────────────────────────────┘
             │
┌────────────▼────────────────────────────────────┐
│         输出层 (邮件 + 文件)              │
│  HTML邮件 | JSON数据 | Web展示             │
└─────────────────────────────────────────────────┘

核心功能

1. 智能新闻抓取

新闻源覆盖:

  • 国内:量子位、雷锋网、机器之心、36氪等13个源
  • 国际:TechCrunch、MIT Review、VentureBeat等100+个RSS源
  • GitHub:自动抓取5个热门AI项目
  • Hugging Face:获取5个热门模型

技术实现:

# 双模式抓取
- HTML解析:BeautifulSoup + 自定义选择器
- RSS订阅:feedparser解析feed

# 并发抓取
ThreadPoolExecutor(max_workers=3)
- 动态调整并发数(成功率>90%增加,<70%减少)
- 指数退避重试(1s → 2s → 4s → 8s)

# User-Agent轮换
内置10+种浏览器UA随机切换,避免被封

2. 本地AI智能处理

为什么用Ollama?

  • ✅ 完全本地运行,隐私安全
  • ✅ 零API费用,不限速
  • ✅ 支持多种开源模型

双模型策略:

# 国内新闻用中文优化模型
domestic_news → qwen2.5:7b-instruct

# 国际新闻用英文强势模型
global_news → llama3.1:8b

AI处理流程:

  1. 智能筛选:关键词预筛 + AI精准筛选
  2. 分别排名:国内TOP5,国际TOP10
  3. 生成摘要:100字以内简洁总结
  4. 趋势分析:识别技术热点+行业方向
  5. 综合汇总:用qwen合并成最终报告

3. 智能缓存系统(性能提升80%)

痛点: 每次运行都要重新抓取、重新AI处理,耗时60秒+

解决方案:

# 新闻历史缓存(LRU策略)
- 记录已抓取新闻的标题哈希
- 只抓取24小时内新内容
- 超过1000条自动删除最老的

# AI结果缓存
- 缓存AI生成的摘要和趋势
- 相同新闻集合直接返回(0秒)
- 超过100条自动清理

效果对比:

  • 首次运行:30秒(从60秒优化到30秒)
  • 重复运行:10秒(缓存命中,AI几乎0耗时)

4. 美观的邮件输出

邮件内容:

  • GitHub热门项目(带Star徽章)
  • Hugging Face模型(带下载量)
  • 国内AI新闻 TOP5
  • 国际AI新闻 TOP10
  • AI综合摘要 + 趋势分析

模板设计:

  • 响应式HTML,移动端友好
  • 现代化卡片布局
  • 4种风格可选(极简/编辑/现代/纯文本)

技术亮点

1. 指数退避重试

class RetryConfig:
    max_retries = 3
    initial_backoff = 1.0秒
    exponential_base = 2.0  # 每次翻倍
    jitter = True          # 添加随机抖动

# 重试时间:1s → 2s → 4s

避免频繁请求被封,提高成功率。

2. 动态并发调整

class DynamicConcurrencyManager:
    def adjust_workers(self, success):
        if success_rate > 0.9:
            increase_workers()  # 成功率高,增加并发
        elif success_rate < 0.7:
            decrease_workers()  # 失败率高,降低并发

自动适应网络状况,1-10个线程动态调整。

3. LRU缓存清理

def add_news(self, news):
    self.cache[news.hash] = news

    if len(self.cache) > MAX_SIZE:
        # 按时间戳排序,删除最老的
        oldest = sorted(self.cache.items(), key=lambda x: x.timestamp)[0]
        del self.cache[oldest.hash]

防止缓存无限增长,永远不超过1000条。


部署方案

本地运行

# 1. 安装Ollama
ollama pull qwen2.5:7b-instruct
ollama pull llama3.1:8b

# 2. 安装依赖
pip install -r requirements.txt

# 3. 配置邮箱
cp config.example.json config.json
# 编辑配置,设置环境变量 AI_NEWS_EMAIL_PASSWORD

# 4. 运行
python run.py

Docker部署(推荐)

# 一键启动(包含Ollama)
docker-compose up -d

# 查看日志
docker-compose logs -f ai-news

GitHub Actions

在GitHub上设置后,每天自动运行:

  • 定时抓取(Cron表达式)
  • 自动推送结果
  • 完全免费

效果展示

运行日志

[INFO] 缓存管理器已启用(过期时间: 24h新闻, 6h AI)
[INFO] 缓存已启用 - 新闻: 152/1000 (15.2%), AI: 5/100 (5.0%)
[INFO] AI缓存命中(15条新闻)
[INFO] 总共获取到 18 篇不重复新闻
[INFO] 邮件发送成功!

邮件预览

每天早上8点准时收到:

  • GitHub热门:AutoGPT、Llama 3、Stable Diffusion…
  • Hugging Face:Whisper-v3、BERT-base…
  • 国内新闻:百度文心4.0、阿里通义千问…
  • 国际新闻:OpenAI GPT-5、Google Gemini 2.0…
  • AI摘要:3句话总结当天重点
  • 趋势分析:技术热点+行业方向

读一遍邮件,AI圈动态全掌握!


性能数据

指标 优化前 优化后 提升
抓取耗时 40秒 10秒 75%
AI处理 20秒 0-2秒 90%
总耗时 60秒 10秒 83%
缓存命中率 0% 80%
请求成功率 70% 95% 25%

开源计划

当前版本:v2.1.0

下一步计划:

  • [ ] Web管理界面(Django/Flask)
  • [ ] 更多邮件服务商(Gmail/Outlook)
  • [ ] Telegram/钉钉推送
  • [ ] 新闻分类标签
  • [ ] 用户自定义关键词

欢迎Star + Fork,一起完善!


总结

这个项目让我每天早上省下30分钟刷新闻的时间,而且AI整理的信息更全面、更有条理。

核心价值:

  1. 完全本地化,隐私安全
  2. 零API费用,想跑多久跑多久
  3. 智能缓存,越用越快
  4. 自动化运行,每天准时推送

适合人群:

  • AI从业者/研究者
  • 技术爱好者
  • 想跟上AI动态的任何人

项目地址: github.com/zuowen7/ai_n

如果对你有帮助,求个Star鼓励一下!⭐


关于作者

独立开发者,专注AI自动化工具

GitHub: @zuowen7

(完)