RAG 系统测试题 — 参考答案

#RAG #测试 #答案

题目见 [[RAG_测试题]]


第一部分:概念理解

Q1. RAG 的全称及解决的三个核心问题

全称:Retrieval-Augmented Generation(检索增强生成)

解决的三个核心问题:

  1. 知识截止日期:LLM 训练有时间限制,RAG 通过动态检索外部知识库弥补
  2. 幻觉问题(Hallucination):LLM 可能编造不存在的内容,RAG 让它基于真实检索内容生成回答
  3. 私有知识无法访问:企业内部文档无法训练进 LLM,RAG 可以将私有文档存入向量库实时检索

Q2. 向量嵌入的正确说法:A、C

  • A ✅ L2 距离越小 = 向量越近 = 语义越相似
  • B ❌ text-embedding-v4 输出 1024 维向量,不是 512 维
  • C ✅ 向量数据库支持按语义相似度搜索(近邻搜索)
  • D ❌ 同一段文字经过同一个模型,每次得到的向量是确定性的(完全相同)

Q3. IVF_FLAT 参数含义

  • nlist=128:将向量空间聚类成 128 个簇,建索引时使用
  • nprobe=10:查询时只搜索最近的 10 个簇(而不是全部128个),是速度和精度的权衡
  • 提高精度的调整方式:增大 nprobe(例如从10增大到30)。nprobe 越大,搜索的簇越多,精度越高,但查询越慢。也可以适当增大 nlist(需要重建索引)。

Q4. 混合搜索权重与分数计算

  • 向量搜索权重:0.7(70%)
  • 关键词搜索权重:0.3(30%)
  • 融合分数公式:
    1
    
    final_score = 0.7 × vector_similarity + 0.3 × keyword_score
    
    其中 vector_similarity = 1 / (1 + L2_distance)

Q5. 意图识别的作用与四个分类

作用:在检索之前先判断问题领域,实现领域过滤,只在相关领域的文档中搜索,提升检索精准度;同时对于低置信度的通用问题,可以跳过 RAG 直接调用 LLM 节省资源。

四个分类

  1. law(法律)
  2. finance(金融)
  3. ai(人工智能)
  4. general(通用)

第二部分:系统架构

Q6. 三层服务架构

1
2
3
4
5
6
7
8
9
【应用层】你的应用(Web/APP/Bot)
      ↓ HTTP
【RAG 服务层】rag_service.py → 端口 8001(完整版)
             rag_service_simple.py → 端口 8002(简化版)
      ↓ HTTP
【向量 API 层】milvus_api.py → 端口 8000
      ↓ gRPC
【数据库层】Milvus 向量数据库 → 端口 19530
           + etcd(2379)+ MinIO(9000/9001)+ Attu(3000)

外部 LLM:阿里 DashScope API(qwen-plus + text-embedding-v4)


Q7. 完整版 vs 简化版

  • 完整版 rag_service.py:端口 8001
  • 简化版 rag_service_simple.py:端口 8002

完整版比简化版多出的三个功能(任选三个):

  1. 意图识别(判断领域,领域过滤)
  2. 查询扩展(生成3个变体查询,提升召回率)
  3. 多轮对话(Session 管理,维护对话历史)
  4. 流式输出(SSE 协议,实时返回内容)
  5. 详细引用溯源(引用片段内容+相关性分数)

Q8. Collection 字段及作用

字段类型作用
idINT64(主键,自增)文档唯一标识
textVARCHAR(最大65535字符)存储文档块的实际文本内容
embeddingFLOAT_VECTOR(1024维)文本对应的向量,用于语义搜索
sourceVARCHAR(最大500字符)来源文件名,如 ai_dev.md
sectionVARCHAR(最大500字符)所属章节/标题,用于引用溯源
keywordsVARCHAR(最大1000字符)jieba 提取的关键词,用于关键词搜索

Q9. 中文分词工具

  • 工具:jieba
  • 提取结果存储在:keywords 字段(空格分隔的关键词字符串)
  • 用于:关键词搜索(通过 LIKE '%关键词%' 进行过滤匹配)

Q10. LLM 相关配置

  • 公司:阿里巴巴
  • 聊天模型:qwen-plus(通义千问 Plus)
  • Embedding 模型:text-embedding-v4(1024维输出)
  • 需要的 API Key:DASHSCOPE_API_KEY(存储在 .env 文件中)
  • Base URL:https://dashscope.aliyuncs.com/compatible-mode/v1(兼容 OpenAI SDK 格式)

第三部分:数据流程

Q11. 数据入库流程

  1. 读取 milvus.doc/ 目录下的 Markdown 文件(ai_dev.md、fin.md、law.md)
  2. ##### 标题对文档进行切块(Chunking),每块携带 source 和 section 信息
  3. 对每个文本块进行文本预处理(去除多余空白等)
  4. 并行处理两件事:
    • 调用 text-embedding-v4 生成 1024 维向量
    • jieba 分词提取关键词字符串
  5. {text, embedding, source, section, keywords} 批量插入 Milvus
  6. 在 embedding 字段上创建 IVF_FLAT 索引(nlist=128)
  7. 将 Collection 加载到内存,准备查询

Q12. 完整版 RAG 查询流程

问题:“人工智能在金融行业有哪些应用?”

  1. 意图识别:LLM 判断 → 可能返回 {domain: "finance", confidence: 0.7}{domain: "ai", confidence: 0.8}(跨领域问题)
  2. 查询扩展:生成3个变体,如:
    • “AI技术在银行、证券行业的具体应用”
    • “机器学习在金融风控中的使用案例”
    • “人工智能在投资决策中的角色”
  3. 混合检索:4个问题(原问题+3个变体)分别做向量搜索和关键词搜索
  4. 结果融合去重:合并所有结果,按 0.7×向量分+0.3×关键词分 打分排序,去重
  5. 取 Top-5 文档块:选出最相关的5个文档片段
  6. 构建 Context Prompt:将5个片段格式化为[参考1][参考2]…形式
  7. 调用 qwen-plus:发送"问题+参考资料",指示模型基于参考资料回答并引用
  8. 返回结果:包含 answer、sources列表、domain、expanded_queries、referenced_fragments

Q13. 查询扩展的核心思路与示例

核心思路:用 LLM 从不同角度/措辞重新表达原始问题,生成多个语义等价但表述不同的查询,扩大检索覆盖面,提高召回率。

“什么是机器学习?“的可能扩展:

  1. “机器学习的定义和基本概念是什么?"(换措辞)
  2. “机器学习和传统编程有什么区别?"(对比角度)
  3. “监督学习、无监督学习、强化学习有什么区别?"(细化分类)

Q14. L2 距离与相似度的关系

  • L2 距离(欧氏距离):值越小 → 向量越近 → 越相似;值越大 → 越不相似
  • 问题:L2 距离范围是 [0, +∞),不直观
  • 转换公式similarity = 1 / (1 + L2_distance)
    • distance=0 → similarity=1.0(完全相同)
    • distance=1 → similarity=0.5
    • distance=∞ → similarity→0
  • 这样相似度被归一化到 (0, 1] 区间,便于与关键词分数做加权融合

第四部分:代码理解

Q15. 代码分析

a. 为什么用 top_k * 2

为了给后续的融合和去重留出空间。两路搜索各取更多结果(top_k×2),融合后去重,最终再从合并结果中选出真正的 top_k。如果两路都只取 top_k,去重后结果可能不足 top_k 条。

b. 1 / (1 + r.distance) 的作用?distance=0 时的结果?

作用:将 L2 距离(越小越好)转换为相似度分数(越大越好),归一化到 (0, 1]。

  • distance=0 时:1 / (1+0) = 1.0(最高相似度)

c. 同时出现在两路结果中的文档,最终分数?

1
2
3
4
5
6
7
8
# 向量搜索时:
merged[id] = 0.7 × vector_similarity

# 关键词搜索时发现 id 已存在:
merged[id] += (1 - 0.7) × 0.8 = 0.3 × 0.8 = 0.24

# 最终分数:
final_score = 0.7 × vector_similarity + 0.24

这类文档既语义相关又含关键词,会获得更高的综合分数,排名更靠前——这正是混合搜索的优势。


Q16. Prompt 要求与 temperature 的差异

RAG Prompt 要求 LLM

  1. 基于提供的参考资料来回答问题(不要凭空捏造)
  2. 引用相关参考,格式为 [参考N]
  3. 如果参考资料不包含答案,诚实说明

temperature 差异的原因

场景temperature原因
意图识别0.1(很低)需要确定性的分类结果,低温度让输出更稳定可预测,不需要创意
查询扩展0.7(较高)需要多样性的问题变体,高温度鼓励创造性,生成不同角度的查询
回答生成0.7(中等)平衡准确性和流畅性,既基于事实又能自然表达

第五部分:优化与扩展

Q17. 切块策略问题与改进

当前策略:按 ##### Markdown 标题切割

潜在问题

  1. 一个章节可能非常长,超过 LLM 的 token 限制
  2. 一段连续的内容可能被标题人为分割,丢失上下文连贯性
  3. 对没有良好标题结构的文档效果差

两种改进方案

方案1:滑动窗口切块(固定大小+重叠)

1
2
3
chunk_size = 512 字符
overlap = 100 字符(相邻块共享100字符)
→ 防止关键信息被切断

方案2:父子切块(Parent-Child Chunking)

1
2
3
检索时使用小块(如128字符)→ 精准匹配
喂给 LLM 时使用父块(512字符)→ 提供更多上下文
→ 兼顾检索精度和生成质量

Q18. 重排序(Reranking)

是什么:Reranker 是一种交叉编码器(Cross-Encoder)模型,它同时接受"查询"和"候选文档"作为输入,计算两者的相关性分数。

在 RAG 流程中的位置

1
检索(top-20粗排)→ 【Reranker 精排】→ 取 top-5 喂给 LLM

比向量相似度排序的优势

  • 向量相似度是独立计算 Query 和 Document 的,再比较(双编码器)
  • Reranker 让 Query 和 Document 互相关注(交叉注意力),能更准确地判断相关性
  • 代价是速度较慢,所以先粗排再精排,取得速度和精度的平衡

Q19. RAG 评估指标含义

指标含义评估什么
faithfulness(忠实度)生成的回答是否完全基于检索到的上下文,没有引入外部知识或捏造防幻觉能力
answer_relevancy(回答相关性)生成的回答是否真正回答了用户的问题回答是否跑题
context_precision(上下文精确率)检索到的文档中,有多少是真正相关的(精确率)检索是否引入了噪声
context_recall(上下文召回率)回答问题所需的信息是否都被检索到了(召回率)检索是否遗漏了重要内容

Q20. 法律文书查询场景的针对性改进

  1. 专业词汇处理:添加法律领域词典到 jieba,确保"原告”、“被告”、“诉讼时效"等法律术语能被正确分词,不被拆散

  2. 结构化元数据:在数据库中增加 law_type(刑事/民事/行政)、jurisdiction(管辖地)、effective_date(生效日期)等字段,支持精确过滤

  3. 调低 temperature,提高准确性:法律场景不能有模糊表述,将生成温度调低至 0.3 以下,减少创意性内容,增强答案准确性

  4. 强化引用溯源:每条回答必须附带具体法条编号(如《民法典》第 577 条),并显示原文文本,不允许模糊表述

  5. 增加免责声明:在系统 Prompt 中要求模型声明"本回答仅供参考,具体法律问题请咨询专业律师”

  6. 细粒度权限控制:按用户角色(律师/法官/普通用户)过滤可查询的文档范围,防止敏感文书泄露


评分建议:每题5分,满分100分。建议先独立作答,再对照答案,重点关注答错的概念。