如何更好地用AI搜题?CPGraph:超细粒度题目检索
Raylan0228 · · 科技·工程
CPGraph 是一个以构建编程竞赛知识图谱并在其上进行检索为核心的项目。可以简单理解成,CPGraph 就是一个连接 AI 大模型和 OI 题库的桥梁。使用的时候就像 DeepSeek / 豆包官网一样直接问问题就行。
CPGraph 能做些什么?
talk is cheap,这里是一些实战截图(以 Cherry Studio 客户端,DeepSeek-v4-pro 为例,使用CPGraph云端MCP)
图片较大,可能需要稍微加载一会
如果你是 OIer / ACMer:
:::info[给我半平面交的题单] ::: :::info[有没有使用了主席树维护逆序对的题目?] :::
如果你是出题人:
:::info[给我一些比较新颖的博弈论题目]
:::
:::info[帮我仔细地查重:这是一道交互题。有一个长度为
可以看到,CPGraph 是一个以题目检索作为核心任务的项目。同时,也可以完成包括但不限于知识点梳理,Trick 总结,题目查重等任务。
也许有人会问:现在的大语言模型越来越强,为什么我还需要你的 CPGraph?这些任务直接交给 DeepSeek / GPT 不是一样能完成吗?
还真的完不成!就以刚刚的题目查重为例,如果不接入 CPGraph,即便开启了网络搜索也很难找到原题 P14274。因为 LLM 的世界知识根本不包含,或者是“遗忘”了这些题目。CPGraph 就相当于 LLM 的一个外置大脑,LLM 可以利用它检索题目,大大提高了像查重任务的可靠性。
快速开始
如果你希望练习时多一种搜题途径,或者更好地整理算法知识,不妨试试访问 CPGraph 官网。
如果你对 CPGraph 的源码和具体实现感兴趣,可以访问 GitHub 链接,还有技术文档。
下面是一些技术杂谈,应该大部分都比较易懂。因为绝大部分琐碎的工程细节本文都不涉及,如果你需要更具体的如何提取知识三元组和实体对齐,MCP的实现等可以参考 GitHub 和技术文档。
一些关键概念解释(由 DeepSeekV4 生成)
- 知识图谱
一种用“图”来组织知识的方式。你可以把它想象成一张巨大的关系网,每个“点”是一样东西或一个概念,每条“线”代表它们之间有什么关系。 - 实体
图中的“点”。可以是一个具体事物(比如某个人、某道题),也可以是一个抽象概念(比如一个算法)。 - 关系
图中连接“点”的“边”,用来描述实体之间有什么联系,比如“包含”“属于”“被用于”等。 - 知识三元组
知识图谱里最小的知识单元,形式是(实体,关系,实体),例如(动态规划,包含,背包 DP)。海量三元组拼在一起,就编织成了整个知识网络。 - MCP
一种标准协议,让 AI 大模型能够像一个“万能接口”一样,统一地连接和使用外部工具或数据源(比如数据库、搜索引擎),实现自动化的信息获取和操作。 - RAG
检索增强生成。一种让大模型在回答问题之前,先去外部资料库里“找一找”相关信息,再根据找到的资料来组织答案的技术。好处是回答有据可依,能有效减少“胡乱编造”。 - 文本嵌入 把文字变成一串稠密的数字(向量)。“稠密”的意思是,每个数字位置都被实实在在的语义信息填满,没有浪费的空位。 意思越近的词,这串数字组成的“坐标”在空间中就挨得越近。
为什么选择知识图谱?
知识图谱的形式天然适合组织题目。举个例子就是洛谷题库的标签系统。很容易发现,某些标签存在“父子关系”,就比如背包 DP是动态规划的一个子分支,01 背包又是背包 DP的一个子分支。放在知识图谱里,这种关系维护起来就很自然,类似动态规划 --> 背包 DP --> 01 背包 --> 某个具体的题目。
同时,维护一个庞大的,静态的标签系统是很困难的。因为静态标签系统是一个自顶向下的设计。还是拿洛谷的题目标签举例,每个标签有一个固定的数字 id,比如后缀自动机 SAM的 id 是 101。这些 id 本身是写死在数据库的,如果想增加一个标签,就要先注册一个id,然后去题库里找到所有应该被标记的题目,打上标签。这个过程需要遍历以往的所有题目,而且如果已有标签非常多,增加新题目也会更困难。
而图谱构建是一个动态的,自底向上的过程。每道题会使用 LLM 提取实体和关系。其中“实体”的作用类似于标签,但是这些实体并不是一成不变的,它可能会在图谱构建过程中被删除,清洗或者和其他实体合并。对比传统标签数据库,这种方式粒度更细,但噪声也更多。
有关图谱构建的流程,其实比较公式,就是文本切块后用 LLM 提取知识三元组,然后去把含义相同的实体合并。可以直接去 GitHub 翻代码或者参考 LightRAG。我认为重点是去噪部分。
CPGraph 是如何“去噪”的
从图谱本身下手
可以说优化知识图谱就是一个无底洞,因此我暂时只停留在了 OpenIE 后的 AI 过滤噪声。截止到今天,还没有谁敢说图谱构建可以完全自动化。无限地投入人力去完善图谱,仍然是一个必不可少的环节。只不过我做不到,所以 CPGraph 的图谱可能质量“偏低”。不过该有的基础清洗还是有的。
从检索工具下手
检索方法无非就是嵌入向量检索,关键词 Tag 黑白名单筛选,BM25,模式匹配这些。CPGraph 使用了一个工程上比较经典的方案:多路召回。就是把嵌入向量检索,BM25 ,图谱检索每一种都检索一次,最后合并去重。我简单测试了一下,结论稍微有一点反常识: BM25 返回的内容召回率最高,其次是图谱检索,最差的是嵌入检索。
为什么 BM25 的表现最好?
BM25 是一种稀疏向量检索,可以简单理解成“文本匹配”,如果查询 线段树,召回的就是字面上包含(这只是一个简化理解,事实上 BM25 会更复杂)线段树 的文本,比如 线段树是一种数据结构。但是 Segment Tree 是一种数据结构 就不能召回。
文本嵌入检索是一种稠密向量检索,优点是可以处理同义词。查询 树链剖分时,重链剖分、实链剖分 也会被召回。但是换一个角度看,这样也更容易混入更多噪声。查询 重链剖分,有关 实链剖分 的内容也会混进来。
BM25 就不会有这个问题,因为精确的文本匹配噪声更少,在同样的 topk 下就能返回更多相关的文本,召回率更高。对比嵌入检索,同义词和近义词因为在嵌入空间上很接近,导致返回中会夹杂大量似是而非,没有用的噪声数据。所以实际的表现并不够好。
图谱检索则可以看成嵌入检索的增强版。先通过小规模的嵌入检索在图谱上找到几个“起点”,然后从起点开始扩展。这样既利用了嵌入检索处理同义词的能力,也通过图谱的结构化信息减少了噪声。
与现有项目的比较
LightRAG:我入门知识图谱的白月光,小巧精致的实验室级项目,曾几何时,CPGraph 也只是试图在 LightRAG 基础上魔改。不过小巧的坏处就在这了:魔改越深,LightRAG 带来的限制就越多,逐渐不再能满足我的需求。与其魔改为什么不自己(用AI)从头写?
GraphRAG:微软的超高 star 企业级知识图谱项目,准确来说和 LightRAG 一样,都是图谱增强式的 RAG。性能很强,核心问题是图谱的构建比较复杂,成本极高。而且魔改起来也有点困难。
KAG:企业级项目,特点是架构有意限制了 OpenIE 的使用,同时支持逻辑形式推理。问题是,KAG 本意是给企业做数据聚合和查询用的,OI 知识图谱是非格式化的知识居多,也不大需要形式推理。
原题机和 CPRet 都是题目检索项目,CPGraph 虽然也主攻题目检索,但严格说和原题机、CPRet 并不在同一个垂直方向上。CPGraph 主要擅长基于知识点的题目检索,而非基于题意。当然这里只是说相对擅长的部分,你也可以试着在 CPRet 检索容斥原理,同样 CPGraph 也能胜任一般的题意检索任务。
最后再说说 CPGraph
对比其他知识图谱项目,在 OI 语境下重新平衡了图谱构建的性能,质量,和开销。平均只需要数秒提取一份文档或者题目;统一进行实体的清理和对齐,噪声相对更少;成本大概控制在每插入 100 题 1 到 2 元。
对比其他题目检索项目,CPGraph 不止处理题目,还顺带提取了大量 OI 知识点共同补全知识图谱。这赋予了 CPGraph 一项独一无二的检索能力:超细粒度的题目检索。举个例子,假如我需要有关超现实数(Surreal Numbers)的题目(这是一个有关博弈论的冷门知识点,OIwiki 暂未收录),可以说如果没有 CPGraph,除了直接向万能的群友求助或者翻博客,很难找到更便捷的检索方法了。但是使用 CPGraph,你就只需要对 LLM 说:“给我超现实数的题目”,就可以直接找到这两道题:P4225 [清华集训 2017] 福若格斯、P14017 [ICPC 2024 Nanjing R] 棋字井。
一些缺点:
- 题目数量较少。对比一下,原题机的题目数量是 11 万,CPRet 是 7 万,CPGraph 只有 3 万。主要原因是我的题目处理流程需要每道题目有对应的题解,因此像 QOJ 这种不提供题解区的题库比较棘手。而且现在项目还是在不断测试和改进,我也有意把题目暂时控制在总共三万题这个不大不小的范围。
- 缺少题目难度划分。目前还不支持类似“提供一些简单题”,“有什么思维好题”这种查询。不过关于题目难度的 LLM 标注已经在更新日程上了,再等等...
- 其他有待发现的问题
写在后面
首先我要说明,CPGraph 不是一个稳定的项目。一方面是因为我的水平有限,二是精力和资金限制。种种原因下,我只能选择做出这样一个“粗糙”的版本。很多技术细节因为篇幅原因没有展开,另外一些我觉得比较有趣的话题,比如如何靠模型蒸馏,把文本嵌入模型内存占用压缩800%,或者是如何租服务器搭建网站前后端,这些以后再说。
我可以保证网站至少能持续运行半年,但是后续的网站和项目更新就随缘了,因此有兴趣的可以自行 fork。
PS:两个月前我就在等 v4,现在等到的却是百万 token 24 块钱的 V4,降价之前是真的用不起了
PS:v4 大降价了,ds 伟大,拜谢 ds。有条件的还是建议自行买 API 结合 MCP 使用
更多信息请访问 cpgraph.top 或 GitHub 仓库。