一个问题,三张交接单

把图检索和大模型结合的思路,常被归入GraphRAG(用图结构增强检索的生成方式)一类做法。落到游戏里,难点不在概念,而在每一段谁负责什么、出错怎么办。

假设玩家在虚构游戏里问:“我想拿灰烬护符,现在最快应该先做哪些任务?”爱游戏AI处理这类问题时,把过程拆成三次交接。每一次交接都有固定的格式,前一环节只交付该格式规定的内容,后一环节只信任这份交付。这样做的好处很朴素:某一步出错时,可以直接翻开那张单子,看错在哪里。

三张单分别是:目标单(大模型交给图系统)、路径单(图系统交给Agent)、步骤单(Agent交给玩家)。下面按顺序看每张单上写什么、为什么这样写。

第一张单:目标单

大模型在这里只做一件事:把自然语言翻译成结构化目标,而不是回答问题。示例:

intent: 目标规划(不是查事实)
target: 灰烬护符(候选:装备,id=E12)
player_state: 已完成「山道通行」;未解锁「沉钟港」
constraints: 版本=当前;不含可选支线=未指定
need_clarify: 否

每个字段都对应一种失败。intent用来区分“这件东西掉在哪”和“怎么最快拿到”,这两类问题走不同的通路,区别可以看查事实与规划步骤为什么是两种问题target必须落到图里的具体实体编号,而不是一段文字,因为“灰烬护符”可能同时有普通版和强化版,落不到唯一编号就要追问。player_state来自玩家已经授权使用的游戏进度,它决定后面哪些节点可以直接剪掉。

注意,这张单上没有任何“答案”。如果大模型在这一步就顺手编出一串任务名,后面的图系统反而会被这些捏造内容带偏。

大模型生成图查询:诱人,但要加约束

有人会想:既然大模型会写查询语句,直接让它写图数据库的查询不就行了?这条路可行,但风险清晰:

  • 虚构关系类型:图里只有“需要”“解锁”“产出”,模型却写出一个不存在的“推荐前置”,查询要么报错,要么悄悄返回空。
  • 漏掉版本条件:忘了过滤版本,取回的可能是旧版本的任务条件。
  • 遍历失控:不限深度的展开可能拖垮图库,返回几千个无关节点。
  • 越权操作:查询里混入写入或删除语句。

爱游戏的做法是收紧这条通路:目标单先转成有限种类的查询模板(例如“依赖展开”“反向来源”“可并行分组”),大模型只填参数;关系类型和实体编号按图的模式(schema,图里允许的实体和关系定义)校验;查询一律只读,限定展开深度和返回数量;版本条件由系统自动附加,而不依赖模型是否记得写。模型的灵活性放在理解问题,而不是自由拼接查询。

第二张单:路径单

图系统拿到目标单后,沿“需要”“前置”“解锁”等边反向展开依赖,得到路径单。它不是一条线,而是带状态的一棵依赖树:

灰烬护符
├ 需要 冷铁碎片×3
│  └ 来源:沉钟港矿道(未解锁 → 需 完成「潮汐信标」)
├ 需要 任务奖励「守夜人印记」
│  └ 前置:山道通行(已完成,剪枝)
└ 可选:铁匠强化(不影响获得)

路径单里的关键信息有:每个节点的完成状态(已完成的剪掉)、边的类型(必需、可选、互斥)、哪些节点可以并行、每步的预估耗时或风险标签。这里体现了图的价值:它能表达“先做A再做B”,也能表达“A和B互不依赖,可以交替做”。关于依赖边的语义设计与剪枝,目标导向图和普通实体图的区别里有更完整的讨论。

“最短”和“最快”常常不一致:路径最少的方案可能要穿过一个高风险区域,而稍长的方案更安全。所以路径单会保留几条候选和各自的代价说明,而不是只给一条。

路径结果的校验

路径单交给Agent之前,还要过一道机器校验,因为图谱本身可能缺边、错边或存在环:

  1. 无环检查:依赖里出现循环,说明数据有误,需要标记并回退。
  2. 悬空检查:路径中每个节点都能在当前版本里找到,不能引用已删除的任务。
  3. 互斥检查:不能同时要求“选择A阵营”和“选择B阵营”的两个分支。
  4. 状态一致:玩家已完成的节点不得再次出现在剩余步骤里。

通不过校验的路径不会交给Agent,而是触发降级。这一层不依赖大模型,是纯规则,成本低、结果确定。

第三张单:步骤单

Agent这时才开始“说人话”:把路径单整理成编号步骤,并保留必要标注。它可以调整语气和顺序,但不能新增路径单里没有的任务。步骤单的每一行带有对应的图节点编号,玩家点开可以看到来源与适用版本。这样,当一个步骤有问题时,能追溯到是路径单的问题还是措辞的问题。爱游戏App展示步骤时,也倾向于带着节点来源。这一环节与让答案带来源和版本的思路是一致的。

多轮追问:改约束,不要重头再来

玩家常常接着问:“我不想做那个支线,还有别的办法吗?”这时正确做法是修改目标单里的约束字段(例如排除某个任务节点),再次走图查询,而不是让大模型凭上一轮的印象重新编一个方案。上一轮的目标单和路径单要保存下来,这样追问“为什么要先去沉钟港”时,可以直接指出对应的依赖边。如果图里确实不存在绕开它的路径,系统应当明说“当前数据里没有替代路线”,而不是勉强拼凑一个。

某一段失败时怎么降级

失败位置 表现降级做法
目标单 实体无法唯一确定 向玩家追问“是普通版还是强化版”
图查询 超时或模板不匹配退回文本检索,只给“需要哪些前置”的说明,并标注未做完整规划
路径校验 发现环或悬空节点提示该内容正在核对,不输出可疑路径
步骤单 措辞与路径不符 丢弃措辞,直接展示结构化路径

降级的原则是:宁可少说,也不要用不可靠的内容填满答案。对玩家而言,一句“这条路线暂时无法确认”,比一份错误的清单更节省时间。