001 的数字经得起复核吗?用公开数据逐条核一遍
本文首发于 OpenGEO: https://opengeo.page/observations/001-recheck/
《OpenGEO 观察 001》里写了不少数字:千问 20 条只送 5 条、Kimi 12 处引用来自 8 个网页、豆包改写出 5 条搜索词……这些数字,读者自己能核吗?
能核的部分,我把它做成了一个脚本。数据是 001 公开在 Hugging Face 的脱敏数据集,脚本只用 Python 标准库,下载即跑。下面是逐条结果。
- 001 原文: https://opengeo.page/observations/001-suzhou-yimei/
- 数据集: https://huggingface.co/datasets/Maodian/opengeo-observation-001 (CC BY 4.0)
一句话结论
文中 12 项可从数据核对的数字,全部对得上。另有 3 处口径需要读者知道,2 项数字数据里核不了。
逐条核对
| 文中的说法 | 数据里的结果 | 结论 |
|---|---|---|
| 豆包请求带 3 项定位权限状态,没有坐标 | local_permission:* 3 项,coordinates_in_request = false |
对上 |
千问 user_city 为苏州市,意图为「本地生活-地点周边信息查询」 |
city = 苏州市,uvl_intent.content 相同 |
对上 |
| 元宝调用了 region_search | 第 3 问工具顺序:region_search → web_search |
对上 |
| 豆包改写出 5 条搜索词 | 5 条 | 对上 |
| Kimi 改写出 3 条搜索词 | 3 条 | 对上 |
| 千问改写出 1 条搜索词 | 1 条(另有 RAG 主查询和子查询 2 条,见下文口径一) | 对上,有口径 |
| 千问检索 20 条,送进模型 5 条 | material_stat.total = 20,sent_to_model = 5 |
对上 |
| 豆包第 3 问参考 29 篇,抓到 17 条带链接 | 29 条,其中 17 条有链接 | 对上 |
| 17 条里同名诊所相关 6 条、抖音 4 条 | 6 条、4 条 | 对上 |
| 此前问护肤品时 29 篇里 10 篇来自抖音 | 第 1 问 29 条,短视频 10 条 | 对上 |
| Kimi 12 处引用,来自 8 个不同网页,都带段落锚点 | 12 / 8 / 12 | 对上 |
| DeepSeek 先搜 5 个词得 30 条、打开 7 个网页;再搜 4 个词、打开 3 个网页 | 第 1 轮 5 词、30 条、TOOL_OPEN 7 次;第 2 轮 4 词、TOOL_OPEN 3 次 |
对上 |
会话历史一节也能核:豆包 last_message_index = 15,千问 continue_chat,DeepSeek parent_message_id = 6,说明这三家的主会话前面已有一轮;元宝 replyIndex = 1、Kimi 本轮才生成对话标题,是新对话。和 001 的说明一致。
三处口径
口径一:千问到底改写了几条? 千问一轮里有好几层「搜索词」。001 写的「1 条」是热点判断模块的改写词(hotspot_intent.rewrite_content),也是 20 条素材对应的那条。同一轮里,RAG 检索工具实际用的是主查询加子查询共 2 条。按哪一层算,答案是 1 或 2。比较「改写条数」时,要说清是哪一层。
口径二:豆包那 12 条没有链接的参考。 29 篇里有 12 条只有卡片、没有链接,数据集标为 card_without_url:video_card,也就是视频卡片。001 说「17 条带链接来源里抖音 4 条」,这个数没错;但如果这 12 张视频卡也来自短视频平台,豆包这一问的短视频占比会比 001 写的高得多【推断】。数据里没有它们的域名,核不了。
口径三:DeepSeek 打开了哪些网页? TOOL_OPEN 共 10 次,但只有 2 次带回了网址。所以「打开 7 个、3 个网页」能核,「打开的是哪些网页」只能核到 2 个。
核不了的两项
- 四家最终推荐的机构数(豆包 16、千问 12、Kimi 10、元宝 6)。回答原文含个人信息和对商业机构的评价,数据集没有收录,所以这几个数只能信作者。
- 元宝第 3 问的搜索词。001 已写明没采到,数据里也没有。
复核脚本
把下面的代码存成 verify_001.py,运行 python3 verify_001.py,输出应与上表一致。
# 复核 OpenGEO 观察 001 的数字。数据:huggingface.co/datasets/Maodian/opengeo-observation-001(CC BY 4.0)
import json, urllib.request, collections as C
BASE = "https://huggingface.co/datasets/Maodian/opengeo-observation-001/resolve/main/data/"
def load(name):
with urllib.request.urlopen(BASE + name + ".jsonl") as r:
return [json.loads(l) for l in r.read().decode("utf-8").splitlines() if l.strip()]
turns, queries, sources, tools, signals = (load(n) for n in ["turns", "queries", "sources", "tool_calls", "signals"])
def pick(rows, **kw):
return [r for r in rows if all(r.get(k) == v for k, v in kw.items())]
main3 = dict(session="main", turn=3)
# 位置
db = pick(signals, platform="doubao", **main3)
print("豆包 定位权限项:", len({s["signal"] for s in db if s["signal"].startswith("local_permission")}),
"| 请求带坐标:", [s["value"] for s in db if s["signal"] == "coordinates_in_request"])
qw = {s["signal"]: s["value"] for s in pick(signals, platform="qwen", **main3)}
print("千问 city:", qw.get("city"), "| 意图:", qw.get("uvl_intent.content"))
print("元宝 工具顺序:", [t["tool_name"] for t in pick(tools, platform="yuanbao", **main3)])
# 搜索词
for p in ["qwen", "kimi", "doubao", "deepseek"]:
qs = pick(queries, platform=p, **main3)
print(p, "搜索词", len(qs), C.Counter(q["query_source"].split(" ")[0] for q in qs))
# 来源筛选
print("千问 material_stat:", qw.get("hotspot_intent.material_stat.total"), "→", qw.get("hotspot_intent.material_stat.sent_to_model"))
# 豆包引用
ref = pick(sources, platform="doubao", stage="displayed_reference", **main3)
linked = [s for s in ref if not s.get("source_type", "").startswith("card_without_url")]
print("豆包 第3问 参考:", len(ref), "| 带链接:", len(linked), "| 其中同名诊所相关:", sum(bool(s.get("entity_masked")) for s in linked),
"| 抖音:", sum(s.get("domain") == "www.iesdouyin.com" for s in linked))
ref1 = pick(sources, platform="doubao", stage="displayed_reference", session="main", turn=1)
print("豆包 第1问 参考:", len(ref1), "| 短视频:", sum(s.get("source_type") == "short_video" for s in ref1))
# Kimi 引用
ks = {s["signal"]: s["value"] for s in pick(signals, platform="kimi", category="retrieval", **main3)}
print("Kimi 引用:", ks.get("citation_events"), "处 | 不同网页:", ks.get("unique_cited_urls"), "| 带段落锚点:", ks.get("citations_with_text_fragment_anchor"))
# DeepSeek 两轮检索(第 4 问)
dq = pick(tools, platform="deepseek", session="main_q4", turn=4)
for rnd in (1, 2):
r = [t for t in dq if t["round"] == rnd]
print(f"DeepSeek 第{rnd}轮: 搜索词", sum(t.get("n_queries", 0) for t in r), "| 打开网页", sum(t["tool_name"] == "TOOL_OPEN" for t in r),
"| 返回结果", len(pick(sources, platform="deepseek", session="main_q4", stage="retrieved", round=rnd)))
# 会话历史
for s in pick(signals, category="context", session="main", turn=1):
if s["signal"] in ("prior_messages_in_conversation", "parent_message_id"):
print("历史", s["platform"], s["value"])
回到开头
001 的数字经得起复核吗?能放进公开数据的,都经得起;放不进去的(最终回答),这次只能如实标出。下一次观测,我会把「最终回答里的机构名单」单独脱敏成计数表放进数据集,让这一项也能被核。
笔者的看法:GEO 研究里最缺的不是结论,是可以被别人重算一遍的数字。
原文与授权
- 原文: https://opengeo.page/observations/001-recheck/
- 作者:何瑜
- 许可:本文以 CC BY 4.0(署名 4.0 国际)协议发布,转载请注明作者与原文链接。

浙公网安备 33010602011771号