001 的数字经得起复核吗?用公开数据逐条核一遍

本文首发于 OpenGEO: https://opengeo.page/observations/001-recheck/

《OpenGEO 观察 001》里写了不少数字:千问 20 条只送 5 条、Kimi 12 处引用来自 8 个网页、豆包改写出 5 条搜索词……这些数字,读者自己能核吗?

能核的部分,我把它做成了一个脚本。数据是 001 公开在 Hugging Face 的脱敏数据集,脚本只用 Python 标准库,下载即跑。下面是逐条结果。

一句话结论

文中 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 研究里最缺的不是结论,是可以被别人重算一遍的数字。


原文与授权

posted @ 2026-11-07 20:16  maodian927  阅读(3)  评论(0)    收藏  举报