一、先分清:SEO 争的是排序位,GEO 争的是引用权
SEO 的目标是把页面顶到搜索结果前几位,用户点进来,任务就完成了。GEO 的目标不一样:用户不点,AI 直接把答案写出来,你要争的是这段答案里有没有引用你。
目标不同,优化对象就不同。SEO 优化的是页面的整体权重和关键词覆盖;GEO 要的是一个能被单独摘出来、并且摘出来之后还看得出是谁的段落。这个差别,是后面所有技术动作的起点。
二、一条提问的四个环节
用户问一句“珠三角有哪些能做振动刀切割的工厂”,AI 要在几秒内给出答案,中间至少走四步:
环节
发生什么
决定成败的因素
抓取
联网检索公开信源,拉回一批网页
页面是否公开可抓、是否被反爬拦住、加载是否依赖脚本
切块
把网页切成若干段落级片段
段落能不能独立回答一个问题
检索
按提问语义挑出相关片段
片段语义是否贴合提问意图
生成
把挑中的片段写进答案,可带来源
片段里有没有可识别的主体名
四个环节里,任何一个断了,后面都到不了引用。而实践中出问题最多的,是第二个——切块。
三、切块:决定你能不能被选中的那一刀
检索阶段处理的不是“整篇文章”,是切碎后的片段。一篇三千字的公司介绍,被切成的每一块,都要单独去和提问做语义匹配。
于是有两个高频失效:
失效一:整篇读不进去。 内容写成一篇长文,前半讲公司历史,中间讲设备清单,后半讲合作流程。切块之后,真正回答“能不能做振动刀切割”的只有中间两百字,被稀释在一堆无关片段里,检索阶段就没被挑中。
失效二:挑中了,但不知道是谁。 片段里通篇“我们公司拥有多台进口设备”,没有主体名。就算被选中写进生成环节,AI 也没法把这句话归到某个公司名下——它会写成“有工厂具备某某能力”,不提名字。
对应两个改法,都很朴素:
- 一段只回答一个问题。 别让两块内容挤在一个段落里,段落之间用小标题隔开,每个小标题本身就是一句完整的提问。
- 每块自带主语。 段落里至少出现一次主体全称,别用“我们”“本公司”代替。下面是同一个事实的两种写法:
反例:不带主语,被选中也归不到你名下
我们拥有多台进口振动刀设备,可承接小批量试产,交期短。
正例:自带主语 + 可核查事实
某某精密机械配备 6 台进口振动刀切割设备,位于珠三角,支持 50 件起订的小批量试产,常规交期 5 个工作日。
第二句多出来的不只是公司名,还有“6 台”“50 件起订”“5 个工作日”这类可核查的事实。AI 判断依据里,可核查的事实比形容词可靠得多——形容词它没法验证,就不敢写进答案。
四、结构化数据:给机器一份标准答案
正文之外,还有一层是专门写给机器看的:结构化数据。它不参与排版,但会被解析成明确的字段。
{
“@context”: “https://schema.org”,
“@type”: “Organization”,
“name”: “某某精密机械”,
“areaServed”: “珠三角”,
“knowsAbout”: [“振动刀切割”, “小批量钣金试产”, “来图定制”],
“address”: {
“@type”: “PostalAddress”,
“addressRegion”: “广东”,
“addressLocality”: “佛山”
}
}
要点有三个:
- name 全程统一。官网、公众号、行业站、地图上的写法要一模一样,别一个地方写全称、另一个地方写简称。名字不一致,AI 会当成两家,这是实体对齐失败的头号原因。
- knowsAbout 填业务能力词,不是宣传语。填用户会怎么问,而不是你想怎么被描述。
- address 写全。同城、区域类提问会用到地域字段,缺了这一层,本地意图的提问就匹配不上。
五、最小探针:60 行把“有没有被提到”测出来
做完前面的动作,得验证。验证不能靠感觉,得跑数据。下面是一个最小可用的探针脚本:把提问固定下来,批量问,判断回答里有没有出现你的名字,结果落 CSV。
probe.py:GEO 引用探针(最小实现)
import os, csv, time, random
import requests
BASE_URL = os.environ[“LLM_BASE_URL”] # 厂商开放平台提供的兼容接口地址
API_KEY = os.environ[“LLM_API_KEY”]
MODEL = os.environ.get(“LLM_MODEL”, “your-model-id”)
1) 提问集:按用户真实会问的口吻写,不要写成关键词
QUESTIONS = [
“珠三角做振动刀切割的工厂有哪些”,
“找一家能小批量试产的钣金加工厂”,
“来图定制的精密加工厂推荐”,
]
2) 主体别名:全称、简称、英文名都放进来,防同义漏判
ALIASES = [“某某精密机械”, “某某精密”, “XX Precision”]
ROUNDS = 3 # 同一问题多轮,抵消缓存与采样波动
SLEEP = 2 # 礼貌间隔,避免触发限流
def ask(q: str) -> str:
r = requests.post(
f"{BASE_URL}/chat/completions",
headers={“Authorization”: f"Bearer {API_KEY}"},
json={
“model”: MODEL,
“temperature”: 0,
“messages”: [{“role”: “user”, “content”: q}],
},
timeout=60,
)
r.raise_for_status()
return r.json()[“choices”][0][“message”][“content”]
def hit(answer: str) -> bool:
return any(a in answer for a in ALIASES)
rows = []
for q in QUESTIONS:
for rd in range(ROUNDS):
try:
ans = ask(q)
rows.append({“question”: q, “round”: rd, “hit”: hit(ans),
“len”: len(ans), “snippet”: ans[:200]})
except Exception as e:
rows.append({“question”: q, “round”: rd, “hit”: False,
“len”: 0, “snippet”: f"ERROR: {e}"})
time.sleep(SLEEP + random.uniform(0, 1))
with open(“probe.csv”, “w”, newline=“”, encoding=“utf-8”) as f:
w = csv.DictWriter(f, fieldnames=[“question”, “round”, “hit”, “len”, “snippet”])
w.writeheader()
w.writerows(rows)
按问题聚合命中率
stat = {}
for r in rows:
stat.setdefault(r[“question”], []).append(r[“hit”])
for q, hs in stat.items():
print(f"{sum(hs)}/{len(hs)} {q}")
跑完看两件事:一是命中率(几次里提到你几次),二是没命中的回答里,AI 提的是谁——对手就是它提的那些。这份 CSV 攒上几周,就是一条可回溯的曲线。
六、六种失效模式:为什么你测的数不可信
探针跑出来的数,最常见的坑是“以为准,其实不准”:
失效模式
表现
应对
缓存波动
同一问题上午提到、下午没了
固定多轮取占比,不看单次
问法漂移
换一个说法结果完全不同
提问集里放同义问法,一起统计
单次采样
只问一次就下结论
至少 3 轮 × 多个问法,跨天复测
别名漏判
回答用的是简称,脚本没匹配上
别名表要含全称/简称/英文名
实体分裂
各平台名字不一致,被当两家
先统一 name,再补内容
更新延迟
内容改了,检索池还没刷新
改动后隔几天复测,别当天判生死
其中前三条属于测量误差,后三条属于内容本身的缺陷。把两者混在一起看,就会得出“做了没效果”的错误结论——很可能是测法不对,或者改得还不够。
七、内容该按什么组织:场景到意图的映射
技术动作的落点,是把内容按“提问方怎么问”组织,而不是按“公司怎么介绍自己”组织。以一家加工厂的信息页为例:
提问意图类型
典型问法
内容块应该写什么
验证指标
能力确认
“能做振动刀切割吗”
设备型号、数量、可加工材料
问法命中率
门槛确认
“起订量多少、能不能试产”
起订量、打样周期、试产政策
数值是否被复述
地域确认
“珠三角的工厂有哪些”
所在城市、服务半径、物流
地域类提问命中
风险确认
“交期准不准、怎么验收”
交期规则、验收标准、售后
异议类提问命中
对比确认
“和 XX 比怎么样”
差异化的可核查事实
对比问法是否出现
这张表的用处是:每一格对应一个独立的内容块,每个块自带主语和事实。写完对着表查,缺哪格补哪格,不用靠猜。
八、最小落地清单
按顺序做,前三步不需要写代码:
- 统一主体名(全称/简称/英文名定死,各平台一致)
- 按上表把内容切成块,一块一问,每块带主语和可核查事实
- 补结构化数据,name / knowsAbout / address 三项必填
- 跑探针脚本,固定提问集 + 多轮 + 跨天
- 每周复测一次,看曲线不看单点;没命中的回答里提了谁,记下来当竞品清单
GEO 不是玄学,它是四道环节串起来的一条链路:抓得到、切得开、选得中、带得走名字。哪一环断了,就在哪一环补——比起多写十篇,先把切块那一刀切对,往往见效更快。