Files
nba-fan-hub/README.md
T

8.6 KiB
Raw Blame History

🏀 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

🚀 快速开始

# 1. 灌数据(首次或数据更新后)
./start.sh seed              # 或 python3 seed.py --rebuild-vector

# 2. 启动
./start.sh start             # http://<IP>:16090
./start.sh status            # 查看状态

依赖:flaskrequestsopenclaw 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 已含 basketballleagues 表加一行 CBA,灌入 CBA 球队/球员/比赛即可,全部工具自动生效
新增足球 sports 表加 footballleagues 加英超/西甲等;球员/球队表字段通用(位置、数据字段可增列)
新增人物角色(教练/经纪人/评论员/主持人/总经理/球探…) persons.role 是自由字符串,新增角色直接入库即可
新增查询工具 tools.py 加一个函数 + 注册进 TOOLS/TOOL_HANDLERS 即自动接入对话
向量库隔离 Chroma 按集合名隔离(nba_fan_knowledge_v1cba_...),互不影响
数据更新 修改 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 数据。