项目采用 多路召回 + 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的效果如何? 

向量模型效果评估

  1. 基础召回指标采用召回率、精确率、F1 分数评判检索匹配度,检验相关文档能否被有效筛选出来。

  2. 相似度分布检验查看同类文本向量距离、异类文本向量距离,合格模型同类聚集、异类区分明显。

  3. 场景实测验证结合业务测试集提问,对比真实标准答案,判断语义匹配、专业术语识别能力。

  4. 性能指标评估统计单条推理耗时、内存占用,兼顾检索精度与线上并发承载能力。

重排模型效果评估

  1. 排序质量指标使用 NDCG、MAP 评价排序合理性,越相关的文档排名越靠前。

  2. 正负样本区分度测试模型能否有效区分高度相关、弱相关、无关文本,过滤无效干扰结果。

  3. 边界案例测试针对歧义语句、近似语义、专业话术做测试,检验排序稳定性。

  4. 耗时开销评估统计重排处理耗时,控制候选集处理时延,满足接口响应要求。

整体链路综合评估

  1. 全流程对比打分分别单用 BM25、向量检索、向量加重排组合,横向对比最终检索准确率。

  2. 极端用例验证短句、长文本、模糊语义、专业冷门词汇全覆盖测试鲁棒性。

  3. 业务落地验收贴合实际业务查询场景,以真实使用体验、答案可用性作为最终评判依据。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐