mirror of
https://github.com/stardrophere/InsightRadar.git
synced 2026-06-05 21:09:20 +08:00
4.9 KiB
4.9 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
项目简介
InsightRadar(聚势智见)是一个热点资讯聚合平台。核心流程:定时爬取微博、知乎、百度等平台热搜 → 用本地 Embedding 模型(Qwen3-Embedding-4B)做余弦相似度语义聚类 → 合并为 UnifiedEvent(大事件)→ 调用 DeepSeek 等大模型生成 AI 摘要与标签 → 按用户订阅关键词定时推送邮件简报。
开发命令
后端(Python / FastAPI)
cd backend
uv sync # 安装依赖
uv run python main.py # 启动开发服务器(默认 :8000)
# 或
uv run uvicorn app.main:app --reload --port 8000
前端(Vue 3 / Vite)
cd frontend
npm install
npm run dev # 开发服务器(Vite,默认 :5173,代理到后端)
npm run build # 构建产物到 dist/
npm run type-check # TypeScript 类型检查
npm run lint # oxlint + eslint 双重 lint(自动修复)
npm run format # Prettier 格式化 src/
生产部署(将前端打包集成到后端)
cd frontend && npm run build
cp -r dist/* ../backend/app/static/
架构概览
后端分层
backend/app/
├── main.py # FastAPI 入口,APScheduler 调度(抓取/摘要/推送三个定时任务)
├── database.py # SQLAlchemy engine(SQLite WAL 模式,支持 SQLALCHEMY_DATABASE_URL 切换)
├── initialize.py # 启动时幂等写入默认信息源(今日头条、微博等11个平台)
├── models/models.py # 全部 ORM 表定义(单文件)
├── api/
│ ├── router.py # 统一挂载所有子路由,前缀 /api/v1
│ └── endpoints/ # auth / events / preferences / delivery / revisions / sources / stats
├── services/
│ ├── fetcher_service.py # 爬取热搜 + Embedding 生成 + 语义聚类入库(核心)
│ ├── summary_service.py # 调用大模型生成 AI 摘要与标签
│ ├── matching_service.py # 精确 + 语义双模式匹配用户兴趣
│ └── delivery_service.py # 检查推送时间窗口并发送邮件简报
├── core/
│ ├── security.py # JWT 签发与校验
│ └── verification/ # 验证码逻辑(Redis 或 DB 双模式存储)
├── crud/ # 数据库 CRUD 操作
├── schemas/ # Pydantic 请求/响应 Schema
├── prompts/ # LLM Prompt 模板
└── static/ # 前端构建产物(生产环境)
前端分层
frontend/src/
├── api/ # 封装 fetch 请求(基于 config/apiBase.ts,前缀 /api/v1)
├── stores/ # Pinia 状态(auth / theme)
├── router/ # Vue Router(requiresAuth / guestOnly meta 守卫)
├── views/ # 页面:Dashboard / Search / Topics / Delivery / Revisions / Login / Register
├── layouts/ # DashboardLayout(统一侧边栏)
└── components/ # 通用组件(UnifiedEventCard 等)
关键数据模型
UnifiedEvent:语义聚类后的"大事件",含 AI 摘要、center_embedding(聚类中心向量)、hot_scoreTrendingEvent:各平台原始热搜,通过external_id(MD5 指纹)去重,unified_event_id关联大事件ExtractedTopic/DiscussionComment:多态设计,target_type区分挂载在 EVENT / TREND / ARTICLE 下DeliveryHistory:防重推记录,唯一约束(user_id, target_type, target_id)
Embedding 模型
fetcher_service.py 在模块级加载 SentenceTransformer 全局单例(embedder_model)。matching_service.py 直接 import 复用该单例,避免重复加载。模型路径由 EMBEDDING_MODEL_PATH 配置,需提前将模型文件放入 backend/data/ 目录。
配置
.env 文件放在项目根目录(或 backend/data/,两处均可),关键变量:
| 变量 | 说明 |
|---|---|
SQLALCHEMY_DATABASE_URL |
默认 sqlite:///./data/demo.db,可切换 PostgreSQL |
EMBEDDING_MODEL_PATH |
本地 Embedding 模型路径 |
AI_API_KEY |
大模型 API Key(DeepSeek 等 OpenAI 兼容接口) |
SIMILARITY_THRESHOLD |
热搜语义聚类阈值(默认 0.72) |
AUTH_CODE_STORE |
验证码存储模式:db(无 Redis 时)或 redis |
REDIS_URL |
Redis 连接,为空时验证码自动回退到数据库 |
注意事项
- 后端工作目录:必须在
backend/下运行,静态文件路径app/static是相对路径 - Embedding 模型冷启动慢:首次加载 Qwen3-Embedding-4B 约需数十秒,是正常现象
- 前端 API 路径:所有请求统一经
src/config/apiBase.ts的fetchApi()发出,前缀/api/v1,无需手动拼接 - 数据库迁移:当前使用
Base.metadata.create_all()自动建表,不使用 Alembic;修改 Model 字段后需手动处理已有数据库