# b-mind-ai **Repository Path**: Clark_Liu/b-mind-ai ## Basic Information - **Project Name**: b-mind-ai - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-06 - **Last Updated**: 2026-08-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # B-Mind AI · 哔哩学派 > 把 B 站的视频拆成一张能一步步走、走完能验证的知识地图——会了才算数 ## 项目简介 在 B 站学东西的人都逃不掉一个现象:**收藏 ≈ 看了**——收藏夹里的教程吃灰,真想学时不知道先看哪个;四十分钟的视频里,需要的只有那三分钟;看完一堆视频,还是不知道自己到底会没会 哔哩学派把 B 站的视频拆成知识点,排好顺序、补上前置依赖,变成一张能一步步走的知识地图。AI 只做导航、不做替代:不生成知识内容,不替视频说话,每个知识点都通向一条视频的具体时间戳,点开就跳回 UP 主讲到那里的那一秒。每个知识点学完要过 AI 出题验证,答对了进度才走——会了才算数,不靠感觉 学到一半随时追问:简单的当场答,值得展开的会在地图上长出补给支线,接入其他 UP 主的视频;同一个知识点有多种讲法时,画布上分叉出多视角对比。走完全程生成结课画像;学会的知识点变成"记忆点灯屋"里的一串灯,遗忘曲线让灯变暗,灯快灭了就提醒你回来复习 它不挑领域——编程、摄影、游戏、健身、备考,只要是"想在 B 站搞会一个东西",都能变成地图 --- ## 核心理念:KaleidoMind **KaleidoMind = Kaleidoscope(万花筒)+ Mind(心智)** 万花筒的秘密在于:筒里其实只有几片碎玻璃。它从不制造新的玻璃,却在每一次转动中,让同样的碎片落成一个完整、有序、只属于这一次转动的图案 B 站就是那个装满碎玻璃的筒。知识的碎片到处都是——一段讲透了指针的视频、三分钟的布光演示、一页拍下来的板书——但它们以"视频"为单位躺着:**内容的生产单位是视频,知识的消费单位却是知识点。** 碎片都在,图案不在。零基础的人看到的不是万花筒,是一地碎玻璃 **KaleidoMind,就是那个"转动"的动作。** 你说出"想学什么",AI 把 B 站的知识碎片重新排列:拆出知识点、排好顺序、补齐那些没人明说的隐性依赖,落成一张从起点通到终点的学习地图 这里有一个我们始终不越过的边界:**万花筒不造玻璃。** 碎片永远是 UP 主的创作——每个知识点都通向一条视频的具体时间戳,AI 不替视频说话,它只是转动的那只手。在用户和内容之间,AI 可以做替代层,也可以做导航层;我们选导航,因为图案的美,来自碎片本身 而万花筒还有一层更深的性质:**同样的碎片,每一次转动的图案都不一样。** 每个人的起点不同、追问不同、走出的支线不同——一百万人学同一门课,会转出一百万张不一样的地图。这不是生成的随机性,这是学习本来的样子 ### 核心设计原则 **原则一:先给全貌,再走细节** 出发之前,先看到整张图——包括所有隐性依赖已经被拍平的路径。你在起点就知道这条路是通的,不需要走到一半发现少了块地基再折返。迷茫的本质不是路难,是看不见路的全貌;**于无序中见秩序,于迷茫处锚脚步** **原则二:主路恒定,支线有度** 主干路线不随操作漂移——地图必须是可信的,今天和明天指向同一个终点。生长只发生在你主动追问时,而且 AI 会先做一次判断:一句话能说清的,当场答,不动地图;只有当追问指向一个值得系统展开的子主题,地图上才生长出一条补给支线,接入其他 UP 主的视频。同一个知识点存在多种讲法时,画布上会分叉出别的视角,把"别人讲到了、这条视频没覆盖"的增量标出来——但增量只展示、不再递归分叉。**转动是为了看清图案,不是为了转个不停。** 万花筒转得太快,看到的又是碎片了 **原则三:绿了才算会,刻度即正反馈** 看完 ≠ 学会。每个节点要过 AI 出题验证,答对了才变绿,进度才走。图案好不好看不重要,走不走得通才重要——**每一步皆有来路,每一站自有刻度。** 来路是 UP 主的创作,刻度是你自己挣的 **原则四:图案会散,所以有人守着** 万花筒最诚实的一点是:手一松,图案就散了——遗忘对知识做的正是这件事。所以走完地图不是终点:每个学会的知识点是一盏灯,遗忘曲线让灯从绿变暗,"记忆点灯屋"守着这串灯,哪盏快灭了就提醒你回来把它重新点亮。**转出图案只需要一次输入,守住图案需要一个不睡觉的同伴** 这个时代不缺碎片,缺的是转动。AI 最大的诱惑是替你看——总结好、压缩好、喂到嘴边,图案很美,但那是它的图案。KaleidoMind 想做的相反:**碎片还是那些碎片,创作还给创作者,转动交给 AI,而看的人、走的人、点亮每一盏灯的人,始终是你。** 万花筒的意义从来不在筒里,在举起它的那双眼睛 --- ## 技术架构 ``` ┌──────────────── 前端 apps/web (React + Vite) ────────────────┐ │ Landing / Thinking / Directions / GraphView │ │ Projects / ReviewDaemon(点灯屋) / DebugView │ │ Zustand · React Flow · TanStack Query · Tailwind │ │ │ api/client.ts │ └─────────────────────┼─────────────────────────────────────────┘ │ HTTP /api/v1/* ┌──────────────── 后端 apps/api (FastAPI) ─────────────────────┐ │ health / topics / maps / supply / ask / verify │ │ perspectives / snapshot / edit / share / img │ │ │ 缓存优先:命中返回,未命中生成 │ │ ┌──────────┴───────────┐ ┌──────────────────┐ │ │ │ 本地缓存 .cache/(JSON)│◀── 写回 ──── │ generators │ │ │ │ topics/maps/supply… │ │ B 站采集 + LLM 结构化│ │ │ └───────────────────────┘ └────────┬─────────┘ │ └────────────────────────────────────────────────────┼──────────┘ ┌─────────────────┴────────┐ │ bilibili-api-python │ │ OpenAI 兼容 LLM │ │ ffmpeg(视频帧截图) │ └───────────────────────────┘ ``` 后端用 `bilibili-api-python` 抓取 B 站视频,LLM 结构化为递归学习地图,按主题/方向存本地 `.cache/`。命中缓存秒开,未命中实时生成,`force` 参数触发重建。LLM 产出的 `video.bvid` 须落在本次抓取集合内,否则剥离——不编造视频;时间戳只能取自素材片段,AI 无法凭空指路。 | 层 | 技术 | |---|---| | 前端 | React 18 · TypeScript · Vite 5 · Zustand · TanStack Query · React Flow (@xyflow/react) · Tailwind CSS · framer-motion · canvas-confetti | | 后端 | Python · FastAPI · Uvicorn · bilibili-api-python · openai(兼容 SDK) · httpx · ffmpeg(板书截图) | | 数据 | 实时采集 + LLM 结构化 → `.cache/` JSON,缓存优先,支持 force 重建和前端编辑保存 | | 部署 | 前端 Vercel(vercel.json);后端任意 Python 平台(需配 .env) | ### 图谱 React Flow 渲染,确定性 mindmap 布局。合集居中,视频分列左右;点击角标展开/折叠其下的 clip 和 concept 子树。五类节点: | 类型 | 含义 | 角色 | |---|---|---| | `collection` | 课程合集 | 地图中心,每轮递归起点 | | `autoCollection` | AI 自动选的下一轮合集 | 难点延展出的新内容 | | `episode` | 单集 / 独立项目视频 | 合集拆出的子项 | | `clip` | AI 从视频总结的片段 | 关键学习点 | | `concept` | 重要知识点 | 可学习、可验证、可追问、可分叉多视角 | ### 学习闭环 点击 concept 弹出面板:学习目标、关键点、B 站视频锚点(可跳对应秒数)、板书截图。然后进入验证:`verify/challenge` 现场出题(problem 类题 / quiz 抽查),`verify/judge` 由 LLM 判分——参考答案不下发前端,判分时现推标准。代码类走前端预设片段比对,两条路互补。 --- ## 目录结构 ``` b-mind-ai/ ├── apps/ │ ├── web/ 前端 │ │ └── src/ │ │ ├── screens/ Thinking / Directions / GraphView / Projects / ReviewDaemon / DebugView │ │ ├── components/ Header / Hero / NodePanel / EditPreview / CompletionPortrait / … │ │ ├── graph/ React Flow 节点 + mindmap 布局 + 主题 │ │ ├── store.ts Zustand 状态机 │ │ ├── api/client.ts 唯一 API 入口 │ │ └── types.ts 数据契约 │ └── api/ │ ├── main.py FastAPI 入口(全部路由) │ ├── config.py 环境变量 │ ├── bili_client.py B 站 API 封装(搜索/合集/字幕/截图) │ ├── llm_client.py OpenAI 兼容客户端 │ ├── cache.py 文件缓存 + map_index │ ├── generators/ maps / directions / supply / ask / verify / perspectives / edit / streaming / validate │ ├── warmup.py 缓存预热 CLI │ ├── .env.example │ └── requirements.txt ├── docs/ │ └── data-collection.md 字段契约参考 ├── knowledge/packs/ 样例数据 ├── vercel.json └── README.md ``` --- ## 快速开始 ### 后端 ```bash cd apps/api pip install -r requirements.txt cp .env.example .env # 填入 OPENAI_API_KEY 与 BILI_SESSDATA python -m uvicorn main:app --port 8000 ``` `.env` 关键项(详见 [apps/api/.env.example](apps/api/.env.example)): - `OPENAI_API_KEY` / `OPENAI_BASE_URL` / `OPENAI_MODEL` — 任意 OpenAI 兼容 LLM - `BILI_SESSDATA`(可选 `BILI_JCT` / `BILI_BUVID3`)— 浏览器 Cookie 缺 key 时后端不崩溃,生成接口返回对应错误。板书截图功能依赖本机 `ffmpeg`(不在 PATH 时该接口返回错误,其余功能不受影响)。 预热缓存: ```bash python warmup.py "C++" "数据结构" # --force 强制重建 ``` ### 前端 ```bash cd apps/web npm install npm run dev # http://localhost:5173 ``` 默认请求 `localhost:8000`。后端不可用时页面报错(无 mock 兜底)。换地址设 `VITE_API_BASE_URL`。 --- ## API | 方法 | 路径 | 说明 | |---|---|---| | GET | `/api/v1/health` | 健康检查(key 状态 / B 站登录态 / 缓存量) | | GET | `/api/v1/topics?q=C++&force=` | 主题 → 方向卡片(缓存优先,force=1 重建) | | GET | `/api/v1/topics/stream?q=&force=` | 方向生成的流式版本 | | GET | `/api/v1/maps/{map_id}?force=` | 方向 → 递归学习地图 | | GET | `/api/v1/maps/{map_id}/stream?force=&seed_bvid=` | NDJSON 流,逐层推节点 | | PUT | `/api/v1/maps/{map_id}` | 保存编辑后的地图(写回缓存) | | POST | `/api/v1/maps/{map_id}/edit` | 自然语言编辑地图(AI 解析编辑意图) | | POST | `/api/v1/supply` | 追问 → 补给支线(`{nodeId, question, force}`) | | POST | `/api/v1/ask` | 追问智能分流(当场作答 / 建议开支线) | | POST | `/api/v1/verify/challenge` | 为知识点现场出验证题(problem / quiz) | | POST | `/api/v1/verify/judge` | LLM 判分 + 反馈 | | POST | `/api/v1/perspectives` | 多视角对比 + 增量知识点提取 | | GET | `/api/v1/snapshot?bvid=&sec=` | 视频帧截图(板书上画布,需 ffmpeg) | | POST | `/api/v1/share` | 学迹分享快照 | | GET | `/api/v1/img?url=` | B 站图片防盗链代理 | --- ## 数据管线 后端实时生成 → 写本地缓存: 1. `bili_client.py` — 搜索主题、拉合集/单集/字幕 2. `llm_client.py` — LLM 将视频组织为递归地图,撰写教学内容 3. `generators/streaming.py` — 视频按合集顺序、片段按时间排序,处理期间持续上报状态 4. `generators/validate.py` — bvid 校验,不在抓取集合内的剥离 5. `cache.py` — 按主题/地图存 JSON,维护 map_index,命中返回 三种调整方式:`force` 重建覆盖、图谱页内置编辑器改后 `PUT` 写回、或自然语言描述改动由 AI 解析执行(`/maps/{id}/edit`)。 --- ## 范围与后续 已落地: - 用户输入 → 意图分析 → 方向选择(流式) - 树图生成 + 全貌展示 + 知识点密度配置 - 节点学习面板(视频时间戳锚点 + 板书截图上画布) - AI 出题验证 + LLM 判分(代码类片段比对互补) - 追问智能分流 + 补给支线(跨视频检索) - 多视角对比 + 增量知识点(只读不递归) - 进度追踪 + 里程碑 + 结课画像 - 记忆点灯屋(遗忘曲线复习提醒,独立页面) - 学迹(学习轨迹一键生成分享图文) 后续方向:收藏夹自动延展成学习地图(睡前收藏,醒来成图)、同一张地图上的排行与结伴等社区玩法、智能视频切片。 时间戳/分段精度依赖 LLM 质量,可用内置编辑器微调。