项目采用 多路召回 + Rerank的RAG架构,核心入口是 RagSpecialistAgent.java,当用户与问答助手进行语言交流时,输入查询,首先先进行意图识别,判断是单任务还是多任务,并且判断是否需要RAG检索,因为对于记录热量,记账等操作,无需进行RAG检索增强,只有针对那种用户学校的私有知识,才需要走RAG流程。
多路召回的具体流程:
1.向量检索(ES KNN):k-nearest neighbor(k 近邻)向量搜索,给定一个查询向量,从索引中找出最相似的Top-K向量文档,近似KNN是生产首选,采用HNSW算法,HNSW是多层图索引,把向量组织成多层网络:
上层:稀疏、粗粒度,快速过滤候选
下层:稠密、细粒度,精确找近邻
搜索:从顶层入口 → 逐层往下贪心遍历 → 收集最近邻
核心 trade-off:
m:每层每个节点最大连接数(默认 16)→ 越大越准、越耗内存ef_construction:建图时候选队列大小(默认 100)→ 越大建索引越慢、召回越高
private List<Map<String, Object>> knnSearch(String query, String school, int topK) { float[] embedding = embeddingModel.embed(query); // 生成向量 // 使用 ES 的 knn 查询 .knn(k -> k .field("embedding") .queryVector(queryVector) .k(topK) .numCandidates(topK * 2) ) // 低分过滤:score >= 0.5 }Embedding模型选取的是阿里百炼平台的向量模型,会生成1536维向量,ES向量检索会采用余弦相似度。
2.BM25文本检索(关键词检索):Best Matching 25,ES、Solr 默认经典概率检索打分算法,用来做关键词文本相似度匹配,检索传统文字内容。
- 词频 TF:词语在文档出现次数,越多分越高
- 逆文档频率 IDF:词越稀有,权重越高;常用词权重压低
- 文档长度:抑制长文档天然占便宜,避免越长分越高
private List<Map<String, Object>> textSearch(String keyword, String school, int topK) { builder.query(q -> q.bool(b -> b .must(m -> m.match(mc -> mc.field("question").query(keyword))) .filter(f -> f.term(t -> t.field("school").value(school))) )); }3.对双路检索到的结果进行去重,使用LinkedHashMap
Map<String, Map<String, Object>> dedupMap = new LinkedHashMap<>(); // docId = school + "|" + title String docId = getDocId(r); dedupMap.put(docId, r); // 后出现的同ID会被忽略4.Rerank重排序:调用 阿里云 DashScope Rerank API (qwen3-rerank 模型)对多路召回结果进行语义重排。
相关问题:
1)为什么是这两种检索方式,有没有别的检索方式,为什么不用?
其他的方式还有知识图谱检索 (Knowledge Graph),ColBERT (Late Interaction)等。不选第一个的原因是需要额外构建知识图谱,会增加系统的复杂度,而且,针对学校的私有信息,例如奖学金,宿舍信息等,不会很复杂和困难,因此无需使用复杂度较高的检索方式;不选第二个的原因是需要特殊的 embedding 模型。
2)知识库如何进行扩充:
针对学校的私有知识,管理员手动上传文档,然后经过数据清洗,chunk以及向量化最后存入数据库,chunk时会进行少量的重复,防止语义断裂;
针对chunk的切分方式,我知道的有以下几种:
1.固定大小切块(基础常用)
按字符 / Token 固定长度切割,设重叠窗口防语义断裂
特点:实现最简单、速度快
适用:规整文档、纯文本
2. 滑动窗口切块
固定步长滑动切割,相邻块保留重叠内容
特点:减少上下文丢失,提升召回完整性
适用:长段落、连续叙事文本
3. 语义切块(智能最优)
依据句子语义边界、语义相似度分割,不割裂完整含义
特点:块语义独立完整,检索精度最高
适用:论文、合同、专业资料
4. 层级切块
先大章节拆分,再逐层细分段落、句子,树形结构分块
特点:保留文档层级结构
适用:书籍、手册、带标题层级文档
5. 规则分隔切块
按换行、句号、分页符、标题标签、特殊符号切割
特点:贴合原生排版,边界清晰
适用:PDF、Word、结构化台账
6. 标题驱动切块
以一级 / 二级标题为分割依据,一个标题对应一个块
特点:主题高度统一
适用:报告、规章制度、技术文档
7. 问答式切块
把原文拆成独立问答单元,一问一答为单块
特点:贴合提问检索习惯
适用:题库、FAQ、客服话术
5.向量模型与重排模型的选择应该注意什么问题?
首先是向量模型选型时需要注意,第一,领域要匹配业务场景,专业场景可以使用微调过的专用模型,通用文本使用通用预训练模型,保障语义表征贴合业务特征;第二,维度严格统一模型输出向量维度,必须和向量数据库索引维度保持一致,避免入库、检索异常;第三,权衡精度与性能参数量、向量维度越高语义效果越好,但资源消耗、推理耗时同步上升,根据并发规模、硬件资源合理取舍;第四,适配相似度算法模型输出格式匹配库内设定的余弦、点积、欧式距离计算规则,保证相似度判定有效;第五,上下文窗口适配切块长度根据文本分块大小,选择对应上下文长度的模型,防止文本截断丢失关键信息。
其次,重排模型选型时需要注意:第一,明确使用定位重排仅作用于检索召回后的候选集,不替代全量检索,用来精细化筛选排序结果;第二,把控候选集数量常规选取 20-50 条召回结果送入重排,数量过多会大幅增加耗时,影响接口响应速度;第三,匹配文本长度依据分块文本篇幅,选择对应窗口大小的重排模型,避免超长文本无法完整解析;第四,按需取舍精度高精准业务选用高精度重排模型,高并发吞吐场景选用轻量化模型平衡效率。
6.如何评估你的RAG的效果如何?
向量模型效果评估
基础召回指标采用召回率、精确率、F1 分数评判检索匹配度,检验相关文档能否被有效筛选出来。
相似度分布检验查看同类文本向量距离、异类文本向量距离,合格模型同类聚集、异类区分明显。
场景实测验证结合业务测试集提问,对比真实标准答案,判断语义匹配、专业术语识别能力。
性能指标评估统计单条推理耗时、内存占用,兼顾检索精度与线上并发承载能力。
重排模型效果评估
排序质量指标使用 NDCG、MAP 评价排序合理性,越相关的文档排名越靠前。
正负样本区分度测试模型能否有效区分高度相关、弱相关、无关文本,过滤无效干扰结果。
边界案例测试针对歧义语句、近似语义、专业话术做测试,检验排序稳定性。
耗时开销评估统计重排处理耗时,控制候选集处理时延,满足接口响应要求。
整体链路综合评估
全流程对比打分分别单用 BM25、向量检索、向量加重排组合,横向对比最终检索准确率。
极端用例验证短句、长文本、模糊语义、专业冷门词汇全覆盖测试鲁棒性。
业务落地验收贴合实际业务查询场景,以真实使用体验、答案可用性作为最终评判依据。