mirror of
https://github.com/stardrophere/InsightRadar.git
synced 2026-06-06 01:57:51 +08:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3fcd589482 | |||
| 7a34fc0079 | |||
| 6af713b67a | |||
| 6992b58208 |
@@ -1,2 +1,70 @@
|
|||||||
# InsightRadar
|
# 聚势智见 — 基于语义聚类与大模型的热点资讯聚合平台
|
||||||
An AI-powered trend monitoring and news intelligence platform
|
|
||||||
|
一个智能热点监测与个性化分发平台,通过语义聚类与大模型技术,将分散在微博、知乎、抖音、百度等平台的热点资讯自动归并为统一事件,生成AI摘要与标签,并支持个性化订阅与定时推送。
|
||||||
|
|
||||||
|
## 核心特性
|
||||||
|
|
||||||
|
- **跨平台热点聚合**:基于Embedding语义相似度计算,自动识别不同平台的同一事件
|
||||||
|
- **AI智能摘要**:调用大模型生成统一标题、综合摘要与标准化标签
|
||||||
|
- **个性化推荐**:支持关键词订阅、语义匹配与多因子排序
|
||||||
|
- **舆情分析工具**:提供热度趋势追踪、标题修改监控、时间线分析
|
||||||
|
- **定时简报推送**:自定义推送时间与接收邮箱,生成个性化AI简报
|
||||||
|
|
||||||
|
## 快速部署
|
||||||
|
|
||||||
|
### 方式一:Docker部署(推荐)
|
||||||
|
|
||||||
|
**环境要求**
|
||||||
|
- Linux系统(推荐Ubuntu 22.04 LTS / Debian 12)
|
||||||
|
- Docker ≥ 20.10.0,Docker Compose v2
|
||||||
|
- 内存 ≥ 512MB(建议1GB以上)
|
||||||
|
|
||||||
|
**部署步骤**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 构建镜像
|
||||||
|
docker build -t insightradar:latest .
|
||||||
|
|
||||||
|
# 2. 配置目录(参考docker/ereadm.txt)
|
||||||
|
mkdir -p ./data ./logs
|
||||||
|
|
||||||
|
# 3. 启动服务
|
||||||
|
cd docker
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方式二:源码部署
|
||||||
|
|
||||||
|
**环境要求**
|
||||||
|
|
||||||
|
- Python ≥ 3.11,uv包管理器
|
||||||
|
- Node.js ≥ 22
|
||||||
|
- 内存 ≥ 512MB
|
||||||
|
|
||||||
|
**后端部署**
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
# 复制
|
||||||
|
cd backend
|
||||||
|
uv sync
|
||||||
|
uv run
|
||||||
|
```
|
||||||
|
|
||||||
|
**前端部署**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 复制
|
||||||
|
cd frontend
|
||||||
|
npm install
|
||||||
|
npm run build
|
||||||
|
# 将dist/目录内容复制到 backend/app/static/
|
||||||
|
```
|
||||||
|
|
||||||
|
**配置说明**
|
||||||
|
|
||||||
|
- 复制 .env.example 为 .env 并填写配置
|
||||||
|
- 将Embedding模型(Qwen3-Embedding-4B)放入 backend/data/ 目录
|
||||||
|
|
||||||
|
### 访问应用
|
||||||
|
|
||||||
|
部署完成后,通过 http://<服务器IP>:<配置端口> 访问Web界面。
|
||||||
@@ -235,17 +235,17 @@ async function handleSearch() {
|
|||||||
<div class="tips-box glass-panel">
|
<div class="tips-box glass-panel">
|
||||||
<h2 class="panel-title"><i class="fa-regular fa-lightbulb"></i> 搜索建议</h2>
|
<h2 class="panel-title"><i class="fa-regular fa-lightbulb"></i> 搜索建议</h2>
|
||||||
<div class="tips-content">
|
<div class="tips-content">
|
||||||
<button class="tip-tag" @click="keyword='新能源汽车'; hours=168; handleSearch()">
|
<button class="tip-tag" @click="keyword='火箭发射'; hours=168; handleSearch()">
|
||||||
<i class="fa-solid fa-rocket"></i> 新能源汽车
|
<i class="fa-solid fa-rocket"></i> 火箭发射
|
||||||
</button>
|
</button>
|
||||||
<button class="tip-tag" @click="keyword='苹果公司'; hours=168; handleSearch()">
|
<button class="tip-tag" @click="keyword='苹果公司'; hours=168; handleSearch()">
|
||||||
<i class="fa-brands fa-apple"></i> 苹果产业链
|
<i class="fa-brands fa-apple"></i> 苹果公司
|
||||||
</button>
|
</button>
|
||||||
<button class="tip-tag regex-tag" @click="keyword='AI|LLM'; hours=168; handleSearch()">
|
<button class="tip-tag regex-tag" @click="keyword='AI|LLM'; hours=168; handleSearch()">
|
||||||
<i class="fa-solid fa-code-branch"></i> AI / 大模型
|
<i class="fa-solid fa-code-branch"></i> AI / 大模型
|
||||||
</button>
|
</button>
|
||||||
<button class="tip-tag regex-tag" @click="keyword='美国关税'; hours=168; handleSearch()">
|
<button class="tip-tag regex-tag" @click="keyword='美国'; hours=168; handleSearch()">
|
||||||
<i class="fa-solid fa-flag-usa"></i> 美国关税
|
<i class="fa-solid fa-flag-usa"></i> 美国
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -261,9 +261,15 @@ async function handleSearch() {
|
|||||||
<div v-else-if="searchResult" class="results-container">
|
<div v-else-if="searchResult" class="results-container">
|
||||||
<section class="chart-section glass-panel">
|
<section class="chart-section glass-panel">
|
||||||
<div class="section-header">
|
<div class="section-header">
|
||||||
<h2 class="section-title">
|
<div class="section-title-group">
|
||||||
<i class="fa-solid fa-wave-square"></i> 时间热度脉络
|
<h2 class="section-title">
|
||||||
</h2>
|
<i class="fa-solid fa-wave-square"></i> 时间热度脉络
|
||||||
|
</h2>
|
||||||
|
<span class="chart-tip">
|
||||||
|
<i class="fa-solid fa-hand-pointer"></i>
|
||||||
|
点击时间点查看具体事件列表
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
<span class="meta-info">共 {{ searchResult.timeline.length }} 个时间节点 · 覆盖 {{ searchResult.events.length }} 个聚合事件</span>
|
<span class="meta-info">共 {{ searchResult.timeline.length }} 个时间节点 · 覆盖 {{ searchResult.events.length }} 个聚合事件</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -553,6 +559,30 @@ async function handleSearch() {
|
|||||||
color: var(--brand-primary);
|
color: var(--brand-primary);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.section-title-group {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 12px;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chart-tip {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
padding: 4px 10px;
|
||||||
|
border-radius: var(--radius-md);
|
||||||
|
background: var(--brand-primary-alpha);
|
||||||
|
border: 1px solid rgba(99, 102, 241, 0.2);
|
||||||
|
color: var(--brand-primary);
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chart-tip i {
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
.time-filter-badge {
|
.time-filter-badge {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -599,6 +629,10 @@ async function handleSearch() {
|
|||||||
outline: none;
|
outline: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.chart-container :deep(.apexcharts-marker) {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
.events-section {
|
.events-section {
|
||||||
margin-top: 8px;
|
margin-top: 8px;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user