RAG 01 · 资料小屋 · 复现说明
资料小屋 · 十关复现说明
从刚才玩的那一关出发,读同一份资料、做同一项操作,再检查证据为什么够或不够。
这份说明对应基础游戏「资料小屋」的十关。 打开第 1 关 →
现在你可以做什么
每关展开「查看操作手顺与结果」:顾客问题、候选资料的顺序、每一步的操作、证据判定(不合适 / 还需补充 / 足够)和最后的回信都写在上面。不用安装任何东西。
如果你有自己的 RAG 项目
可以按同样的方法复现:准备一小组问题和资料,固定候选顺序,逐步记录交出去的证据,再用同样三档判断证据够不够。
本站源码状态
本站源码(包括游戏规则和生成这些记录的脚本)目前没有公开,也没有下载入口。页面下方的命令只能在作者自己的仓库里运行。
这些记录由构建时运行游戏规则产生。资料、词语权重、候选列表和回信是手写教学内容;不是实时模型回答,也不是旧奶茶店助手的向量检索记录。
操作名称与资料保留游戏中的中文,方便逐项对照。三语概念对应关系见页面下方。
01 找到那一页
打开这一关 →查看操作手顺与结果
第1单 · 顾客问题
几点开门?
查看「营业时间」,拿起并交给顾客
营业时间 — 上午九点开门。
证据足够
最后交给写信台/顾客的证据
- 营业时间:上午九点开门。
教学回信/顾客反馈(预写)
九点开门,好的,明早见!
生成这一关记录的命令(只能在作者的仓库里运行):
npm run experiment:rag -- --level 102 从几页里挑出对的
打开这一关 →查看操作手顺与结果
第1单 · 顾客问题
周几休息?
先试「饮品价格」,观察为什么不够
饮品价格 — 珍珠奶茶 15 元,杨枝甘露 18 元,加料 2 元。
证据不合适 · 这页是价格,我想知道哪天休息。
改选「营业安排」,交给顾客
营业安排 — 周一至周六营业,周日休息。
证据足够
最后交给写信台/顾客的证据
- 营业安排:周一至周六营业,周日休息。
教学回信/顾客反馈(预写)
周日休息,记住了。
生成这一关记录的命令(只能在作者的仓库里运行):
npm run experiment:rag -- --level 203 换了问法也能找到
打开这一关 →查看操作手顺与结果
第1单 · 顾客问题
周日能来买奶茶吗?
先试含有“奶茶”字样的价格页
饮品价格 — 珍珠奶茶 15 元,杨枝甘露 18 元,加料 2 元。
证据不合适 · 这页是奶茶价格。我不是问多少钱,是问周日能不能来。
改选能说明周日是否营业的资料
营业安排 — 周一至周六营业,周日休息。
证据足够
最后交给写信台/顾客的证据
- 营业安排:周一至周六营业,周日休息。
教学回信/顾客反馈(预写)
周日不开门啊,知道了,我周六来。
生成这一关记录的命令(只能在作者的仓库里运行):
npm run experiment:rag -- --level 304 请 LLM 写回信
打开这一关 →查看操作手顺与结果
第1单 · 顾客问题
我周六九点半来,开门了吗?
取收件窗口的问题,交给 LLM 写信台
查看「营业时间」,拿起并交给写信台;取回信后交给顾客
营业时间 — 平日九点开门;周末十点开门。
证据足够
最后交给写信台/顾客的证据
- 营业时间:平日九点开门;周末十点开门。
教学回信/顾客反馈(预写)
还没开门。周六属于周末,10点开门。
生成这一关记录的命令(只能在作者的仓库里运行):
npm run experiment:rag -- --level 405 重新排列候选资料
打开这一关 →查看操作手顺与结果
第1单 · 顾客问题
珍珠奶茶多少钱?
先取默认第一张「新品宣传」,交给写信台
当前候选顺序:新品宣传 → 活动海报 → 制作说明 → 饮品价格表
新品宣传 — 新品芋泥波波上市!老顾客买珍珠奶茶,第二杯半价。
证据不合适 · 这些资料没有提供价格:这页讲新品上市和第二杯半价,没写珍珠奶茶本身多少钱。
回到检索台,把「饮品价格表」上移一位
当前候选顺序:新品宣传 → 活动海报 → 饮品价格表 → 制作说明
回到检索台,把「饮品价格表」上移一位
当前候选顺序:新品宣传 → 饮品价格表 → 活动海报 → 制作说明
回到检索台,把「饮品价格表」上移一位
当前候选顺序:饮品价格表 → 新品宣传 → 活动海报 → 制作说明
取新的第一张,交给写信台
当前候选顺序:饮品价格表 → 新品宣传 → 活动海报 → 制作说明
饮品价格表 — 珍珠奶茶 18 元 · 杨枝甘露 20 元 · 加料 2 元
证据足够
最后交给写信台/顾客的证据
- 饮品价格表:珍珠奶茶 18 元 · 杨枝甘露 20 元 · 加料 2 元
教学回信/顾客反馈(预写)
珍珠奶茶 18 元。
没有被找回的资料,不能靠重新排序凭空出现。
生成这一关记录的命令(只能在作者的仓库里运行):
npm run experiment:rag -- --level 506 改写检索查询
打开这一关 →查看操作手顺与结果
第1单 · 顾客问题
那个QQ的黑色小丸子,晚上几点就没啦?
执行检索,比较候选顺序
当前候选顺序:冬季限定 → 小料介绍 → 营业时间
先取原查询的第一条,检查证据
当前候选顺序:冬季限定 → 小料介绍 → 营业时间
冬季限定 — 黑芝麻汤圆:黑色的小丸子,冬季晚上供应。
证据不合适 · 这页是黑芝麻汤圆。客人指着的是珍珠奶茶里的珍珠。
回到检索台,拿掉查询词「QQ」
回到检索台,拿掉查询词「黑色小丸子」
回到检索台,拿掉查询词「晚上」
回到检索台,拿掉查询词「几点」
加入查询词「珍珠」
加入查询词「停止供应」
加入查询词「时间」
执行检索,比较候选顺序
当前候选顺序:珍珠 · 供应时间 → 营业时间 → 小料介绍
取改写后的第一条,交给写信台
当前候选顺序:珍珠 · 供应时间 → 营业时间 → 小料介绍
珍珠 · 供应时间 — 珍珠每日19:30停止供应。
证据足够
最后交给写信台/顾客的证据
- 珍珠 · 供应时间:珍珠每日19:30停止供应。
教学回信/顾客反馈(预写)
您说的是珍珠吧?珍珠每天19:30停止供应,七点半以后就没有了。
生成这一关记录的命令(只能在作者的仓库里运行):
npm run experiment:rag -- --level 607 找回片段上下文
打开这一关 →查看操作手顺与结果
第1单 · 顾客问题
新宿店周六几点开门?
先取没有店名的片段,交给写信台
当前候选顺序:片段 · 来源:门店营业时间 第 2 段 → 门店地址 → 节假日安排
片段 · 来源:门店营业时间 第 2 段 — ……周末10点开门。
证据不合适 · 这段没有说明是哪家店。不能直接把 10 点当成新宿店的开门时间。
回到检索台,点击「查看来源(展开)」
取「新宿店」那一行,交给写信台
门店营业时间 · 新宿店 — 新宿店:周末9点开门。
证据足够
最后交给写信台/顾客的证据
- 门店营业时间 · 新宿店:新宿店:周末9点开门。
教学回信/顾客反馈(预写)
新宿店周六9点开门(周六属于周末)。
切分(Chunking)方式也会影响这个问题:切的时候就把店名和时间留在一起,片段本身就够用。重新切分和展开上下文是两种不同的做法。
生成这一关记录的命令(只能在作者的仓库里运行):
npm run experiment:rag -- --level 708 比较两种查找方式
打开这一关 →查看操作手顺与结果
第1单 · 顾客问题
SKU-MT-042 现在多少钱?
先选「按意思找」
执行检索,比较候选顺序
当前候选顺序:价格表 · SKU-MT-024 → 新品预告 → 价格表 · SKU-MT-042
试取 SKU-MT-024,核对编号
当前候选顺序:价格表 · SKU-MT-024 → 新品预告 → 价格表 · SKU-MT-042
价格表 · SKU-MT-024 — SKU-MT-024 茉香奶绿(大杯):19 元。
证据不合适 · 这页是 SKU-MT-024,客人问的是 042。编号差一位,不是同一件商品。
回到检索台,也启用「按字找」
执行检索,比较候选顺序
当前候选顺序:价格表 · SKU-MT-042 → 价格表 · SKU-MT-024 → 编号说明 → 新品预告
取 SKU-MT-042,交给写信台
当前候选顺序:价格表 · SKU-MT-042 → 价格表 · SKU-MT-024 → 编号说明 → 新品预告
价格表 · SKU-MT-042 — SKU-MT-042 茉莉奶绿:16 元。
证据足够
最后交给写信台/顾客的证据
- 价格表 · SKU-MT-042:SKU-MT-042 茉莉奶绿:16 元。
教学回信/顾客反馈(预写)
SKU-MT-042 是茉莉奶绿,16 元。
第2单 · 顾客问题
有没有口感清爽、带点酸味的饮品?
第二单先选「按字找」
执行检索,比较候选顺序
当前候选顺序:焦糖奶茶 → 加料推荐 → 柠檬绿茶
试取「焦糖奶茶」,核对口味描述
当前候选顺序:焦糖奶茶 → 加料推荐 → 柠檬绿茶
焦糖奶茶 — 口感醇厚,香甜浓郁。
证据不合适 · 这页只是也用了“口感”两个字。焦糖奶茶香甜浓郁,不清爽也不酸。
回到检索台,也启用「按意思找」
执行检索,比较候选顺序
当前候选顺序:焦糖奶茶 → 柠檬绿茶 → 加料推荐 → 百香果多多
取「柠檬绿茶」,交给写信台
当前候选顺序:焦糖奶茶 → 柠檬绿茶 → 加料推荐 → 百香果多多
柠檬绿茶 — 鲜柠檬配茉莉绿茶,入口爽口,微酸回甘。
证据足够
最后交给写信台/顾客的证据
- 柠檬绿茶:鲜柠檬配茉莉绿茶,入口爽口,微酸回甘。
教学回信/顾客反馈(预写)
推荐柠檬绿茶:资料写它入口爽口,微酸回甘。
意思接近不等于事实成立。不管哪一路找到的,都要资料本身明确支持答案。
生成这一关记录的命令(只能在作者的仓库里运行):
npm run experiment:rag -- --level 809 发现缺口,再补查
打开这一关 →查看操作手顺与结果
第1单 · 顾客问题
今晚8点还能买到珍珠奶茶吗?
按顾客问题检索
当前候选顺序:营业时间
取营业时间,交给写信台,阅读信息缺口
当前候选顺序:营业时间
营业时间 — 门店营业到21:00。
已接收,还需补充 · 知道门店开着,但还不知道珍珠供应到几点。
回到检索台,先试补查价格
当前候选顺序:饮品价格
把价格交给写信台,观察缺口仍然存在
当前候选顺序:饮品价格
饮品价格 — 珍珠奶茶 18 元。
证据不合适 · 这是价格,填不上缺口:还不知道珍珠供应到几点。
改查「珍珠 · 供应时间」
当前候选顺序:珍珠 · 供应时间
补齐珍珠供应时间,取回信交给顾客
当前候选顺序:珍珠 · 供应时间
珍珠 · 供应时间 — 珍珠19:30停止供应。
证据足够
最后交给写信台/顾客的证据
- 营业时间:门店营业到21:00。
- 珍珠 · 供应时间:珍珠19:30停止供应。
教学回信/顾客反馈(预写)
门店开到21:00,但珍珠19:30就停止供应了,今晚8点买不到珍珠奶茶,可以换别的饮品。
这展示了“判断不足—继续检索”的过程,是理解 Agentic RAG 的一个入口;Agentic RAG 不只是重复检索。
生成这一关记录的命令(只能在作者的仓库里运行):
npm run experiment:rag -- --level 910 沿关系寻找证据
打开这一关 →查看操作手顺与结果
第1单 · 顾客问题
A供应商今晚无法按时送货,明天哪些饮品可能受影响?
展开 A 供应商
展开木薯粉
展开珍珠
把珍珠奶茶路径加入证据
先只带一条路径给写信台
关系证据 — A 供应商 → 木薯粉 → 珍珠 → 珍珠奶茶(进货单、配方、菜单)
证据不合适 · 我只拿到一条受影响的路径。A 供应商还连着别的原料吗?再去关系板看看。
回到关系板,展开 A 供应商的芋头
展开芋泥
把芋泥奶茶路径加入证据
带两条路径给写信台;留意回信中的“可能”和库存限制
关系证据 — A 供应商 → 木薯粉 → 珍珠 → 珍珠奶茶(进货单、配方、菜单);A 供应商 → 芋头 → 芋泥 → 芋泥奶茶(进货单、配方、菜单)
证据足够
最后交给写信台/顾客的证据
- 关系证据:A 供应商 → 木薯粉 → 珍珠 → 珍珠奶茶(进货单、配方、菜单);A 供应商 → 芋头 → 芋泥 → 芋泥奶茶(进货单、配方、菜单)
教学回信/顾客反馈(预写)
可能受影响:珍珠奶茶(木薯粉 → 珍珠)和芋泥奶茶(芋头 → 芋泥),都依赖 A 供应商。资料里没有库存信息,是否停售要先查库存。
物流延误只能说明“可能受影响”;没有库存信息,就不能断言一定停售。完整的 GraphRAG 专题还会探索建图和不同的查询方式,这一关只展示关系能提供关联证据。
生成这一关记录的命令(只能在作者的仓库里运行):
npm run experiment:rag -- --level 10这些记录是怎样生成的
在本站仓库的根目录运行,需要 Node 22.12 或更高版本;不需要模型、API key 或联网。仓库目前没有公开,所以这些命令只能在作者自己的仓库里运行;列在这里,是为了说明页面上的记录从哪里来。
运行全部十关
npm run experiment:rag数据与步骤的位置
experiments/rag/room/README.mdsrc/scripts/rag-game/levels.tssrc/data/rag-reproduction.ts
查看构建时的完整记录
[
{
"level": 1,
"title": "找到那一页",
"skill": "找到唯一资料",
"learn": [
"先找到和问题有关的那一页,再交出去。整个游戏都从这一步开始:检索(Retrieval)。"
],
"source": "teaching-simulation",
"orders": [
{
"question": "几点开门?",
"steps": [
{
"action": "take",
"arg": "hours",
"label": "查看「营业时间」,拿起并交给顾客",
"candidates": [],
"item": {
"id": "hours",
"t": "营业时间",
"b": "上午九点开门。",
"kind": "doc"
},
"judgement": {
"verdict": "accept",
"complete": true
}
}
],
"evidence": [
{
"id": "hours",
"t": "营业时间",
"b": "上午九点开门。",
"kind": "doc"
}
],
"complete": true,
"reply": "九点开门,好的,明早见!"
}
]
},
{
"level": 2,
"title": "从几页里挑出对的",
"skill": "从不同资料中选择",
"learn": [
"资料一多,就要读一读、比一比,挑出真正能回答问题的那一页。"
],
"source": "teaching-simulation",
"orders": [
{
"question": "周几休息?",
"steps": [
{
"action": "take",
"arg": "price",
"label": "先试「饮品价格」,观察为什么不够",
"candidates": [],
"item": {
"id": "price",
"t": "饮品价格",
"b": "珍珠奶茶 15 元,杨枝甘露 18 元,加料 2 元。",
"kind": "doc"
},
"judgement": {
"verdict": "reject",
"say": "这页是价格,我想知道哪天休息。"
}
},
{
"action": "take",
"arg": "schedule",
"label": "改选「营业安排」,交给顾客",
"candidates": [],
"item": {
"id": "schedule",
"t": "营业安排",
"b": "周一至周六营业,周日休息。",
"kind": "doc"
},
"judgement": {
"verdict": "accept",
"complete": true
}
}
],
"evidence": [
{
"id": "schedule",
"t": "营业安排",
"b": "周一至周六营业,周日休息。",
"kind": "doc"
}
],
"complete": true,
"reply": "周日休息,记住了。"
}
]
},
{
"level": 3,
"title": "换了问法也能找到",
"skill": "理解不同问法",
"learn": [
"价格页上也写着“奶茶”,但能回答“周日能不能来”的是营业安排。找资料要看意思,不只是看有没有同样的字。"
],
"source": "teaching-simulation",
"orders": [
{
"question": "周日能来买奶茶吗?",
"steps": [
{
"action": "take",
"arg": "price",
"label": "先试含有“奶茶”字样的价格页",
"candidates": [],
"item": {
"id": "price",
"t": "饮品价格",
"b": "珍珠奶茶 15 元,杨枝甘露 18 元,加料 2 元。",
"kind": "doc"
},
"judgement": {
"verdict": "reject",
"say": "这页是奶茶价格。我不是问多少钱,是问周日能不能来。"
}
},
{
"action": "take",
"arg": "schedule",
"label": "改选能说明周日是否营业的资料",
"candidates": [],
"item": {
"id": "schedule",
"t": "营业安排",
"b": "周一至周六营业,周日休息。",
"kind": "doc"
},
"judgement": {
"verdict": "accept",
"complete": true
}
}
],
"evidence": [
{
"id": "schedule",
"t": "营业安排",
"b": "周一至周六营业,周日休息。",
"kind": "doc"
}
],
"complete": true,
"reply": "周日不开门啊,知道了,我周六来。"
}
]
},
{
"level": 4,
"title": "请 LLM 写回信",
"skill": "把问题和资料交给 LLM,生成回答",
"learn": [
"之前:找到资料,交回资料。",
"现在:把问题和资料交给 LLM,生成回答。",
"RAG:检索增强生成。"
],
"source": "teaching-simulation",
"orders": [
{
"question": "我周六九点半来,开门了吗?",
"steps": [
{
"action": "question",
"arg": "",
"label": "取收件窗口的问题,交给 LLM 写信台",
"candidates": []
},
{
"action": "take",
"arg": "weekend",
"label": "查看「营业时间」,拿起并交给写信台;取回信后交给顾客",
"candidates": [],
"item": {
"id": "weekend",
"t": "营业时间",
"b": "平日九点开门;周末十点开门。",
"kind": "doc"
},
"judgement": {
"verdict": "accept",
"complete": true
}
}
],
"evidence": [
{
"id": "weekend",
"t": "营业时间",
"b": "平日九点开门;周末十点开门。",
"kind": "doc"
}
],
"complete": true,
"reply": "还没开门。周六属于周末,10点开门。"
}
]
},
{
"level": 5,
"title": "排在前面的不一定最有用",
"skill": "检索候选与排序",
"learn": [
"检索先找到候选,重排序(Rerank)帮助把更适合当前问题的资料放到前面。"
],
"note": "没有被找回的资料,不能靠重新排序凭空出现。",
"source": "teaching-simulation",
"orders": [
{
"question": "珍珠奶茶多少钱?",
"steps": [
{
"action": "take",
"arg": "",
"label": "先取默认第一张「新品宣传」,交给写信台",
"candidates": [
"新品宣传",
"活动海报",
"制作说明",
"饮品价格表"
],
"item": {
"id": "promo",
"t": "新品宣传",
"b": "新品芋泥波波上市!老顾客买珍珠奶茶,第二杯半价。",
"kind": "doc",
"src": "station"
},
"judgement": {
"verdict": "reject",
"say": "这些资料没有提供价格:这页讲新品上市和第二杯半价,没写珍珠奶茶本身多少钱。"
}
},
{
"action": "up",
"arg": "price",
"label": "回到检索台,把「饮品价格表」上移一位",
"candidates": [
"新品宣传",
"活动海报",
"饮品价格表",
"制作说明"
]
},
{
"action": "up",
"arg": "price",
"label": "回到检索台,把「饮品价格表」上移一位",
"candidates": [
"新品宣传",
"饮品价格表",
"活动海报",
"制作说明"
]
},
{
"action": "up",
"arg": "price",
"label": "回到检索台,把「饮品价格表」上移一位",
"candidates": [
"饮品价格表",
"新品宣传",
"活动海报",
"制作说明"
]
},
{
"action": "take",
"arg": "",
"label": "取新的第一张,交给写信台",
"candidates": [
"饮品价格表",
"新品宣传",
"活动海报",
"制作说明"
],
"item": {
"id": "price5",
"t": "饮品价格表",
"b": "珍珠奶茶 18 元 · 杨枝甘露 20 元 · 加料 2 元",
"kind": "doc",
"s": "价格表",
"src": "station"
},
"judgement": {
"verdict": "accept",
"complete": true
}
}
],
"evidence": [
{
"id": "price5",
"t": "饮品价格表",
"b": "珍珠奶茶 18 元 · 杨枝甘露 20 元 · 加料 2 元",
"kind": "doc",
"s": "价格表",
"src": "station"
}
],
"complete": true,
"reply": "珍珠奶茶 18 元。"
}
]
},
{
"level": 6,
"title": "换一种说法",
"skill": "改善查询表达",
"learn": [
"顾客的说法和资料的写法常常不一样。换一种查询表达(Query Rewrite),检索就能找到资料;回答时仍然照顾客原来的问题来答。",
"同时用几种说法去查、再把结果合在一起,是 MultiQuery 的思路。"
],
"source": "teaching-simulation",
"orders": [
{
"question": "那个QQ的黑色小丸子,晚上几点就没啦?",
"steps": [
{
"action": "search",
"arg": "",
"label": "执行检索,比较候选顺序",
"candidates": [
"冬季限定",
"小料介绍",
"营业时间"
]
},
{
"action": "take",
"arg": "",
"label": "先取原查询的第一条,检查证据",
"candidates": [
"冬季限定",
"小料介绍",
"营业时间"
],
"item": {
"id": "tangyuan",
"t": "冬季限定",
"b": "黑芝麻汤圆:黑色的小丸子,冬季晚上供应。",
"kind": "doc",
"src": "station"
},
"judgement": {
"verdict": "reject",
"say": "这页是黑芝麻汤圆。客人指着的是珍珠奶茶里的珍珠。"
}
},
{
"action": "rm",
"arg": "QQ",
"label": "回到检索台,拿掉查询词「QQ」",
"candidates": []
},
{
"action": "rm",
"arg": "黑色小丸子",
"label": "回到检索台,拿掉查询词「黑色小丸子」",
"candidates": []
},
{
"action": "rm",
"arg": "晚上",
"label": "回到检索台,拿掉查询词「晚上」",
"candidates": []
},
{
"action": "rm",
"arg": "几点",
"label": "回到检索台,拿掉查询词「几点」",
"candidates": []
},
{
"action": "add",
"arg": "珍珠",
"label": "加入查询词「珍珠」",
"candidates": []
},
{
"action": "add",
"arg": "停止供应",
"label": "加入查询词「停止供应」",
"candidates": []
},
{
"action": "add",
"arg": "时间",
"label": "加入查询词「时间」",
"candidates": []
},
{
"action": "search",
"arg": "",
"label": "执行检索,比较候选顺序",
"candidates": [
"珍珠 · 供应时间",
"营业时间",
"小料介绍"
]
},
{
"action": "take",
"arg": "",
"label": "取改写后的第一条,交给写信台",
"candidates": [
"珍珠 · 供应时间",
"营业时间",
"小料介绍"
],
"item": {
"id": "pearl",
"t": "珍珠 · 供应时间",
"b": "珍珠每日19:30停止供应。",
"kind": "doc",
"s": "珍珠供应",
"src": "station"
},
"judgement": {
"verdict": "accept",
"complete": true
}
}
],
"evidence": [
{
"id": "pearl",
"t": "珍珠 · 供应时间",
"b": "珍珠每日19:30停止供应。",
"kind": "doc",
"s": "珍珠供应",
"src": "station"
}
],
"complete": true,
"reply": "您说的是珍珠吧?珍珠每天19:30停止供应,七点半以后就没有了。"
}
]
},
{
"level": 7,
"title": "这句话说的是哪家店",
"skill": "找回片段的上下文",
"learn": [
"片段一旦离开了它的主体和条件(哪家店),就可能不足以支持回答。展开上下文(Small-to-Big),把主体找回来。"
],
"note": "切分(Chunking)方式也会影响这个问题:切的时候就把店名和时间留在一起,片段本身就够用。重新切分和展开上下文是两种不同的做法。",
"source": "teaching-simulation",
"orders": [
{
"question": "新宿店周六几点开门?",
"steps": [
{
"action": "take",
"arg": "frag",
"label": "先取没有店名的片段,交给写信台",
"candidates": [
"片段 · 来源:门店营业时间 第 2 段",
"门店地址",
"节假日安排"
],
"item": {
"id": "frag",
"t": "片段 · 来源:门店营业时间 第 2 段",
"b": "……周末10点开门。",
"kind": "doc",
"s": "片段",
"src": "station"
},
"judgement": {
"verdict": "reject",
"say": "这段没有说明是哪家店。不能直接把 10 点当成新宿店的开门时间。"
}
},
{
"action": "expand",
"arg": "",
"label": "回到检索台,点击「查看来源(展开)」",
"candidates": []
},
{
"action": "take",
"arg": "shinjuku",
"label": "取「新宿店」那一行,交给写信台",
"candidates": [],
"item": {
"id": "shinjuku",
"t": "门店营业时间 · 新宿店",
"b": "新宿店:周末9点开门。",
"kind": "doc",
"s": "新宿店",
"src": "station"
},
"judgement": {
"verdict": "accept",
"complete": true
}
}
],
"evidence": [
{
"id": "shinjuku",
"t": "门店营业时间 · 新宿店",
"b": "新宿店:周末9点开门。",
"kind": "doc",
"s": "新宿店",
"src": "station"
}
],
"complete": true,
"reply": "新宿店周六9点开门(周六属于周末)。"
}
]
},
{
"level": 8,
"title": "两种查找方式",
"skill": "关键词与语义检索",
"learn": [
"按字找(关键词检索)擅长编号、专有名词这类要一字不差的线索;按意思找(语义检索)能找到换了说法的内容。两路合并去重,就是混合检索(Hybrid Search)的思路。"
],
"note": "意思接近不等于事实成立。不管哪一路找到的,都要资料本身明确支持答案。",
"source": "teaching-simulation",
"orders": [
{
"question": "SKU-MT-042 现在多少钱?",
"steps": [
{
"action": "tool",
"arg": "sem",
"label": "先选「按意思找」",
"candidates": []
},
{
"action": "search",
"arg": "",
"label": "执行检索,比较候选顺序",
"candidates": [
"价格表 · SKU-MT-024",
"新品预告",
"价格表 · SKU-MT-042"
]
},
{
"action": "take",
"arg": "sku024",
"label": "试取 SKU-MT-024,核对编号",
"candidates": [
"价格表 · SKU-MT-024",
"新品预告",
"价格表 · SKU-MT-042"
],
"item": {
"id": "sku024",
"t": "价格表 · SKU-MT-024",
"b": "SKU-MT-024 茉香奶绿(大杯):19 元。",
"kind": "doc",
"s": "SKU-024",
"src": "station"
},
"judgement": {
"verdict": "reject",
"say": "这页是 SKU-MT-024,客人问的是 042。编号差一位,不是同一件商品。"
}
},
{
"action": "tool",
"arg": "kw",
"label": "回到检索台,也启用「按字找」",
"candidates": []
},
{
"action": "search",
"arg": "",
"label": "执行检索,比较候选顺序",
"candidates": [
"价格表 · SKU-MT-042",
"价格表 · SKU-MT-024",
"编号说明",
"新品预告"
]
},
{
"action": "take",
"arg": "sku042",
"label": "取 SKU-MT-042,交给写信台",
"candidates": [
"价格表 · SKU-MT-042",
"价格表 · SKU-MT-024",
"编号说明",
"新品预告"
],
"item": {
"id": "sku042",
"t": "价格表 · SKU-MT-042",
"b": "SKU-MT-042 茉莉奶绿:16 元。",
"kind": "doc",
"s": "SKU-042",
"src": "station"
},
"judgement": {
"verdict": "accept",
"complete": true
}
}
],
"evidence": [
{
"id": "sku042",
"t": "价格表 · SKU-MT-042",
"b": "SKU-MT-042 茉莉奶绿:16 元。",
"kind": "doc",
"s": "SKU-042",
"src": "station"
}
],
"complete": true,
"reply": "SKU-MT-042 是茉莉奶绿,16 元。"
},
{
"question": "有没有口感清爽、带点酸味的饮品?",
"steps": [
{
"action": "tool",
"arg": "kw",
"label": "第二单先选「按字找」",
"candidates": []
},
{
"action": "search",
"arg": "",
"label": "执行检索,比较候选顺序",
"candidates": [
"焦糖奶茶",
"加料推荐",
"柠檬绿茶"
]
},
{
"action": "take",
"arg": "caramel",
"label": "试取「焦糖奶茶」,核对口味描述",
"candidates": [
"焦糖奶茶",
"加料推荐",
"柠檬绿茶"
],
"item": {
"id": "caramel",
"t": "焦糖奶茶",
"b": "口感醇厚,香甜浓郁。",
"kind": "doc",
"src": "station"
},
"judgement": {
"verdict": "reject",
"say": "这页只是也用了“口感”两个字。焦糖奶茶香甜浓郁,不清爽也不酸。"
}
},
{
"action": "tool",
"arg": "sem",
"label": "回到检索台,也启用「按意思找」",
"candidates": []
},
{
"action": "search",
"arg": "",
"label": "执行检索,比较候选顺序",
"candidates": [
"焦糖奶茶",
"柠檬绿茶",
"加料推荐",
"百香果多多"
]
},
{
"action": "take",
"arg": "lemon",
"label": "取「柠檬绿茶」,交给写信台",
"candidates": [
"焦糖奶茶",
"柠檬绿茶",
"加料推荐",
"百香果多多"
],
"item": {
"id": "lemon",
"t": "柠檬绿茶",
"b": "鲜柠檬配茉莉绿茶,入口爽口,微酸回甘。",
"kind": "doc",
"src": "station"
},
"judgement": {
"verdict": "accept",
"complete": true
}
}
],
"evidence": [
{
"id": "lemon",
"t": "柠檬绿茶",
"b": "鲜柠檬配茉莉绿茶,入口爽口,微酸回甘。",
"kind": "doc",
"src": "station"
}
],
"complete": true,
"reply": "推荐柠檬绿茶:资料写它入口爽口,微酸回甘。"
}
]
},
{
"level": 9,
"title": "还缺一条线索",
"skill": "发现信息缺口,再次检索",
"learn": [
"先检查手上的资料够不够回答,发现缺口,再朝缺口的方向发起新的检索。"
],
"note": "这展示了“判断不足—继续检索”的过程,是理解 Agentic RAG 的一个入口;Agentic RAG 不只是重复检索。",
"source": "teaching-simulation",
"orders": [
{
"question": "今晚8点还能买到珍珠奶茶吗?",
"steps": [
{
"action": "first",
"arg": "",
"label": "按顾客问题检索",
"candidates": [
"营业时间"
]
},
{
"action": "take",
"arg": "",
"label": "取营业时间,交给写信台,阅读信息缺口",
"candidates": [
"营业时间"
],
"item": {
"id": "open21",
"t": "营业时间",
"b": "门店营业到21:00。",
"kind": "doc",
"src": "station"
},
"judgement": {
"verdict": "accept",
"say": "知道门店开着,但还不知道珍珠供应到几点。"
}
},
{
"action": "dir",
"arg": "cost",
"label": "回到检索台,先试补查价格",
"candidates": [
"饮品价格"
]
},
{
"action": "take",
"arg": "",
"label": "把价格交给写信台,观察缺口仍然存在",
"candidates": [
"饮品价格"
],
"item": {
"id": "cost",
"t": "饮品价格",
"b": "珍珠奶茶 18 元。",
"kind": "doc",
"src": "station"
},
"judgement": {
"verdict": "reject",
"say": "这是价格,填不上缺口:还不知道珍珠供应到几点。"
}
},
{
"action": "dir",
"arg": "pearl",
"label": "改查「珍珠 · 供应时间」",
"candidates": [
"珍珠 · 供应时间"
]
},
{
"action": "take",
"arg": "",
"label": "补齐珍珠供应时间,取回信交给顾客",
"candidates": [
"珍珠 · 供应时间"
],
"item": {
"id": "pearl1930",
"t": "珍珠 · 供应时间",
"b": "珍珠19:30停止供应。",
"kind": "doc",
"s": "珍珠供应",
"src": "station"
},
"judgement": {
"verdict": "accept",
"complete": true
}
}
],
"evidence": [
{
"id": "open21",
"t": "营业时间",
"b": "门店营业到21:00。",
"kind": "doc",
"src": "station"
},
{
"id": "pearl1930",
"t": "珍珠 · 供应时间",
"b": "珍珠19:30停止供应。",
"kind": "doc",
"s": "珍珠供应",
"src": "station"
}
],
"complete": true,
"reply": "门店开到21:00,但珍珠19:30就停止供应了,今晚8点买不到珍珠奶茶,可以换别的饮品。"
}
]
},
{
"level": 10,
"title": "关系里的答案",
"skill": "利用实体关系回答问题",
"learn": [
"资料之间的关系(供应商 → 原料 → 半成品 → 饮品)能把分散的证据连起来,每一步都能追溯到来源。"
],
"note": "物流延误只能说明“可能受影响”;没有库存信息,就不能断言一定停售。完整的 GraphRAG 专题还会探索建图和不同的查询方式,这一关只展示关系能提供关联证据。",
"source": "teaching-simulation",
"orders": [
{
"question": "A供应商今晚无法按时送货,明天哪些饮品可能受影响?",
"steps": [
{
"action": "node",
"arg": "A",
"label": "展开 A 供应商",
"candidates": []
},
{
"action": "node",
"arg": "tapioca",
"label": "展开木薯粉",
"candidates": []
},
{
"action": "node",
"arg": "pearl",
"label": "展开珍珠",
"candidates": []
},
{
"action": "add",
"arg": "pearlTea",
"label": "把珍珠奶茶路径加入证据",
"candidates": []
},
{
"action": "take",
"arg": "",
"label": "先只带一条路径给写信台",
"candidates": [],
"item": {
"id": "graph:pearlTea",
"t": "关系证据",
"b": "A 供应商 → 木薯粉 → 珍珠 → 珍珠奶茶(进货单、配方、菜单)",
"kind": "doc",
"s": "关系证据",
"src": "station",
"data": [
"pearlTea"
]
},
"judgement": {
"verdict": "reject",
"say": "我只拿到一条受影响的路径。A 供应商还连着别的原料吗?再去关系板看看。"
}
},
{
"action": "node",
"arg": "taro",
"label": "回到关系板,展开 A 供应商的芋头",
"candidates": []
},
{
"action": "node",
"arg": "taropaste",
"label": "展开芋泥",
"candidates": []
},
{
"action": "add",
"arg": "taroTea",
"label": "把芋泥奶茶路径加入证据",
"candidates": []
},
{
"action": "take",
"arg": "",
"label": "带两条路径给写信台;留意回信中的“可能”和库存限制",
"candidates": [],
"item": {
"id": "graph:pearlTea+taroTea",
"t": "关系证据",
"b": "A 供应商 → 木薯粉 → 珍珠 → 珍珠奶茶(进货单、配方、菜单);A 供应商 → 芋头 → 芋泥 → 芋泥奶茶(进货单、配方、菜单)",
"kind": "doc",
"s": "关系证据",
"src": "station",
"data": [
"pearlTea",
"taroTea"
]
},
"judgement": {
"verdict": "accept",
"complete": true
}
}
],
"evidence": [
{
"id": "graph:pearlTea+taroTea",
"t": "关系证据",
"b": "A 供应商 → 木薯粉 → 珍珠 → 珍珠奶茶(进货单、配方、菜单);A 供应商 → 芋头 → 芋泥 → 芋泥奶茶(进货单、配方、菜单)",
"kind": "doc",
"s": "关系证据",
"src": "station",
"data": [
"pearlTea",
"taroTea"
]
}
],
"complete": true,
"reply": "可能受影响:珍珠奶茶(木薯粉 → 珍珠)和芋泥奶茶(芋头 → 芋泥),都依赖 A 供应商。资料里没有库存信息,是否停售要先查库存。"
}
]
}
]下一步:真实模型实验
如果要研究真实模型,需用对应关卡资料另行运行检索与生成,保存模型版本、候选分数、完整上下文及原始回答。这里不把预写回信当作模型输出;实验说明中的进一步手顺列出了每关需要控制的变量。
旧奶茶店助手已退出游戏入口。历史向量检索实验保留在 experiments/rag/milk-tea-ai-01/,其记录不对应这里的十关。
本页概念
点击概念,查看中文・日本語・English 对照与解释。
检索查看详细
- 中文
- 检索
- 日本語
- 検索
- English
- Retrieval
从资料集合中找回与问题相关的候选资料,之后仍需判断证据是否足够。
语义检索查看详细
- 中文
- 语义检索
- 日本語
- 意味検索
- English
- Semantic search
依据语义相关性找资料,能处理不同表述,但相似不等于事实相同。第八关结果为手写示例。
大语言模型 LLM查看详细
- 中文
- 大语言模型
- 日本語
- 大規模言語モデル
- English
- Large language model (LLM)
根据输入生成语言的模型。资料小屋里的 LLM 回信为预先编写的教学内容,并未在线调用模型。
检索增强生成 RAG查看详细
- 中文
- 检索增强生成
- 日本語
- 検索拡張生成
- English
- Retrieval-augmented generation (RAG)
先检索相关资料,再把问题和资料交给模型生成回答。资料被找回不代表答案一定正确。
重排序查看详细
- 中文
- 重排序
- 日本語
- リランキング
- English
- Reranking
对已经找回的候选重新排序,不能凭空增加未检索到的资料。第五关由玩家手动排序。
查询改写查看详细
- 中文
- 查询改写
- 日本語
- クエリ書き換え
- English
- Query rewriting
调整用于检索的表达,同时保留原始问题的意图;回答仍应面向原始问题。
多查询检索查看详细
- 中文
- 多查询检索
- 日本語
- マルチクエリ検索
- English
- Multi-query retrieval
用多个查询表达检索,合并候选并去重。第六关只演示改写查询,没有自动执行多查询。
文本切分查看详细
- 中文
- 文本切分
- 日本語
- チャンク分割
- English
- Chunking
把文档分成检索单元。主体、条件与正文被拆散后,片段可能不足以支持回答。
上下文扩展查看详细
- 中文
- 上下文扩展
- 日本語
- コンテキスト拡張
- English
- Small-to-big retrieval
先找回小片段,再扩展到它的周边或上级内容,恢复主体与条件。
关键词检索查看详细
- 中文
- 关键词检索
- 日本語
- キーワード検索
- English
- Keyword search
利用词语匹配找资料,尤其适合编号和专有名词等精确线索。
混合检索查看详细
- 中文
- 混合检索
- 日本語
- ハイブリッド検索
- English
- Hybrid search
结合关键词与语义等不同检索途径,融合结果。第八关采用交错合并与去重。
智能体式检索增强生成查看详细
- 中文
- 智能体式检索增强生成
- 日本語
- エージェント型RAG
- English
- Agentic RAG
由系统根据任务状态选择检索等后续动作。第九关仅用固定规则演示发现缺口与补查,不是自主智能体。
图结构检索增强生成查看详细
- 中文
- 图结构检索增强生成
- 日本語
- グラフ型RAG
- English
- GraphRAG
利用实体与关系组织和检索证据。第十关展示手工关系图的路径证据,不包含自动建图或完整 GraphRAG 系统。