Files
nba-fan-hub/README.md
T

131 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🏀 NBA球迷大全
面向球迷的 NBA 信息问答系统:对话即可查询比赛、球员、球队、新闻、人物、百科等准确信息。
基于 **大模型(DeepSeek+ 结构化查询(SQLite+ RAG 向量检索(Chroma + bge-large-zh** 混合架构,
数据全部来自内置数据库,回答准确可溯源。
## ✨ 功能
- 💬 **智能对话**:自然语言提问,自动路由到数据库/向量库,返回带来源的准确回答
- 例:「2026年总决赛谁赢了」「库里本赛季场均数据」「约基奇和字母哥谁得分多」「雷霆为什么能夺冠」
- 🏟️ **数据浏览**:球队 / 球员 / 比赛(含技术统计)/ 新闻 / 人物 / 排名 六大浏览页面
- 🧠 **RAG 检索**:新闻与百科向量化存储,语义检索 + Rerank 精排
- 🔧 **Function Calling**:8 个查询工具(球队/球员/比赛/单场详情/排名/新闻/人物/百科),多轮工具调用 + 实体覆盖补全
- 🧵 **多轮对话**:支持上下文指代(「他拿过几个MVP?」→ 上一话题对象)
- 🎛️ **管理后台**`/admin`,默认密码 admin123):球队/球员/比赛/技术统计/排名/新闻百科/人物/运动/联赛 全量 CRUD + 站点配置(开场白、快捷问题、站点名、页脚、密码)
- 📰 **参考资讯折叠块**:回答用到新闻/百科时,回答上方默认折叠展示资讯链接,点击直达详情
-**实体识别标记**:回答中的球队/球员/人物/比赛自动高亮(含简称:雷霆/湖人/库里/字母哥…),点击弹出详情;回答下方生成快速查看卡片
- 📝 **Markdown 回答**:大模型回答以 Markdown 渲染(标题/列表/表格/代码块/引用),本地 marked 库无外部依赖
- 🔗 **独立详情页**`/team/1` `/player/1` `/game/1` `/news/1` `/person/1`,弹窗与列表中均有「查看完整详情」链接跳转;详情页内含交叉链接(球队→球员/比赛,比赛→球员/球队)
- 🏆 **季后赛对阵图**:排名页展示完整 bracket(首轮/半决/分区决赛/总决赛),胜者高亮、点击看比赛,支持多赛季切换(2024-25 / 2025-26
## 🏗️ 系统架构
```
用户提问
┌─────────────┐ 工具调用(8个) ┌──────────────────┐
│ DeepSeek │ ───────────────► │ tools.py 查询层 │
│ deepseek- │ ◄─────────────── │ · SQLite 结构化 │
│ v4-flash │ 工具结果回填 │ · Chroma 向量检索 │
└─────────────┘ └──────────────────┘
│ 最终答案(数据准确 + 来源标注)
前端(对话 + 数据浏览)
```
| 模块 | 技术 | 说明 |
|------|------|------|
| 对话大脑 | DeepSeek `deepseek-v4-flash`(函数调用) | 意图理解、工具选择、答案生成 |
| 结构化数据 | SQLite(本地) | 球队/球员/比赛/统计/排名/新闻/人物,多赛季(2024-25/2025-26 |
| 向量检索 | Chroma16010REST | 新闻/百科语义检索(cosine) |
| Embedding | bge-large-zh-v1.5160111024维) | 中文语义向量 |
| Rerank | bge-reranker-v2-m316011 | 检索精排(可选) |
| 前端 | 原生 HTML/JS(无构建) | 对话 + 六大浏览页 + 独立详情页 + 管理后台 + 对阵图 |
## 📁 目录结构
```
nba-fan-hub/
├── api.py # Flask 服务(REST API + 静态页 + 详情页路由 + 管理后台)
├── chat.py # 对话管线(工具路由 + 兜底 + 覆盖补全)
├── tools.py # 8 个查询工具(SQL + 向量),含绰号别名/模糊匹配
├── llm.py # DeepSeek 调用(思考模式 reasoning_content 回传)
├── entity_linker.py # 实体识别程序(回答中球队/球员/人物/比赛标记 + 卡片)
├── playoffs.py # 季后赛对阵图生成器(多赛季 bracket)
├── admin.py # 管理后台 API(登录认证 + 通用 CRUD + 站点配置)
├── vector_store.py # Embedding + Chroma + Rerank(纯 REST,零额外依赖)
├── db.py # SQLite 连接与建表(含 site_config 配置表)
├── seed.py # 种子数据入口(幂等,可 --rebuild-vector
├── seed_seasons.py # 赛季补充数据(2024-25 排名/季后赛 + 2025-26 首轮补齐)
├── seed_*.py # 模拟数据(30队/154球员/54比赛/46新闻百科/38人物)
├── static/ # 前端(index.html 前台 / admin.html 后台 / detail.html 详情页 + lib/marked.min.js
├── data/ # nba_fan.db(自动生成)
└── start.sh # 启停脚本(start/stop/restart/status/seed
```
## 🚀 快速开始
```bash
# 1. 灌数据(首次或数据更新后)
./start.sh seed # 或 python3 seed.py --rebuild-vector
# 2. 启动
./start.sh start # http://<IP>:16090
./start.sh status # 查看状态
```
依赖:`flask``requests`openclaw conda 环境已具备)。外部依赖服务:
- 大模型:DeepSeek APIkey 配置于 `config.py`
- 向量库:Chroma @ `121.40.164.32:16010`
- Embedding/Rerank@ `121.40.164.32:16011`
## 🔌 REST API
| 接口 | 说明 |
|------|------|
| `POST /api/chat` | 对话 `{message, history}``{reply, sources, used_tools, news_refs, entities, cards}` |
| `GET /api/boot` | 对话启动信息(开场白 + 快捷问题,后台可配置) |
| `GET /api/teams[?q=]` `GET /api/teams/<id>` | 球队列表/详情(含阵容+近期比赛) |
| `GET /api/players[?q=]` `GET /api/players/<id>` | 球员列表/详情 |
| `GET /api/games[?q=&status=]` `GET /api/games/<id>` | 比赛列表/详情(含技术统计) |
| `GET /api/standings?conf=西部/东部&season=2025-26` | 排名(多赛季) |
| `GET /api/seasons` | 可用赛季列表 |
| `GET /api/playoffs?season=2025-26` | 季后赛对阵图(首轮/半决/分区决赛/总决赛) |
| `GET /team/<id>` `/player/<id>` `/game/<id>` `/news/<id>` `/person/<id>` | 独立详情页 |
| `GET /api/news[?q=&kind=]` `GET /api/news/<id>` | 新闻/百科 |
| `GET /api/persons[?q=&role=]` | 人物(coach/commentator/host/agent/gm/legend |
| `GET /api/health` | 健康检查 + 数据统计 |
| `POST /api/admin/login` | 管理后台登录(默认密码 admin123) |
| `GET/POST/PUT/DELETE /api/admin/<table>[/<id>]` | 通用数据 CRUD(表白名单防注入) |
| `GET/PUT /api/admin/config` | 站点配置读写(开场白/快捷问题/密码等) |
## 🧩 扩展设计(重点)
数据库采用「运动-联赛-球队-球员」分层,新增球类/联赛/人物角色无需改代码:
| 扩展需求 | 怎么做 |
|----------|--------|
| **新增 CBA** | `sports` 已含 basketball`leagues` 表加一行 `CBA`,灌入 CBA 球队/球员/比赛即可,全部工具自动生效 |
| **新增足球** | `sports` 表加 `football``leagues` 加英超/西甲等;球员/球队表字段通用(位置、数据字段可增列) |
| **新增人物角色**(教练/经纪人/评论员/主持人/总经理/球探…) | `persons.role` 是自由字符串,新增角色直接入库即可 |
| **新增查询工具** | `tools.py` 加一个函数 + 注册进 `TOOLS`/`TOOL_HANDLERS` 即自动接入对话 |
| **向量库隔离** | Chroma 按集合名隔离(`nba_fan_knowledge_v1``cba_...`),互不影响 |
| **数据更新** | 修改 `seed_*.py``./start.sh seed --rebuild-vector` 一键重建 |
## 🧠 对话管线要点
1. **工具优先**:系统提示词强制「数据问题先查库」,8 个工具返回结构化 JSON
2. **思考模式兼容**DeepSeek 思考模型要求回传 `reasoning_content`,已处理
3. **文本工具调用兜底**:模型偶尔把工具调用写成正文,正则解析 + 未知工具名智能映射
4. **实体覆盖补全**:多实体问题(「约基奇和字母哥…」)自动拆词补查,杜绝漏数据
5. **多层兜底**:LLM 异常 → 关键词预检索注入;最终轮仍异常 → 工具结果摘要
6. **诚实原则**:查不到如实说明,常识补充与数据库数据明确区分
## 📊 数据规模(模拟数据,2025-26 赛季)
30 支球队 · 154 名球员(含绰号别名)· 54 场比赛(常规赛/季后赛/总决赛/夏季联赛)· 93 条技术统计 · 46 篇新闻/百科 · 38 位人物
> ⚠️ 数据为演示用模拟数据(2026 总决赛剧情:雷霆 4-2 凯尔特人,SGA FMVP),接入真实数据源时仅需替换 seed 数据。