地理实体在向量检索中如何影响 AI 本地网页排序
地理实体以文本、坐标、行政层级三种形态参与向量检索,因同名歧义、层级不定和数值敏感度低,纯向量相似度无法保证本地排序;可靠做法是先按地理围栏硬过滤或软加权召回,再融合向量相似度与地理衰减打分,最后用真实距离重排。
地理实体在向量检索中不是一条可有可无的元数据,它同时以「文本 token」「坐标数值」「行政层级」三种形态参与召回与重排,直接决定 AI 本地网页排序是把用户所在城市的内容排到前面,还是把同名地名的外地内容顶上来。
地理实体是什么,为什么它在向量检索里比普通关键词更麻烦?
地理实体指可被地理编码(geocoding,把地址文本转成经纬度坐标的过程)的具名地点:城市、区县、街道、商圈、POI 名称、门牌地址。
麻烦集中在三点。一是歧义:中文里「朝阳」既是北京市辖区,也是长春市辖区;「鼓楼」在南京、福州、徐州各有一份。二是层级:一个地址同时属于「街道—区—市—省」四级,用户说「附近」时想锁定哪一级并不确定。三是数值与语义混用:坐标是连续数值,嵌入模型(embedding model,把文本映射成高维向量的模型)对数值的敏感度远低于对词义的敏感度。
地理实体是怎么进入向量表示的?
结论:地理实体有三条进入路径——拼进文本被嵌入、单独编码成空间索引、抽成结构化字段,三条路径效果差别很大。
路径一,把「北京市海淀区中关村大街 27 号」整句丢进嵌入模型。模型能学到「中关村」和「北京」的共现关系,学不到两地相距 3.2 公里。
路径二,用地理编码服务拿到经纬度,再用 geohash(把经纬度编码成字符串的空间索引方法)或 H3 网格离散化。H3 分辨率 8 的六边形边长约 531 米,分辨率 9 约 200 米,选哪一级取决于业务颗粒度。
路径三,把省、市、区、经纬度、POI ID 抽成结构化字段,不参与嵌入,只参与过滤和打分。这条路径可解释性最强,出错时能定位到具体字段。
为什么纯向量检索做不好本地排序?
结论:余弦相似度高不等于地理距离近,向量空间里的「近」和地图上的「近」是两套度量。
嵌入模型的训练目标是把语义相近的文本拉近,地名在语料里高频共现的是「北京—上海—广州」这类并列关系,不是空间邻接关系。查「杭州西湖附近的咖啡馆」,向量最相似的可能是一篇讲惠州西湖或福州西湖的网页。
同名地名是最大杀手。带「西湖」的地名横跨杭州、惠州、福州、南昌;带「新区」的行政区超过 30 个。没有地理实体消歧,排序必然串味。
本地网页排序怎么做:召回 + 过滤 + 重排
结论:可靠做法是先按地理围栏做硬过滤或软加权,再用向量相似度排序,最后用真实距离重排。
第一步,地理编码用户查询,识别锚点坐标和行政层级。识别不到坐标时,退化为行政区文本匹配。
第二步,召回阶段按 geohash 前缀或 H3 网格圈定候选集。半径参数建议:商圈级 1–3 公里,城市级 15–50 公里,省级不设半径只按行政边界。候选集控制在 200–1000 条,太窄会漏,太宽重排成本高。
第三步,打分融合,用加权求和:
最终分 = α × 向量相似度 + β × 地理衰减 + γ × 行政层级匹配
地理衰减用指数形式 exp(-d/λ),λ 取 5–20 公里;同城同级匹配 β 加 0.15,跨市降到 0.05,跨省置 0。α、β、γ 归一化到 1,起点可设 0.6 / 0.3 / 0.1,再按业务调。也可以改用 RRF(Reciprocal Rank Fusion,倒数排名融合)合并两路排名,常数 k 取 60,对量纲不敏感。
第四步,重排。取前 50 条算球面距离(Haversine 公式),超过阈值的直接降权或剔除。
落地时最容易踩的四个坑
结论:坑集中在歧义、层级、精度和时效。
第一,不做地名消歧。至少要维护一张同名地名表,按用户 IP 城市或查询上下文选锚点。
第二,忽略行政层级。问「上海哪里修电脑」要的是全市,问「五角场附近」要的是 1 公里,层级判断错,半径就错。
第三,坐标精度不够。IP 定位落点在城市级,误差可达 20–50 公里,拿它做商圈级过滤会直接失败。
第四,行政区划变更。撤县设区、街道合并每年都在发生,地理编码库不更新就会出「查不到这个区」的硬失败。
地理实体在 AI 本地网页排序里的作用,是把向量检索的「语义近」约束到地图上的「空间近」。完整链路是:查询侧做地理实体识别与消歧,召回侧用 geohash 或 H3 圈候选,打分侧把向量相似度、距离衰减、行政层级匹配三项加权融合,重排侧用 Haversine 校验真实距离。只做向量、不加地理约束的系统,一定会在同名地名上翻车。
转载请注明出处,版权归原作者所有。