简述
本文主要记录对于提高rag相似度的经验. 主要涉及 向量召回(稠密检索), BM25 / 关键词召回(稀疏检索),规则 / 知识图谱召回 三种手段.
前置过滤
我们需要从客户 query 中提取关键词, 在 rag 向量相似度匹配以前, 先在数据库做前置过滤.
比如:
省份, 城市, 区县, 品牌, 地铁线路, 地铁站名称等
使用关键词去数据库 like 可以而框住 rag 的返回值数据范围, 提高知识召回的速度和准确性.
比如:
query: 我想在广东11号线看电影
关键词: 省份:广东 and 地铁:11号线
注意, 某些关键词会同时命中个字段, 此时需要取需要同时取值, 比如:
query: 我想在万达看电影
关键词: 影院:万达 or 地铁站:万达
注意: 部分词有严重歧义, 比如吉林, 有吉林省和吉林市
embedding 向量召回 基础概念
embedding 向量 和 embeddingModel
词(苹果) -> token(15963) -> 词向量(0.1,0.5,0.8...)
词向量([苹果] 0.1,0.5,0.8...) + 词向量([14] 0.9,0.3,0.6...) ---(多头注意力)---> 句子向量([苹果14] 0.8,0.2.0,7...)
词嵌入模型执行如下步骤
- 先将一个句子分词(Tokenize),映射为模型词表对应的 TokenID,例如 苹果 = 15963
- 根据模型嵌入权重,将每个 TokenID 查表转换为原始静态词向量
- 将整句多个原始词向量,送入多层 Transformer + 多头自注意力做上下文交互迭代,生成带上下文的 Token 向量;再通过均值池化压缩聚合,得到唯一句向量
- 任意两段文本的最终向量,通过余弦相似度计算,数值越高语义越相近
- 同一款模型(如 all-minilm-l6-v2),不同框架 / 工具会因是否归一化、池化策略、预处理差异,导致相似度绝对值不同;但语义相似度排序结果基本一致
- 不同模型 (如 all-minilm-l6-v2, bge-small-zh-v1.5), 相似度值域和排序会有很大差异.
简单的提高BI知识库相似度准确性的手段
-
知识文本优化
- 只有部分字段参数RAG 召回相似度匹配. (比如: 查询案例中 query 参与相似度, sql 不参与计算只参与返回)
- 过长的知识会稀释注意力和相似度, 超过 500 个 token 之后的内容不参与向量相似的计算
- 统一指标名词、业务术语、同义描述; 避免同一指标多种写法造成向量语义分裂,降低跨问句召回失败率。
- 早期测试通过的知识, 后期可能和新知识冲突, 或被新知识淘汰出 topN 召回列表, 需要定期回顾检查
-
文本向量程化以前程序自动降噪
目标: 压缩短句, 只提取文本中的核心语义去计算相似度. (只影响相速度评分, 对外不可见)
原始问题: 帮我查询2026年4月14日的订单总量如何?
降噪以后: 某日的「订单总量」
- 删除无意义的前缀后缀
- 删除所有的日期时间及数字值
- 给关键字打上引号标记