需求要点
构建一个可本地部署的自我学习式信息过滤器。
数据流:
信息源(RSS/YouTube/Email/BBS) ⇒ 本服务 ⇒ 用户
核心功能:
- 从大量信息中筛选与用户相关、感兴趣的内容
- 去除无用资讯,降低信息噪音
- 支持用户反馈(1-5分评分)进行在线学习
- 评分设计:3分为基准,5分特别感兴趣,1分特别不感兴趣
现状分析(开源方案)
1. auto-news (finaldie)
- 多源聚合:RSS、Twitter、YouTube、Reddit、个人笔记
- 过滤机制:基于Prompt的LLM过滤 + 关键词配置 + Milvus向量去重
- 学习能力:❌ 无自动学习机制,主要靠手动配置
2. Khoj
- 定位:AI第二大脑,自托管
- 过滤机制:语义搜索 + 会话上下文感知 + 自定义Agents
- 学习能力:⚠️ 仅会话级学习,不持久化长期画像
3. RSSbrew
- 定位:自托管RSS工具,支持AI摘要
- 过滤机制:规则引擎(关键词匹配)
- 学习能力:❌ 零学习机制,纯规则驱动
4. rssfilter
- 过滤机制:AI评分 + 阈值过滤
- 学习能力:❌ 基于静态用户描述,无反馈学习
⚠️
**共同缺陷:**现有工具都停留在’配置一次,终身不变’的阶段,没有真正的用户反馈闭环。
自建方案选型
技术栈推荐(轻量级方案)
- **抓取层:**Python + feedparser / yt-dlp / imaplib
- **存储:**SQLite + sqlite-vec(向量搜索插件)
- **AI层:**Ollama本地运行(nomic-embed-text + qwen/llama)
- **调度:**APScheduler 或系统 Cron
- **推送:**Telegram Bot API
在线学习核心算法
基于1-5分评分的向量方向调整算法:
def update_user_vector_online(
user_vector: np.ndarray,
article_embedding: np.ndarray,
rating: int, # 1-5
learning_rate: float = 0.1
) -> np.ndarray:
# 1-5分映射到 [-1, 1]
target_similarity = (rating - 3) / 2
# 当前相似度
current_similarity = np.dot(user_vector, article_embedding) / (
np.linalg.norm(user_vector) * np.linalg.norm(article_embedding)
)
# 误差驱动更新
error = target_similarity - current_similarity
gradient = error * article_embedding * learning_rate
new_vector = user_vector + gradient
# L2归一化
return new_vector / np.linalg.norm(new_vector)核心思想:高分文章拉近距离,低分文章推远距离。
各方案对比
算法方案对比
对比维度:复杂度 / 响应速度 / 冷启动 / 长期稳定性 / 可解释性
- 方案1 - 向量方向调整:
- 复杂度:低 | 响应:极快(<0.1ms) | 冷启动:快但易过拟合 | 长期:易遗忘旧兴趣 | 可解释性:差
- “热情但健忘”
- ✅ 对近期偏好响应极快(这周迷上钓鱼,立刻全是钓鱼内容)
- ❌ 早期喜欢的内容会被”遗忘”(去年爱看的科技评测越来越少)
- ❌ 容易陷入信息茧房,难以突破
- 方案2 - 贝叶斯更新:
- 复杂度:中 | 响应:快(<0.5ms) | 冷启动:稳健探索 | 长期:平衡新旧 | 可解释性:好(有置信度)
- “稳重但慢热”
- ✅ 长期画像稳定,不会今天推这个明天推那个
- ✅ 自动平衡新旧兴趣(不会完全抛弃老爱好)
- ⚠️ 响应变化较慢,用户需要多点几次反馈才能改变推荐方向
- 方案3 - 双塔模型:
- 复杂度:高 | 响应:一般(1-10ms) | 冷启动:慢热型 | 长期:最稳定 | 可解释性:中
- “聪明但需要数据”
- ✅ 最精准,能发现”隐性关联”(喜欢A的人通常也喜欢B)
- ✅ 不会过度反应,对噪声反馈鲁棒
- ❌ 需要持续积累正负样本,偶尔推荐会显得”莫名其妙”(探索负样本)
性能资源对比
对比指标:单用户内存 / 单次更新运算 / 推荐QPS / 部署难度
- 方案1:~0.5KB内存 | ~400次运算 | 1000+QPS | 极简部署
- 方案2:~1KB内存 | ~600次运算 | 1000+QPS | 简单部署
- 方案3:~50KB内存 | ~500-2000次运算 | 500+QPS | 中等部署
推荐选择
💡
建议:混合策略 • 前期(<50次反馈):使用方案2(贝叶斯),稳健探索 • 后期(>50次反馈):切换到方案1(向量调整),快速响应 • 定期批量校准:使用方案3的对比学习进行全局优化
文档生成时间:2026-03-17