AI 搜索每次往模型里塞多少字?抓包实测上下文拼接与搜索注入
原文链接:https://opengeo.page/observations/002-context-token-probe/
一句话结论:追问时,浏览器不重发之前的对话。千问和腾讯元宝回传的输入 token 显示,不搜索时历史是逐字往上加的;打开搜索后,当轮会再塞进一大段网页和地点材料。这段材料只在当轮看得到,下一轮若不再搜索,输入就跌回「固定前缀 + 已写出的问答」。
观测记录 #001 看到对话历史会改变搜索词和最终推荐。这篇接着问两件事:多轮对话时,模型实际带上了多少历史;打开联网搜索后,检索材料按多大的量进入模型。
材料来自 DeepSeek、豆包、千问、腾讯元宝、Kimi 五个网页端。能算出输入 token 的只有千问和腾讯元宝,另外三家的请求形状可以看,输入量看不到。
本文要点
- 追问不重发历史【实测】。五家的后续请求都只带新问题和指向上一条的编号。记录到的请求体积大约是 DeepSeek 220 字节、Kimi 550 字节、千问 720 字节、腾讯元宝 800 字节、豆包 2.3 KB。豆包那个体积主要来自定位权限等客户端信息,不是历史正文。
- 不搜索时,历史逐字增加【实测】。6 轮等长问题里,千问和腾讯元宝每一轮新增的输入,都接近「上一轮回答 + 这一轮问题」。6 轮内没有出现突然变平的截断。
- 固定前缀差很多【推断】。第 1 轮输入扣掉问题本身后,千问大约还剩 5700 token,腾讯元宝大约剩 1060 token。请求里没有单独给出系统提示,所以这是估算。
- 搜索注入是当轮的大头【实测】。腾讯元宝这 6 轮每轮输入 21162 至 25156 token,公开数据里的引用文档数是 17 至 19。千问走通用模型时,1 条搜索词对应回答轮比规划轮多出 6248 至 6696 token,2 条搜索词多出 11295 至 11607 token。
- 下一轮不搜索,搜索材料就不在了【实测】。千问从 17031 跌到 6933,腾讯元宝从 22657 跌到 2960。两家都能一字不差复述第 1 问的原话,说明问题文本还在,网页原文没有一起留下。
- 按引用文档数平均,每篇大约 1100 至 1240 token【推断】。这是估算注入除以 cited_docs,不是测到了每一篇的长度。
说明:【实测】是抓包或服务端回传里直接读到的。【推断】是用这些数字做的估算。【未知】是没有下发、因此不能判断的。
追问时,浏览器会把之前的对话重发一遍吗?
不会。五家后续请求都只带新问题和消息编号【实测】。
五家各开新会话,连续追问本地餐饮问题,记录每一轮的 POST。没有一家在追问时重发历史全文【实测】。
| 平台 | 追问时实际发送的字段 | 请求体积 | 证据 |
|---|---|---|---|
| DeepSeek | parent_message_id 递增,加新的 prompt | 约 220 字节 | 【实测】 |
| Kimi | chat_id,加 message.parent_id,加新的 blocks | 约 550 字节 | 【实测】 |
| 千问 | parent_req_id,加 session_id,messages 里只有新消息 | 约 720 字节 | 【实测】 |
| 腾讯元宝 | 会话 ID 在 URL 里,正文是新的 prompt | 约 800 字节 | 【实测】 |
| 豆包 | conversation_id,加 last_message_index,加新问题 | 约 2.3 KB | 【实测】 |
因此,从浏览器发出去的请求看不出模型读了多少历史。豆包的 2.3 KB 也不能当成历史正文,里面主要是 client_meta 一类的客户端字段【实测】。有没有人能用改过的请求骗过服务端,这次没有测【未知】。
五家里,千问和腾讯元宝在响应里给了每轮输入 token。DeepSeek 这次只看到会话累计用量,豆包和 Kimi 没有下发 token 统计【实测】。下面的输入量结论只覆盖千问和腾讯元宝。
不联网搜索时,模型看到的历史是全文还是摘要?
这 6 轮里是逐字往上加,没有出现截断【实测】。
千问和腾讯元宝各开一个新对话,明确要求不联网。连续发送 6 轮字数相同的问题,每轮 42 字:前半句是「不要联网搜索。把这句话翻译成英文,再用中文写约100字赏析:」,后接一句 12 字的日常描写。遥测里这 6 轮的搜索次数和工具调用都是 0【实测】。
如果历史是全文拼接,那么:
残差 = 本轮输入 - 上一轮输入 - 上一轮输出
残差应该接近「本轮这句 42 字的问题 + 固定的消息分隔」。6 轮的数如下【实测】。
| 轮次 | 千问输入 | 千问输出 | 千问新增输入 | 千问残差 | 元宝输入 | 元宝输出 | 元宝新增输入 | 元宝残差 |
|---|---|---|---|---|---|---|---|---|
| 第 1 轮 | 5748 | 133 | — | — | 1086 | 112 | — | — |
| 第 2 轮 | 5933 | 151 | +185 | 52 | 1223 | 130 | +137 | 25 |
| 第 3 轮 | 6120 | 149 | +187 | 36 | 1377 | 133 | +154 | 24 |
| 第 4 轮 | 6305 | 160 | +185 | 36 | 1537 | 153 | +160 | 27 |
| 第 5 轮 | 6502 | 163 | +197 | 37 | 1717 | 133 | +180 | 27 |
| 第 6 轮 | 6700 | 156 | +198 | 35 | 1876 | 139 | +159 | 26 |
从第 3 轮起,千问残差停在 35 至 37,腾讯元宝停在 24 至 27。第 2 轮千问残差是 52,比后面多出约 16。增长没有在某一轮突然变平【实测】。多出来的 16 个 token 像是多轮消息多了一段固定开头,但响应里没有单独标出这段模板【推断】。
第 1 轮输入扣掉问题本身以后,千问大约还剩 5700 token,腾讯元宝大约剩 1060 token【推断】。千问这一路的模型名是 qwenchat-fast-complex-base,腾讯元宝请求里写的是 hunyuan_gpt_175B_0404【实测】。差出来的部分包含什么,请求里没有分开【未知】。
打开联网搜索后,服务端往模型里塞了多少字?
腾讯元宝每轮输入约 2.1 万至 2.5 万 token。千问走通用模型时,搜索材料按搜索词条数增加;同一会话里还会换到另一个模型名【实测】。
另开新会话,要求联网。连续发送等长问题,每轮 34 字,问苏州老字号的地址、招牌菜和人均价格。两家的顺序不一样。千问是松鹤楼、得月楼、朱鸿兴、黄天源、采芝斋、陆稿荐。腾讯元宝第 2 轮是陆稿荐,第 3 轮才是得月楼。元宝还有第 7 轮,再次提交陆稿荐;这一轮只有 web_search,没有 poi_search,输入 24843,引用文档数 19。下面的表只用前 6 轮。
腾讯元宝:前 6 轮的引用文档数是 17 至 19
这 6 轮都同时出现了 poi_search 和 web_search【实测】。表里的引用文档数是公开文件 context_probe.jsonl 的 cited_docs。本地汇总 ctx-results.json 里同一轮的 docs 是 37、35、35、33、37、35,不是这个数,公开文件也没有放字符总长,所以这里不用。
| 轮次 | 询问对象 | 输入 token | 输出 token | 引用文档数 | 减去不搜索同轮输入 |
|---|---|---|---|---|---|
| 第 1 轮 | 松鹤楼 | 24616 | 391 | 19 | 约 23530 |
| 第 2 轮 | 陆稿荐 | 23219 | 288 | 18 | 约 21996 |
| 第 3 轮 | 得月楼 | 21162 | 254 | 18 | 约 19785 |
| 第 4 轮 | 朱鸿兴 | 21312 | 366 | 17 | 约 19775 |
| 第 5 轮 | 黄天源 | 25156 | 307 | 19 | 约 23439 |
| 第 6 轮 | 采芝斋 | 21769 | 416 | 18 | 约 19893 |
最后一列用的是另一段「不搜索」对话的同序号轮次,不是从同一个会话里扣掉搜索结果。问题和已经积累的回答都不一样,所以它是估算,不是精确的搜索材料长度【推断】。数量级是清楚的:这 6 轮的输入比不搜索时大一个数量级,每轮都在 2 万 token 上下【实测】。
千问:通用模型按搜索词增加,老字号问题会换模型
千问的 chat_odps 把一轮拆成两段:规划轮 R1,回答轮 R2【实测】。下面把老字号实验、餐饮追问和主会话放在一起。
| 会话与轮次 | 提问内容 | 模型名 | 规划轮 R1 | 搜索词数 | 回答轮 R2 | R2 减 R1 |
|---|---|---|---|---|---|---|
| 老字号 T1 | 松鹤楼地址、招牌菜和人均 | rag-fliggy-308x | — | — | 8015 | 没有这段拆分 |
| 老字号 T2 | 得月楼地址、招牌菜和人均 | rag-fliggy-308x | — | — | 7980 | 没有这段拆分 |
| 老字号 T3 | 朱鸿兴地址、招牌菜和人均 | qwenchat-fast-complex-base | 6004 | 1 | 12252 | 6248 |
| 老字号 T4 | 黄天源地址、招牌菜和人均 | qwenchat-fast-complex-base | 6135 | 1 | 12831 | 6696 |
| 老字号 T5 | 采芝斋地址、招牌菜和人均 | rag-fliggy-308x | — | — | 8290 | 没有这段拆分 |
| 老字号 T6 | 陆稿荐地址、招牌菜和人均 | rag-fliggy-308x | — | — | 8871 | 没有这段拆分 |
| 餐饮追问 T1 | 苏州值得去的百年老字号 | qwenchat-fast-complex-base | 5736 | 见注 | 17031 | 11295 |
| 主会话 Q1 | 苏州当地有名的护肤品 | qwenchat-fast-complex-base | 7626 | 见注 | 19233 | 11607 |
搜索词数要分开看。T3、T4 的 1 条,来自 context_probe.jsonl 的 search_query_count。餐饮追问和主会话这两行,公开的 token 记录没有这个计数。queries.jsonl 里,两行都有 2 条页面展示的搜索词,字段是 multi_load 的 query_list;同一轮还有别的改写字段,不能把它们加进去当成 3 条或 4 条。本地 qwen-context-growth.json 的 searchQ 也是 2,但 qwen-server-telemetry.json 没有导出这个字段。
R2 减 R1 是同一轮里的两个数,这个减法是直接读到的【实测】。把它解释成「每条展示搜索词大约分到 5600 至 6700 token」,目前只有这四轮【推断】。
同一串老字号问题里,T1、T2、T5、T6 的模型名是 rag-fliggy-308x,T3、T4 仍是 qwenchat-fast-complex-base【实测】。所以模型名不是整段会话锁死的。飞猪这一路没有给出 R1、R2 和搜索词条数,内部用了什么材料看不到【未知】。
单篇网页能分到多少?搜到的内容会留到下一轮吗?
按公开的引用文档数除,每篇大约 1100 至 1240 token。下一轮一旦不搜索,万级的搜索输入不会留下【推断;跌落本身是实测】。
1. 每篇大约 1100 token,是除出来的
- 腾讯元宝前 6 轮输入约 2.1 万至 2.5 万 token,引用文档数是 17 至 19。用上表估算的搜索注入除以这个数,大约每篇 1100 至 1240 token【推断】。本地汇总的 docs 是 33 至 37,字符总长约 3 万至 4 万,两个数都没进公开文件,不拿来当每篇长度。
- 千问主会话 Q1 的 rerank_doc_count 是 10。同一轮 R2 比 R1 多 11607 token。10 篇一起分这 1.1 万 token,平均大约 1100 token,和「一条展示搜索词」不是同一个口径【推断】。Q2「问兰药业是什么」的 rerank_doc_count 是 0,不能把 10 篇套到这一问上【实测】。
- 千问 Q1 的 web_search@ai_retriever 耗时 1141 毫秒,Q2 是 1028 毫秒。首包延迟分别是 2512 毫秒和 1972 毫秒【实测】。这是检索器这一次调用的耗时,不是目标网页的首字节时间,响应里也没有超时阈值【未知】。
2. 关掉搜索的下一轮,输入会跌下去
一组是「先搜索两轮,再明确要求不搜索」【实测】。
| 轮次 | 提问 | 千问输入 | 腾讯元宝输入 |
|---|---|---|---|
| 第 1 轮 | 苏州百年老字号餐饮,联网搜索 | 17031(规划轮 5736) | 21140 |
| 第 2 轮 | 哪家适合带孩子,联网搜索 | 8943(模型名为 rag-fliggy-308x) | 22657 |
| 第 3 轮 | 不用搜索,一句话总结刚才聊了什么 | 6933 | 2960 |
| 第 4 轮 | 不用搜索,重复上一句 | 7011(加 78) | 3026(加 66) |
| 第 5 轮 | 不用搜索,复述第一个问题的原话 | 7066(加 55) | 3421 |
第 3 轮起不再搜索,千问从 17031 跌到 6933,腾讯元宝从 22657 跌到 2960【实测】。6933 接近千问不搜索实验里的水位。第 5 轮两家都复述出了第 1 问的原话【实测】。
这只能说明:在这次「明确要求不搜索」的轮次里,之前那一万多 token 的搜索输入没有留在新的输入里。用户如果继续用一句会触发搜索的话来追问,服务端会不会再搜、会不会仍丢掉上一轮材料,这次没有测【未知】。
千问和腾讯元宝这次对得上的拼法是【推断】:
本轮输入 = 固定前缀
+ 此前各轮的「问题 + 最终回答」
+ 本轮如果搜索,再加本轮的搜索材料
+ 本轮问题
这对内容作者意味着什么?
- 不要把平均值写成一条硬配额。 按公开的引用文档数除,元宝大约是每篇 1100 至 1240 token;按千问重排保留的 10 篇除,大约是 1100 token。这足够提醒人不要把唯一的事实埋在长背景后面,但这次没有看到检索器在第几个字截断【推断】。
- 没被写进回答的材料,在一次不再搜索的追问里用不上。 证据只到这里:下一轮被要求不搜索时,模型还能复述上一轮的问题和回答,输入里已经没有上一轮那一万多 token。不能推广成「所有第二轮追问都会把来源名单清掉」【实测的范围见上一节】。
- 不能从 1.1 秒推出「网站必须 1 秒内响应」。 1141 毫秒和 1028 毫秒是千问检索器整次调用的耗时。这里面有查询、检索服务和结果组装,没有分成每个目标网站的 TTFB,也没有给出超时就被丢弃的阈值【未知】。
常见问题
用户追问时,AI 会重新阅读上一轮搜出来的网页原文吗?
千问和腾讯元宝在下一轮被明确要求不搜索时,输入 token 会从一万多跌到只剩固定前缀和此前的问答。留下的是上一轮的最终回答,不是上一轮的网页原文。豆包、Kimi 和 DeepSeek 没有下发输入 token,看不出是不是同样处理。
AI 搜索一次能读完一整篇长文章吗?
这次没有测到截断位置。公开数据里,腾讯元宝前 6 轮的引用文档数是 17 至 19。用估算的搜索注入除以这个数,大约每篇 1100 至 1240 token。这是平均值,不是每一篇的实测长度。
为什么同一个对话里,千问有时走网页搜索,有时换成另一个模型?
六轮句式相同的老字号问题里,四轮的模型名是 rag-fliggy-308x,两轮是 qwenchat-fast-complex-base。模型名按轮变化,飞猪这一路内部检索了什么没有下发。
为什么千问和腾讯元宝的固定输入差这么多?
不搜索的第一轮,扣掉问题本身之后,千问大约还剩 5700 token,腾讯元宝大约剩 1060 token。请求里没有单独的系统提示字段,这个差是用输入减去问题估算的。
测试方法与局限
- 发布时间:2026-11-13。抓包时间是 2026-10-30 23:00 至 2026-10-31 03:05(北京时间)。6 轮控制实验集中在 10 月 31 日 01:52 至 03:05;护肤品主会话和餐饮追问是同一段抓包里更早的会话,不是 #001 的医美问题。
- 条件:单账号,桌面 Chromium,用 CDP 记录请求和流式响应。出口是苏州电信。千问遥测里的 user_city 是苏州市、user_prov 是江苏省【实测】。
- 能看到:五家追问请求的字段;千问和腾讯元宝每轮的输入、输出 token;千问的模型名、R1/R2、老字号实验的搜索词计数、检索耗时和 rerank_doc_count;腾讯元宝的引用文档数。本地还有召回资料数和字符总长,但公开文件没有。
- 看不到:豆包、Kimi、DeepSeek 的输入 token;两家都没有下发 cached_tokens;6 轮以后会不会截断;rag-fliggy-308x 内部的材料;每个目标网站的响应时间和超时阈值。
- 平台页只收录这次能分开写的两家:千问、腾讯元宝。
数据与复算
公开数据集 Maodian/opengeo-observation-001 里,这篇用到三个文件:data/context_probe.jsonl、data/signals.jsonl、data/queries.jsonl。下表的筛选条件都指这三个文件。本地的 ctx-results.json、qwen-context-growth.json、qwen-server-telemetry.json 是同一次抓包的汇总,没有放进数据集。
| 文中的数字 | 怎么复算 | 结果 |
|---|---|---|
| 千问不搜索:5748、5933、6120、6305、6502、6700 | context_probe.jsonl,platform=qwen、condition=search_off_prompt,读 prompt_tokens 和 completion_tokens | 第 3 至 6 轮残差为 36、36、37、35 |
| 元宝不搜索:1086、1223、1377、1537、1717、1876 | 同文件 platform=yuanbao、condition=search_off_prompt | 第 2 至 6 轮残差为 25、24、27、27、26 |
| 元宝联网输入 21162 至 25156,引用文档 17 至 19 | 同文件 condition=search_on_prompt 的前 6 轮,读 prompt_tokens 和 cited_docs;第 7 轮单独是 24843 和 19 | 与表中一致 |
| 千问 T3、T4 相差 6248、6696,搜索词数为 1 | 同文件 qwen、search_on_prompt 的 turn 3 和 4;per_round_prompt_tokens 的后一个减前一个,search_query_count 为 1 | 12252 减 6004;12831 减 6135 |
| 追问和主会话相差 11295、11607 | signals.jsonl,千问 followup_recall turn 1 的 token_usage 是 17031;main turn 1 是 19233。规划轮 5736 和 7626 没有单独进公开文件,只能从本地 qwen-context-growth.json 和 qwen-server-telemetry.json 的分轮字段复算 | 17031 减 5736;19233 减 7626 |
| 这两行的展示搜索词各有 2 条 | queries.jsonl,query_source 为 multi_load 的 query_list:followup_recall turn 1 和 main turn 1 | 不要把同轮其他 query_source 的改写字段加进去 |
| 不搜索后千问跌到 6933 | signals.jsonl,qwen、followup_recall、turn 1 和 turn 3 的 token_usage | 17031 到 6933 |
| 元宝从 22657 跌到 2960 | 本地追问遥测的 promptTokens。signals.jsonl 和 context_probe.jsonl 都没有这两个数 | 不能只用公开文件复算 |
| Q1 重排篇数为 10,Q2 为 0 | signals.jsonl,signal=rerank_doc_count,qwen、main、turn 1 和 turn 2 | 10;0 |
| 检索耗时 1141 毫秒、1028 毫秒 | 只在本地 qwen-server-telemetry.json 的 tool 字段里,没有进公开数据集 | 公开文件不能复算这一行 |
原文链接:https://opengeo.page/observations/002-context-token-probe/
- 点赞
- 收藏
- 关注作者
评论(0)