1. 问题现象与背景分析
最近在开发一个教育类知识库系统时,发现一个有趣的现象:当用户查询"第六课内容是什么"时系统返回空结果,而查询"第6课"却能正确返回三年级下册词语表内容。这个现象揭示了当前大语言模型在处理数字表征时的一个潜在问题——阿拉伯数字与中文数字在向量空间中的距离差异。
作为从业者,我们首先需要理解向量空间模型(VSM)的基本原理。在自然语言处理中,文本被映射为高维空间中的向量,语义相似的文本在向量空间中距离较近。理论上,"第六课"和"第6课"应该具有高度相似的向量表示,但实际测试表明两者的匹配效果存在显著差异。
通过分析知识库的原始数据结构可以发现,存储的课程编号统一采用"第X课"的阿拉伯数字格式。这解释了为什么查询"第6课"能精确匹配,而"第六课"却无法命中。但更深入的问题是:为什么模型不能自动识别这两种数字表达方式的语义等价性?
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数字表征的向量空间分析
2.1 中文数字与阿拉伯数字的编码差异
在Unicode编码层面,阿拉伯数字"6"的编码是U+0036,而中文数字"六"的编码是U+516D。这种底层编码的差异会导致:
- 分词器(Tokenizer)将它们视为完全不同的token
- 初始嵌入层(Embedding)会为它们分配不同的向量表示
- 即使经过多层Transformer的上下文学习,它们的向量表示仍可能保持较大距离
测试表明,在768维的BERT向量空间中,"6"与"六"的余弦相似度通常只有0.3-0.5,远低于同义词对的典型相似度(0.7-0.9)。
2.2 位置编码的影响分析
大模型中的位置编码(Positional Encoding)会进一步放大这种差异。考虑以下两个查询:
- "第6课"的分词结果通常是["第","6","课"]
- "第六课"的分词结果通常是["第六","课"]
由于"第六"被作为一个完整token处理,其位置编码与["第","6"]的组合存在本质区别。这种结构差异会导致最终的向量表示产生更大距离。
3. 解决方案设计与实现
3.1 预处理层的数字标准化
最直接的解决方案是在文本进入向量化流程前进行数字格式统一:
python复制import re
def normalize_numbers(text):
# 中文数字转阿拉伯数字
cn_to_arabic = {'零':'0','一':'1','二':'2','三':'3',
'四':'4','五':'5','六':'6','七':'7',
'八':'8','九':'9','十':'10'}
for cn, num in cn_to_arabic.items():
text = text.replace(cn, num)
# 统一"第X课"格式
text
