关键词索引
关键词索引是信息检索领域的经典方法,在RAG系统中仍然发挥着重要作用,特别是在需要精确匹配和高召回率场景下。
什么是关键词索引?
关键词索引是一种基于文本中出现的关键词或术语构建的索引结构,它将每个关键词映射到包含该关键词的文档列表。与向量索引关注语义相似性不同,关键词索引专注于精确匹配或部分匹配特定词汇,是传统搜索引擎的核心技术。
倒排索引
倒排索引是关键词索引的核心数据结构,它"倒置"了文档和词汇的关系,以词汇为索引,记录包含该词汇的所有文档。
倒排索引结构
一个完整的倒排索引通常包含以下组件:
- 词典(Dictionary):所有唯一词汇的集合,通常按字母顺序排序
- 倒排列表(Posting List):每个词汇对应的文档ID列表
- 位置信息(Positions):词汇在每个文档中的位置
- 频率信息(Frequency):词汇在每个文档中出现的次数
倒排索引示例
假设有以下三个文档:
- 文档1:"人工智能技术正在快速发展"
- 文档2:"机器学习是人工智能的一个分支"
- 文档3:"深度学习推动了人工智能技术的进步"
对应的倒排索引可能如下:
词汇 | 文档ID列表 | 位置信息 | 频率信息 |
---|---|---|---|
人工智能 | [1, 2, 3] | [0, 2, 4] | [1, 1, 1] |
技术 | [1, 3] | [1, 5] | [1, 1] |
发展 | [1] | [4] | [1] |
机器学习 | [2] | [0] | [1] |
分支 | [2] | [5] | [1] |
深度学习 | [3] | [0] | [1] |
推动 | [3] | [1] | [1] |
进步 | [3] | [6] | [1] |
倒排索引构建过程
- 文档收集:获取需要索引的文档集合
- 文档分析:对每个文档进行分词、去除停用词等预处理
- 词汇提取:从文档中提取所有唯一词汇,建立词典
- 倒排列表构建:为每个词汇创建包含文档ID的列表
- 位置和频率记录:记录每个词汇在文档中的位置和频率
- 索引优化:压缩索引、构建辅助数据结构等
排序算法
关键词索引通常结合各种排序算法来对检索结果进行排序,以提高相关性。
TF-IDF
TF-IDF(Term Frequency-Inverse Document Frequency)是最经典的文本相关性计算方法,它结合了词频(TF)和逆文档频率(IDF)两个因素。
TF-IDF计算公式
TF-IDF = TF × IDF
- TF(词频):词汇在文档中出现的频率,计算公式为:TF = (词汇在文档中的出现次数) / (文档中的总词数)
- IDF(逆文档频率):衡量词汇的普遍重要性,计算公式为:IDF = log(总文档数 / 包含该词汇的文档数)
TF-IDF特点
- 重视在文档中频繁出现但在整个文档集合中较少出现的词汇
- 降低常见词(如"的"、"是"等)的权重
- 计算简单,易于实现
- 不考虑词汇的语义关系
BM25
BM25(Best Matching 25)是对TF-IDF的改进版本,是目前最流行的关键词排序算法之一。
BM25计算公式
score(D, Q) = ∑(IDF(qi) × (f(qi, D) × (k1 + 1)) / (f(qi, D) + k1 × (1 - b + b × |D| / avgdl)))
其中:
- D:文档
- Q:查询,包含多个词汇qi
- f(qi, D):词汇qi在文档D中的频率
- |D|:文档D的长度(词数)
- avgdl:所有文档的平均长度
- k1:控制词频缩放的参数,通常在1.2-2.0之间
- b:控制文档长度归一化的参数,通常为0.75
BM25特点
- 考虑了文档长度的影响,避免长文档的优势
- 词频饱和,避免单个词汇频率过高导致的偏差
- 参数可调,适应不同类型的文档集合
- 在实际应用中表现优异
语言模型
语言模型方法使用概率模型来估计查询在文档语言模型下的生成概率。
基本原理
对于查询Q和文档D,计算P(Q|D),即给定文档D生成查询Q的概率。通常使用多项式分布和平滑技术来估计这个概率。
常见的语言模型方法
- Jelinek-Mercer平滑:结合文档模型和集合模型
- Dirichlet平滑:使用先验分布进行平滑
- 两阶段平滑:结合多种平滑方法
关键词提取
在RAG系统中,关键词提取是构建关键词索引的重要步骤,常用的关键词提取方法包括:
统计方法
- TF-IDF:使用TF-IDF值提取重要词汇
- TextRank:基于图算法的关键词提取
- RAKE:快速自动关键词提取算法
机器学习方法
- 监督学习:使用标注数据训练分类器
- 半监督学习:结合少量标注数据和大量未标注数据
- 深度学习:使用BERT等预训练模型提取关键词
混合方法
- 统计+规则:结合统计特征和语言规则
- 统计+机器学习:使用统计特征训练机器学习模型
- 多模型集成:综合多种模型的结果
关键词索引在RAG中的应用
稀疏向量检索
在RAG系统中,关键词索引通常以稀疏向量的形式实现,每个文档表示为一个高维稀疏向量,向量的每个维度对应一个词汇,值为该词汇的权重(如TF-IDF或BM25分数)。
稀疏向量检索流程
- 将文档集合转换为稀疏向量表示
- 构建倒排索引,支持高效检索
- 将用户查询转换为稀疏向量
- 计算查询向量与文档向量的相似度
- 返回相似度最高的文档
关键词过滤
在RAG系统中,关键词索引还可以用作预过滤器,缩小向量索引的搜索范围。
关键词过滤流程
- 从用户查询中提取关键词
- 使用关键词索引快速找到包含这些关键词的文档子集
- 在这个子集上应用向量索引进行语义搜索
- 合并结果,返回最终答案
精确匹配
对于需要精确匹配的场景(如法律文件、技术规范等),关键词索引比向量索引更适合。
精确匹配应用场景
- 法律条款查询
- 产品规格检索
- 代码片段搜索
- 专业术语定义查找
实现工具
在实际应用中,可以使用以下工具实现关键词索引:
工具 | 特点 | 适用场景 |
---|---|---|
Elasticsearch | 分布式搜索引擎,支持BM25,高可扩展性 | 大规模文档集合,需要复杂查询 |
Solr | 基于Lucene,功能丰富,易于配置 | 企业搜索,需要高级功能 |
Whoosh | 纯Python实现,轻量级,易于集成 | 小型应用,原型开发 |
PyTerrier | Python接口的信息检索框架,支持多种模型 | 研究实验,需要灵活性 |
Rank-BM25 | 轻量级BM25实现,易于使用 | 简单应用,快速实现 |
Sparse Embeddings | 结合现代NLP和传统IR技术 | 需要平衡效率和语义理解 |
关键词索引优化技巧
预处理优化
- 分词优化:选择适合领域的分词器
- 停用词处理:移除对检索无意义的常见词
- 词干提取:将词汇归一化为基本形式
- 同义词扩展:添加同义词,提高召回率
索引优化
- 索引压缩:减少索引大小,提高检索速度
- 分片策略:合理设置分片数量和大小
- 缓存机制:缓存热门查询结果
- 增量更新:支持实时添加新文档
查询优化
- 查询扩展:添加相关词汇,提高召回率
- 查询重写:根据上下文调整查询
- 字段加权:为不同字段设置不同权重
- 结果多样性:避免返回过于相似的结果
关键词索引的局限性
- 语义理解有限:难以捕捉词汇之间的语义关系
- 同义词问题:不同表达相同概念的词汇难以匹配
- 多义词问题:同一词汇在不同上下文有不同含义
- 语言依赖:不同语言需要不同的处理方法
- 长尾查询:罕见查询难以有效处理
案例研究
案例1:技术文档检索系统
对于包含大量技术术语和专业词汇的文档集合,可以采用以下策略:
- 使用领域特定的分词器和停用词列表
- 构建专业术语同义词库
- 结合BM25和语言模型进行排序
- 实现高亮显示和上下文摘要
案例2:混合检索系统
结合关键词索引和向量索引的混合系统:
- 使用关键词索引进行初步过滤
- 使用向量索引进行语义排序
- 设计加权融合算法
- 实现自适应调整机制