清水河畔 · 本地知识工程 · 2026

河畔索引

让散在论坛里的经验,查得到,也对得上。

数据保存在本机。原文一律跳回原站。

界面结构示意,非实时截图

概览

经验一直都在。只是站内搜索只认标题,而真正有用的那句话,往往藏在第十四楼。

一套系统负责把楼层找出来,另一套负责把找到的内容变成选课时能核对的证据。同一站点上还长着两条 AI 对话:一条查本地索引,一条把问题编译成查询矩阵后去调官方接口。

393,815
条主题标题已入索引
titles_fts · 近 6 年口径
274,739
条楼层正文可全文检索
posts_fts · 逐层定位
24
个板块完成采集
单并发 · 断点续采

数据截至 2026 年 11 月 13 日,取自本地 SQLite 实测。

02   course-system/ · 选课情报系统

选课之前,看证据。

从原版培养方案出发,走到本学期分班、教师评价,再到自己的学分表。每条结论都标明来源层级,都能点回原始帖子或指南条目。

界面结构示意,非实时截图

01 / 起点

原版方案,直接点

培养方案 PDF 逐页保留原版式,课程代码是可点热区,点一下就能看到详情并加入工作区。解析器出的草稿要人工审核过才发布。

73 页原文 · 314 个课程锚点

02 / 口径

评价有先后,也有边界

指南优先,无指南才用河畔,只有两者都没有时才引用口碑。跨课程与口碑单独隔离,标注「非本课结论」;两源冲突会显式标出。

guide > hepan > cross / general

03 / 落点

工作区算得清

按分类选课、选教师,实时汇总学分进度与上课时间;冲突直接指到星期和节次,每门课带代表评价与来源链接。

学分统计 · 时间冲突 · 证据回链

275
位教师建档
347
条教师-课程结论
549
条分层证据
74
个本学期开课班

03   web/ · 本地问答 /ask

问一句,从楼层里找依据。

不是接一个模型就开始答。一句话进来,先拆出实体和检索词,再依次走本地楼层、标题层和按需抓取;材料不够就少说,引用对不上就删掉。

界面结构示意,非实时截图

01 / 拆问题

先拆问题,再检索

模型抽人名、课程名等实体和检索词,抽不出来就退回规则。问某位老师时,标题和正文都没提到他的材料直接丢掉,不让同名的人凑数。

实体门 · 规则兜底 · 查询改写

02 / 找材料

标题层,按需抓

混合模式先在 35 万余条标题里召回,模型挑出最可能有答案的几条,再单并发抓正文,抓到就缓存。强度分三档,硬上限 12 帖 / 24 次请求。

light 20/3 · standard 40/5 · deep 80/10

03 / 对证

答案逐条对得上

SSE 流式输出,思考过程单独展开,不混进正文。生成后校验 [n] 有没有越界,越界直接剔除,零引用标低置信;材料确实不相关就直说。

引用后校验 · 低置信标记 · 可拒答

这条链路只用本机索引,代价是最新发生的事查不到。同一个站点下还有另一条路径:不查本地库,把问题编译成可编辑的查询矩阵,人工确认后才去调论坛官方接口。

04   prototype/ · 实时检索 /live

先给你看,
要查什么。

另一条 AI 对话,反过来做。一句话先编译成一张可编辑的查询矩阵,人确认过才执行;之后每条查询、每次等待、每篇正文都在屏幕上,答案要带日期和楼层。

界面结构示意,非实时截图;日期与条目为示例

01 / 先编译

矩阵摆在你面前

模型把一句话拆成 3–4 行检索面、每行至多 3 条短查询,上限 9 条。格子可以改、可以加组,去重并强制留一条宽召回。确认之前,一个请求都不会发出去。

每格 ≤ 4 词 · 权重高 / 中 / 低 · 规则兜底

02 / 知道今天

旧帖不能当新闻

运行时按 UTC+8 取当天,问题涉及时效就标出门槛,规则判定优先、模型不能放宽。材料分当前 / 近期 / 历史 / 未标注,历史降权;没有新材料的,回答开头必须直说。

今年 / 现在 → 365 天 · 其他 → 730 天

03 / 全程可见

连等待都写得清楚

SSE 逐条播报查询命中、配额倒计时、合并去重与正文抓取。搜索 10 次 / 60 秒、两次间隔至少 6 秒,抓正文单并发,且和采集器互斥;引用能落到具体楼层。

top 5 × 1 页正文 · 内存缓存 30 分钟

校园词表是离线挖出来的:从 393,815 条标题里用纯规则筛出 1,794 条(教师 551 / 课程 517 / 黑话 589 / 地点 113 / 板块 13 / 组织 11)和 33 组别名,例如「数据结构 → 数构 / DS」。一次 9 条查询的实测约 59.4 秒、54 条候选;抓 5 篇正文得到 18 段证据、534 字,引用可定位到第 1 / 2 / 9 楼。官网白名单检索目前仍停在方案阶段,尚未接入运行链路。

05   一条链路

一套找得到,
一套用得上。

前半段是检索问题,后半段是判断问题。论坛楼层被抽成带出处的证据,才进入教师评价与选课工作区;本地问答读的是同一批材料。实时检索是旁路,不写回索引。

web/ 河畔索引 · 采集与检索
course-system/ 选课情报 · 判定与使用
01

采集

单并发、限速、断点续采,主楼与回复都写进同一张楼层表。

02

索引

FTS5 全文、本地向量、标题索引,每 90 秒增量同步。

03

检索 / 问答

三路召回融合,答案逐条引用,可跳回原站楼层。

04

楼层证据

保留帖子标题、楼层号、正文片段与原帖链接。

05

评价结论

按指南 / 河畔 / 口碑分层聚合,冲突与非本课结论单列。

06

选课工作区

学分、时间冲突、代表评价,点开就是原始来源。

目前有 327 条来自河畔的楼层证据进入评价系统,占 549 条证据的 59.6%。另外 138 条来自选课指南,其余为跨课程与口碑参考。

06   技术规格

底下是什么。

主体是两套独立工程,另有一条实时链路挂在同一个站点下。主站与选课系统全程本机运行;实时检索会调用论坛官方接口,需要账号和网络,且调用前由人确认矩阵。

项目河畔索引 · web/选课情报系统 · course-system/
前端
原生 HTML / CSS / JS,单页应用
Vue 3 · TypeScript · Vite · Pinia · Vue Router
服务端
Python 标准库 http.server,SSE 流式输出
FastAPI · SQLAlchemy 2 · Pydantic v2
存储
SQLite + FTS5 + sqlite-vec ANN,主库约 4.3 GB
SQLite(WAL),方案 / 学期 / 评价三层分离
检索
BM25 · BGE 向量 · 标题向量 · RRF 融合
结构化查询:方案树、开课班、证据分层
本地问答
实体规划 · 混合模式按需抓取 · SSE 流式与思考过程 · 引用后校验
不设对话入口,结论按来源分层聚合
本地模型
bge-base-zh-v1.5 嵌入,向量落盘 fp16
规则聚合,不调用生成模型
登录
邀请码 + 本地会话,仅监听 127.0.0.1:8777
邀请码 + 自填姓名,HttpOnly Cookie 会话
部署
本机运行,不对外开端口
Docker Compose(:8000 / :8080)+ Nginx
数据处理
采集、清洗、嵌入均在本地完成
PDF / DOCX / XLSX / MD 解析后人工审核发布

还有一条实时链路 · prototype/

项目实时检索原型 · /live
形态
独立原型,挂在主站 /live 下复用登录会话;单独运行默认 127.0.0.1:8899
服务端
Python 标准库 http.server + SSE,接口 /api/plan · /api/run · /api/status
检索接口
论坛 Mobcent 官方搜索:只匹配标题、空格为 AND、searchid 翻页、500 条截断
意图与时效
模型生成可编辑查询矩阵,规则兜底;离线词表 1,794 条 / 33 组别名;UTC+8 日期、四档新鲜度、回答门禁
节流与账号
10 次 / 60 秒,最小间隔 6 秒;与采集器互斥;token 只存内存;正文缓存为内存 TTL 30 分钟
数据边界
不写回本地索引,结果只留在当次会话。官网白名单检索仍在方案阶段,尚未接入

两条对话链路的模型分别由 web/llm.local.json 与 prototype/llm.local.json 配置。主站未配置时只列依据、不生成回答;实时检索未配置时退回抽取式回答。配置后会把检索到的楼层片段送给模型,这一步由使用者自己决定。页面中的界面图形为结构示意,数据条目取自本地数据库或实测记录。

07   三条底线

宁可留白。

01

数据留在本机

采集、清洗、索引、嵌入都在本地完成,主站只监听回环地址。实时检索是唯一会走外部接口的一环:确认矩阵后才发关键词,楼层片段是否交给模型由使用者决定。

02

不镜像原文

库里只存检索所需的文本与定位信息。要看原帖,一律跳回 bbs.uestc.edu.cn 对应的楼层。

03

没有依据就说没有

引用要能点开,结论要标明来源层级,旧材料只作历史参考。材料不足时写清不能确认的部分,不补材料之外的事实。