数据截至 (上游 commit 298b68274234)
Ragas 测试集生成 — 文档变知识图谱,沿图造问答对
本章讲 Ragas 信号最强的特色功能:没有测试集时,怎么把一堆文档自动变成「问题 + 标准答案 + 该用哪段资料」的评测数据。核心妙处是先把文档建成知识图谱,再沿图上的连通路径造出需要跨多个文档才能回答的多跳问题。
1. 为什么不直接「给文档让 LLM 出题」
最朴素的做法:把每段文档丢给 LLM「出个问题」。问题是这样只能出单跳问题(答案在单段文字里),测不出 RAG 系统综合多段资料的能力——而那恰恰是 RAG 最难、最该测的地方。
Ragas 的解法:先把文档之间的关系(主题相近、提到同一实体)显式建成一张图,再沿着图上「A 连 B 连 C」这样的路径出题,逼着一个问题的答案散落在多个文档里。
2. 主线全景:文档 → 图 → 问答对
文档 docs
│ ① 转成 Node(type=DOCUMENT/CHUNK)
▼
KnowledgeGraph(只有节点,没有边)
│ ② apply_transforms: 抽标题/摘要/实体 + 切块 + 按相似度/共指连边
▼
KnowledgeGraph(节点 + 关系边)
│ ③ generate_personas_from_kg: 从图里推几个「提问者人设」
│ ④ 按 query_distribution 把 testset_size 拆给各合成器
▼
各 Synthesizer:
single-hop ── 取单个节点 ── 造单跳 scenario
multi-hop ── find_n_indirect_clusters 取路径簇 ── 造多跳 scenario
│ ⑤ 每个 scenario → generate_sample: LLM 据节点内容造(问题,答案)
▼
Testset(问答对 + 标准答案 + 用了哪些节点 + 由哪个合成器造)
总指挥是 TestsetGenerator。最常用的入口 generate_with_langchain_docs:把文档转成 DOCUMENT 节点 → 建空图 → apply_transforms 补齐边 → 调 generate()(src/ragas/testset/synthesizers/generate.py:114-220)。还有 generate_with_chunks(你已切好块,直接当 CHUNK 节点,src/ragas/testset/synthesizers/generate.py:302-412)和 from_langchain / from_llama_index 适配不同生态。