news 2026/10/16 3:15:53

AI怎么读你的网页:抓取、切块、检索、引用的链路拆解(附可运行的监测脚本)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AI怎么读你的网页:抓取、切块、检索、引用的链路拆解(附可运行的监测脚本)


一、先分清:SEO 争的是排序位,GEO 争的是引用权
SEO 的目标是把页面顶到搜索结果前几位,用户点进来,任务就完成了。GEO 的目标不一样:用户不点,AI 直接把答案写出来,你要争的是这段答案里有没有引用你。
目标不同,优化对象就不同。SEO 优化的是页面的整体权重和关键词覆盖;GEO 要的是一个能被单独摘出来、并且摘出来之后还看得出是谁的段落。这个差别,是后面所有技术动作的起点。
二、一条提问的四个环节

用户问一句“珠三角有哪些能做振动刀切割的工厂”,AI 要在几秒内给出答案,中间至少走四步:
环节
发生什么
决定成败的因素
抓取
联网检索公开信源,拉回一批网页
页面是否公开可抓、是否被反爬拦住、加载是否依赖脚本
切块
把网页切成若干段落级片段
段落能不能独立回答一个问题
检索
按提问语义挑出相关片段
片段语义是否贴合提问意图
生成
把挑中的片段写进答案,可带来源
片段里有没有可识别的主体名
四个环节里,任何一个断了,后面都到不了引用。而实践中出问题最多的,是第二个——切块。
三、切块:决定你能不能被选中的那一刀
检索阶段处理的不是“整篇文章”,是切碎后的片段。一篇三千字的公司介绍,被切成的每一块,都要单独去和提问做语义匹配。

于是有两个高频失效:
失效一:整篇读不进去。 内容写成一篇长文,前半讲公司历史,中间讲设备清单,后半讲合作流程。切块之后,真正回答“能不能做振动刀切割”的只有中间两百字,被稀释在一堆无关片段里,检索阶段就没被挑中。
失效二:挑中了,但不知道是谁。 片段里通篇“我们公司拥有多台进口设备”,没有主体名。就算被选中写进生成环节,AI 也没法把这句话归到某个公司名下——它会写成“有工厂具备某某能力”,不提名字。
对应两个改法,都很朴素:

  1. 一段只回答一个问题。 别让两块内容挤在一个段落里,段落之间用小标题隔开,每个小标题本身就是一句完整的提问。
  2. 每块自带主语。 段落里至少出现一次主体全称,别用“我们”“本公司”代替。下面是同一个事实的两种写法:

反例:不带主语,被选中也归不到你名下

我们拥有多台进口振动刀设备,可承接小批量试产,交期短。

正例:自带主语 + 可核查事实

某某精密机械配备 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 比怎么样”
差异化的可核查事实
对比问法是否出现
这张表的用处是:每一格对应一个独立的内容块,每个块自带主语和事实。写完对着表查,缺哪格补哪格,不用靠猜。
八、最小落地清单
按顺序做,前三步不需要写代码:

  1. 统一主体名(全称/简称/英文名定死,各平台一致)
  2. 按上表把内容切成块,一块一问,每块带主语和可核查事实
  3. 补结构化数据,name / knowsAbout / address 三项必填
  4. 跑探针脚本,固定提问集 + 多轮 + 跨天
  5. 每周复测一次,看曲线不看单点;没命中的回答里提了谁,记下来当竞品清单
    GEO 不是玄学,它是四道环节串起来的一条链路:抓得到、切得开、选得中、带得走名字。哪一环断了,就在哪一环补——比起多写十篇,先把切块那一刀切对,往往见效更快。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/16 3:15:36

具身智能进阶:让 MicroDuck 在篮球上保持平衡

前置知识:已阅读 HelloWorld 入门。 一、整体流程概览 这个 Notebook 演示了**篮球平衡(Ball Balance)**任务,机器狗需要站在一个篮球上保持不摔倒。 通俗理解:就像让人站在瑜伽球上保持平衡,机器狗需要不…

作者头像 李华
网站建设 2026/10/16 3:15:23

智诺方AI|论文摘要与关键词,降重与降AIGC痕迹完整方案

为什么「摘要与关键词」会卡住毕业论文进度 在同时应对查重与 AIGC 检测的场景里,很多同学卡在「摘要与关键词」不是因为不会打字,而是边界、逻辑或检测风险没处理好。摘要字数少却信息密度极高,既是查重标红重灾区,也是 AIGC 检测…

作者头像 李华
网站建设 2026/10/16 3:15:03

Linux之网络<数据链路层>

数据链路层1. 怎么分离报文头部与有效载荷?以太网头部长度固定为 14 字节(662)。 收到完整以太网帧之后:总帧数据,跳过前面固定 14 字节的帧头,剩下的部分就是上层有效载荷。 公式:载荷 整个以…

作者头像 李华
网站建设 2026/10/16 3:13:59

STM32移植TencentOS tiny MQTT组件实现物联网云接入

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/16 3:13:45

提升RAG准确率的实用技巧(收藏版),程序员小白也能轻松掌握!

本文详细介绍了如何提升RAG(检索增强生成)的准确率,从文档解析、切分、向量化到检索与重排序,每个环节都提供了实用的解决方案和代码示例。此外,还分享了进阶技巧和多轮对话上下文管理,帮助读者全面掌握RAG…

作者头像 李华
网站建设 2026/10/16 3:13:31

OpenClaw安装配置实战:从零搭建轻量级自动化任务调度系统

拿到一个开源工具,我的习惯是先别急着敲安装命令,先把“它到底要装什么、装在哪、怎么跑起来”这三件事想清楚。OpenClaw 这名字乍一看像个机器人项目,但它其实是一套轻量级的自动化任务调度与执行框架,用一次你就会觉得&#xff…

作者头像 李华