G²PRO 文章解读
解读 G²PRO 如何用用户时空知识图谱组织候选线索,以 LLM 梯度归因为图提示打标签,并训练轻量选择器优化 POI 推荐。
G²PRO: Gradient-guided Graph Prompt Optimization for LLM-based POI Recommendation
把「下一个地点推荐」交给大模型时,你要往 prompt 里塞多少张附近店铺的信息卡?塞少了模型不知道,塞多了模型被淹没。 这篇论文的答案很有意思:不要人写规则去挑,让 LLM 自己的梯度来告诉你哪张卡有用。
G²PRO 的整条主线可以压成一句话:图结构负责「有哪些候选线索」,梯度归因负责「哪些线索真的管用」,一个轻量 GNN 负责把这个判断学下来,推理时替代掉昂贵的梯度计算。 下面我们从最外层的问题背景开始,一层层剥到它最巧的那个设计。
本文有 3 个可交互图版(拖滑块、点节点、切换分支),它们是理解这篇论文的主要抓手,建议动手玩。论文原图直接取自 PDF,可点击放大查看。数学细节都折叠在「深入」块里。
前置知识:这个任务和这类模型长什么样
如果你已经熟悉 next-POI recommendation 和「生成式 LLM 做推荐」的范式,可以直接跳到三个挑战。这一节把四个前提交代清楚。
Next-POI Recommendation
在 LBSN(基于位置的社交网络,如 Foursquare)里,每个用户留下一串签到记录 (POI, 时间戳)。 给定用户 \(u\) 在 \(t_n\) 之前的历史轨迹 \(T_{t_n}\),预测他在 \(t_{n+1}\) 会去的下一个地点。 每个 POI 是一个四元组 (id, category, lat, lon)——既有语义属性也有连续的时空坐标,这个「双重身份」是全篇矛盾的来源。
时空小模型
RNN/LSTM 路线(LSTPM)建模长短期偏好;Transformer 路线(TAPT)联合预测时间和地点; 图路线(GETNext、STHGCN)把全局 POI 转移关系建成图再做卷积。 它们的共同点:所有时空规律都学在 embedding 里——效果扎实,但那是一堆隐向量,没法直接说给 LLM 听。
把排序题改写成填空题
不再输出一个打分向量,而是拼一段 prompt——「候选集 + 历史轨迹 + 问题」,让模型生成下一个 POI 的 id 文本。 再用 beam search(论文里 width=10)拿到多条候选生成路径,按生成概率排序,就得到了 top-K 推荐列表。 模型本体冻结,只用 LoRA(\(r=8,\alpha=16\))微调,让它学会「照这个格式答题」。
RAG:检索来的东西塞进 prompt
LLM 不知道「\(p_1\) 在 \(p_{10}\) 隔壁」「大家逛完 \(p_3\) 常去 \(p_9\)」这类本地知识。 标准做法是检索相关信息、转成自然语言、拼进 prompt——这就是 Retrieval-Augmented Generation。 G²PRO 全篇要解决的,正是这个「检索什么、检索多少」的问题。
核心矛盾:Modality Gap
把上面两条路线并排看,问题就出来了:时空知识住在连续向量空间,语言推理住在离散 token 空间。 小模型能捕捉「周五晚上从办公楼出来的人,八成往酒吧区走」这种模式,但它只能把结论写成一个隐向量; LLM 有很强的序列推理和常识,但你必须用文字告诉它这件事。中间这道墙,论文叫 modality gap。
架桥的最朴素办法就是——把图上的关系全部翻译成句子塞给 LLM。而这篇论文的出发点是:这么做会立刻撞上三堵墙。
三个挑战

语言推理与时空感知的不对称
LLM 擅长语言序列,但缺乏对真实空间/时间语义的 grounding,直接问它容易产生幻觉; 时空模型能在 embedding 层面吃透这些模式,可这些知识被困在隐表示里,无法在 LLM 推理时直接复用。 两边各有各的强项,却接不上线。
时空数据天然的检索瓶颈
POI 的空间关系形成的图有很强的社区结构——局部极度稠密、全局非常稀疏。 于是一旦把这些关系转成文本做 RAG,检索结果会塌缩到一小片密集的本地邻域:几十上百条「\(p_1\) 在 \(p_{10}\)、\(p_{13}\)、\(p_{105}\)、…、\(p_{543}\) 附近」。 上下文被撑满,延迟上升,噪声反而拖垮推理。
缺少判别有效线索的原则性机制
不同的 prompt 片段对模型输出的影响差异巨大,但现有方法把所有上下文一视同仁。 于是 prompt 构造停留在手写启发式(「取最近的 20 个邻居」),不可优化—— 你无法回答「这条信息到底帮没帮上忙」,也就无法系统性地改进它。
方法总览:三件套
G²PRO 对着这三堵墙给了三个部件,并且它们是串起来的:
| 部件 | 解决 | 一句话 |
|---|---|---|
| UST-KG | 挑战一 | 用户行为时空知识图谱:把时空关系显式建成异构图,既能喂 GNN,也能翻译成人话喂 LLM |
| GPS | 挑战二 | Graph Prompt Selector:轻量 GNN + 序列解码器,从图里只挑十几个结构上有信息量的节点 |
| GP²L | 挑战三 | 用 LLM 对 prompt embedding 的梯度反推「哪条 hint 真的有贡献」,把它当作 GPS 的监督标签 |

训练时贵的那一步(跑 LLM 梯度)只做一次,产出标签;推理时只跑那个几十万参数的 GPS。 论文自己的说法是:「把昂贵的推理成本前置到预处理」。这也是全文效率分析的核心论点。
UST-KG:把签到记录变成一张有类型的图
UST-KG(User-behavior Spatio-Temporal Knowledge Graph)是一个以用户为中心的异构图 \(G_{t_n}=\langle V,\mathcal E,\Phi,\Psi\rangle\)。 节点只有一种类型(POI),但边有四种,这四种边就是全篇的信息单元:
空间邻近:\(\operatorname{dist}(\mathrm{loc}_i,\mathrm{loc}_j)\le\delta\)。纯地理,跟谁去过没关系。
同类别:两个 POI 属于同一个 category。提供语义上的替代关系。
个人转移:这个用户确实在 \(p_i\) 之后直接去过 \(p_j\)。个性化行为。
全局转移:\(\operatorname{Freq}(p_i\to p_j)\ge\tau\),全体用户中高频出现的一步转移。群体规律。
节点集也定义得很克制:只包含出现在该用户轨迹里的 POI,以及与轨迹 POI 有至少一条一跳关系的 POI。 换句话说,这是围绕一条轨迹长出来的局部图,不是全城大图——这直接决定了它的规模(NYC 平均 132.6 个节点,TKY 328.5 个)。
UST-KG 是「双重用途」的。当成异构图,它喂给 GNN 做消息传递(挑战一的左半边);当成知识图谱,取一个 POI 的一跳子图翻译成自然语言,它就是 LLM 的 prompt hint(挑战一的右半边)。同一份结构,两种消费方式——这就是它架桥的方式。
动手:把这张图搭出来
下面这张示意图有 16 个 POI 和一条 5 步的用户轨迹(橙色虚线)。四类边可以逐个打开,near 的半径 δ 可以拖。 点任意一个节点,右边会实时生成它的一跳子图对应的 hint 文本——这正是模块 ③ 干的事。
把 δ 拉大,或者把四类边全部打开,看右下角「全塞 tokens」的变化——这就是挑战二。论文实测:NYC 的图平均 132.6 个节点,若全量描述会远超上下文预算;GPS 最终只留 18.43 条 hint、约 2045 tokens。
深入:UST-KG 的形式定义与在线更新
\(\Psi:\mathcal E\to T_{\mathcal E}\),其中 \(T_{\mathcal E}=\{\mathrm{near},\mathrm{cate},\mathrm{trans}^{u},\mathrm{trans}^{o}\}\)。对边 \(e=(v_i,v_j)\):
- \(\Psi(e)=\mathrm{near}\iff\operatorname{dist}(\mathrm{loc}_{p_i},\mathrm{loc}_{p_j})\le\delta\)
- \(\Psi(e)=\mathrm{cate}\iff p_i\) 与 \(p_j\) 同类别
- \(\Psi(e)=\mathrm{trans}^{u}\iff(p_i,t_i),(p_j,t_j)\in T^{u}_{t_n}\) 且 \(t_i\lt t_j\)(该用户直接相继访问)
- \(\Psi(e)=\mathrm{trans}^{o}\iff\operatorname{Freq}(p_i\to p_j)\ge\tau\)(全体轨迹中的高频一步转移)
在线更新:新签到 \(p_n\) 到来时,它和它的一跳关系被增量加进 \(G_{t_n}\),不需要全局重建。这对线上系统很重要——图是跟着用户走的,不是每天离线重跑一次。
GPS:用「意图向量」去匹配节点
图建好了,接下来要回答挑战二:从一两百个节点里挑哪十几个? GPS(Graph Prompt Selector)的做法是一个很干净的双塔匹配。
关键在于并行的那一支:一个 Transformer 序列解码器把用户历史轨迹编码成一个动作向量 \(a_{t_n}\)—— 论文的措辞是「模型在当前序列上下文条件下的选择意图」。然后打分就是这两者的余弦相似度:
最后不是取固定的 top-20,而是先用 z-score 找离群点,再截 top-k:
阈值是自适应的:\(\mu+1.5\sigma\) 意味着「比这张图上的平均节点显著突出的那些」。 如果一张图上所有节点都同样平庸,它就一个都不选;如果有几个特别突出,它才选。 这跟固定 top-20 的行为完全不同——后者不管有没有好线索都硬凑 20 条。 同样的 \(1.5\sigma\) 规则在下文 GP²L 打标签时会再出现一次,是全篇一以贯之的「只要离群点」哲学。
拼 Prompt:四个块,和一个反直觉的设计
完整 prompt 是四段字符串拼接:
- \(P_{\mathrm{cand}}\) 候选集——把 prompt 里出现过的所有 POI 汇总成一个显式候选空间。
- \(P_{\mathrm{hint}}\) 图感知提示——GPS 选出的每个节点,把它的一跳子图写成一句描述。这是全篇唯一「可优化」的部分。
- \(P_{\mathrm{history}}\) 历史轨迹——最近 \(h\) 条签到,按时间顺序列 id 和时间。
- \(P_{\mathrm{QA}}\) 问答指令——「在 \(t\) 时刻用户会去哪个 POI id?从候选列表中恰好选一个。」
论文的理由是一句朴素但重要的观察:「LLM 倾向于生成 prompt 里出现过的实体。」 与其让模型在几万个 POI id 里自由发挥(然后幻觉出一个不存在的 id),不如先把可能的答案显式圈出来。 这既是引导,也顺便避免了在各段之间重复描述同一个 POI——附录 D 还提到,同类型的边描述会合并成一句来省 token。
Hint 是怎么从图变成句子的
对 GPS 选中的每个节点 \(v\in N_I\),取它的一跳子图 \(G_{t_n}(v,1)\), 先写这个节点自己的属性,再写它所有关联边的语义。四类边各自对应一种句式:
| 边类型 | 生成的句子 |
|---|---|
| \(\mathrm{trans}^{u}\) | POI id {p}: Is a {category}. User visited {k} times, last on {t}. |
| near / cate | POI id {p}: Is a {category}. Near {…}. Same category as {…}. |
| \(\mathrm{trans}^{o}\) | POI id {p}: Is a {category}. Most users visited {q} after visiting {p}. |
动手:拼一条 prompt,看它怎么改变答案
下面复现论文 5.8 节的三个真实 case(用的是论文里的 POI id 和真实排序结果)。 切换 case,再打开/关掉 \(P_{\mathrm{hint}}\),看 LLM 的 top-5 怎么翻转。左边的 \(k\) 滑块控制 hint 条数,token 数用的是论文 Figure 4 的实测曲线。
三个 case 对应 hint 的三种作用机制:直接支撑(图上有一条边直接指向答案)、丰富选项(把被历史压住的合理选项抬进候选)、抑制竞争(说清那个「看起来很像」的干扰项其实不对)。 注意第三种——hint 的价值不总是加分,也可以是减掉一个错误答案的分。

GP²L:全文最巧的那一步
到这里所有部件都就位了,只剩一个问题——也是挑战三的正面回答:
GPS 是个需要监督训练的模型。可是谁来告诉它「哪个 POI 节点值得放进 prompt」?数据集里没有这个标签。
你可以想些糙办法:随机选、按 embedding 相似度选、拿「目标 POI 和它的一跳邻居」当正样本。 论文在 Table 8 全试了一遍,最好的糙办法也比正解差 2.33%(NYC),最差的差 11.48%。
G²PRO 的答案是直接去问 LLM 本人——不是问它「你觉得哪条有用」(那不可靠),而是看它的梯度。 论文原话:「与常规梯度归因主要用于事后分析不同,GP²L 把反转的梯度归因当作显式的监督机制。」
第一步:Grad × Input 得到 token 级归因
一次 forward:prompt 编码成 embedding \(\mathcal E_{t_n}\),其中第 \(i\) 条 hint 占据的那段记作 \(\mathcal E_h^i\)。 把 hint 段当变量、其余当常量,整个 prompt embedding 就是 hint 的函数:
然后对目标下一个 POI 的 token 算交叉熵,反传到每个 token embedding 上,再和 embedding 本身逐元素相乘:
这就是经典的 Grad×Input——一阶泰勒展开下,\(\langle g,\Delta e\rangle\) 近似「把这个 token 从零基线扰动到现在的值,输出变了多少」。 论文特意不把它塌缩成标量点积,而是保留逐维度的 \(g\odot e\),最后取 \(L_2\) 范数——因为正负维度点积会相互抵消,而他们想要的是影响强度而非净方向。
第二步(关键):对比归因
常规归因衡量的是「输入变量对当前模型输出的贡献」。可当模型输出的就是错的那个答案时, 归因高的 token 恰恰是把它带偏的那些——你如果照单全收当正样本,就等于在训练 GPS 去挑那些坑人的 hint。
为此论文再算一份「面向当前预测」的损失和归因,然后做差:
\(a_{\Delta}\) 大,意味着这个 token 推动模型走向正确答案的力度,超过它强化当前(错误)预测的力度。 于是最终用哪个归因,取决于模型这次答没答对:
第三步:聚合成 hint 权重,z-score 打标签
注意 \(T_i\):只取这条 hint 里归因最高的 \(n\) 个 token 求和,而不是全部相加。 否则长 hint 天然占便宜——这是个朴素但必要的归一化。得到的 \(l=[l_1,\ldots,l_{\lvert G\rvert}]\) 就是 GPS 的二分类训练标签。
动手:走一遍 GP²L
下面是 8 条 hint 的一次打标签过程。最有意思的是右上角那个开关:把「模型这次答错了」打开, 再对比「只用 \(a_{\mathrm{tgt}}\)」和「用 \(a_{\Delta}\)」两种归因——你会看到 h2 和 h6 这两条只是在强化错误答案的 hint 如何被识别出来并剔除。
示意数值,用于演示机制。真实实现中 \(a^{i,j}\) 是 hidden-dim 维向量、每条 hint 有几十个 token;论文对每条 hint 只取 top-n token 的 \(L_2\) 范数求和。
深入:两个工程细节(效率 & 标签验证)
① 批处理归因(5.4 节)。朴素做法是每个候选节点单独跑一次归因,复杂度 \(O(N\times\mathrm{infer\_time})\)——候选集一大就废了。 GP²L 改成批级:一次 forward-backward 里同时处理多个候选(batch=30),摊薄推理开销。 实测每 100 个节点:NYC 从 144.53s 降到 19.62s,TKY 从 189.9s 降到 20.12s,7 倍以上加速。
但增益不是随 batch 单调的:batch 越大,重复推理开销越省,可 token 级梯度计算量在涨,尤其当总 token 数接近 GPU 并行上限(约 5k tokens)时会掉头。论文测出的最优采样数是 20–40,且是硬件相关的(他们用单张 RTX 6000 Ada 48GB)。这也解释了 Figure 3 右图为什么在 40 之后回升。
② 标签验证机制(附录 F)。式(20)的 z-score 假设「这 \(k\) 条里至少有一条是真正的正样本」——但这个假设有时不成立。 于是打完标签后还有一道保险:把被标为正的 hint 单独组一个 prompt 跑一遍,检查目标 POI 是否出现在 LLM 的 top-5 beam 输出里。 如果没有,就判定这批正标签无效,把这 \(k\) 条全部当负样本。这是个保守过滤器,会减少正样本数量,但显著提升标签精度且不增加时间复杂度。

训练与推理:三阶段流水线
LoRA 微调基座 LLM
先只用基础 prompt(\(P_{\mathrm{cand}}+P_{\mathrm{history}}+P_{\mathrm{QA}}\),不带 hint)微调 \(M_{\mathrm{base}}\),得到任务适配后的 \(M_{\mathrm{fine}}\)。这一步只是让模型学会答题格式和基本的轨迹模式。
GP²L 打标签 → 训练 GPS
按 mini-batch 遍历 UST-KG 节点,每次随机采 \(k\) 个节点拼成 hint prompt,喂 \(M_{\mathrm{fine}}\) 做一次 forward + backward,只对 hint 段的 embedding 开梯度追踪,产出二值标签。一张有 \(\lvert G\rvert\) 个节点的图需要 \(\lceil\lvert G\rvert/k\rceil\) 次前反向,就能覆盖全部节点。用这些标签监督训练 GPS。
推理:GPS 选点 → 拼 hint → 生成
训练好的 GPS 在 UST-KG 上打分选节点,按 4.2.2 拼进 prompt,\(M_{\mathrm{fine}}\) 用 beam search(\(B=10\))生成排序列表。推理路径上完全没有梯度计算——GPS 单次推理只要 54.8s / 1000 样本,是 LLM 推理(2495s)的 2%。
「这个方法把昂贵推理的一部分转移到了预处理阶段,用训练好的 GPS 实现高效的在线 hint 选择。」GP²L 打标签在 NYC 要 3372.6s / 1000 样本,比 LLM 微调(923.4s)还贵 3.6 倍——但它只付一次。
实验:它到底好在哪
设置
四个数据集:Foursquare 的 NYC(22.7 万签到 / 1,083 用户 / 38,333 POI / 482.8 km²)和 TKY(57.4 万 / 2,293 / 61,858 / 212.0 km²)是城市级; Weeplaces 的 Cal(97.2 万 / 5,250 / 99,733 / 423,967.5 km²)和 Flo(13.7 万 / 2,064 / 25,287 / 139,670 km²)是州级——空间覆盖大三个数量级,POI 分布稀疏得多。 预处理去掉签到数 <10 的用户和 POI,轨迹按 48 小时间隔切分,按时间 8:1:1 划分。 基座是 Qwen3-4B 和 Llama3-8B,单卡 RTX 6000 Ada(48GB),LoRA \(r=8\)、\(\alpha=16\)、\(\mathrm{lr}=2\times10^{-4}\),使用 FP16。 GPS 是 (128, 256, 128) 三层、4 个 GAT 头 + 8 个 Transformer 解码头,训 5 个 epoch。所有结果取 3 次独立运行平均。
主结果
切换数据集和指标看对比。橙色为 G²PRO,蓝色为传统时空模型,紫色为 LLM 方法。
三个值得单独说的发现
它同时解决了 recall–ranking 的两难
论文观察到一个普遍现象:传统模型 recall 高、排序差(候选覆盖广但排不准),LLM 方法排序好、recall 低(细粒度排序强但候选面窄)。 比如 MTNet 在 TKY 的 Recall@10 达 0.6147,超过多数 LLM 方法,但 Acc@1 和 MRR 明显落后。 G²PRO 把这两件事解耦了——UST-KG 负责时空上的全面召回,GPS 负责把带完整 POI id 的图 hint 送进去,让 LLM 在一个更丰富且更相关的候选集上排序。结果是 Recall@5、Recall@10、NDCG、MRR 同时涨。
换基座依然稳
Table 3 用 Llama3-8B 重跑了一遍 NYC:G²PRO 拿到 Acc@1 = 0.4244(Qwen3-4B 是 0.4160),依然大幅领先所有基线。 对照组里 LLM4POI 从 Qwen 上的 0.3861 掉到 Llama 上的 0.3235,CoMaPOI 从 0.2861 掉到 0.2530——基线对基座敏感,G²PRO 不敏感。 这支持了论文的论点:提升来自框架本身,不是某个基座的特性。
有 36% 的样本是「救不回来的」
Table 9 做了个很诚实的拆解:把训练集按「静态 prompt 下目标 POI 能否进 top-5」分成 optimizable(约 64–65%)和 unopt.(约 35%)两部分。 在可优化的那部分,Acc@1 冲到 0.7975(NYC)/ 0.7301(TKY);而在不可优化的那部分,Recall@10 还有 0.8644,Acc@1 却只有 0.1717—— 说明目标 POI 一直被以高置信度排在低位。这等于给出了方法的能力边界:hint 能重排候选,但救不了模型完全没考虑到的目标。
消融:哪种边最重要?
Table 7,四个指标的平均相对下降。切换数据集会看到一个耐人寻味的差异。
选点策略对比:证明 GP²L 标签确实有用
Table 8 是这篇论文最有说服力的一张表——它直接回答「梯度打标签是不是多此一举」:
| 选点策略 | Acc@1 | Recall@10 | NDCG@10 | MRR | 平均降幅 |
|---|---|---|---|---|---|
| NYC | |||||
| GP²L 训练的 GPS | 0.4160 | 0.6927 | 0.5518 | 0.5066 | — |
| ① 随机选 | 0.3502 | 0.6396 | 0.4933 | 0.4467 | −11.48% |
| ② embedding 相似度 | 0.3542 | 0.6396 | 0.4943 | 0.4482 | −11.12% |
| ③ 简单监督(目标+一跳邻居为正) | 0.3995 | 0.6876 | 0.5405 | 0.4937 | −2.33% |
| TKY | |||||
| GP²L 训练的 GPS | 0.3743 | 0.6552 | 0.5104 | 0.4645 | — |
| ① 随机选 | 0.3500 | 0.6138 | 0.4788 | 0.4359 | −6.29% |
| ② embedding 相似度 | 0.3515 | 0.6185 | 0.4815 | 0.4380 | −5.77% |
| ③ 简单监督 | 0.3535 | 0.6277 | 0.4860 | 0.4411 | −4.90% |
读法:策略 ① 在 NYC 上甚至比完全不给 hint 还差(对照 Table 7 的 no-hint = −13.04%,随机 = −11.48%,几乎一样糟)—— 乱塞信息约等于不塞。策略 ③ 用「目标 POI 及其一跳邻居为正样本」这种直觉监督已经相当强了(只差 2.33%), 但仍稳定劣于梯度标签。差距不大,但四个指标、两个数据集上一致——这正是这篇论文真正在论证的东西。
成本账
| 数据集 | LLM 微调 | LLM 推理 | GPS 训练 | GPS 推理 | GP²L 打标签 |
|---|---|---|---|---|---|
| NYC | 923.4s | 2495.0s | 65.1s | 54.8s | 3372.6s |
| TKY | 927.9s | 2450.3s | 76.0s | 87.4s | 3633.7s |
单位:秒 / 1000 样本。左边三列(微调、打标签、GPS 训练)都是一次性离线成本;线上只有 LLM 推理 + GPS 推理,后者只占 2%。
怎么看这篇
它做对了什么
- 把一个启发式问题变成了可优化目标。「往 prompt 里塞什么」长期是手工艺,这篇给了一个有监督信号的闭环。这个思路不限于 POI——任何 graph-RAG 场景都能套。
- 对比归因这一手很干净。「模型答错时,常规归因解释的是错误答案」这个观察本身不新,但把 \(a_{\mathrm{tgt}}-a_{\mathrm{pred}}\) 用作标签生成而非事后解释,是个漂亮的视角反转。
- 成本结构诚实。没有掩盖 GP²L 很贵(比微调还贵 3.6 倍),而是明确论证「它只付一次,且换来的是线上 2% 开销的选择器」。Table 5/6 把账摊开给你看。
- Table 9 的能力边界拆解。主动指出 35% 的样本方法根本帮不上忙,这在推荐系统论文里不多见。
我会追问的地方
- 必须是白盒模型。GP²L 要拿 LLM 对输入 embedding 的梯度,闭源 API 模型(GPT/Claude)用不了。这把方法限制在自托管开源基座上。
- 一阶归因当「真实因果贡献」仍是近似。Grad×Input 是零基线下的一阶泰勒展开,对高度非线性的 attention 路径未必忠实——附录 E 承认了这个假设("under the assumption of local smoothness")。标签验证机制(附录 F)某种程度上是在给这个近似打补丁。
- 超参耦合得比较紧。\(k\)(每轮采样数)既影响标签质量,又影响归因效率的甜点区,还是硬件相关的(论文说最优值 20–40 取决于 GPU 并行上限)。换一张卡就要重调。
- \(1.5\sigma\) 这个魔数出现了两次(GPS 选点、GP²L 打标签),但没有敏感性分析。它承担的分量不小。
- 州级数据集上的相对优势小很多。NYC/TKY 平均提升 7.2%/5.7%,而 Table 4 的 FLO/CAL 上,G²PRO 的 Acc@1(0.2430/0.2564)领先第二名(0.2367/0.2370)幅度明显收窄。POI 分布一稀疏,图上的邻近关系信息量就下降——这和消融里 NYC 对 trans 边不敏感(各类边单独去掉只掉 0.7~1.2%)而 TKY 敏感(4~5.6%)是同一件事的两面:图 hint 的价值高度依赖数据密度。
G²PRO 真正的贡献不是「图 + LLM 做 POI 推荐」——那已经有一堆工作了。它的贡献是给 prompt 里的每一条上下文赋予了一个可测量、可学习的价值, 并且证明了这个价值信号比任何手写规则都更好。如果你在做任何形式的 retrieval-augmented 系统,这个「用下游模型的梯度反向定义检索质量」的框架值得抄。
