文章总结: 本文设计并实现了一个面向大规模数学题库的公式增强型相似题检索系统,通过LaTeX公式规范化、语义向量召回与规则重排的混合检索框架,实现对原题、改写题、同结构题和弱相关题的分层识别。系统强调数学题目的结构性特征,结合公式骨架、领域信号和多路召回策略,相比单纯依赖嵌入向量的方案,能更准确处理公式密集型与文字型题目,并提供可解释的匹配结果与评分。 综合评分: 85 文章分类: 技术标准,解决方案,数据安全,应用安全,安全开发
数学题库相似题检索系统
原创
Uysieot Uysieot
简单读写
2026年5月3日 15:18 四川
在小说阅读器读本章
去阅读
面向大规模数学题库的公式增强型相似题检索系统设计与实现
基于 LaTeX 规范化、语义向量召回与规则重排的混合检索方案
数学题识别项目 · 技术论文稿
版本:1.0 日期:2026 年 5 月
摘要
本文围绕一个包含十万级数学题目的相似题检索系统展开,提出一种面向数学题库的混合检索框架。该框架以原始题面保真为前提,通过 LaTeX 公式抽取、公式规范化、变量与数值骨架化、伪公式过滤、语义向量召回、关键词召回、公式结构召回以及规则化重排,实现对“原题”“改写题”“同结构题”和“弱相关题”的分层识别。与单纯依赖 embedding 的方案相比,本文方案强调数学题目的结构性:公式、条件、目标、题型信号和领域信号均参与检索过程。在实践中,系统从早期的公式抽取脚本逐步演化到支持 GPU 向量化、批量 JSONL 入库、中文化输出、HTML 报告生成的完整命令行工具。本文详细描述了数据模型、公式处理、弱公式降权、多路召回、融合评分、错误案例分析和后续优化方向。
关键词:数学题库;相似题检索;LaTeX 公式;向量检索;规则重排;多路召回;图论信号;函数方程信号
目录
1 引言
2 问题定义与系统目标
3 数据表示与规范化模型
4 LaTeX 公式处理与弱公式过滤
5 多路召回框架:哈希、公式、语义与关键词
6 融合评分与重排策略
7 领域信号设计:函数同余、余数优化与图论路径
8 系统工程实现与命令行工作流
9 实验观察与典型案例分析
10 局限性与后续优化路线
11 结论
附录 A 数据字段建议
附录 B 常用命令
1 引言
数学题库检索不同于普通文本检索。普通问答或文档搜索通常以自然语言语义为核心,而数学题目同时包含自然语言、符号公式、变量关系、题型约束和隐含结构。两个题目可能文字完全不同,却因为公式骨架一致而属于同结构题;也可能文字模板高度相似,却因为公式、条件或目标不同而并不相似。
本项目的实际需求是:在一个由 JSONL 文件组成的大规模题库中,输入一道新题,快速找出原题、改写题、换变量或换数字的同结构题,以及语义上相关的题目。题库中的题目大多只有题面,没有标准解答。因此,系统不能依赖解题过程或答案匹配,而必须从题面本身构造可比较的多层表示。
本文提出的方案不是单一的“向量入库”系统,而是一个混合检索系统。它将题目拆成原文、规范化文本、公式列表、公式骨架、关键词集合、领域信号和向量表示,并在搜索时融合多路候选。实践表明,这种设计能够同时兼顾公式型题目和文字型图论、组合题,减少纯语义模型带来的假阳性。
表 1 相似题检索目标分层
| | | | | — | — | — | | 检索目标 | 典型表现 | 主要识别依据 | | 原题 | 题面完全相同或仅格式不同 | raw_hash、normalized_hash、文本近似度 | | 改写题 | 措辞变化但题意一致 | 语义向量、关键词重合、强领域信号 | | 同结构题 | 变量或数字变化,公式结构一致 | formula_skeleton、条件/目标骨架 | | 弱相关题 | 同题型或同主题,但结构不同 | 语义向量、少量领域信号 |
2 问题定义与系统目标
2.1 输入与输出
系统输入包括两类:一类是题库中的结构化 JSONL 记录,通常包含 id 与 statement_display 字段;另一类是用户在命令行或接口中输入的新题文本。输出是按综合相似度排序的 Top K 结果,每个结果包含题目 UID、原始 ID、来源文件、匹配类型、综合得分、向量分、规则分、数学信号、融合说明以及可选的 HTML 报告。
在本项目中,题目记录来自多个分片 JSONL 文件。为避免不同文件中 id 冲突,系统在处理阶段生成全局唯一的 uid,格式为“文件名::原始 id”。例如 ap_problem_statement.part0010.jsonl::4502。
2.2 约束条件
系统设计受以下约束影响。第一,题目大多没有解析,因此不能依赖解法步骤、方法标签或答案文本。第二,题面中公式已经以 LaTeX 形式存在,公式 OCR 不是主要难点,重点转向公式规范化与骨架化。第三,题库中既有公式密集型题,也有文字密集型题。第四,英文题较多,因此系统需要在英文原文上完成相似检索,同时将命令行与报告界面尽量中文化。
2.3 设计目标
系统的第一目标是可用性:能在本地目录中批量处理题目、建立索引,并通过命令行检索。第二目标是鲁棒性:对于公式、文字、图论、函数方程等不同类型题目均能给出合理排序。第三目标是可解释性:每条结果不只给出一个黑箱分数,还应展示向量分、规则分、公式分、文本分和领域信号,便于人工判断。
3 数据表示与规范化模型
3.1 三层数据思想
系统采用三层数据思想:原始层、规范层和索引层。原始层完整保留 raw_text 与 statement_display,任何清洗、替换和公式处理都不能覆盖原始数据。规范层包括 normalized_text、search_text、formulas、math_signals 等字段。索引层则包括 text_index、formula_exact_index、formula_variable_index、formula_skeleton_index、condition_formula_index 和 target_formula_index。
图 1 系统处理流程概览
| | | — | | 原始 JSONL -> 文本清洗 -> LaTeX 公式抽取 -> 公式规范化与骨架化 -> 伪公式过滤 -> 生成索引字段 -> embedding 向量化 -> 多路召回与重排 |
3.2 核心字段
表 2 处理后题目记录的核心字段
| | | | | — | — | — | | 字段 | 含义 | 用途 | | raw_text | 原始题面,不做破坏性修改 | 追溯、精确匹配、人工核验 | | normalized_text | 清洗后的展示文本 | 近似原题判断、展示 | | search_text | 公式用占位符替换后的文本 | 语义向量、关键词召回 | | formulas | 题目中的 LaTeX 公式对象列表 | 公式匹配、结构比较 | | index_fields | 多种索引文本 | 向量、关键词和公式召回 | | hash | 多粒度哈希 | 原题、规范题、公式集合快速判断 | | math_signals | 题型与领域信号 | 重排降权、强信号加权 |
3.3 UID 与来源管理
大规模题库通常以多个分片存储,且不同文件中可能复用同一个整数 id。为避免索引冲突,系统将 source_file 与 source_id 组合为 uid。检索结果中同时保留 uid、source_id 和 source_file,使前端页面可以直接定位到原始题库记录。
4 LaTeX 公式处理与弱公式过滤
4.1 公式抽取
题目中的公式主要由美元符号、括号式 LaTeX 环境和行间公式环境包围。系统在处理阶段记录每个公式的原始片段、规范 LaTeX、位置、变量、数字、结构特征、角色和哈希。角色包括 condition、target 和 unknown。由于很多题目没有明确的“求证/求”分割,角色判断主要依赖公式在题面中的位置和前后关键词。
4.2 公式规范化
公式规范化不是完整的数学等价证明,而是工程上的写法统一。系统将常见差异统一为可比较形式,例如 \geq 与 \ge、\leq 与 \le、x^{2} 与 x^2、隐式乘法 ab 与 a*b、\dfrac 与 \frac 等。规范化后的公式用于 exact 匹配;变量骨架用于换变量匹配;数字骨架用于换数字同结构匹配。
表 3 公式多版本表示
| | | | | — | — | — | | 版本 | 示例 | 用途 | | canonical | a+b=3 | 判断公式是否基本相同 | | variable_skeleton | VAR1+VAR2=3 | 判断是否仅变量名不同 | | number_skeleton | VAR1+VAR2=NUM | 判断是否数字变化但结构相同 |
4.3 弱公式问题
实践中发现,题目中并非所有 LaTeX 都是有效数学结构。例如 $A$、$B$、$(i)$、$(ii)$、$\emph{path}$、$\text{…}$、以及 n>=3 这类简单范围条件,虽然是 LaTeX 片段,但不能作为强公式相似依据。若不加过滤,大量题目会因为共享 VAR>=NUM 之类骨架而被错误判定为 same_formula_skeleton。
因此,从 v7 开始系统引入弱公式过滤。弱公式仍可保留在原始题面中,但不触发强公式哈希、不参与公式支持加分,也不会作为 hash_bump 的依据。该策略显著改善了文字型图论题和组合题的排序稳定性。
图 2 弱公式与强公式示例
| | | — | | 弱公式示例: $A$, $B$, $F$ $(i)$, $(ii)$, $(iii)$ $\emph{path}$, $\emph{long path}$ $n \geq 3$, $k \geq 0$ 强公式示例: f(ab)=f(a)f(b) f(m+n)\equiv f(m)\pmod n \sum_{j=1}^{m} ((a_j+k)\pmod n) a_{n+1}=2a_n+1 |
5 多路召回框架:哈希、公式、语义与关键词
5.1 为什么不能只靠向量
向量模型擅长处理“Find all…”与“Determine all…”之类的自然语言改写,但对数学题而言,语义相似不等于结构相似。许多函数题都包含 function f、positive integer、prove that 等模板词,embedding 容易给出较高相似度;但如果缺少核心公式条件,实际并不相似。因此,向量召回只应作为候选来源之一,而不应单独决定排序。
5.2 召回通道
表 4 多路召回通道
| | | | | — | — | — | | 召回通道 | 候选来源 | 适合场景 | | 哈希召回 | raw_hash、normalized_hash、公式哈希 | 原题、格式变化题 | | 向量召回 | semantic embedding | 英文改写、语义相似题 | | 公式召回 | 公式 exact、变量骨架、数字骨架 | 代数、函数、数列、公式密集题 | | 关键词召回 | token overlap / lexical recall | 图论、组合、定义型文字题 | | 领域信号召回 | math_signals overlap | 函数同余、路径、余数优化等专项题 |
5.3 关键词召回的重要性
在图论城市航班题中,题面关键并非公式,而是 cities、flights、long path、short path、no cities in common、number of flights 等短语。早期版本仅依赖向量与公式召回,导致这类题即使已经入库,也可能无法进入候选集。v6 之后加入 lexical recall 后,原题能够稳定召回;v7 又通过弱公式降权,避免简单公式骨架干扰排序。
6 融合评分与重排策略
6.1 分数组成
系统最终分数由向量分、规则分、文本重合分、公式精确分、变量骨架分、数字骨架分、条件/目标分、领域信号分和哈希奖励共同构成。不同题型的权重并不完全一致:公式密集题更看重公式,文字型图论题更看重关键词与图论信号,函数同余题更看重 multiplicative_function_eq、mod_operator、target_power_form 等信号。
图 3 综合评分抽象形式
| | | — | | 综合分 = 融合函数( vector_score, rule_score, text_score, formula_exact_score, formula_skeleton_score, condition_target_score, signal_score, hash_bonus, penalty_terms ) |
6.2 匹配类型
表 5 检索结果类型说明
| | | | | — | — | — | | 类型 | 中文含义 | 解释 | | original_exact | 原题精确命中 | 原文或哈希完全一致 | | near_original_rewrite | 原题改写 | 语义和关键信号均强,文本存在改写 | | same_formula_skeleton | 公式骨架相同 | 核心公式结构高度一致 | | semantic_similar | 语义相似 | 向量和文本较接近,但结构支持有限 | | related_or_weak | 弱相关 | 同主题或同领域,但缺少核心结构 | | signal_mismatch_weak | 信号不匹配弱相关 | 有表面相似,但关键领域信号缺失 |
6.3 降权策略
系统采用若干降权策略避免误匹配。若 query 存在同余、乘法函数、幂函数目标,而候选缺失这些核心信号,则触发 signal_penalty。若 query 是图论长短路径问题,而候选缺少 long_short_path 或 disjoint_paths,也会降权。若候选只是共享 n>=NUM 或单变量公式,则不能触发强公式加分。
7 领域信号设计:函数同余、余数优化与图论路径
7.1 函数同余信号
函数同余类题目容易出现高语义假阳性。很多题都包含 f、positive integer、mod、prove 等词,但真正决定相似性的通常是 f(ab)=f(a)f(b)、f(m+n)≡f(m) mod n、not identically zero、f(n)=n^k 等结构。系统将这些特征抽取为 math_signals,并在重排阶段作为强约束。
表 6 函数同余类信号
| | | | | — | — | — | | 信号 | 触发模式 | 作用 | | has_congruence | \equiv、mod、divides 等 | 识别同余类问题 | | has_multiplicative_function_eq | f(ab)=f(a)f(b) 或类似结构 | 识别乘法函数 | | has_nonzero_function | not identically zero | 区分零函数类题目 | | target_power_form | f(n)=n^k 或幂函数结论 | 识别幂形式目标 |
7.2 余数优化信号
对于包含 a mod n、remainder、max-min、sum over index、shifted mod expression 的题目,系统需要区分“泛同余题”和“余数优化题”。仅有 mod operator 并不意味着相似;若缺少 max/min、(a_j+k) mod n、sum_j 等结构,应降低排序。该方向仍属于后续增强重点。
7.3 图论路径信号
图论文字题往往公式很少,或公式主要是变量占位。系统为城市航班与路径类题增加了 has_path_structure、has_long_short_path、has_disjoint_paths、has_count_edges_target 等信号。以“long path / short path / no cities in common / number of flights”为核心的题目,在 v7 后能够被稳定识别为强相似或原题改写。
8 系统工程实现与命令行工作流
8.1 模块结构
当前系统以单个 Python 命令行工具为核心,包含 process-dir、stats、build、search 等子命令。process-dir 负责批量处理 split_jsonl 目录,build 负责加载 processed_jsonl 并生成向量索引,search 负责 query 处理、多路召回、融合重排和报告输出。
图 4 项目目录结构建议
| | | — | | math_question_search_starter_v8_1/ src/ math_search_pipeline_v8.py enhanced_question_normalizer_v2.py requirements.txt README.md 数据目录示例: split_jsonl/ 原始题库 JSONL processed_jsonl_v8/ 处理后 JSONL index/ap_all_v8_gpu/ 本地向量与记录索引 reports/last_search.html HTML 搜索报告 |
8.2 处理与建库
图 5 批量处理与 GPU 建库命令
| | | — | | python src\math_search_pipeline_v8.py process-dir ^ –input-dir “E:\数学\题目搜索\split_jsonl” ^ –output-dir “E:\数学\题目搜索\processed_jsonl_v8” python src\math_search_pipeline_v8.py build ^ –processed-dir “E:\数学\题目搜索\processed_jsonl_v8” ^ –index-dir “E:\数学\题目搜索\index p_all_v8_gpu” ^ –device cuda ^ –batch-size 128 ^ –fp16 |
8.3 搜索与 HTML 报告
中文版工具在搜索结果中输出中文字段,并支持通过 –html-report 生成报告页面。报告包含查询题、Top 10 结果、综合分、匹配等级、数学信号和分数明细,便于保存、复盘与人工评估。
图 6 搜索并生成 HTML 报告命令
| | | — | | python src\math_search_pipeline_v8.py search ^ –index-dir “E:\数学\题目搜索\index p_all_v8_gpu” ^ –query “…题面文本…” ^ –device cuda ^ –fp16 ^ –topk 10 ^ –html-report “E:\数学\题目搜索 eports\last_search.html” |
9 实验观察与典型案例分析
9.1 正整数表格题
在早期测试中,查询“Find all positive integers n such that the n x n table can be filled with 1,2,-3 …”时,系统能够将原题排在第一。引入向量后,改写句 “Find all…” 与原句 “Determine all…” 的相似度显著提升;同时,通过公式和规则分避免将所有“positive integers”模板题误判为强相似。
9.2 函数同余题
对于包含 f:N*->Z、f(ab)=f(a)f(b)、f(m+n)≡f(m) mod n、f(n)=n^k 的题目,系统 v5 引入函数同余信号后,能够把普通函数同余题降为弱相关。实验中,Top 5 候选大多只有 congruence 与 function_equation,而缺少 multiplicative_function_eq 与 target_power_form,因此合理地被标为 related_or_weak。
9.3 城市航班长短路径题
城市航班题暴露了两个问题:一是原题虽在索引中,但纯向量候选未必召回;二是题面中 $A$、$B$、$\emph{path}$ 等伪公式过多,导致公式骨架干扰排序。v6 加入关键词召回,v7 加入弱公式降权和图论路径信号后,原题改写能稳定排第一,且相关结果中 disjoint cycles、无公共顶点路径等弱相关题被合理排在后面。
表 7 系统版本演进
| | | | | — | — | — | | 版本 | 主要问题 | 修正方向 | | v1-v2 | 仅规则或文本相似,改写题分数偏低 | 加入 SequenceMatcher 与文本近似评分 | | v3-v4 | 批量入库与 GPU 加速需求 | 支持目录处理、CUDA、FP16 | | v5 | 函数同余类假阳性 | 加入 math_signals 与 signal penalty | | v6 | 文字型图论题召回不足 | 加入 lexical recall 与伪公式过滤 | | v7 | 弱公式 skeleton 过强 | 弱公式降权、hash_bump 收紧、图论信号 | | v8-v8.1 | 输出与报告体验不足 | 中文化输出、HTML 报告、屏蔽 warning |
10 局限性与后续优化路线
10.1 当前局限
第一,公式 AST 解析仍是规则型,不等同于完整计算机代数系统。第二,公式角色 condition 与 target 的识别仍依赖启发式规则。第三,领域信号目前以手工规则为主,覆盖了函数同余、图论路径、余数优化等典型方向,但尚未覆盖所有竞赛数学主题。第四,HTML 报告主要用于人工查看,尚未形成可交互的标注与评测闭环。
10.2 后续优化
后续可以从四个方向推进。首先,引入人工评测集,对原题、强相似、弱相关、不相关进行标注,用 MAP、Recall@K、MRR 等指标评估。其次,尝试更强的 embedding 或 reranker 模型,尤其针对英文数学题的长文本理解。第三,将 Qdrant、FAISS 或 pgvector 引入生产索引,支持更大规模和低延迟检索。第四,建设可解释反馈机制,让人工点击“像/不像”后自动调整权重或训练轻量 reranker。
表 8 后续优化方向
| | | | | — | — | — | | 优化项 | 收益 | 优先级 | | 人工评测集 | 量化比较不同版本效果 | 高 | | 更强 reranker | 减少语义假阳性 | 中高 | | 生产向量库 | 支持更大题库和在线服务 | 中高 | | 主题分类器 | 按代数/数论/图论动态调权 | 中 | | 公式 AST 增强 | 提升复杂公式结构匹配 | 中 | | 前端标注系统 | 形成检索质量闭环 | 中 |
11 结论
本文围绕大规模数学题库的相似题检索,提出并实现了一个公式增强型混合检索系统。该系统保留原始题面,构造规范化文本、公式骨架、关键词索引、向量表示与领域信号,并通过多路召回和规则重排完成 Top K 搜索。
系统实践表明,数学题检索不能只依赖语义向量,也不能只依赖公式规则。向量模型适合处理语言改写,公式骨架适合处理同结构,关键词召回适合处理文字型图论题,而领域信号则能降低函数同余、余数优化等方向的假阳性。通过 v1 到 v8.1 的迭代,系统已经具备批量入库、GPU 加速、中文输出和 HTML 报告能力,可作为后续 Web 服务、题库去重和相似题推荐的基础。
附录 A 数据字段建议
附录代码 1 处理后题目记录示例
| | | — | | { “uid”: “ap_problem_statement.part0010.jsonl::4502”, “source_id”: 4502, “source_file”: “ap_problem_statement.part0010.jsonl”, “raw_text”: “…”, “normalized_text”: “…”, “search_text”: “… [FORMULA_1] …”, “formulas”: [ { “raw_latex”: “n\ge100”, “canonical_latex”: “n\ge100”, “variable_skeleton”: “VAR1\ge100”, “number_skeleton”: “VAR1\geNUM”, “role”: “condition” } ], “index_fields”: { “text_index”: “…”, “formula_exact_index”: “…”, “formula_skeleton_index”: “…” }, “math_signals”: { “has_long_short_path”: true, “has_disjoint_paths”: true } } |
附录 B 常用命令
附录代码 2 常用命令合集
| | | — | | 统计处理结果: python src\math_search_pipeline_v8.py stats ^ –processed-dir “E:\数学\题目搜索\processed_jsonl_v8” 检查 GPU: python src\math_search_pipeline_v8.py check-gpu 搜索已有题目: python src\math_search_pipeline_v8.py search ^ –index-dir “E:\数学\题目搜索\index p_all_v8_gpu” ^ –id “ap_problem_statement.part0010.jsonl::4502” ^ –include-self ^ –device cuda ^ –fp16 ^ –topk 5 生成报告: python src\math_search_pipeline_v8.py search ^ –index-dir “E:\数学\题目搜索\index p_all_v8_gpu” ^ –query “…” ^ –topk 10 ^ –html-report “E:\数学\题目搜索 eports\last_search.html” |
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:简单读写 Uysieot Uysieot《数学题库相似题检索系统》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。





![社区[bl0ckdev]打造一个人的本地进攻性红队小组agent的碰壁之路[1]](/images/random/titlepic/5.jpg)



评论