<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>测试之家社区</title>
    <link>https://testerhome.com/</link>
    <description>测试之家社区最新发帖.</description>
    <language>en-us</language>
    <item>
      <title>本地部署 CLM-8B</title>
      <description>&lt;p&gt;&lt;img src="/uploads/photo/2026/1edebc82-b039-4010-a5d7-e37de2c234d1.png!large" title="" alt="介绍"&gt;&lt;/p&gt;
&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;前段时间 TypeSafe AI JEV 凭借快速决策能力出圈，斯坦福 + Hazy+NVIDIA 推出 CLM8b 也具有同等能力：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Jev：TypeSafe AI 推出的业界第一个 System‑One 闭源 API 决策模型，只能调用云端 API，权重不公开。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CLM‑8B：斯坦福 + Hazy+NVIDIA，Jev 的开源对标方案，Apache‑2.0 协议，可以本地完整部署。 &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;两者定位完全一致：不做文本生成，专门做 Agent 快速决策、候选动作打分、选择、yes/no 判断；接口原语对齐：Choice / Score / Noul。不同点如下：&lt;br&gt;
&lt;img src="/uploads/photo/2026/97893c99-eef7-47be-96f6-3e9aba627b85.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="部署"&gt;部署&lt;/h2&gt;&lt;h2 id="环境"&gt;环境&lt;/h2&gt;&lt;h3 id="系统"&gt;系统&lt;/h3&gt;
&lt;p&gt;Ubuntu 24.04.4 LTS + NVIDIA GeForce RTX™ 4070 Laptop GPU，可以使用 sudo ubuntu-drivers install 补充缺少的驱动&lt;br&gt;
&lt;img src="/uploads/photo/2026/84816ad3-d5c2-4e21-a888-49c3dc7308e4.png!large" title="" alt="Nvidia驱动"&gt;&lt;/p&gt;
&lt;h3 id="Python"&gt;Python&lt;/h3&gt;
&lt;p&gt;使用 conda，安装 pytyhon=3.13.16&lt;/p&gt;
&lt;h2 id="代码"&gt;代码&lt;/h2&gt;&lt;h3 id="github"&gt;github&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/Contrastive-LM/CLM%EF%BC%8C%E4%B8%8B%E8%BD%BD%E5%AE%8C%E6%88%90%E5%90%8E%E5%AE%89%E8%A3%85%E6%89%80%E6%9C%89%E4%BE%9D%E8%B5%96" rel="nofollow" target="_blank"&gt;https://github.com/Contrastive-LM/CLM，下载完成后安装所有依赖&lt;/a&gt;\&lt;/p&gt;
&lt;h2 id="启动"&gt;启动&lt;/h2&gt;
&lt;p&gt;前置准备，获取相应模型（如果遇到无法获取模型可先进行设置镜像：export HF_ENDPOINT=&lt;a href="https://hf-mirror.com%EF%BC%89%EF%BC%9A" rel="nofollow" target="_blank"&gt;https://hf-mirror.com）：&lt;/a&gt;\&lt;/p&gt;
 &lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. encoder (Qwen3-8B embeddings)&lt;/span&gt;
vllm serve Qwen/Qwen3-8B &lt;span class="nt"&gt;--served-model-name&lt;/span&gt; qwen3-8b &lt;span class="nt"&gt;--runner&lt;/span&gt; pooling &lt;span class="nt"&gt;--max-model-len&lt;/span&gt; 2048 &lt;span class="nt"&gt;--port&lt;/span&gt; 8090 &lt;span class="nt"&gt;--gpu-memory-utilization&lt;/span&gt; 0.9
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;第一步需要下载模型作为编码作用，将输入的状态转换成数字提供给后续使用&lt;br&gt;
vLLM 启动成功&lt;br&gt;
&lt;img src="/uploads/photo/2026/f6328df5-d0ba-4bb5-a0c6-dbcbcdc5c4f9.png!large" title="" alt="vLLM启动成功"&gt;&lt;/p&gt;
 &lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 2. CLM API on :8700 (downloads the 75 MB reference head on first run)&lt;/span&gt;
clm-serve
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;第二步启动页面交互，将状态通过向量匹配得到结果&lt;br&gt;
CLM 启动成功&lt;br&gt;
&lt;img src="/uploads/photo/2026/fb841b18-9f07-4b00-b66a-39d547b3f6ae.png!large" title="" alt="CLM启动成功"&gt;&lt;/p&gt;

&lt;p&gt;结构图&lt;br&gt;
&lt;img src="/uploads/photo/2026/7dfe58b4-328a-4e46-bae1-3d8259344c17.png!large" title="" alt="结构图"&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;骨干底座：冻结 Qwen3‑8B&lt;/strong&gt;（底座权重完全不训练，只做编码）&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;两个可训练投影头：&lt;code&gt;State Head&lt;/code&gt;（状态编码器）、&lt;code&gt;Action Head&lt;/code&gt;（动作编码器），合计仅 &lt;strong&gt;20M 参数（75MB checkpoint）&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;训练目标：&lt;strong&gt;双向 InfoNCE 对比损失&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;- 把 “正确状态‑动作” 向量拉近；错误样本向量推开&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;推理逻辑： &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;- 分别编码当前状态&lt;code&gt;s&lt;/code&gt;、所有候选动作&lt;code&gt;a₁,a₂…&lt;/code&gt;得到 embedding&lt;/p&gt;

&lt;p&gt;- 计算向量点积 / 余弦相似度打分，softmax 输出分布，选最高分动作&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;核心特性：embedding 可独立缓存&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;如果候选动作集合不变（工具列表、菜单选项），动作向量只算一次反复复用；只需要重新编码变化的状态，极大降低 Agent 循环延迟。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="使用"&gt;使用&lt;/h2&gt;&lt;h2 id="页面使用"&gt;页面使用&lt;/h2&gt;
&lt;p&gt;启动成功之后可通过浏览器访问：&lt;a href="http://localhost:8700" rel="nofollow" target="_blank"&gt;http://localhost:8700&lt;/a&gt;&lt;br&gt;
Choice / Score / Noul&lt;br&gt;
&lt;img src="/uploads/photo/2026/9a9191ce-c44f-49a3-82f9-5f9d7255e9ac.png!large" title="" alt="Choice / Score / Noul"&gt;&lt;/p&gt;

&lt;p&gt;Rank&lt;br&gt;
&lt;img src="/uploads/photo/2026/084b01e4-c5d6-4a38-9ec4-e06c045f1f2e.png!large" title="" alt="Rank"&gt;&lt;/p&gt;

&lt;p&gt;以上为 CLM8b 两种使用方法，Rank 目前不够稳定&lt;/p&gt;
&lt;h2 id="接口使用"&gt;接口使用&lt;/h2&gt;&lt;h3 id="CURL 请求"&gt;CURL 请求&lt;/h3&gt; &lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; http://localhost:8700/v1/systemone &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "state": "Customer: my invoice was charged twice and nobody answers the phone!",
  "model": "clm-latest",
  "questions": {
    "urgency": {
      "type": "noul",
      "instructions": "Is this urgent?"
    },
    "department": {
      "type": "choice",
      "instructions": "Which team should handle this?",
      "criteria": {
        "billing": "Charges, invoices, refunds",
        "technical": "Bugs and outages"
      }
    },
    "frustration": {
      "type": "score",
      "instructions": "How frustrated is the customer?",
      "criteria": [
        "Calm",
        "Frustrated",
        "Very angry"
      ]
    }
  }
}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt; &lt;h3 id="Response 返回"&gt;Response 返回&lt;/h3&gt; &lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"clm-latest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"answers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"urgency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"noul"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="nl"&gt;"noul"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.8263707919505312&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"department"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"choice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="nl"&gt;"choice"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"billing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.9871286986216236&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="nl"&gt;"probabilities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                                &lt;/span&gt;&lt;span class="nl"&gt;"billing"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.9935643493108117&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                                &lt;/span&gt;&lt;span class="nl"&gt;"technical"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.00643565068918816&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"frustration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.9999515815375033&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.9999452154944316&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="nl"&gt;"legend"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                                &lt;/span&gt;&lt;span class="nl"&gt;"0"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Calm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                                &lt;/span&gt;&lt;span class="nl"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Frustrated"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                                &lt;/span&gt;&lt;span class="nl"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Very angry"&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="nl"&gt;"probabilities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                                &lt;/span&gt;&lt;span class="nl"&gt;"0"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.1895458784263167e-05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                                &lt;/span&gt;&lt;span class="nl"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2.4627544927911903e-05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                                &lt;/span&gt;&lt;span class="nl"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.9999634769962877&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"billing_units"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"input_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"output_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt; </description>
      <author>MNicholas</author>
      <pubDate>Sun, 04 Oct 2026 00:39:13 +0800</pubDate>
      <link>https://testerhome.com/topics/44926</link>
      <guid>https://testerhome.com/topics/44926</guid>
    </item>
    <item>
      <title>AI for Testing 提效实战·测试设计（二）：让 AI 按等价类 + 边界值把用例补全</title>
      <description>&lt;p&gt;用 AI 做测试设计 ·（二）&lt;/p&gt;

&lt;p&gt;📌 &lt;strong&gt;先说清怎么读这个系列&lt;/strong&gt;：一篇讲一个方法，是为了讲透，&lt;strong&gt;不是让你做需求时跑好几个 prompt&lt;/strong&gt;。实操时脑暴、等价类、边界、场景法是&lt;strong&gt;同一次协作里的连续动作&lt;/strong&gt;，一个综合提示词 + 两三句追问即可走完（系列收尾会给"做完一整个需求"的整合版）。&lt;/p&gt;

&lt;p&gt;先讲一个我曾 review 到的真实事故——&lt;strong&gt;用例一条没漏、全绿，bug 还是上了线。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="开篇：一组"&gt;开篇：一组"全绿"的边界用例，为什么没拦住&lt;/h2&gt;
&lt;p&gt;某 B 端系统有个"客户备注"字段，需求里只写了一句"用户可填写客户备注"，&lt;strong&gt;没给长度、没给字符规则。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;负责测试的同事就让 AI 补边界用例，AI 很利索地给了一组：&lt;code&gt;100、101、255、256&lt;/code&gt;。他照着填、照着测，结果全是"通过"，于是放心上线。&lt;/p&gt;

&lt;p&gt;上线没多久，有个客户粘贴了一段 40 多字、末尾还带个 Emoji 的备注，&lt;strong&gt;点保存直接报错&lt;/strong&gt;。倒查代码才发现：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;数据库这一列其实是 &lt;code&gt;varchar(32)&lt;/code&gt;，按 UTF-8 存储；&lt;/li&gt;
&lt;li&gt;这个入口的前端组件偏偏没做长度限制，接口也只在落库时才抛错；&lt;/li&gt;
&lt;li&gt;于是 &lt;strong&gt;32 这个真实边界，用例里一次都没出现过&lt;/strong&gt;；字符数和字节数的差异、Emoji，也压根没测。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;255、256&lt;/code&gt; 测了一堆，&lt;strong&gt;可那根本不是这个系统的边界。&lt;/strong&gt; 用例绿，只证明"AI 猜的那几个数没出问题"，证明不了真实边界被覆盖了。&lt;/p&gt;

&lt;p&gt;这一篇就顺着这个事故倒查三件事：等价类/边界值到底在干什么、AI 为什么会一本正经给错数、怎么把"假边界"换成"真边界"。&lt;/p&gt;
&lt;h2 id="一、倒查第一层：等价类和边界值，本质是测试的"&gt;一、倒查第一层：等价类和边界值，本质是测试的"压缩算法"&lt;/h2&gt;
&lt;p&gt;一个备注框的理论输入是天文数字，不可能穷举。测试设计的核心，是从无穷输入里&lt;strong&gt;挑出最有代表性的少数几个&lt;/strong&gt;，靠的就是这两个用了几十年的方法：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;等价类划分&lt;/strong&gt;：把"系统会一视同仁处理"的输入归成一类，每类只取一个代表——同一类里要么都过要么都挂，测十个和测一个信息量一样。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;边界值分析&lt;/strong&gt;：缺陷不是均匀分布的，而是&lt;strong&gt;高度聚集在"分界"的地方&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;合起来就是一套压缩算法：&lt;strong&gt;等价类把"无穷"压成"几类"，边界值在每类最容易出事的边缘再精准点几枪。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;为什么 bug 总爱在边界扎堆？&lt;/strong&gt; 这是代码决定的，分界处几乎必然对应这些易写错的写法：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;比较运算符：&lt;code&gt;&amp;lt;&lt;/code&gt; 写成 &lt;code&gt;&amp;lt;=&lt;/code&gt;，差一个等号（off-by-one）；&lt;/li&gt;
&lt;li&gt;下标和容量：数组从 0 计数、长度判断差一、容量刚好卡住；&lt;/li&gt;
&lt;li&gt;临界规则：库存为 0、余额刚好等于金额、次数刚好到上限；&lt;/li&gt;
&lt;li&gt;精度舍入：小数截断、四舍五入、浮点表示误差。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;正常数据走"主干大马路"，边界数据走"分叉判断"——&lt;strong&gt;判断一多，错就多。&lt;/strong&gt; 所以老手拿到字段，眼睛先盯两端。&lt;/p&gt;
&lt;h2 id="二、倒查第二层：AI 为什么会给"&gt;二、倒查第二层：AI 为什么会给"看起来很专业"的假边界&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;先说强项&lt;/strong&gt;：一旦真实边界确定，让它按"最小、略小、刚好、略大、最大"去铺，它一个不漏；批量划类也又快又整齐，不累、没定式。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;但死穴也正在这&lt;/strong&gt;：&lt;strong&gt;它既不知道你系统的真实边界，也不知道系统按什么规则"分"类。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;你只丢一句"帮我测备注长度的边界"，它并不知道你这列是 &lt;code&gt;varchar(32)&lt;/code&gt; 还是 &lt;code&gt;varchar(255)&lt;/code&gt;、业务上限是多少。它给的 &lt;code&gt;255、256、100、101&lt;/code&gt;，本质是从海量训练语料里"&lt;strong&gt;回忆&lt;/strong&gt;"出来的高频经典数字——&lt;strong&gt;不是读了你的约束算出来的。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;心智模型（沿用第一篇）&lt;/strong&gt;：它是那个经验极丰富、但第一天上班、完全不懂你们系统的同事。你不告诉他"字段到底多长"，他报的就全是"别的公司常见的数"。&lt;/p&gt;

&lt;p&gt;事故里那位同事踩的，就是这个坑：&lt;strong&gt;把"AI 猜的"当成了"系统真的"。&lt;/strong&gt; 记住这条，下面所有动作都围绕一件事——&lt;strong&gt;逼 AI 把猜测和真实分开。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="三、从事故到正确动作：把假边界换成真边界"&gt;三、从事故到正确动作：把假边界换成真边界&lt;/h2&gt;&lt;h3 id="动作 1：先去找"&gt;动作 1：先去找"真实边界"，能确定就直接喂（最省力，也最该先做）&lt;/h3&gt;
&lt;p&gt;别一上来就让 AI 报数。真实约束优先从这些地方直接读，不必只靠问开发：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;接口参数校验注解&lt;/strong&gt;：&lt;code&gt;@Size(max=)&lt;/code&gt;、&lt;code&gt;@Max&lt;/code&gt;、&lt;code&gt;@DecimalMax&lt;/code&gt; 等；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;数据库字段定义&lt;/strong&gt;：&lt;code&gt;varchar(n)&lt;/code&gt;、精度标度；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;前端校验规则&lt;/strong&gt;：组件的 maxlength、正则。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;能拿到确定值，就直接把确定值喂给它&lt;/strong&gt;（长度 + 按字符还是字节 + 前后端是否都校验，要给全）；下面动作 2 的"待确认"流程，只在需求没写、暂时查不到时才用。&lt;/p&gt;
&lt;h3 id="动作 2：拿不准时，让它先列"&gt;动作 2：拿不准时，让它先列"边界假设 + 依据"，而不是直接给数&lt;/h3&gt; &lt;pre class="highlight plaintext"&gt;&lt;code&gt;在你给出任何具体数字前，先列一张表：
边界点 | 你的取值 | 依据。
依据必须标注三类：【需求明示】【技术推断】【待确认】。
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;同一个字段，它可能这样交代：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;下限 / 上限 →【需求明示】&lt;/li&gt;
&lt;li&gt;"中英文是否都按 1 个字符计数" →【待确认】&lt;/li&gt;
&lt;li&gt;"前端限了，接口是否也校验" →【待确认】&lt;/li&gt;
&lt;li&gt;数据库列长度、超长是拒绝还是截断 →【待确认】&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这一步把"猜测"从结论里揪出来打标签，你一眼就能分清哪些能直接用、哪些必须核实。等你查清后，再把真实约束喂回去：&lt;/p&gt;
 &lt;pre class="highlight plaintext"&gt;&lt;code&gt;补充确认后的约束：
- 数据库列为 varchar(32)，按 UTF-8 存储；
- 后端按"字符个数"校验，不是字节数；
- 前后端都校验，接口直连也要拦；
- 超长由后端统一拒绝，不截断。
请基于这些已确认约束重新生成边界用例，去掉【待确认】项。
&lt;/code&gt;&lt;/pre&gt; &lt;h3 id="动作 3：划等价类，注意一类一个代表"&gt;动作 3：划等价类，注意一类一个代表&lt;/h3&gt;
&lt;p&gt;先用一版&lt;strong&gt;初稿提示词&lt;/strong&gt;让它跑通（看懂输出即可，长期用动作 6 的进阶版）：&lt;/p&gt;
 &lt;pre class="highlight plaintext"&gt;&lt;code&gt;你是一名有10年经验的资深测试工程师。
请对下面字段用"等价类划分 + 边界值分析"设计用例。
字段：昵称，2~12个字符，支持中文/英文/数字，不允许特殊符号，不能与他人重复。
要求：
1. 表格列等价类：类编号 | 输入说明 | 类型(有效/无效) | 代表值；
2. 对长度做边界值，给出每个点的取值和预期；
3. 推断的边界标【待确认】，不当确定结论；
4. 最后单列需要找开发/产品确认的问题。
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;它返回的等价类，&lt;strong&gt;正确示范&lt;/strong&gt;应该长这样（注意：处理不同的要拆成不同类、一类只留一个代表）：&lt;/p&gt;
 &lt;table class="table-responsive table table-bordered table-striped"&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th&gt;类编号&lt;/th&gt;
&lt;th&gt;输入说明&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;代表值&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E1&lt;/td&gt;
&lt;td&gt;纯中文，长度区间内&lt;/td&gt;
&lt;td&gt;有效&lt;/td&gt;
&lt;td&gt;"测试工程师"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E2&lt;/td&gt;
&lt;td&gt;纯英文，长度区间内&lt;/td&gt;
&lt;td&gt;有效&lt;/td&gt;
&lt;td&gt;"tester"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E3&lt;/td&gt;
&lt;td&gt;中英数混合，长度区间内&lt;/td&gt;
&lt;td&gt;有效&lt;/td&gt;
&lt;td&gt;"test01 测试"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E4&lt;/td&gt;
&lt;td&gt;空（什么都不填）&lt;/td&gt;
&lt;td&gt;无效&lt;/td&gt;
&lt;td&gt;""&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E5&lt;/td&gt;
&lt;td&gt;只填空格&lt;/td&gt;
&lt;td&gt;无效&lt;/td&gt;
&lt;td&gt;"   "&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E6&lt;/td&gt;
&lt;td&gt;纯数字&lt;/td&gt;
&lt;td&gt;有效&lt;/td&gt;
&lt;td&gt;"12345"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E7&lt;/td&gt;
&lt;td&gt;长度不足（1 字符）&lt;/td&gt;
&lt;td&gt;无效&lt;/td&gt;
&lt;td&gt;"a"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E8&lt;/td&gt;
&lt;td&gt;长度超长（13 字符）&lt;/td&gt;
&lt;td&gt;无效&lt;/td&gt;
&lt;td&gt;13 个字符&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E9&lt;/td&gt;
&lt;td&gt;含特殊符号&lt;/td&gt;
&lt;td&gt;无效&lt;/td&gt;
&lt;td&gt;"test@"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E10&lt;/td&gt;
&lt;td&gt;Emoji / 组合音标字符&lt;/td&gt;
&lt;td&gt;无效【是否允许待确认】&lt;/td&gt;
&lt;td&gt;"测😀"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E11&lt;/td&gt;
&lt;td&gt;与他人昵称重复&lt;/td&gt;
&lt;td&gt;无效&lt;/td&gt;
&lt;td&gt;已存在的昵称&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt; &lt;h3 id="动作 4：点边界用"&gt;动作 4：点边界用"三点 / 五点法"&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;三点法&lt;/strong&gt;（常规字段够用）：恰在边界、刚出边界内侧、刚越界外侧。例：&lt;code&gt;2 / 3 / 1&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;五点法&lt;/strong&gt;（高风险、数值/金额字段建议）：最小、略高于最小、任意正常、略低于最大、最大，再各配一个越界值。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;对应"昵称 2~12"，真实的长度边界是：1 字符拒绝 / &lt;strong&gt;2 通过（恰下限）&lt;/strong&gt; / 3 通过 / 11 通过 / &lt;strong&gt;12 通过（恰上限）&lt;/strong&gt; / 13 拒绝。&lt;/p&gt;

&lt;p&gt;数值类字段还要额外点两类：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;小数精度&lt;/strong&gt;：金额 &lt;code&gt;0.01&lt;/code&gt;、&lt;code&gt;0.001&lt;/code&gt;（多一位小数）、&lt;code&gt;0.10&lt;/code&gt; 与 &lt;code&gt;0.1&lt;/code&gt;、很大数字末位舍入；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;业务边界 ≠ 系统边界&lt;/strong&gt;：单笔限额 5 万（业务），但字段本身能存更大——两个边界都要测。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="动作 5：主动补"&gt;动作 5：主动补"隐性边界"，这是最显功力、AI 默认不会给的部分&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;字符数 ≠ 字节数&lt;/strong&gt;：一个中文在 UTF-8 下占 3 字节、Emoji 占 4 字节，还有组合音标字符——"12 个字符"和"12 个字节"测出的结果完全不同；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;看不见的字符&lt;/strong&gt;：前后空格、全角/半角、制表符、零宽字符；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;不止输入有等价类&lt;/strong&gt;：

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;输出等价类&lt;/strong&gt;：成功、重复、超长是否各走对了文案；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;状态等价类&lt;/strong&gt;：未登录 / 已登录 / 被禁用户去改，结果不同；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;分页/数量/时间边界&lt;/strong&gt;：第 0 条、第 1 条、翻页临界、跨天跨月、闰年 2 月 29 日。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;一句"请额外补充字节数、不可见字符、输出与状态相关的边界"，常常能捞出一整层第一版没有的用例。&lt;/p&gt;
&lt;h3 id="动作 6：反向收口，并打包成进阶提示词"&gt;动作 6：反向收口，并打包成进阶提示词&lt;/h3&gt;
&lt;p&gt;生成完别照单全收，先让它反查：&lt;/p&gt;
 &lt;pre class="highlight plaintext"&gt;&lt;code&gt;请给每条用例标注覆盖的类编号和边界点，然后：
1. 有效类：允许一例覆盖多个有效类，用最少用例覆盖全部；
2. 无效类：一例只覆盖一个无效点，带两个非法条件的拆开；
3. 指出还有哪个类/边界没被覆盖；
4. 对每个无效类，说明对应系统哪条校验/哪条不同处理路径，
   说不出来的标【疑似脑补】。
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;日常不用每次手拼，下面这段把全部动作整合了（替换方括号；查清约束后再单独补发一次）：&lt;/p&gt;
 &lt;pre class="highlight plaintext"&gt;&lt;code&gt;你是一名有10年经验的资深测试工程师，请用"等价类划分 + 边界值分析"
为下面字段设计用例。

【业务/技术背景】
- 字段用途与产品：[这是什么字段、给谁填]
- 已确认的约束：[类型、长度按字符还是字节、数据库列、前后端是否都校验]
- 业务上限/规则：[单笔限额、次数、库存等，没有写"暂无"]

【字段需求】
"""
[贴需求原文]
"""

请严格按顺序完成：
1. 先不要给具体数字，列"边界假设表"：边界点 | 取值 | 依据，
   依据标【需求明示】【技术推断】【待确认】。
2. 列等价类表：类编号 | 输入说明 | 有效/无效 | 代表值；
   除输入类外必须考虑状态类、输出类；代表值落在类中间、足够典型；
   不新增需求里没有的类。
3. 长度用三点法、数值/金额用五点法，金额额外测小数精度与舍入。
4. 主动补隐性边界：字符数与字节数、Emoji/组合字符、空格/全角半角/零宽字符，
   以及输出等价类、状态等价类。
5. 每条用例标注覆盖的类编号与边界点；有效类用最少用例覆盖，
   无效类一例只覆盖一个无效点；指出未覆盖缺口；每个无效类说明对应的
   真实校验/处理路径，说不出来的标【疑似脑补】。
6. 等价类专项自检（逐条回答）：
   ① 有没有漏无效类/状态类/输出类？
   ② 有没有需求里不存在、自己加出来的类？
   ③ 有效/无效有没有标反（空格、特殊符号默认应为无效，除非需求允许）？
   ④ 代表值是否都落在类中间、而不是贴着边界？
   ⑤ 有没有"处理相同却拆两类"或"处理不同却并一类"？
7. 最后列出必须找开发/产品确认的边界问题。
&lt;/code&gt;&lt;/pre&gt; &lt;h2 id="四、事故本可以提前避免：一张"&gt;四、事故本可以提前避免：一张"边界确认清单"&lt;/h2&gt;
&lt;p&gt;动作 6 最后那节别浪费，AI 通常会列出：&lt;/p&gt;

&lt;p&gt;长度按字符还是字节？中英文、Emoji 如何计数？前后空格是否自动 trim？仅前端拦截还是接口也校验？超长是拒绝还是截断？重复判定是否区分大小写、全角半角？需求长度与数据库列是否一致？&lt;/p&gt;

&lt;p&gt;写用例前一次性跟开发对齐，能避免大量"我以为边界是 12，结果按字节算"的返工——&lt;strong&gt;开头那个事故，靠这张清单就能在上线前拦住。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="五、复盘留下的三个坑"&gt;五、复盘留下的三个坑&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. 假边界给你虚假的安全感。&lt;/strong&gt; AI 报的数越自信、越"经典"，越可能只是语料高频值。它能保证格式铺满，保证不了数字是真的——没核实一律【待确认】。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. AI 划类的五种典型错误，对照自查：&lt;/strong&gt; 漏类（漏无效/状态/输出类）｜编类（加需求没有的类）｜判反（空格/特殊符号默认合法）｜代表值取错（没落在类中间）｜粗细失当（处理不同却并类、或一类拆几个）。判据：&lt;strong&gt;每个无效类，对得上一条真实校验或不同处理路径吗？&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. 有效类"笛卡尔积式"爆量，是用例库被灌水的隐形元凶。&lt;/strong&gt; AI 容易把多个有效类两两组合全列出，用例瞬间膨胀。但有效类只要求"覆盖到"，不要求"组合穷尽"。看到用例成批增加，先问：&lt;strong&gt;这是覆盖了新逻辑，还是只换了排列？&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="六、比 prompt 更重要的：4 个非提示词能力"&gt;六、比 prompt 更重要的：4 个非提示词能力&lt;/h2&gt;
&lt;p&gt;prompt 只是"怎么发问"，真正拉开水平、且不依赖某段神奇提示词的是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;分工&lt;/strong&gt;：AI 出初稿和广度，你出约束和裁决（确认真实边界、判断系统有没有、定优先级、去重）。把裁决也外包，就得到好看但不能用的用例。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;协作&lt;/strong&gt;：把一问一答变成带反馈的多轮，每轮只推进一件事；它开始"忘"约束时让它复述需求或重开。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;验证&lt;/strong&gt;：把产出当"待验证草稿"——抽样反推依据、用接口注解/库定义/实跑核对、两模型交叉看差异点。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;工程化&lt;/strong&gt;：模型按任务选（结构化划类用主流模型，复杂约束用长上下文推理稳的）；输出成可入库的表；把验证过的提示词固化进"生成—评审—入库"流程。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;工具只是沉淀方法——&lt;strong&gt;方法没掌握，换什么工具都白搭。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="总结：我的固定动作"&gt;总结：我的固定动作&lt;/h2&gt;
&lt;p&gt;拿到字段 → &lt;strong&gt;先从接口注解/库定义/前端校验读真实边界，能确定就直接喂；拿不准让 AI 列"假设 + 依据"打标签&lt;/strong&gt; → 查清并喂回约束 → 划等价类（一类一代表）+ 三点/五点边界 → 补字节/精度/状态等隐性边界 → 按覆盖反向去重查漏 → 用"边界确认清单"对齐 → 定稿。&lt;/p&gt;

&lt;p&gt;几分钟，换来的是&lt;strong&gt;每条边界都有据可依&lt;/strong&gt;。这一步最关键的不是让 AI 多报几个数，而是&lt;strong&gt;逼它把"猜的"和"真的"分开&lt;/strong&gt;——假用例比没用例更危险，因为它会让你以为自己测过了。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;em&gt;这是「AI for Testing 提效实战 · 测试设计（二）」。&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;如果这个动作对你有用，欢迎转给那个总在用例里写"测试 255、256"的同事。&lt;/em&gt;&lt;/p&gt;</description>
      <author>Santo</author>
      <pubDate>Sat, 03 Oct 2026 17:22:25 +0800</pubDate>
      <link>https://testerhome.com/topics/44925</link>
      <guid>https://testerhome.com/topics/44925</guid>
    </item>
    <item>
      <title>从 AGI Bar 一路玩到世界人工智能大会，一款 AI 桌游的奇幻之旅丨《Talk With》AI 主题桌游正式发售！</title>
      <description>&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-13415cf5c22589efffd9867449c9034677b.png" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="玩了一年，今天终于可以把《Talk With》带回家了！"&gt;&lt;strong&gt;玩了一年，今天终于可以把《Talk With》带回家了！&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;从 2025 年夏天在北京 AGI Bar 用手写卡牌和瓜子 Token 跑完第一局，到 RTE 大会、黑客松、社区聚会、WAIC，再到最近的世界设计之都大会，《Talk With》跟着 RTE 开发者社区在北京、上海、杭州、旧金山等地试玩了一年。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;现在，《Talk With》AI 主题桌游正式发售了。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;9 月 30 日—10 月 31 日，限时限量发售 30 套。&lt;/p&gt;

&lt;p&gt;前往联合出品方二十面体线上商店购买：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://k.youshop10.com/vXagAtHj" rel="nofollow" target="_blank"&gt;https://k.youshop10.com/vXagAtHj&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-4f32d484059b10e3c71764b9eb1e5743ab8.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;如果你想先来现场玩一局，今年 &lt;strong&gt;10 月 23—24 日的 iRTE 2026 实时智能大会&lt;/strong&gt;，《Talk With》也会继续开桌！&lt;/p&gt;

&lt;p&gt;报名 iRTE 大会一起玩：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bagevent.com/event/9260716" rel="nofollow" target="_blank"&gt;https://www.bagevent.com/event/9260716&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-ee7b45804f9003936483b1d2dd41b52bbd0.png" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="先来认识全球首款 AI 主题桌游《Talk With》"&gt;&lt;strong&gt;先来认识全球首款 AI 主题桌游《Talk With》&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;AI 主题桌游《Talk With》（中文名：聊天能解决的事儿）支持 3～5 人同场竞技，每局约 40 分钟。&lt;/p&gt;

&lt;p&gt;你会遇到一些意想不到甚至无厘头的需求场景，想办法为它提出语音产品方案。&lt;/p&gt;

&lt;p&gt;从有限的初始资金出发，经过三轮竞拍，逐步挑选技术、构建自己的产品。&lt;/p&gt;

&lt;p&gt;到了路演环节，你要讲出产品愿景，再用投票争取桌上其他人的认可。&lt;/p&gt;

&lt;p&gt;一张「市场行情卡」也可能让局面突然改变，考验你的临场应对。&lt;/p&gt;

&lt;p&gt;最后，还要靠你的演讲和投资眼光，争取桌上的两种胜利。&lt;/p&gt;

&lt;p&gt;每一局最终会诞生两位赢家：「独角兽奖」属于资本最雄厚的创业者，「金伯乐奖」属于最有投资眼光的人。&lt;/p&gt;

&lt;p&gt;无论你是策略大师还是演讲达人，这里都有你大展身手的舞台！&lt;/p&gt;
&lt;h2 id="从 AGI Bar 一路玩到世界人工智能大会，一款 AI 桌游的奇幻之旅"&gt;&lt;strong&gt;从 AGI Bar 一路玩到世界人工智能大会，一款 AI 桌游的奇幻之旅&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-1ac82fe7477a1f5e63ea9c922b07a22d0d5.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;去年夏天，《Talk With》第一次被带到北京 AGI Bar 的桌上。&lt;/p&gt;

&lt;p&gt;从那天起，这副桌游跟着 RTE 开发者社区去了更多地方。&lt;/p&gt;

&lt;p&gt;北京、上海、杭州；开发者大会、黑客松、社区聚会……每到一站，总有人第一次坐上这张桌子，也有人带着新的玩法和建议离开。&lt;/p&gt;

&lt;p&gt;一局游戏里，最有意思的瞬间往往来自玩家：一个出人意料的竞拍策略、一场临时发挥的路演，或是一句「这里要是这样玩，会不会更好？」&lt;/p&gt;

&lt;p&gt;每一次试玩，都帮我们重新检查规则是否容易理解、流程是否顺畅、哪些环节还能更好玩。&lt;/p&gt;

&lt;p&gt;这一年很多熟悉的面孔和第一次见面的朋友都曾加入这一桌，也用自己的玩法和建议，帮我们把游戏往前推了一步。&lt;/p&gt;

&lt;p&gt;在下一局开始之前，也想带你重新看看，这副桌游和开发者一起走过的一年。&lt;/p&gt;
&lt;h2 id="2025.08.03｜AGI Bar@北京：第一局，在微醺里开始试玩"&gt;&lt;strong&gt;2025.08.03｜AGI Bar@ 北京：第一局，在微醺里开始试玩&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;2025 年 8 月，北京 AGI Bar。《Talk With》第一次和社区伙伴见面。当时桌游卡片是临时打印剪裁的，游戏币用瓜子来代替。但这些不妨碍我们把 AI 语音创业的想法铺在桌上，和大家一起试着把它玩成一局游戏。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-961e1ab98d8e1dc963cd93aadb494dda063.png" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="2025.10.31｜RTE2025：第一次走进大型开发者大会"&gt;&lt;strong&gt;2025.10.31｜RTE2025：第一次走进大型开发者大会&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;2025 年 10 月，北京 RTE 2025 大会。&lt;/p&gt;

&lt;p&gt;从上午到下午，连续开了多场桌游局。它第一次从酒吧里的一张小桌，走进一场真正的大型开发者大会。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-a4cc278fb138bce9b0db3e21790fa5d6121.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;也是这一站，我们第一次收到这么多来自玩家的公开反馈。&lt;/p&gt;

&lt;p&gt;有人玩完发朋友圈：&lt;strong&gt;「AI + 桌游，好活。」&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;有人认真总结，为什么这副桌游特别适合 AI 创业者和投资人：既要做自己的产品，也要判断别人的项目值不值得投；既要考虑技术储备，也得想需求、路线、资金和最终的路演。&lt;/p&gt;

&lt;p&gt;还有玩家在牌局里，把自己对 Voice AI 的理解也带了进来——同样一张技术牌，工程师、产品经理、创业者看到的价值可能完全不同。&lt;/p&gt;

&lt;p&gt;桌游开始有了我们之外的解释～&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-cd7ade21093d0664866fbf8fb7eb06f16a3.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;也是从这次开始，我们觉得，《Talk With》不应该只跟着 RTE 开发者社区自己的活动走。&lt;/p&gt;

&lt;p&gt;于是，我们发起了 &lt;strong&gt;「AI 桌游社区伙伴计划」&lt;/strong&gt;，邀请一起在运营 AI、开发者或创业社区参与，申请通过后，我们会免费寄出一套《Talk With》。&lt;/p&gt;

&lt;p&gt;我们想看看，当这副桌游离开我们的活动现场，在另一群人、另一张桌子上开始一局，又会发生什么。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=Mzg3NjgwMjUzOQ==&amp;amp;mid=2247511259&amp;amp;idx=1&amp;amp;sn=b0173f965fb813814184ec4e3feb1629&amp;amp;scene=21#wechat_redirect" rel="nofollow" target="_blank" title=""&gt;就在本周五！全球首款 AI 主题桌游试玩会丨 Convo AI&amp;amp;RTE2025&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="2025.12.13｜GDPS 全球开发者先锋大会：从 RTE 大会走向更大的开发者现场"&gt;&lt;strong&gt;2025.12.13｜GDPS 全球开发者先锋大会：从 RTE 大会走向更大的开发者现场&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;《Talk With》被带到了上海的 ** GDPS 全球开发者先锋大会。**&lt;/p&gt;

&lt;p&gt;这一次，坐上桌子的已经不只是熟悉 RTE 社区的人。&lt;/p&gt;

&lt;p&gt;不同技术方向、不同工作背景的开发者开始一起抢同一批技术牌，也开始用自己的经验理解那些需求。&lt;/p&gt;

&lt;p&gt;一场桌游慢慢变成了一种很特别的交流方式：&lt;/p&gt;

&lt;p&gt;很多现实里的问题，如果一上来就问「你怎么看 AI 创业」「你怎么看 Voice AI」，聊天很容易停在抽象判断里。&lt;/p&gt;

&lt;p&gt;但当大家手里真的只有有限的预算、几张技术牌和一个必须解决的需求时，很多选择反而会变得具体。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;你愿意为什么技术下注？这个需求到底值不值得做？如果只有这么多钱，你会先补哪一块能力？&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;原本设计在规则里的东西，我们发现也逐渐变成了开发者之间真正会讨论的话题。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-a7f50d3fa4243221017148cabdd8ae158bc.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=Mzg3NjgwMjUzOQ==&amp;amp;mid=2247512548&amp;amp;idx=1&amp;amp;sn=650ab70ef469559552b3d16b6397fa8d&amp;amp;scene=21#wechat_redirect" rel="nofollow" target="_blank" title=""&gt;活动报名丨全球首款 AI 主题桌游《Talk With》线下开玩！上海 GDPS 2025 见！&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="2026. 01.17｜RTE × AI HACKATHON 环球黑客松：第一次到了杭州"&gt;&lt;strong&gt;2026. 01.17｜RTE × AI HACKATHON 环球黑客松：第一次到了杭州&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;2026 年的第一站，《Talk With》去了杭州。我们和 &lt;strong&gt;AI HACKATHON 环球黑客松&lt;/strong&gt;一起，在杭州云谷中心·云谷之芯开桌。&lt;/p&gt;

&lt;p&gt;一边是真正参加黑客松、现场 Build 产品的开发者，一边是桌游里临时组成的「创业公司」。&lt;/p&gt;

&lt;p&gt;两件事放在同一个现场，意外地很搭。&lt;/p&gt;

&lt;p&gt;现实里，Builder 在有限时间里决定今天先实现什么；桌游里，玩家在有限预算里决定应该抢什么技术。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-bada047ec464a4d5c98030e04b2ff26b3a8.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=Mzg3NjgwMjUzOQ==&amp;amp;mid=2247513522&amp;amp;idx=1&amp;amp;sn=4840c6409a3c753d98ea1e407188f891&amp;amp;scene=21#wechat_redirect" rel="nofollow" target="_blank" title=""&gt;杭州场来了！全球首款 AI 主题桌游试玩会丨 RTE x 环球黑客松&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="2026.03.28｜中关村 AI 原点社区 Party Nights：又回到社区的一张桌子"&gt;&lt;strong&gt;2026.03.28｜中关村 AI 原点社区 Party Nights：又回到社区的一张桌子&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;2026 年 3 月，北京 AI 原点社区。新的一年，桌游回到北京。每次重新开局，现场玩家的选择和反馈，都会给我们新的启发。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-1271492206f82f160d9faeebae596aef46f.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=Mzg3NjgwMjUzOQ==&amp;amp;mid=2247515415&amp;amp;idx=1&amp;amp;sn=2d596486102895796432d0dc2f711b4b&amp;amp;scene=21#wechat_redirect" rel="nofollow" target="_blank" title=""&gt;桌游玩家招募！全球首款 AI 主题桌游《Talk With》线下开玩丨北京 AI 原点社区 Party Nights 见！&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="2026.06.03｜AGI Bar@上海：一年后，又回到了 AGI Bar"&gt;&lt;strong&gt;2026.06.03｜AGI Bar@ 上海：一年后，又回到了 AGI Bar&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;6 月 3 日，《Talk With》来到 &lt;strong&gt;AGI Bar@ 上海&lt;/strong&gt; 开业季。&lt;/p&gt;

&lt;p&gt;一年前，在 AGI Bar@ 北京，我们用的是&lt;strong&gt;手写卡牌和瓜子 Token。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这一次来到上海，桌上已经是一套正式发布的《Talk With》桌游。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-452ed80ed94efc6528f14954034677b659b.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=Mzg3NjgwMjUzOQ==&amp;amp;mid=2247517316&amp;amp;idx=1&amp;amp;sn=7020f8319d6835632afdc86f73c5d868&amp;amp;scene=21#wechat_redirect" rel="nofollow" target="_blank" title=""&gt;6 月 3 日晚，和 RTE 社区一起加入 AGI Bar@ 上海开业季聚会！&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="2026.07.19｜WAIC 2026 × WAIC UP!：一路玩到了世界人工智能大会"&gt;&lt;strong&gt;2026.07.19｜WAIC 2026 × WAIC UP!：一路玩到了世界人工智能大会&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;再后来，《Talk With》一路玩到了 &lt;strong&gt;WAIC 2026 世界人工智能大会&lt;/strong&gt;，我们和 &lt;strong&gt;WAIC UP!&lt;/strong&gt; 官方一起办了一场&lt;strong&gt;「桌游 + Vibe Coding」&lt;/strong&gt;夜场。&lt;/p&gt;

&lt;p&gt;白天逛展、看产品，晚上坐下来继续 learning、playing &amp;amp; building。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-aa5368da75d8417d32803b1b48de9e2e6de.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;这一年，许多朋友陪着《Talk With》玩过一局。谢谢每一位坐下来试玩、认真提出建议的玩家；也谢谢帮忙讲解规则、带动讨论的主持人，以及一路支持活动的社区伙伴。&lt;/p&gt;

&lt;p&gt;你们的每一次参与，都让我们更清楚这副桌游该怎样玩得顺畅、怎样让更多人愿意开口。今天能把它正式带给更多朋友，离不开这些共同完成的试玩。&lt;/p&gt;
&lt;h2 id="2026.9.28 ｜《Talk With》来到了世界设计之都大会"&gt;&lt;strong&gt;2026.9.28 ｜《Talk With》来到了世界设计之都大会&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-f67631d37347e6ca26b3bf9ef02ce2e886f.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;9 月底，《Talk With》来到了 2026 世界设计之都大会。&lt;/p&gt;

&lt;p&gt;桌游摆上展台以后，不少路过的人停下来翻卡牌、看玩法，也有人蹲在桌前研究了很久，拍下整套桌游。&lt;/p&gt;

&lt;p&gt;还有不少人现场询问 &lt;strong&gt;「这套桌游可以买到吗？」&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;挺巧的。&lt;/p&gt;

&lt;p&gt;因为从2025年8月3日在 AGI Bar 用手写卡牌和瓜子 Token 跑完第一局，到开发者大会、黑客松、社区聚会、WAIC，再到今天的世界设计之都大会，我们把《Talk With》带出去试玩了整整一年。&lt;/p&gt;

&lt;p&gt;而今天，这个问题终于可以有一个确定的回答：&lt;/p&gt;

&lt;p&gt;可以了。&lt;/p&gt;
&lt;h2 id="现在，想邀请你把《Talk With》带回自己的桌上"&gt;&lt;strong&gt;现在，想邀请你把《Talk With》带回自己的桌上&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;这一年来，我们越来越觉得，《Talk With》真正好玩的地方，不只是最后谁赢了。&lt;/p&gt;

&lt;p&gt;而是那些发生在牌局中间的：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;「如果是我，我会这样做。」&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;「这项技术你为什么愿意花这么多钱？」&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;「这个需求其实真的有人在做。」&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;「等等，这个产品好像真能成立。」&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;一年前，我们在 AGI Bar 的一张桌子上，第一次听到这些讨论。&lt;/p&gt;

&lt;p&gt;一年后，希望下一局发生在你的桌上。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-3ac1fad554f0c33ad651597ef432274488b.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;《Talk With》现已正式发售，找 3～5 个朋友，开一局吧。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;前往联合出品方二十面体线上商店购买：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://k.youshop10.com/vXagAtHj" rel="nofollow" target="_blank"&gt;https://k.youshop10.com/vXagAtHj&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-0cc0d6c84a86f4d20372e067ddabb24f217.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;9 月 30 日~10 月 31 日，限量限时销售 30 套。&lt;/p&gt;
&lt;h2 id="今年 RTE 大会，邀请你来带大家玩"&gt;&lt;strong&gt;今年 RTE 大会，邀请你来带大家玩&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;今年的 &lt;strong&gt;iRTE 2026 大会&lt;/strong&gt;，《Talk With》还会继续开桌，在此也邀请大家来做桌游主持人～&lt;/p&gt;

&lt;p&gt;做主持人，不只是把规则讲清楚、把一局游戏顺利带完。你会坐在一桌来自不同公司、不同技术方向的开发者中间，看大家怎么理解同一个需求、为什么愿意为某项技术下注，也会听到很多平时很难在大会演讲里听到的产品判断和技术讨论。&lt;/p&gt;

&lt;p&gt;你也会从「来玩一局的人」，变成那个&lt;strong&gt;让一桌陌生人迅速熟起来、把现场真正带起来的人&lt;/strong&gt;。在这个过程中，顺便练练表达、控场和组织能力，认识一些新的开发者朋友。&lt;/p&gt;

&lt;p&gt;不用是资深桌游玩家，也不用提前把所有规则背下来。我们会在大会前带主持人完整跑一遍游戏，熟悉竞拍、路演、投票等环节，帮助你完成第一次主持。&lt;/p&gt;

&lt;p&gt;如果你对 &lt;strong&gt;AI / Voice AI / 开发者社区 / 桌游&lt;/strong&gt;感兴趣，很适合来试一次。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;想来玩一局：&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bagevent.com/event/9260716" rel="nofollow" target="_blank"&gt;https://www.bagevent.com/event/9260716&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-e9d6a9e0364a692b8d935ff28a504f530de.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;想来带一桌：&lt;/strong&gt; 添加微信 &lt;strong&gt;Creators2022&lt;/strong&gt;，备注「公司/项目 + 职位 + 桌游主持人」&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;这次，可以来当玩家，也可以来当那个让整桌人都玩起来的人。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这一年，我们一起玩了很多场。下一局，期待在桌边见到你。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-db2f780cbfd93e9e5a6e1c9a86fc9f7adb9.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-d5729b1aefd67b40e3de14921ca37dd2c28.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.rtecommunity.dev/" rel="nofollow" target="_blank" title=""&gt;&lt;strong&gt;阅读更多 Voice Agent 学习笔记：了解最懂 AI 语音的头脑都在思考什么&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-615fef4e3db3d8a1d3afd3836d4648b4f9d.png" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>RTE</author>
      <pubDate>Thu, 01 Oct 2026 22:05:25 +0800</pubDate>
      <link>https://testerhome.com/topics/44923</link>
      <guid>https://testerhome.com/topics/44923</guid>
    </item>
    <item>
      <title>Amphion 等提出音频自进化框架 EvoAudio：训练数据随模型短板动态调整；OpenAI DevDay 语音接入 Dots、Codex CLI 与 Meetings 插件丨日报</title>
      <description>&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-0246ffee0a6accd7bbf0b7f3e78ef5bcdf1.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;本期编辑：&lt;a href="https://my.oschina.net/u/111666" rel="nofollow" target="_blank" title=""&gt;@ 三水&lt;/a&gt; @ 鲍勃&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AMD 将以约 82 亿美元收购世界模型公司 World Labs，李飞飞将出任 AMD 执行副总裁兼首席科学家。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;当世界模型开始理解空间、持续模拟环境，并实时响应人的输入，AI 生成的就不再只是一段内容，而可能是一个可以进入、探索和交互的世界。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这也是 RTE 开发者社区最近一直在关注的一条路线：从&lt;strong&gt;实时视频生成、空间智能、交互式视频，到可交互世界模型&lt;/strong&gt;，视频正在从「生成出来给人看」，继续走向「跟人实时互动」。&lt;/p&gt;

&lt;p&gt;所以今年 &lt;strong&gt;iRTE 2026 实时智能大会&lt;/strong&gt; 专门设置了 &lt;strong&gt;「视频 AI 技术专场：从实时视频生成到可交互世界模型」&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;现场，&lt;strong&gt;生数科技 Vidu&lt;/strong&gt; 团队会从 SageAttention、Vidu S1/S2 出发，聊视频生成如何进一步走向实时；&lt;strong&gt;Xmax AI&lt;/strong&gt; 也会带来实时交互模型的探索，讨论当生成内容可以持续响应用户之后，会出现怎样的新娱乐和交互形态。&lt;/p&gt;

&lt;p&gt;从 &lt;strong&gt;World Labs 的可交互 3D 世界&lt;/strong&gt; ，到 &lt;strong&gt;Vidu、Xmax 对实时视频与交互模型的探索&lt;/strong&gt;，这条路线正在变得越来越具体。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;如果你也在关注空间智能、实时视频和可交互世界，10 月 24 日，来现场看看这条路线已经走到哪一步。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;扫描下方二维码报名，线上追进展，这次线下聊实现。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-916aea221884e9f1a0e5930a9b870234171.jpg" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="01 有话题的技术"&gt;&lt;strong&gt;01 有话题的技术&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1、Amphion 与港中大（深圳）、清华、腾讯混元等提出音频理解自进化训练框架 EvoAudio：训练数据随模型短板动态调整，五个音频模型最高提升 6.3 个百分点&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-80f9b3d27ff1ee9293e1ef4282b9db27b9b.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;EvoAudio 把音频模型的能力诊断、训练题生成、强化学习和验证接成一个递归训练闭环：每轮先检查当前模型在 47 项音频技能上的表现，再据此调整下一轮训练的题型配额和难度。候选模型只有在固定验证集上超过上一轮模型，才会进入下一轮并重新决定训练数据。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;训练内容会跟着模型能力变化：&lt;/strong&gt; 系统覆盖语音韵律、说话人与对话、语音内容、声音事件、音乐以及长音频等 6 类共 47 种任务。规划模型根据各技能的准确率、近期提升和训练情况分配下一轮训练重点，并动态调整音高差、信噪比等可控难度；同时保留一部分已掌握任务，降低训练过程中遗忘其他能力的风险。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;训练题可以从音频构造过程直接得到可验证答案：&lt;/strong&gt; EvoAudio 组合 TTS、MIDI、音高变换、时间拉伸、混音等 24 种工具生成音频，答案来自生成参数或原始数据标签，不依赖外部大模型逐题标注。生成后还会重新测量音高、语速、响度、节奏等声学属性，并过滤掉仅看文字就能回答的问题。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;模型更新后必须通过独立验证才能「晋级」：&lt;/strong&gt; 系统使用 GRPO 训练候选模型，再用固定的 2,500 道留出题与当前模型比较；候选模型没有提高就被丢弃，原模型继续生成新的训练课程。这样，上一轮得到的模型会直接决定下一轮训练什么、练多难。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;研究在 Qwen2.5-Omni、Kimi-Audio、Audio Flamingo 3、MiMo-Audio 和 MiniCPM-o 4.5 上进行了 13 轮训练。在 MMSU、MMAU-Pro、MMAR 三项评测的平均成绩上，五个模型分别提升 &lt;strong&gt;1.4--6.3 个百分点&lt;/strong&gt; ；其中 Qwen2.5-Omni 的 MMSU 声学感知准确率从 &lt;strong&gt;44.5% 提升至 61.5%&lt;/strong&gt; 。在相同训练预算下，Qwen2.5-Omni 使用固定训练配置的平均成绩为 62.8%，使用 EvoAudio 动态课程后达到 &lt;strong&gt;65.4%。&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://jensenyx.github.io/EvoAudio.github.io/" rel="nofollow" target="_blank"&gt;https://jensenyx.github.io/EvoAudio.github.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2、Voice AI 公司 Gradium 将 Jev 决策模型接入 TTS：根据对话情绪与紧急程度动态匹配或生成语音风格&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-29b27b29448661396138a91591ee576879e.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;Gradium 展示了一套上下文驱动的 Voice Agent 工作流：用 TypeSafe AI 的决策模型 Jev 从用户消息中判断 &lt;strong&gt;情绪状态和紧急程度&lt;/strong&gt;，再把这些结构化信号转换成 Voice Design 描述，为 Gradium TTS 匹配已有声音；缺少合适声音时，则在后台生成新的声音并加入可复用的声音库。Jev 不负责决定智能体回复什么，只决定这段回复应该以怎样的声音表达。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;声音成为对话上下文的一部分：&lt;/strong&gt; 示例中 Jev 将输入判断为 &lt;code&gt;frustrated / neutral / enthusiastic&lt;/code&gt; 等情绪，以及 &lt;code&gt;relaxed / urgent&lt;/code&gt; 两档紧急程度，再结合语言、表达正式程度映射成具体的声音描述。相比固定使用一套 TTS 声音，同一个客服智能体可以在普通请求、投诉或紧急问题中采用不同的表达方式。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;声音生成移出实时对话主链路：&lt;/strong&gt; 实时路径只需要完成上下文判断、查找对应 &lt;code&gt;voice_id&lt;/code&gt; 和 TTS 合成；尚不存在的声音由 Voice Design 在后台生成并缓存，之后直接复用，避免每轮对话都重新生成声音。Gradium 此前已在 9 月 7 日开放通过文本描述创建新声音的 Voice Design，这次进一步把它接入了对话上下文决策流程。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Jev 可直接作为每轮对话的轻量决策层：&lt;/strong&gt; Gradium 测试中单次 Jev 请求包含网络往返耗时约 &lt;strong&gt;240--850 ms&lt;/strong&gt;，无需针对这些分类标签单独训练模型；开发者可以直接定义情绪和紧急程度等标签及描述，并设置置信度阈值。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://gradium.ai/blog/voice-that-adapts-to-context" rel="nofollow" target="_blank"&gt;https://gradium.ai/blog/voice-that-adapts-to-context&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3、Interspeech 2026 开放语音感知 LLM 实践教程：用 Whisper + Qwen3 跑通训练流程，自生成数据无需 ASR 专项训练也能做到 3.93% WER&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Interspeech 2026 的 Spoken Language Models 教程开放了一套 Hands-on 代码，演示如何把 Whisper-large-v3 编码器接入 Qwen3-4B-Instruct-2507，并在加入语音能力的同时尽量保留原 LLM 的指令遵循能力。仓库提供完整数据准备、训练、评测代码，以及两套约 147 MB 的 adapter + LoRA checkpoint。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;只训练 3,670 万参数接入语音：&lt;/strong&gt; Whisper-large-v3 编码器保持冻结，Qwen3-4B-Instruct-2507 主体同样冻结，仅训练 1,310 万参数的语音适配器，以及 Qwen3 注意力层上的 2,360 万 LoRA 参数。语音特征经过适配器后直接接入 Qwen3 的文本输入序列。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;自生成数据让训练目标保持在原 LLM 的输出分布中：&lt;/strong&gt; 文本版 Qwen3 先读取音频转写和说话人信息，为每条样本生成自然语言回复；训练语音模型时，再把文本描述替换成真实音频，让模型学习从声音生成自己原本就会产生的回复。这样无需人工编写大量语音指令数据，也减少为了适配单一语音任务而改变 LLM 原有回答方式的问题。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;没有做 ASR 和说话人性别专项训练，也能通过提示词完成对应任务：&lt;/strong&gt; 自生成版本训练过程中只学习自由形式的对话回复，从未直接训练 ASR 或性别识别。在 LibriSpeech test-clean 上，通过要求固定输出格式，ASR 清洗后 WER 从默认提示下的 16.54% 降至 &lt;strong&gt;3.93%&lt;/strong&gt; ，说话人性别识别准确率从 81.87% 提升至 &lt;strong&gt;98.24%&lt;/strong&gt;。作为对照，直接针对 ASR + 性别任务监督微调的版本 WER 为 1.81%，性别识别准确率为 98.85%。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;仓库同时提供 Colab、训练脚本和预训练 checkpoint，可以直接复现「任务专项 SFT」和「自生成跨模态对齐」两条训练路线。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/kehanlu/interspeech-tutorial" rel="nofollow" target="_blank"&gt;https://github.com/kehanlu/interspeech-tutorial&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="02 有亮点的产品"&gt;&lt;strong&gt;02 有亮点的产品&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1、OpenAI DevDay 2026 将语音接入 Dots、Codex CLI 与 Meetings：可直接通话智能体、语音控制编程任务并生成会议后续行动&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OpenAI 在 DevDay 2026 将语音进一步接入智能体和工作流产品：长期运行的智能体 Dots 支持直接语音通话，Codex CLI 可以通过语音启动和引导编程任务，新的 Meetings 插件则从麦克风与 Mac 系统音频生成会议记录、摘要和后续行动。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dots 可以直接进行语音通话：&lt;/strong&gt; Dots 是由 GPT-6 Astra 驱动的常驻智能体，拥有自己的云电脑、浏览器和已连接应用，可以持续处理多个任务。除了通过 ChatGPT、Slack 和 Teams 与它交互，用户也可以直接与 Dot 发起语音通话，在对话过程中继续给反馈或讨论任务。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Codex CLI 新增语音控制：&lt;/strong&gt; 更新后的 Codex CLI 支持通过语音启动和引导任务，开发者可以在编码过程中直接用语音下达任务或调整正在执行的工作。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;新增 Meetings 插件把会议音频直接接入后续工作流：&lt;/strong&gt; Meetings 插件同时读取 Mac 的麦克风和系统音频，生成会议记录，并将个性化摘要和行动项保存到 ChatGPT Space。它还可以结合 ChatGPT Work 和已连接应用中的上下文生成后续任务，用户审核后可继续让 ChatGPT 更新项目计划或起草跟进邮件；笔记生成完成后，原始音频会被删除且无法回放。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://openai.com/index/devday-2026-recap/" rel="nofollow" target="_blank"&gt;https://openai.com/index/devday-2026-recap/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://openai.com/index/introducing-dots/" rel="nofollow" target="_blank"&gt;https://openai.com/index/introducing-dots/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://help.openai.com/en/articles/20001546-the-meetings-plugin-in-chatgpt" rel="nofollow" target="_blank"&gt;https://help.openai.com/en/articles/20001546-the-meetings-plugin-in-chatgpt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2、多模态记忆基础设施公司 Memories.ai 推出本地 AI 记忆工具 LUCI Desktop：让 Claude Code、Cursor 和 Codex 直接查询跨应用屏幕与会议历史&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-4d771948ecb4eaec56a76dae0e00766424a.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;LUCI Desktop 将用户在电脑上看到的屏幕内容和会议语音持续整理成一份本地可搜索的历史记录，并通过 Agent Skills 提供给 Claude Code、Cursor、Codex 等智能体；对于不支持 Skills 的智能体，也可以通过 MCP 接入。这样，智能体在执行任务时可以直接检索此前浏览过的网页、PDF、桌面应用内容，以及会议中的讨论和决定，而不需要用户重新复制上下文。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;跨应用屏幕历史成为智能体可调用的上下文：&lt;/strong&gt; LUCI 不依赖每个应用单独提供连接器，而是从电脑屏幕和会议记录建立统一历史。接入后的智能体可以按关键词或语义搜索过去看到的内容、听到的对话，并限定应用或时间范围，还能取回对应时刻的截图。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Skills 是默认接入方式，MCP 作为兼容路径：&lt;/strong&gt; LUCI 可以直接向 Claude Code、Cursor 和 Codex 安装官方 Skills；Skill 本身不保存记忆，而是调用设备上的本地命令读取正在运行的 LUCI。其他无法加载 Skills 的智能体可以通过 MCP 访问同一份记忆。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;捕获、理解和存储主要留在设备端：&lt;/strong&gt; LUCI 在 Mac 和 Windows 上运行，屏幕记录、会议转写和记忆数据保存在本机并静态加密；只有智能体实际检索出的片段才会进入对应的智能体会话。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://luci.memories.ai/computer-history-for-ai-agents" rel="nofollow" target="_blank"&gt;https://luci.memories.ai/computer-history-for-ai-agents&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3、抵押贷款 Voice AI 公司 Sela 累计融资 2100 万美元：语音智能体每月参与促成超 10 亿美元新增房贷&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-9968fde5d1cd8973138cd2728e054c30e60.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;Sela 宣布种子轮和 A 轮累计融资 &lt;strong&gt;2100 万美元&lt;/strong&gt; ，由 Costanoa 领投，Emergence Capital 参投。公司专门为抵押贷款销售部署语音智能体，用于回答借款人问题、介绍贷款方案并在需要时转接贷款专员；Sela 称目前这些智能体每月参与促成超过 &lt;strong&gt;10 亿美元&lt;/strong&gt; 的新抵押贷款。公司成立 18 个月后年化收入已超过 &lt;strong&gt;1000 万美元&lt;/strong&gt; ，美国十大独立抵押贷款银行中已有 &lt;strong&gt;6 家&lt;/strong&gt; 使用其产品。在一项覆盖超过 1 万名潜在借款人的 A/B 测试中，其语音智能体将 lead-to-lock 转化率提高了 &lt;strong&gt;9%&lt;/strong&gt;；公司计划利用新资金扩充团队，并把智能体覆盖范围进一步延伸到消费者贷款流程。以上业务及测试数据均来自 Sela 公布的信息。&lt;/p&gt;

&lt;p&gt;( &lt;a href="https://my.oschina.net/ckypr" rel="nofollow" target="_blank" title=""&gt;&lt;/a&gt;&lt;a href="/PR" class="user-mention" title="@PR"&gt;&lt;i&gt;@&lt;/i&gt;PR&lt;/a&gt; Newswire)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4、临床 AI 公司 Heidi 获 3.4 亿美元新资金并发布 Heidi II：从自动病历记录扩展到可执行临床行政任务&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Heidi 先宣布获得 &lt;strong&gt;3.4 亿美元&lt;/strong&gt; 新资金，包括 Blackbird 领投的 1 亿美元 C 轮融资和 General Catalyst Customer Value Fund 提供的 2.4 亿美元增长投资；随后发布新一代临床 AI 平台 &lt;strong&gt;Heidi II&lt;/strong&gt;。Heidi 此前主要通过 Scribe 监听医患交流并生成病历，目前产品线已经扩展至临床证据检索工具 Evidence、可穿戴录音设备 Remote 和语音转文字功能 Dictate。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agents 从「生成记录」进一步走向执行任务：&lt;/strong&gt; 医生可以直接用自然语言要求 Heidi 完成就诊前病历准备、追踪检查结果、填写转诊表等工作。Agent 会自行规划并跨电子病历、日历、邮箱等系统执行，完成后再把需要临床判断的部分交回医生审核；常用任务还可以保存为定时运行的 Routines。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Memory 会持续学习医生的工作习惯：&lt;/strong&gt; Heidi II 可以从医生明确告诉它的偏好以及后续修改中学习病历格式、表达习惯和工作规则，让之后的生成和执行结果适配个人或机构的工作方式。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;临床证据也被接入同一工作流：&lt;/strong&gt; Heidi II 可以结合患者上下文检索 NEJM、Wiley、Cochrane 等来源的同行评审研究，并在回答中提供引用；Scribe、Evidence、Dictate 等原有能力继续保留在同一平台中。目前平台每周支持约 &lt;strong&gt;280 万次患者就诊&lt;/strong&gt;。Heidi II 已于 9 月 29 日开始推出英文版本，现阶段不在英国和欧盟提供这些新能力。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.heidihealth.com/blog/series-c" rel="nofollow" target="_blank"&gt;https://www.heidihealth.com/blog/series-c&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5、YouTube 将说话声检测接入 AI 肖像保护：结合面部与声音识别创作者被仿冒的内容&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;YouTube 宣布将在今年晚些时候把 &lt;strong&gt;说话声检测（speaking voice detection）&lt;/strong&gt; 接入现有的 likeness detection 系统，与面部检测共同判断视频是否在使用 AI 模仿创作者。现有系统主要识别未经授权使用创作者面部形象的 AI 内容，这次开始把「声音是否像本人」也纳入匹配信号。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;从只看脸扩展到「脸 + 声音」联合匹配：&lt;/strong&gt; YouTube 表示，将说话声检测与面部检测结合后，可以提高整体匹配准确率，并为之后更广泛的声音保护能力打基础。目前官方尚未披露语音检测模型、支持语言或单独针对纯语音克隆内容的具体处理规则。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;创作者可以继续通过 AI 肖像与身份仿冒检测处理匹配结果：&lt;/strong&gt; YouTube 的 AI 肖像与身份仿冒检测已用于发现包含本人 AI 合成形象的视频，并支持用户查看匹配结果和申请移除；这项能力也将进入 YouTube 移动端，方便创作者直接完成注册、查看和处理。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://blog.youtube/news-and-events/made-on-youtube-new-tools-power-creation-journey/" rel="nofollow" target="_blank"&gt;https://blog.youtube/news-and-events/made-on-youtube-new-tools-power-creation-journey/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="03 有态度的观点"&gt;&lt;strong&gt;03 有态度的观点&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1、Instinct 创始人：AI 助手影响用户购买不想要的商品，将是「非常危险的世界」&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-78ac79d2b57d550191ff6210fa9fa7c24e6.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;据《商业内幕》报道，AI 助手 Instinct 创始人 Noah Shinn 表示，如果 AI 智能体利用自身能力影响用户购买他们并不想要的商品或服务，将会是「非常危险的世界」。&lt;/p&gt;

&lt;p&gt;他称，Instinct 不希望通过商业化影响用户行为，使其偏离自身意愿。如果 Instinct 影响用户去购买他们不想买的东西，或者订阅他们不想订阅的服务，还利用自身的智能说服他们，那将会是一个非常危险的世界。&lt;/p&gt;

&lt;p&gt;Shinn 在播客节目《Invest Like The Best》中谈到，Instinct 的数据表明，用户使用前三周内，有 40% 的人分享过信用卡信息；分享信用卡等敏感信息的用户，留存率达到 80%。&lt;/p&gt;

&lt;p&gt;他认为，用户需要数周时间建立信任，而提供更多信息也能让助手更主动、更了解用户处境，并提供更有针对性的帮助。这份信任也涉及 Instinct 将如何实现商业化。&lt;/p&gt;

&lt;p&gt;Shinn 批评，一些免费平台会向用户推送付费广告，试图说服他们购买可能并不需要的商品。他表示，Instinct 不希望用户成为产品，也不希望助手将用户信任转化为说服消费的能力。&lt;/p&gt;

&lt;p&gt;( &lt;a href="/APPSO" class="user-mention" title="@APPSO"&gt;&lt;i&gt;@&lt;/i&gt;APPSO&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-f514d8d4fe4dcca8b9e9ec8a4a2d53d1398.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-be4209f1f009cdb15e1965edc4e97f285b5.jpg" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.rtecommunity.dev/" rel="nofollow" target="_blank" title=""&gt;&lt;strong&gt;阅读更多 Voice Agent 学习笔记：了解最懂 AI 语音的头脑都在思考什么&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;写在最后：&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;我们欢迎更多的小伙伴参与 &lt;strong&gt;「RTE 开发者日报」&lt;/strong&gt; 内容的共创，感兴趣的朋友请通过开发者社区或公众号留言联系，记得报暗号「共创」。&lt;/p&gt;

&lt;p&gt;对于任何反馈（包括但不限于内容上、形式上）我们不胜感激、并有小惊喜回馈，例如你希望从日报中看到哪些内容；自己推荐的信源、项目、话题、活动等；或者列举几个你喜欢看、平时常看的内容渠道；内容排版或呈现形式上有哪些可以改进的地方等。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-fa3d9755f0558faffcbc4370103aa02bf1b.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;作者提示: 个人观点，仅供参考&lt;/p&gt;</description>
      <author>RTE</author>
      <pubDate>Thu, 01 Oct 2026 21:30:46 +0800</pubDate>
      <link>https://testerhome.com/topics/44922</link>
      <guid>https://testerhome.com/topics/44922</guid>
    </item>
    <item>
      <title>我为什么自己造了个 E2E 工具：三条边界，八个取舍，五个被打脸的地方</title>
      <description>&lt;p&gt;先说结论：我造这个工具，不是因为「让 AI 点网页」很酷，而是因为&lt;strong&gt;测试沉淀不下来&lt;/strong&gt;这件事很痛。&lt;/p&gt;

&lt;p&gt;脚本写得出来，但过几个月回头看，仓库里躺着一堆 &lt;code&gt;test-login-2.spec.ts&lt;/code&gt;、&lt;code&gt;fix-tmp.spec.ts&lt;/code&gt;，没人说得清哪条还在用、哪条早就失效、哪条当初为什么那么写。脚本是代码，而我们要的其实是资产：能看懂、能复用、能交接、改版之后还活着。&lt;/p&gt;

&lt;p&gt;这篇把「为什么这么设计」摊开讲，包括代价，也包括几个被打脸之后才补上的地方。&lt;/p&gt;
&lt;h2 id="一、先定三条边界，后面全是推论"&gt;一、先定三条边界，后面全是推论&lt;/h2&gt;
&lt;p&gt;在 README 里我给项目写下的定位是三句话：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;不做通用浏览器助手&lt;/strong&gt;（目标是回归测试，不是「帮你操作任何网站」）；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;不做托管式云测试平台&lt;/strong&gt;（项目、脚本、记录、日志都在本地 SQLite，只有模型请求发到你自己配的网关）；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI 只参与两个环节&lt;/strong&gt;：生成脚本、定位器失效后的自愈重定位，其余全由 Playwright 确定性执行。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这三条一定，后面几乎每个选择都变成了推论：只要「AI 每次都得参与」，你就没有确定性；只要「什么都交给云」，你就把内网环境和数据主权交出去了。&lt;/p&gt;
&lt;h2 id="二、八个取舍：放弃了什么，换来什么"&gt;二、八个取舍：放弃了什么，换来什么&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1）确定性回放，而不是每次让模型点一遍。&lt;/strong&gt;&lt;br&gt;
换来：保存下来的步骤由 Playwright 原样执行，日常回归&lt;strong&gt;不调模型、Token 消耗为 0&lt;/strong&gt;，失败可复现、结果可对比。&lt;br&gt;
代价：脚本自身的稳定性成了天花板 —— 定位器写歪了，回放一定红，没人替你兜（这也是我后来做「测试友好 rule」的原因）。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2）断言失败不做 AI 自愈。&lt;/strong&gt;&lt;br&gt;
定位器失效可以自愈（元素挪了位置照样点得到，可一键采纳回写），但断言失败一律保留证据。理由很硬：给动作换定位是修工具，给断言换目标就是把缺陷改成通过。&lt;br&gt;
代价：失败要人来判断是脚本问题还是产品问题，工具不下结论。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3）登录只录一次。&lt;/strong&gt;&lt;br&gt;
录制一次登录态（Cookie + localStorage）供生成与回放复用，不必每条用例都从登录开始跑。&lt;br&gt;
代价：登录态有生命周期，过期要重录；多账号要维护多份配置。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4）复杂组件用「语义动作」，而不是硬点。&lt;/strong&gt;&lt;br&gt;
Ant Design / Element（element-ui · element-plus）/ Vant / MUI 的下拉、日期、级联这些控件，交给插件做语义动作（选值、设日期、勾选），插件按组件库变体分发 —— 专治「点了但没选上」这种假成功。&lt;br&gt;
代价：插件和预设要维护，项目要关联预设插件才会注入。这确实是一篇讲组件插件的文章能写一整篇的原因。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5）本地桌面端 + SQLite，不做 SaaS。&lt;/strong&gt;&lt;br&gt;
换来：数据不出本机、能连内网系统、零部署、装完就能跑（安装包内置 Node，浏览器用系统 Chrome）。&lt;br&gt;
代价：协作只能靠导出 &lt;code&gt;.testcase&lt;/code&gt; 文件交换，所以我后来把「用例即文件」这条路铺得很实。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6）语义化定位器 + 优先级阶梯。&lt;/strong&gt;&lt;br&gt;
定位从 &lt;code&gt;data-testid → role → label → placeholder → text → alt → title → css → xpath&lt;/code&gt; 这套顺序里挑，抗改版能力完全不一样。&lt;br&gt;
代价：这套优先级要生效，&lt;strong&gt;业务代码得先给锚点&lt;/strong&gt;。所以配套做了让 agent 顺手留 testid 的规则文件 —— 测试友好不是测试单方面的事。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://testerhome.com/uploads/photo/2026/7324a3c1-de1d-47ea-a0da-f67a87906072.jpg!large" title="" alt="预拆分计划弹窗：先看「测试意图与验收约定」，确认后才执行"&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7）用例是可导出的文件，不是锁在库里的记录。&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;.testcase&lt;/code&gt; 能导出、能进 Git、能被编程 agent 按技能包直接生成；含上传动作的用例还能连文件一起打包跨项目带走。&lt;br&gt;
代价：要维护 schema、技能包和导入校验 —— 枚举拼错直接 400，这种「严格」是刻意留的。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://testerhome.com/uploads/photo/2026/25ee92fa-de7b-438f-b826-6f63e52bf3ad.jpg!large" title="" alt="用例列表：导入 / 批量导入，用例本身是可以进 Git 的文件"&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8）先确认计划，再执行。&lt;/strong&gt;&lt;br&gt;
不乱点：先出一份预拆分计划（测试意图、前置条件、数据约束、验收目标与必验项），确认后才在真实浏览器里逐步执行。&lt;br&gt;
代价：多一步交互。但换回来的是「该测什么」这个判断权还在工程师手上。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://testerhome.com/uploads/photo/2026/38aca506-6e66-4b99-839b-516350712d11.jpg!large" title="" alt="步骤表：每个动作落成可编辑的语义定位器步骤，断言与接口断言都在同一条链上"&gt;&lt;/p&gt;
&lt;h2 id="三、五个被现实教会的地方"&gt;三、五个被现实教会的地方&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1）模型真的会打转。&lt;/strong&gt; 生成过程里出现过同工具同参数反复调用的现象，于是补了空转保护：同工具同参数第 4 次警告、第 6 次挂起求助、累计 9 次终止；还有周期性重复的环绕检测（周期 2–4 反复 3 轮判定）。细节上必须区分 —— &lt;strong&gt;只观察不改状态的动作不计入&lt;/strong&gt;，否则模型多看几次页面就被误杀；「求助」也不能重置累计，否则能无限续跑。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2）上下文膨胀是必然的。&lt;/strong&gt; 截图、页面快照、接口响应全堆在对话里，几轮就爆。于是有了状态槽 + 版本替代（新快照/新截图到来时，同槽旧消息原地降级成一行占位）、工作记忆的字符预算、以及省略内容按需回读。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3）唯一数据「填了 A、断言引用 B」是真实灾难。&lt;/strong&gt; 生成阶段真的出现过：输入写了 &lt;code&gt;test829401&lt;/code&gt;，断言期望值算出来是 &lt;code&gt;test442434&lt;/code&gt; —— 两串数字永远不可能相等，用例必红，而且看起来像产品缺陷。现在这是硬规则：同一次运行里同名变量保持一致，填写与断言引用同一个变量。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4）不是所有动作都能靠 AI 兜底。&lt;/strong&gt; 上传、滚动、断言被明确排除在通用自愈之外 —— 上传和滚动的语义一改，验收证据就不成立。所以技能文档里专门写了一节「上传、滚动与作用域」，不允许 agent 自由发挥。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5）平台差异是真坑。&lt;/strong&gt; 最新版本修的正是这个：Windows 上 Hyper-V / WSL2 / Docker 会随机保留一段 TCP 端口，默认的 4123 一旦落在保留段里后端就起不来，而界面只显示一句笼统的「Failed to fetch」。现在改成启动时从 4123 往后探测可用端口（最多 100 个），后端起不来时直接给原因和日志位置。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://testerhome.com/uploads/photo/2026/cfadb200-bcac-40cd-afae-df8476f2c587.jpg!large" title="" alt="设置页：网关地址、模型、视觉能力开关、思考深度、最大步数，全在你手里"&gt;&lt;/p&gt;
&lt;h2 id="四、时间线（顺便证明它有多年轻）"&gt;四、时间线（顺便证明它有多年轻）&lt;/h2&gt;
&lt;p&gt;2026-09-07 第一次提交 → 2026-09-24 发布 v0.1.7，&lt;strong&gt;73 次提交、7 个版本&lt;/strong&gt;。版本内容基本是被现实推着走的顺序：v0.1.3 加应用内更新器；v0.1.6 桌面端导出改系统原生「另存为」、生成日志按界面语言渲染；v0.1.7 修 Windows 保留端口导致的启动失败。&lt;/p&gt;

&lt;p&gt;这些都不算「功能」，但它们是工具能不能被长期用下去的分水岭。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://testerhome.com/uploads/photo/2026/5dd4fc72-f2cb-4469-b8b9-903c7b0401c6.jpg!large" title="" alt="回放证据：逐步状态、耗时、Token 消耗、自愈标记与运行日志"&gt;&lt;/p&gt;
&lt;h2 id="五、它现在解决不了什么"&gt;五、它现在解决不了什么&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;不是云平台&lt;/strong&gt;：没有托管调度、团队权限、并发队列，多机协作要自己想办法；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;不跨 iframe 找元素&lt;/strong&gt;（滚动也不跨 iframe）；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;raw&lt;/code&gt; 动作当前跳过&lt;/strong&gt;，想塞自定义代码进步骤里不生效；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;不 mock 接口&lt;/strong&gt;：接口/WebSocket 断言基于真实请求，拦了就没意义；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;依赖代码侧配合&lt;/strong&gt;：定位优先级再高，业务代码不给锚点也只能掉到末档；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;生成质量的上限是你的模型&lt;/strong&gt;：网关、模型、视觉开关、思考深度、最大步数都在设置里自己配；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;自愈不是万能的&lt;/strong&gt;：动作可以自愈，上传/滚动/断言不行。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="六、给同样在写测试资产的人三条建议"&gt;六、给同样在写测试资产的人三条建议&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;先定边界，再谈功能。&lt;/strong&gt;「AI 在哪些环节参与」必须一句话说清；说不清，用例就永远在「这次能跑、下次不一定」之间摇摆。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;确定性优先，智能其次。&lt;/strong&gt; 让 AI 做理解意图、生成、重新定位这些事，把「跑一遍验证」交给确定性引擎 —— 省下来的成本，是你敢不敢每天跑回归的前提。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;代价要说出口。&lt;/strong&gt; 本地优先就得接受协作靠文件，确定性就得接受脚本要维护，断言不自愈就得接受失败要人看。代价不说清，用户第一次踩到就会觉得被骗。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="七、想听听你们的做法"&gt;七、想听听你们的做法&lt;/h2&gt;
&lt;p&gt;我把三条边界划得挺硬（不做通用助手、不做云平台、AI 只进两个环节），代价也认了。想问问同行：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;你们的 E2E 资产是怎么沉淀的 —— 脚本在仓库里，还是在某个平台的用例库里？交接的时候靠什么？&lt;/li&gt;
&lt;li&gt;「AI 参与测试」这件事，你们的边界划在哪一段？有没有踩过「自动化把缺陷改成通过」的坑？&lt;/li&gt;
&lt;li&gt;回归频率和成本之间，你们最后怎么平衡的？&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;评论区聊聊，也欢迎直接来项目里提 issue。&lt;/p&gt;

&lt;p&gt;参考：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;项目地址：&lt;a href="https://github.com/xianyongwen/TestDog" rel="nofollow" target="_blank"&gt;https://github.com/xianyongwen/TestDog&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;文档：&lt;a href="https://softwing.top/testdog-doc/" rel="nofollow" target="_blank"&gt;https://softwing.top/testdog-doc/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;社区：&lt;a href="https://testerhome.com/opensource_projects/testdog" rel="nofollow" target="_blank"&gt;https://testerhome.com/opensource_projects/testdog&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>w471176877</author>
      <pubDate>Mon, 05 Oct 2026 13:11:33 +0800</pubDate>
      <link>https://testerhome.com/topics/44920</link>
      <guid>https://testerhome.com/topics/44920</guid>
    </item>
    <item>
      <title>AI for Testing 提效实战·测试设计（一）：喂段需求给 AI，30 秒铺开测试点，防漏测的第一步</title>
      <description>&lt;p&gt;用 AI 做测试设计 ·（一）&lt;/p&gt;

&lt;p&gt;做测试这些年，我最慌的时刻从来不是"写不完用例"，而是&lt;strong&gt;上线后冒出一个我压根没想到的场景&lt;/strong&gt;——那种"这个点我当时怎么漏了"的后背发凉。&lt;/p&gt;

&lt;p&gt;漏掉测试点，几乎从来不是因为不仔细，而是&lt;strong&gt;一个人对着需求，思维很难一次铺开&lt;/strong&gt;。正常流程顺下来谁都会，偏偏是边界、异常、逆向那些"犄角旮旯"最容易从指缝里滑走。&lt;/p&gt;

&lt;p&gt;我现在拿到一段需求，&lt;strong&gt;第一步不急着写用例，而是先把需求丢给 AI，让它帮我做一次"测试点脑暴"&lt;/strong&gt;，30 秒铺开一张大网，我再在这张网上增、删、收口。&lt;/p&gt;

&lt;p&gt;但在讲怎么操作之前，我想先把一件更重要的事讲透：&lt;strong&gt;AI 为什么能帮你把测试点铺全，又为什么一定会漏掉一些——搞懂这个，你才知道怎么用它才不翻车。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="一、原理：AI 脑暴测试点，到底在"&gt;一、原理：AI 脑暴测试点，到底在"想"什么&lt;/h2&gt;&lt;h3 id="1.1 为什么它比你一个人想得全"&gt;1.1 为什么它比你一个人想得全&lt;/h3&gt;
&lt;p&gt;先说一个反直觉的事实：&lt;strong&gt;AI 并不是在"推理"你的需求，它更像是在"回忆和重组"成千上万工程师见过的场景。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;大模型在训练时读过海量的需求文档、测试用例、缺陷库、测试经验帖。当你丢给它一句"账号密码登录"，它做的事本质是：&lt;/p&gt;

&lt;p&gt;"登录"这个东西，历史上无数工程师测过，他们踩过空值、超长、爆破、锁定、互踢、弱网……我把这些高频出现的维度，按概率从高到低给你列出来。&lt;/p&gt;

&lt;p&gt;所以它在&lt;strong&gt;通用、公共的维度上，几乎一定比单个普通人想得全&lt;/strong&gt;——因为它背后是成千上万个测试大脑的经验叠加，而且它没有思维定式、不会疲倦、不会"我觉得这种情况不可能发生"。&lt;/p&gt;
&lt;h3 id="1.2 那为什么它又一定会漏"&gt;1.2 那为什么它又一定会漏&lt;/h3&gt;
&lt;p&gt;同样的原理，决定了它的死穴：&lt;strong&gt;它不懂"你的"系统。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;它列的所有东西，都是"通用登录"的经验。但你项目里真正最容易出 bug 的，往往是那些&lt;strong&gt;只存在于你们业务里、需求里没写透、外人根本不可能知道&lt;/strong&gt;的规则，比如：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;你们的账号其实是"工号 + 租户"，跨租户同名会冲突；&lt;/li&gt;
&lt;li&gt;你们有个历史包袱：老用户密码是旧加密方式，新老并存；&lt;/li&gt;
&lt;li&gt;你们登录后要根据风控等级跳不同的中间页。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这些东西，&lt;strong&gt;全网搜不到、训练数据里没有，AI 再强也变不出来。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="1.3 一个最好用的心智模型"&gt;1.3 一个最好用的心智模型&lt;/h3&gt;
&lt;p&gt;我建议你这样定位 AI 在这一步的角色：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;把它当成一个"经验极丰富、但今天第一天来上班、还完全不懂咱们系统"的资深同事。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这个比喻能解释一切：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;通用经验上，他比你还老练 → 所以让他先铺开；&lt;/li&gt;
&lt;li&gt;但他不懂咱们的业务 → 所以&lt;strong&gt;你喂给他的上下文越多，他越靠谱；你只丢一句话，他就只能给你最通用、最没针对性的东西。&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;记住这句话，下面所有"怎么做到更好"的技巧，本质都是同一件事：&lt;strong&gt;想办法让这个新人快速了解你们系统。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="二、基础实操：一段提示词跑通"&gt;二、基础实操：一段提示词跑通&lt;/h2&gt;
&lt;p&gt;就拿最常见的需求来演示：&lt;/p&gt;

&lt;p&gt;用户输入账号和密码，点击登录，校验通过则进入首页。&lt;/p&gt;

&lt;p&gt;我把它原样丢给主流 AI（ChatGPT / Claude / DeepSeek 都可以，这个发散任务对模型要求不高）。&lt;/p&gt;
&lt;h3 id="我用的提示词（可直接抄）"&gt;我用的提示词（可直接抄）&lt;/h3&gt; &lt;pre class="highlight plaintext"&gt;&lt;code&gt;你是一名有10年经验的资深测试工程师。
下面是一段功能需求，请帮我做"测试点脑暴"，而不是直接写详细用例。

需求：
"""
用户输入账号和密码，点击登录，校验通过则进入首页。
"""

要求：
1. 按维度分类列出测试点（正常流程、输入校验、边界值、异常场景、
   安全性、兼容性、性能、交互与状态等）；
2. 重点补充人容易漏掉的异常、逆向、边界场景；
3. 每个测试点一句话即可，不展开步骤；
4. 最后单列一节：这段需求里"描述不清晰、需要找产品确认"的疑点。
&lt;/code&gt;&lt;/pre&gt; &lt;h3 id="AI 返回的测试点（节选）"&gt;AI 返回的测试点（节选）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;正常流程&lt;/strong&gt;：正确账号密码登录成功跳首页；已登录再进登录页的处理。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;输入校验 / 边界&lt;/strong&gt;：账号或密码为空；只填一项；前后带空格；大小写策略；超长、特殊字符、Emoji、中文；粘贴带入的不可见字符。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;异常场景&lt;/strong&gt;：账号不存在；密码连续错误 N 次的锁定 / 验证码；锁定期间与到期解锁；断网 / 弱网 / 超时；服务端报错提示；多端同时登录互踢；快速连点导致重复提交。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;安全&lt;/strong&gt;：密码是否明文、有无"小眼睛"；防爆破限制；刷新能否回看密码；是否 HTTPS；SQL 注入、万能密码。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;兼容 / 性能 / 交互&lt;/strong&gt;：机型系统浏览器分辨率；键盘遮挡、回车提交；响应慢时有无 loading 和防重复；会话有效期与失效。&lt;/p&gt;

&lt;p&gt;30 秒，一张比大多数人第一版全得多的网就铺开了。&lt;/p&gt;
&lt;h2 id="三、怎么做到更好：让输出质量翻倍的做法"&gt;三、怎么做到更好：让输出质量翻倍的做法&lt;/h2&gt;
&lt;p&gt;90% 的人停在"丢一句话、拿一屏结果"，然后抱怨"AI 也就那样"。真正拉开差距的是下面这几个动作——它们都来自前面那个原理：&lt;strong&gt;你给的上下文和约束，决定它的上限。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="做法 1：别只喂需求，把"&gt;做法 1：别只喂需求，把"背景料"一起喂进去&lt;/h3&gt;
&lt;p&gt;这是收益最大、也最少人做的一步。除了那句需求，再附上你能拿到的：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;业务背景&lt;/strong&gt;：这是什么产品、给谁用、核心场景是什么；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;用户角色&lt;/strong&gt;：新用户 / 老用户 / 被风控的用户分别会怎样；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;接口 / 原型&lt;/strong&gt;：有接口文档、原型图、状态流转图就一起给；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;历史 bug&lt;/strong&gt;："这个模块以前在 XX 上出过问题"。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;同一个登录需求，加了"账号是工号、存在跨租户同名、有新老两套密码加密"这些背景后，它列出来的点立刻从"通用清单"变成"你项目的清单"。&lt;strong&gt;信息质量决定输出质量，没有捷径。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="做法 2：让它"&gt;做法 2：让它"换人"再想一遍，专攻盲区&lt;/h3&gt;
&lt;p&gt;一个视角必然有盲区。可以在同一轮里要求它切换身份：&lt;/p&gt;
 &lt;pre class="highlight plaintext"&gt;&lt;code&gt;请分别从以下视角补充测试点：
1. 恶意攻击者（想盗号、爆破、绕过校验）；
2. 完全不懂电脑的老年用户（误操作、异常输入）；
3. 产品经理（关注规则边界和异常提示文案）；
4. 运维 / 风控（关注高频、异常 IP、设备指纹）。
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;正常流你自己能想到，&lt;strong&gt;但"攻击者视角"和"小白误操作视角"是普通人最容易漏、却最容易出线上事故的两类。&lt;/strong&gt; 这一步常常能捞出你第一版完全没有的点。&lt;/p&gt;
&lt;h3 id="做法 3：多轮迭代，逼它"&gt;做法 3：多轮迭代，逼它"再挖深一层"&lt;/h3&gt;
&lt;p&gt;别指望一次问完。第一轮结果出来后，连续追问：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"在【异常场景】这一类里，还有没有更极端、更罕见的情况？"&lt;/li&gt;
&lt;li&gt;"如果上游依赖的服务挂了 / 数据库主从延迟 / 缓存失效，会怎样？"&lt;/li&gt;
&lt;li&gt;"假设已经有了上面这些点，还有什么是大家普遍会忽略的？"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;你会发现每追问一轮，它都能再挤出几条——&lt;strong&gt;人脑是越想越累，它是你不喊停就一直能补。&lt;/strong&gt; 一般追问 2~3 轮，边际收益就开始递减，那时收口刚好。&lt;/p&gt;
&lt;h3 id="做法 4：让它输出成表格或思维导图，直接进评审"&gt;做法 4：让它输出成表格或思维导图，直接进评审&lt;/h3&gt;
&lt;p&gt;纯文字清单不便于评审和归档。在提示词最后加一句：&lt;/p&gt;
 &lt;pre class="highlight plaintext"&gt;&lt;code&gt;请用 Markdown 表格输出，列：模块 | 测试点 | 优先级(高/中/低) | 类型(正常/异常/边界/安全)；
或者用缩进大纲输出，方便我转成思维导图。
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;带优先级和类型的表格可以直接贴到用例管理工具；缩进大纲复制到 &lt;strong&gt;XMind / 幕语 / ProcessOn&lt;/strong&gt; 一键转思维导图，评审时投屏讲，专业度和效率完全不一样。&lt;/p&gt;
&lt;h3 id="做法 5：换个模型交叉验证，或让它"&gt;做法 5：换个模型交叉验证，或让它"自检"&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;交叉验证&lt;/strong&gt;：同一个需求在两个不同模型各问一遍，对比差异——某个模型独有的点，往往就是值得留意的；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;自检&lt;/strong&gt;：最后让它当审核员："请忘掉你刚才的回答，重新审查这份清单，指出其中可能重复、不现实、或仍然遗漏的点。"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;让它自己挑自己的毛病，比你从头肉眼过一遍快得多，也常常能抓出"为了凑数而列的废点"。&lt;/p&gt;
&lt;h3 id="做法 6：把上面 5 点打包——这是我现在直接用的进阶提示词"&gt;做法 6：把上面 5 点打包——这是我现在直接用的进阶提示词&lt;/h3&gt;
&lt;p&gt;不用每次手动拼，下面这段把"喂背景、换视角、结构化输出、自检"全整合了（多轮追问留到结果出来后单独发）。你只需替换方括号里的内容：&lt;/p&gt;
 &lt;pre class="highlight plaintext"&gt;&lt;code&gt;你是一名有10年经验的资深测试工程师，请帮我对下面的需求做"测试点脑暴"，
不要直接写详细用例。

【业务背景】
- 产品/模块：[这是什么产品、核心功能]
- 目标用户：[谁会用，有哪些角色]
- 关键规则/历史包袱：[如账号体系、新老逻辑、风控、上游依赖等]
- 已知历史问题：[这个模块以前在哪出过bug，没有可写"暂无"]

【需求】
"""
[把需求原文贴这里]
"""

请按以下步骤完成：
1. 先按维度分类列出测试点：正常流程、输入校验、边界值、异常场景、
   安全、兼容、性能、交互与状态；每个点一句话。
2. 再分别从【恶意攻击者】【小白/老年用户误操作】【产品经理】
   【运维/风控】四个视角，补充容易被漏掉的测试点。
3. 单列一节"需求疑点"：描述不清、必须找产品确认的问题。
4. 用 Markdown 表格输出，列为：模块 | 测试点 | 优先级(高/中/低)
   | 类型(正常/异常/边界/安全)。
5. 最后以审核员身份自检：指出上表中可能重复、不现实、或你们业务里仍可能遗漏的点。
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;跑完这一轮，再单独发一句做多轮深挖（对应做法 3）：&lt;/p&gt;
 &lt;pre class="highlight plaintext"&gt;&lt;code&gt;针对【异常场景】，再补充更极端、更罕见的情况；
并考虑：上游服务宕机、数据库主从延迟、缓存失效时分别会怎样？
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;对比一下你就看出差别&lt;/strong&gt;：基础版只让 AI"凭一句通用需求列点"，得到的是网上随处可见的通用清单；进阶版通过【业务背景】把它变成"懂你们系统的新人"，再强制换视角、结构化、自检——同样一个模型，输出的针对性和完整度完全不在一个档次。&lt;/p&gt;
&lt;h2 id="四、最容易被忽略的高价值产出：需求疑点"&gt;四、最容易被忽略的高价值产出：需求疑点&lt;/h2&gt;
&lt;p&gt;别忘了提示词最后那条要求。AI 通常会给出这样一节：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;需要找产品确认的疑点：&lt;/strong&gt;&lt;br&gt;
账号是用户名 / 手机号 / 邮箱？密码复杂度规则？输错几次锁定、锁多久？是否单点登录互踢？会话保持多久、要不要"记住我"？账号被禁用 / 注销后提示什么？&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;这一节的性价比极高。&lt;/strong&gt; 在写用例前就把这些问题抛给产品，能省掉后面大量"我以为是这样、结果不是"的返工。AI 在这里像一个不知疲倦的反问机器，帮你把一句话需求里的窟窿提前照出来。&lt;/p&gt;
&lt;h2 id="五、说清楚三个坑"&gt;五、说清楚三个坑&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. 它会列"看起来对、但你们项目根本不涉及"的点&lt;/strong&gt;（比如凭空给你加"微信登录""人脸登录"）。这是通用经验在补，不是读了你的系统——逐条问"我们有这回事吗"，没有就划掉。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. 满满一屏会给你虚假的安全感。&lt;/strong&gt; 它能保证通用维度全，&lt;strong&gt;保证不了业务专属规则全&lt;/strong&gt;，而后者恰恰最容易出事。AI 给的是底盘，不是全部。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. 这是"测试点"，不是"用例"。&lt;/strong&gt; 要不要测、用什么数据、优先级、和已有用例去重，都还要你工程化收口。它替代的是你"对着空白文档冷启动"的那十分钟，不是你的专业判断。&lt;/p&gt;
&lt;h2 id="六、工具与方式建议"&gt;六、工具与方式建议&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;模型选择&lt;/strong&gt;：纯发散脑暴，主流模型差异不大；业务逻辑复杂、要喂大量上下文时，选&lt;strong&gt;长上下文、推理更稳&lt;/strong&gt;的模型（如 Claude、DeepSeek、GPT 高配版）。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;结构化整理&lt;/strong&gt;：Markdown 表格进用例库；缩进大纲进 &lt;strong&gt;XMind / 幕布 / ProcessOn&lt;/strong&gt; 转脑图。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;想要更高的自动化&lt;/strong&gt;：这套"喂需求→出测试点"的逻辑，我自己把它做成了一个小工具（TestPilot），在真实项目里把生成准确率从 62% 调到了 85%。但这是后话，&lt;strong&gt;今天你不用任何工具，用手边一个 AI 加上面几个技巧，就能把这个动作的效果拉满。&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="总结：我的固定动作"&gt;总结：我的固定动作&lt;/h2&gt;
&lt;p&gt;拿到需求 → &lt;strong&gt;喂足背景料，让 AI 脑暴测试点 + 需求疑点&lt;/strong&gt; → 换视角、追问 2~3 轮、自检 → 输出成表格 / 脑图 → 删掉不相关、补上业务专属、找产品确认 → 再写正式用例。&lt;/p&gt;

&lt;p&gt;整个过程也就几分钟，但能把"漏整块维度"的概率压下去一大截。&lt;strong&gt;关键不是 AI 有多强，是你愿不愿意多花两分钟，把它从"通用新人"变成"了解你们系统的新人"。&lt;/strong&gt;&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;em&gt;这是「AI for Testing 提效实战 · 测试设计（一）」。&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;如果这个动作对你有用，欢迎转给那个总被说"又漏测了"的同事。&lt;/em&gt;&lt;/p&gt;</description>
      <author>Santo</author>
      <pubDate>Wed, 30 Sep 2026 19:45:08 +0800</pubDate>
      <link>https://testerhome.com/topics/44918</link>
      <guid>https://testerhome.com/topics/44918</guid>
    </item>
    <item>
      <title>平安银行金融科技部（深圳）招聘 -  测试开发岗/系统开发岗</title>
      <description>&lt;p&gt;平安银行 - 金融科技部（深圳），招聘测试开发/系统开发&lt;br&gt;
工作地点：深圳&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;岗位一：测试开发岗（需求：中级、初级共 2 人）&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;岗位职责：&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;负责 DataOps、ModelOps、数字员工和数据应用系统的功能、性能、兼容性等测试。&lt;/li&gt;
&lt;li&gt;负责系统自动化测试建设，使用 AI 大模型技术（如 LLM）构建基于 AI 技术的自动化测试体系，包括自动生成测试用例、测试脚本与测试数据，设计并实现基于 AI 的缺陷预测模型。&lt;/li&gt;
&lt;li&gt;负责项目质量管控，包括质量流程、质量指标、质量复盘等。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;任职要求：&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;本科及以上学历，计算机、软件工程、自动化、人工智能等相关专业。&lt;/li&gt;
&lt;li&gt;5 年以上软件测试经验，熟练 Linux、Shell、Java、Python 等编程语言，熟悉 Selenium、jesting 等测试框架。&lt;/li&gt;
&lt;li&gt;对 AI 探索有较高热情，能够独立建设智能体，提升测试效率。&lt;/li&gt;
&lt;li&gt;学习能力强，能够独立解决问题，有数据仓库、BI、大数据解决方案相关测试经验者优先。&lt;/li&gt;
&lt;li&gt;具备良好的语言表达能力、抗压能力，以及良好的组织和协同能力。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;岗位二：系统开发岗（需求：中级 1 人）&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;岗位职责：&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;基于 Java 后端与 Vue 前端技术栈，独立完成大数据测试及发布平台核心模块的设计、编码与调试，自主测试所开发的功能模块，保障研发交付质量，确保平台稳定高效运行。&lt;/li&gt;
&lt;li&gt;主导平台技术类改造（如信创改造、架构升级等）技术方案的制定及评审、方案实施。&lt;/li&gt;
&lt;li&gt;负责用户使用平台过程中的技术问题响应与处理，包括咨询解答、故障排查，保障用户使用体验。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;任职要求：&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;本科及以上学历，计算机相关专业。&lt;/li&gt;
&lt;li&gt;3 年以上 Java+Vue 全栈开发经验，参与过至少 1 个平台类项目（大数据/测试/发布相关优先）。&lt;/li&gt;
&lt;li&gt;了解大数据基础技术栈（Hadoop/Spark 等），能完成平台与大数据组件的对接开发，熟悉 MySQL、Redis 使用及基础优化。&lt;/li&gt;
&lt;li&gt;具备测试思维，了解软件测试流程，具备强烈的质量意识和扎实的自测能力，确保开发功能的质量。
5.具备良好的沟通表达与服务意识，能耐心响应用户需求，快速定位并解决用户使用过程中的各类技术问题，高效推进问题闭环。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;简历发至邮箱&lt;/strong&gt;：58524252@qq.com&lt;br&gt;
（请注明来自 TesterHome）&lt;/p&gt;</description>
      <author>TH_tester</author>
      <pubDate>Wed, 30 Sep 2026 18:00:54 +0800</pubDate>
      <link>https://testerhome.com/topics/44917</link>
      <guid>https://testerhome.com/topics/44917</guid>
    </item>
    <item>
      <title>开源一个多会话管理版 deepseek harness 客户端，本视频由 dsh 自己剪辑生成</title>
      <description>&lt;p&gt;介绍视频：&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//player.bilibili.com/player.html?bvid=1e2ad6cErw" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;/?vd_source=8aea9fbb79ff0974df88e27f03f8ef55&lt;br&gt;
（本视频由 dsh 自己剪辑生成）&lt;/p&gt;

&lt;p&gt;按照之前码头（&lt;a href="https://github.com/icesword0760/matoudsh%E5%AE%A2%E6%88%B7%E7%AB%AF%EF%BC%9Ahttps://github.com/icesword0760/whalepod%EF%BC%9B" rel="nofollow" target="_blank"&gt;https://github.com/icesword0760/matoudsh 客户端：https://github.com/icesword0760/whalepod；&lt;/a&gt;）的设计思路（看我上个视频），重新设计了&lt;/p&gt;

&lt;p&gt;但不得不说，deepseek 真的能力有限，这条视频是 4.1 flash max 剪辑的，来回好几遍，还没 opus 一遍强&lt;/p&gt;

&lt;p&gt;简单介绍下，该项目主要用于便捷的管理 ai 研发过程，&lt;br&gt;
可以同时同界面多开会话；&lt;br&gt;
把 ai 会话按照项目制三级管理进行收纳；&lt;br&gt;
每个会话可以自由调整大小和顺序；&lt;br&gt;
会话之间可以自由通信，你可以在一个会话上说，看一下右边这个会话的 xx 信息；&lt;br&gt;
具体看视频吧&lt;/p&gt;</description>
      <author>icesword760</author>
      <pubDate>Wed, 30 Sep 2026 13:18:01 +0800</pubDate>
      <link>https://testerhome.com/topics/44911</link>
      <guid>https://testerhome.com/topics/44911</guid>
    </item>
    <item>
      <title>关于智能体评测你了解多少？</title>
      <description>&lt;p&gt;在 AI 时代，测试专职岗位最后必然会全部转型，比如业务审核师、模型评测师、质量平台开发等等，那么其中的模型、智能体、skill、mcp 等评测师要做些什么事情？从哪些方面去做？整个流程什么样？&lt;/p&gt;
&lt;h2 id="模型 / 智能体 / Skill / MCP 评测：评测师工作内容、评测维度、完整流程"&gt;模型 / 智能体 / Skill / MCP 评测：评测师工作内容、评测维度、完整流程&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;先简单区分概念（避免评测范围混淆）&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;模型（LLM / 多模态基础模型）&lt;/strong&gt;：底层大模型，能力、幻觉、对齐、安全&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;智能体 Agent&lt;/strong&gt;：带规划、工具调用、记忆、多轮决策的 AI 应用（不是单纯问答）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skill（技能）&lt;/strong&gt;：智能体可调用的单项能力，比如查天气、查订单、数据库查询、函数调用&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP（Model Context Protocol，模型上下文协议）&lt;/strong&gt;：标准化协议，让模型安全调用外部工具 / 资源，评测重点：协议交互、权限、上下文传递、异常容错&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id="一、评测师要做哪些核心事情"&gt;一、评测师要做哪些核心事情&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;需求拆解 &amp;amp; 评测范围定义&lt;/strong&gt;
区分：是底层模型评测？还是 Agent 应用评测？还是 Skill 单能力？还是 MCP 协议层交互？明确验收标准、业务目标、风险等级。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;设计评测数据集、测试用例&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;正向用例：正常业务场景&lt;/li&gt;
&lt;li&gt;边界用例：超长上下文、歧义、多轮复杂任务&lt;/li&gt;
&lt;li&gt;对抗 / 红队用例：提示注入、越狱、越权、误导&lt;/li&gt;
&lt;li&gt;领域专业用例：业务专属知识&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;构造评测环境&lt;/strong&gt;
部署待测对象、MCP 服务、工具、依赖的 API / 数据库；准备评测框架（DeepEval、Promptfoo、Langfuse）、标注平台。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;执行评测，采集指标&lt;/strong&gt;
批量跑用例，采集自动指标 + 人工标注样本；记录链路日志（MCP 请求、工具调用参数、返回结果、token、耗时）。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;缺陷定位、根因分析&lt;/strong&gt;
判断问题出在哪一层：基础模型本身？Agent 规划逻辑？Skill 执行报错？MCP 协议传参错误 / 上下文丢失？&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;输出评测报告 &amp;amp; 质量门禁&lt;/strong&gt;
量化指标、缺陷清单、风险结论、是否准入上线；给出优化建议（调 prompt、改 skill、MCP 权限收紧、模型微调等）。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;回归评测 + 线上灰度监控&lt;/strong&gt;
版本迭代后复测；线上埋点，持续监控真实用户 query 的失败、幻觉、越权情况。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="二、从哪些维度开展评测（分 4 类对象，可直接写进方案）"&gt;二、从哪些维度开展评测（分 4 类对象，可直接写进方案）&lt;/h2&gt;&lt;h3 id="✅ 1）基础大模型（LLM / 多模态）评测维度"&gt;✅ 1）基础大模型（LLM / 多模态）评测维度&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;能力维度&lt;/strong&gt;：知识、推理、数学、代码、理解、指令遵循、多轮对话、长上下文&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;事实性 &amp;amp; 幻觉&lt;/strong&gt;：是否编造不存在信息，事实一致性&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;对齐与安全&lt;/strong&gt;：越狱、偏见、有害输出、隐私泄露、拒绝违规请求能力&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;稳定性&lt;/strong&gt;：相同输入是否输出不一致、重复输出、乱码&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;性能指标&lt;/strong&gt;：首 token 耗时、总耗时、token 消耗、并发稳定性&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="✅ 2）智能体 Agent 评测维度（重点！比单纯 LLM 复杂很多）"&gt;✅ 2）智能体 Agent 评测维度（重点！比单纯 LLM 复杂很多）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;任务规划能力&lt;/strong&gt;：能否拆解复杂目标、选择正确执行顺序&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;工具调用正确性&lt;/strong&gt;：是否选对 Skill、参数是否填对、是否重复调用、无效调用&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;记忆管理&lt;/strong&gt;：多轮对话上下文记忆、遗忘、信息混淆&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;错误处理&lt;/strong&gt;：Skill 调用失败后 Agent 能否重试、降级、向用户合理报错，不瞎编答案&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;任务完成率&lt;/strong&gt;：最终是否达成用户目标（&lt;strong&gt;最重要指标&lt;/strong&gt;，不是单句回答打分）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;链路一致性&lt;/strong&gt;：思考过程、工具返回、最终回答是否自洽&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;安全风险&lt;/strong&gt;：Agent 是否通过工具越权访问数据、执行危险操作&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="✅ 3）Skill（技能）评测维度（Agent 的单个能力单元）"&gt;✅ 3）Skill（技能）评测维度（Agent 的单个能力单元）&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Skill = 单个可调用能力，例如：订单查询、数据库检索、邮件发送&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;输入输出正确性&lt;/strong&gt;：入参校验、参数缺失 / 参数异常时返回结果是否符合预期&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;业务准确性&lt;/strong&gt;：查询结果、计算结果是否和真实业务一致&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;异常容错&lt;/strong&gt;：超时、下游接口报错、网络抖动时 Skill 的返回码 / 返回信息&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;权限控制&lt;/strong&gt;：越权查询他人数据、非法参数能否拦截&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;性能&lt;/strong&gt;：调用耗时、并发、限流&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;副作用风险&lt;/strong&gt;：写类 Skill（下单、改数据）会不会误操作、重复提交&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="✅ 4）MCP（Model Context Protocol）评测维度"&gt;✅ 4）MCP（Model Context Protocol）评测维度&lt;/h3&gt;
&lt;p&gt;MCP 是模型和外部工具之间的通信协议，评测聚焦&lt;strong&gt;交互层&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;协议规范一致性&lt;/strong&gt;：请求 / 响应报文、字段、数据类型是否符合 MCP 协议规范&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;上下文传递&lt;/strong&gt;：上下文能否正确透传，上下文截断、丢失、错乱&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;工具调用链路&lt;/strong&gt;：模型→MCP 服务→Skill，参数传递是否失真、参数丢失、类型转换错误&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;安全与权限&lt;/strong&gt;：MCP 的访问控制、鉴权、权限隔离，防止模型通过 MCP 调用未授权工具&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;异常处理&lt;/strong&gt;：MCP 服务宕机、超时、工具报错，能否把错误信息安全回传给模型，不泄露内部敏感信息&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;稳定性&lt;/strong&gt;：并发调用、长会话下 MCP 会话管理、会话超时回收&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;整体评测通用维度：&lt;strong&gt;功能正确性、事实性、安全、性能、稳定性、鲁棒性、可观测性&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="三、完整评测全流程（可直接用于 PPT / 评审文档）"&gt;三、完整评测全流程（可直接用于 PPT / 评审文档）&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;阶段 1：评测准备（需求 &amp;amp; 方案阶段）&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;对齐业务目标：明确 Agent/Skill/MCP 需要解决什么业务问题、上线准入标准、验收指标&lt;/li&gt;
&lt;li&gt;确定评测对象边界：区分是模型本身，还是 Agent 应用，还是 MCP 协议层，避免测混&lt;/li&gt;
&lt;li&gt;设计评测方案：确定评测维度、指标定义、数据集类型、评测工具（DeepEval/Promptfoo/Langfuse）、人工标注规则&lt;/li&gt;
&lt;li&gt;准备测试数据集

&lt;ul&gt;
&lt;li&gt;正向用例：正常业务 query&lt;/li&gt;
&lt;li&gt;边界用例：超长上下文、模糊提问、多步骤复杂任务&lt;/li&gt;
&lt;li&gt;对抗红队用例：提示注入、越权尝试、诱导 Agent 执行危险操作&lt;/li&gt;
&lt;li&gt;负面异常用例：下游服务异常、参数非法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;搭建评测环境：部署待测 Agent、MCP 网关、Skill 服务、依赖 Mock 服务，隔离测试环境，&lt;strong&gt;禁止直接测线上真实业务数据&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;阶段 2：单组件独立评测（单元层，先测组件，再测整体）&lt;br&gt;
【分层评测思想：先组件，再集成】&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Skill 单测&lt;/strong&gt;：单独调用每个 Skill，验证入参、出参、异常、权限，保证单个技能本身可用&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP 协议层评测&lt;/strong&gt;：单独验证 MCP 网关，报文、鉴权、上下文转发、错误透传，不接入大模型&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;基础模型基线评测&lt;/strong&gt;：单独测底层模型的能力、幻觉、安全，作为基线，方便后续区分问题来源&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;目的：提前发现底层组件缺陷，避免集成后分不清是谁的问题&lt;/p&gt;

&lt;p&gt;阶段 3：集成评测（Agent + MCP + Skill 联调）&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;端到端批量自动评测：批量跑测试集，自动采集指标：任务完成率、工具调用错误率、幻觉率、调用耗时&lt;/li&gt;
&lt;li&gt;人工标注评审：抽样对结果人工打分，自动指标只能做参考，Agent 任务是否完成&lt;strong&gt;必须人工校验&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;红队安全评测：构造对抗 prompt，尝试提示注入、诱导 Agent 调用未授权 Skill、越权访问&lt;/li&gt;
&lt;li&gt;故障注入测试：模拟 Skill 超时、下游报错、MCP 服务中断，看 Agent 降级逻辑是否合理&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;阶段 4：缺陷分析 &amp;amp; 定位根因&lt;br&gt;
拿到失败样本，排查归类：&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;模型能力不足？&lt;/li&gt;
&lt;li&gt;Agent 规划逻辑错误（选错工具、参数填错）？&lt;/li&gt;
&lt;li&gt;Skill 本身业务错误？&lt;/li&gt;
&lt;li&gt;MCP 上下文丢失、参数传输错误？
输出缺陷单，附完整链路日志（MCP 请求、工具返回、模型思考过程）&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;阶段 5：质量判定、报告输出&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;汇总量化指标：任务完成率、幻觉率、工具调用失败率、安全高危漏洞数量、P95 耗时&lt;/li&gt;
&lt;li&gt;风险分级：高危 / 中危 / 低危缺陷，定义质量门禁（存在高危漏洞禁止上线）&lt;/li&gt;
&lt;li&gt;输出评测报告：评测范围、数据集、指标、缺陷清单、风险结论、优化建议&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;阶段 6：版本回归 + 线上持续观测&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;迭代新版本，执行回归评测，验证缺陷修复，对比指标变化&lt;/li&gt;
&lt;li&gt;上线灰度：接入 Langfuse 等可观测平台，采集真实用户会话&lt;/li&gt;
&lt;li&gt;线上抽样评测：定期抽取真实用户 query 做人工评估，持续监控幻觉、越权、任务失败，形成闭环&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="四、补充：评测难点（评测师重点关注）"&gt;四、补充：评测难点（评测师重点关注）&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Agent 不能只看模型输出文本，&lt;strong&gt;核心看【任务是否真正完成】&lt;/strong&gt;，模型回答看着通顺，但工具调用错了就是失败&lt;/li&gt;
&lt;li&gt;分层定位难：同样一个错误，可能是模型、Agent 规划、Skill、MCP 任意一层问题，需要链路日志定位&lt;/li&gt;
&lt;li&gt;评测数据集要持续迭代，用户真实 query 不断补充，静态数据集容易过拟合&lt;/li&gt;
&lt;li&gt;安全风险是跨层风险：提示注入可能绕过 Agent，通过 MCP 调用敏感 Skill&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;最后请各位圈里朋友集思广益，大家畅所欲言！分享或谈谈你们的感受、认知、经验吧！&lt;/p&gt;</description>
      <author>shichaolin</author>
      <pubDate>Wed, 30 Sep 2026 11:47:38 +0800</pubDate>
      <link>https://testerhome.com/topics/44910</link>
      <guid>https://testerhome.com/topics/44910</guid>
    </item>
    <item>
      <title>测试数据怎么造才不撞车：环境变量与系统变量的一次实践</title>
      <description>&lt;h3 id="一、先说那个所有人都遇到过的报错"&gt;一、先说那个所有人都遇到过的报错&lt;/h3&gt;
&lt;p&gt;「该手机号已注册」「设备名称已存在」「订单号重复」—— 写 E2E 的人对这类报错都很熟。它们通常不是因为脚本写错了，而是因为&lt;strong&gt;测试数据是写死的&lt;/strong&gt;：&lt;/p&gt;
 &lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fill"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"locator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"strategy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"placeholder"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"手机号"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"13800138000"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;第一次跑没问题，第二次跑就撞车。跟着一起来的还有另外两个问题：把脚本从测试环境切到预发，一堆 &lt;code&gt;http://localhost:8080&lt;/code&gt; 得手改；账号密码躺在脚本 JSON 里，谁都能看到。&lt;/p&gt;

&lt;p&gt;这三个问题看着都像「测试数据问题」，其实需要两种不同的东西：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;要共享、要能改的值&lt;/strong&gt;（域名、账号密码）→ 环境变量；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;每次运行都该不一样的值&lt;/strong&gt;（手机号、身份证、唯一名称）→ 系统变量；&lt;/li&gt;
&lt;li&gt;还有一个隐含要求：同一个脚本里多处引用同一个变量时，必须指向&lt;strong&gt;同一个值&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;下面是我们这边落下来的规则和几个踩过的坑。&lt;/p&gt;
&lt;h3 id="二、环境变量：挂在项目上，引用写 {{名字}}"&gt;二、环境变量：挂在项目上，引用写 &lt;code&gt;{{名字}}&lt;/code&gt;
&lt;/h3&gt;
&lt;p&gt;环境变量挂在&lt;strong&gt;项目&lt;/strong&gt;上（一个项目对应一个被测系统），入口在项目列表的行操作里：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://testerhome.com/uploads/photo/2026/5d1bcb26-4eb7-4747-9d4d-be17e0d6ae7e.jpg!large" title="" alt="项目列表：行操作里的 🔑 是环境变量入口"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://testerhome.com/uploads/photo/2026/1db44dc4-0195-4882-9c20-bb5642000c83.jpg!large" title="" alt="环境变量管理：键值对 + 引用说明"&gt;&lt;/p&gt;

&lt;p&gt;弹窗里那行提示就是全部契约：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;脚本中用 &lt;code&gt;{{变量名}}&lt;/code&gt; 引用，运行脚本时替换为对应值。变量名仅允许字母/中文/数字/下划线，且不以数字开头。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;几个实现上的选择，都是被实际问题逼出来的：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;变量名支持中文&lt;/strong&gt;（&lt;code&gt;{{密码}}&lt;/code&gt;、&lt;code&gt;{{测试账号}}&lt;/code&gt; 都合法）。中文业务系统里，这比硬写成拼音好维护得多。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;值默认密文显示&lt;/strong&gt;，可点眼睛临时查看 —— 因为这个位置最常放的就是账号密码。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;保存是整体替换&lt;/strong&gt;：界面里增删改完一次性提交，后端按变量名去重（后写覆盖）并丢掉非法名。少了一堆「新增单条/删除单条」的中间状态。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;命名错误在输入框当场标红&lt;/strong&gt;，不用等服务端返回。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;替换发生在哪几处&lt;/strong&gt;是固定的：&lt;code&gt;instruction&lt;/code&gt;、&lt;code&gt;url&lt;/code&gt;、&lt;code&gt;value&lt;/code&gt;、&lt;code&gt;locator.value&lt;/code&gt;、&lt;code&gt;locator.name&lt;/code&gt;、&lt;code&gt;locator.scope.value&lt;/code&gt;、&lt;code&gt;locator.scope.name&lt;/code&gt;、&lt;code&gt;assertion.expected&lt;/code&gt;、&lt;code&gt;assertion.jsonPath&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;最后两个最容易被忽略：断言里也该用变量。比如「新建设备后，详情页标题等于刚填的设备名」，就两处都写 &lt;code&gt;{{设备名}}&lt;/code&gt;，而不是把值抄一遍 —— 抄一遍，就等着它和随机数据对不上那天。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;没定义的变量不会被静默吃掉&lt;/strong&gt;：保留 &lt;code&gt;{{xxx}}&lt;/code&gt; 字面量，同时在运行日志里告警：&lt;/p&gt;
 &lt;pre class="highlight plaintext"&gt;&lt;code&gt;[警告] 未定义的环境变量：测试账号、密码
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;这一点我们坚持了很久：把未定义变量替换成空字符串，会让脚本带着空值一路跑下去，然后在某个完全无关的步骤上报错，排查成本高得多。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://testerhome.com/uploads/photo/2026/89dd5a89-d519-4acb-ac1a-13efe6e72020.jpg!large" title="" alt="用例详情：步骤表格里的 {{变量}} 占位符"&gt;&lt;/p&gt;
&lt;h3 id="三、系统变量：六种「每次都不一样」的数据"&gt;三、系统变量：六种「每次都不一样」的数据&lt;/h3&gt;
&lt;p&gt;另一类是内置的、不需要定义的系统变量，写法一致：&lt;/p&gt;
 &lt;table class="table-responsive table table-bordered table-striped"&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th&gt;变量&lt;/th&gt;
&lt;th&gt;生成内容&lt;/th&gt;
&lt;th&gt;例子&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{{systemTime}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;当前时间戳（13 位毫秒）&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;test_{{systemTime}}&lt;/code&gt; → 唯一账号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{{randomNumber}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;随机数字串，默认 6 位，可 &lt;code&gt;{{randomNumber:8}}&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SN-{{randomNumber:8}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{{randomChinese}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;随机常用汉字，默认 2 个，可 &lt;code&gt;{{randomChinese:4}}&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;user_{{randomChinese}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{{randomPhone}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;随机手机号（&lt;code&gt;1[3-9]&lt;/code&gt; 开头 11 位）&lt;/td&gt;
&lt;td&gt;直接填手机号字段&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{{randomEmail}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;随机邮箱&lt;/td&gt;
&lt;td&gt;直接填邮箱字段&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{{randomIdCard}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;随机 18 位身份证号（含校验位）&lt;/td&gt;
&lt;td&gt;直接填证件号字段&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt; 
&lt;p&gt;「随机」这两个字在测试里是要讲质量的，几个细节：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;身份证号是能过校验的&lt;/strong&gt;：地区码、生日（1950–2005、日取 1–28 绕开大小月）、顺序码，再按 GB 11643 的权重表算校验位（取模 11）。不是随便凑 18 个数字 —— 否则第一步就被表单校验拦下。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;随机汉字从高频字池里取&lt;/strong&gt;，出来的是能读的中文（人名、标题可以直接用）。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;随机邮箱用常见域名&lt;/strong&gt;（qq.com / 163.com / 126.com / gmail.com / outlook.com / example.com），避免被测系统的邮箱格式校验把人拦住。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://testerhome.com/uploads/photo/2026/7e42fb47-99e3-477e-b8f9-b1f75f632fd0.jpg!large" title="" alt="用例列表：脚本里存的是占位符，运行时才替换"&gt;&lt;/p&gt;
&lt;h3 id="四、三条真正重要的规则"&gt;四、三条真正重要的规则&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;规则一：同一次运行内，同名变量值一致。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这是最容易做错的地方。系统变量不是「每次出现都随机一次」，而是&lt;strong&gt;运行开始时对用到的键求值一次、全程复用&lt;/strong&gt;：&lt;/p&gt;
 &lt;pre class="highlight plaintext"&gt;&lt;code&gt;第 3 步 填写 手机号 → {{randomPhone}}      → 实例化 137****1234
第 9 步 断言 详情页手机号 = {{randomPhone}} → 同一个 137****1234 ✅
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;如果每处出现都重新随机，断言永远失败，而且失败得没有道理。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;规则二：环境变量优先于系统变量。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;同名时项目里显式定义的值覆盖内置变量。这是个「劫持开关」：某个环境必须用固定号码（走短信验证码的系统），把 &lt;code&gt;randomPhone&lt;/code&gt; 定义成固定值就行，脚本一个字不改。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;规则三：存模式，不存实例。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;脚本里落库的永远是 &lt;code&gt;{{randomPhone}}&lt;/code&gt; 这个占位符，不是它某次求值出来的号码。好处有两个：回放时重新求值 → 每次跑都是新数据，不会「第二次跑就撞已注册」；导出和 Code Review 时看到的是模式，不是一堆随机串。&lt;/p&gt;
&lt;h3 id="五、一个真实的坑：fill 写了 A，断言引用了 B"&gt;五、一个真实的坑：fill 写了 A，断言引用了 B&lt;/h3&gt;
&lt;p&gt;上面三条规则都对，但生成场景里还有一层陷阱，我们是踩到真实案例才发现的：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;模型在 &lt;code&gt;fill&lt;/code&gt; 那一步没有照要求传占位符，而是自己编了一个值（&lt;code&gt;test829401&lt;/code&gt;）；等到后面断言里第一次出现占位符时才求值，得到 &lt;code&gt;test442434&lt;/code&gt;。两边永远不会相遇 —— 而日志上每一步都是「成功」。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;修法不是再嘱咐模型一遍，而是把它变成机制：&lt;strong&gt;&lt;code&gt;fill&lt;/code&gt; / 组件动作成功后，把「实际写进页面的值」按模板反查，登记为该占位符键的实例化&lt;/strong&gt;，之后断言和护栏都从这里取值。模型怎么发挥，都不影响一致性。&lt;/p&gt;

&lt;p&gt;顺带把和「换值重试」的分工说清：缓存保证&lt;strong&gt;同一轮同值&lt;/strong&gt;，显式换值会重新求值并覆盖缓存 —— 一个保一致性，一个提供不重复，两件事正交。&lt;/p&gt;
&lt;h3 id="六、我们没做的几件事"&gt;六、我们没做的几件事&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;不做类型转换&lt;/strong&gt;：变量替换就是字符串替换，数字字段要求变量值本身就是合法数字串。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;不做全局唯一保证&lt;/strong&gt;：系统变量是随机，不是序列。需要严格唯一时，用 &lt;code&gt;{{systemTime}}&lt;/code&gt; 参与拼接。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;不把未定义变量替换成空串&lt;/strong&gt;（见上文），也让脚本带着 &lt;code&gt;{{xxx}}&lt;/code&gt; 显式失败。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;不覆盖 sessionStorage / 跨域 iframe&lt;/strong&gt;：那是浏览器登录态的范畴，交给登录态录制更合适。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="七、想听听你们怎么管测试数据"&gt;七、想听听你们怎么管测试数据&lt;/h3&gt;
&lt;p&gt;我们这边收敛到「环境变量管共享值、系统变量管唯一值、运行时替换」这一套，但测试数据这块各家做法差别很大。我见过的还有：每个用例独立造数据的接口、测试库定时重置、按用例前缀隔离（&lt;code&gt;case_1024_xxx&lt;/code&gt;）、以及直接用线上脱敏数据的快照。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;你们团队现在怎么造数据、怎么避免残留数据把回归搞红？&lt;/strong&gt; 欢迎在评论区聊聊，尤其是那些跑久了才会暴露的方式。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://testerhome.com/uploads/photo/2026/ab394de1-0ab7-4ec9-8c56-b8f39214d129.jpg!large" title="" alt="运行日志：未定义变量会明确告警"&gt;&lt;/p&gt;
&lt;h3 id="现状与限制"&gt;现状与限制&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;开源协议 MIT，当前版本 v0.1.7，提供 macOS（Apple Silicon / Intel）与 Windows x64 安装包；&lt;/li&gt;
&lt;li&gt;面向 Web 应用的端到端回归，用例 / 脚本 / 运行记录全部保存在本地 SQLite；&lt;/li&gt;
&lt;li&gt;需要自备 OpenAI 兼容的模型网关（项目不做托管、不内置模型），需要系统安装 Chrome；&lt;/li&gt;
&lt;li&gt;只做桌面端，不是云测试平台；&lt;/li&gt;
&lt;li&gt;早期项目，欢迎 Issue / 拍砖；&lt;/li&gt;
&lt;li&gt;&lt;p&gt;本项目已收录进 TesterHome 社区开源项目库：&lt;a href="https://testerhome.com/opensource_projects/testdog" title=""&gt;TestDog&lt;/a&gt;。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;GitHub：&lt;a href="https://github.com/xianyongwen/TestDog" rel="nofollow" target="_blank"&gt;https://github.com/xianyongwen/TestDog&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;帮助文档 · 测试数据与登录态：&lt;a href="https://softwing.top/testdog-doc/guide/test-data.html" rel="nofollow" target="_blank"&gt;https://softwing.top/testdog-doc/guide/test-data.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;快速开始：&lt;a href="https://softwing.top/testdog-doc/guide/getting-started.html" rel="nofollow" target="_blank"&gt;https://softwing.top/testdog-doc/guide/getting-started.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;利益相关：我是 TestDog 的作者，本文写的是自己的实现与踩坑，不构成第三方评测。&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <author>w471176877</author>
      <pubDate>Thu, 01 Oct 2026 20:40:52 +0800</pubDate>
      <link>https://testerhome.com/topics/44908</link>
      <guid>https://testerhome.com/topics/44908</guid>
    </item>
    <item>
      <title>聊一个绕不开的老问题：Web E2E 用例里的登录，能不能只做一次</title>
      <description>&lt;h3 id="一个大家都遇到过的小问题"&gt;一个大家都遇到过的小问题&lt;/h3&gt;
&lt;p&gt;「被测系统要登录」——做 Web 自动化的团队基本都绕不过去。最早的写法也都很直接：每条用例开头三步，打开登录页、填账号密码、点登录。&lt;/p&gt;

&lt;p&gt;用例少的时候没感觉，等到几十上百条，问题会集中出现：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;每条用例都多跑一遍登录，回归时间凭空多出一截；&lt;/li&gt;
&lt;li&gt;登录页一改版（按钮文案、加验证码、多一步跳转），&lt;strong&gt;所有用例一起红&lt;/strong&gt;，排查半天发现是登录流程变了；&lt;/li&gt;
&lt;li&gt;想测登录后的页面、想造数据，都得先把登录流程复刻对；&lt;/li&gt;
&lt;li&gt;账号密码散落在脚本里，换个环境就得全局改一遍。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这篇文章想聊的是：登录能不能从「每条用例里的一步」，变成「项目级的一次配置」。下面是我们这边的取舍，以及实现时真正踩到的坑 —— 后面这几条跟用不用 AI 没关系，都是 Web 自动化的老问题。&lt;/p&gt;
&lt;h3 id="一、三种做法，先把取舍摆出来"&gt;一、三种做法，先把取舍摆出来&lt;/h3&gt; &lt;table class="table-responsive table table-bordered table-striped"&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th&gt;做法&lt;/th&gt;
&lt;th&gt;速度&lt;/th&gt;
&lt;th&gt;抗改版&lt;/th&gt;
&lt;th&gt;前置条件&lt;/th&gt;
&lt;th&gt;典型问题&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;每条用例都走一次 UI 登录&lt;/td&gt;
&lt;td&gt;慢&lt;/td&gt;
&lt;td&gt;差&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;td&gt;登录页一改版全局红；验证码 / 会话中断&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;调登录接口拿 token 塞 Cookie&lt;/td&gt;
&lt;td&gt;快&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;td&gt;依赖被测系统的登录接口&lt;/td&gt;
&lt;td&gt;拿不到 localStorage 里的登录态，SPA 里还是「未登录」；接口一改即失效&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;录制一次浏览器登录态（Cookie + localStorage）复用&lt;/td&gt;
&lt;td&gt;快&lt;/td&gt;
&lt;td&gt;好&lt;/td&gt;
&lt;td&gt;需要录一次&lt;/td&gt;
&lt;td&gt;登录态会过期，所以必须能「重录」&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt; 
&lt;p&gt;我们选了第三种，理由很朴素：它复用 Playwright &lt;code&gt;storageState()&lt;/code&gt; 那套东西，&lt;strong&gt;不依赖被测系统的任何接口&lt;/strong&gt;，也不要求把账号密码交给工具。&lt;/p&gt;
&lt;h3 id="二、设计：登录是「项目级配置」，不是「用例的一步」"&gt;二、设计：登录是「项目级配置」，不是「用例的一步」&lt;/h3&gt;
&lt;p&gt;三个定义决定了这个功能长什么样：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;存什么&lt;/strong&gt;：登录后的浏览器状态 —— Cookie + localStorage，正好是 &lt;code&gt;storageState()&lt;/code&gt; 的形状；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;挂在哪&lt;/strong&gt;：项目级。一个项目可以有多份配置（管理员 / 普通用户、测试环境 / 预发环境各一份），可以设一份默认；第一份自动成为默认，删掉默认的会自动把最新一份提上来；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;用在哪&lt;/strong&gt;：回放（用例详情里的「登录配置」下拉）、AI 生成（生成页同一个下拉）、项目默认（用例列表右上角）。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://testerhome.com/uploads/photo/2026/7408e332-0dc9-43a3-bff9-b885fa52d768.jpg!large" title="" alt="登录配置管理：弹窗里是已有配置列表 + 新增表单"&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;登录配置管理：左侧蓝色提示写清了「打开浏览器 → 手动登录 → 停止并保存」的流程。&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://testerhome.com/uploads/photo/2026/07f9051f-ad19-4901-af37-ccecbb44a0b5.jpg!large" title="" alt="新增一份配置：填起始地址和配置名，点「开始录制」"&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;新增配置：起始地址填登录页 URL，配置名可留空（自动命名），点「开始录制」才弹浏览器。&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;有一个刻意的取舍：&lt;strong&gt;不做自动登录&lt;/strong&gt;。工具不存账号密码，也不会自动帮你填表单登录 —— 那意味着明文凭据入库，而且被测系统一加验证码 / 滑块就全线失效。我们做的是把「人工登录一次」的&lt;strong&gt;结果&lt;/strong&gt;，搬运到之后的每一次运行里。&lt;/p&gt;
&lt;h3 id="三、录制：为什么不能只调一次 storageState()"&gt;三、录制：为什么不能只调一次 &lt;code&gt;storageState()&lt;/code&gt;
&lt;/h3&gt;
&lt;p&gt;最直觉的实现是：打开有头浏览器 → 等用户登录 → 调一次 &lt;code&gt;context.storageState()&lt;/code&gt; 存下来。真跑起来才发现两个坑。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;坑一：&lt;code&gt;storageState()&lt;/code&gt; 会为「已经离开的 origin」新建临时页面&lt;/strong&gt;去读 localStorage。录制的同学会莫名看到一闪而过的窗口 —— 明明只打开了一个站点，任务栏却在闪。&lt;/p&gt;

&lt;p&gt;后来改成只从&lt;strong&gt;当前仍打开的页面及其 iframe&lt;/strong&gt; 里采集，同时保留已离开站点的最近一次快照：&lt;/p&gt;
 &lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 只从现有页面/iframe 采集，避免 storageState() 为已离开的 origin 开临时页&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cookies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;origins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;]));&lt;/span&gt; &lt;span class="c1"&gt;// prev：已离开站点的最近快照&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;frames&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isClosed&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nx"&gt;flatMap&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;frames&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;frames&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`(() =&amp;gt; {
    if (!/^https?:$/.test(location.protocol)) return null;
    return { origin: location.origin,
      localStorage: Object.keys(localStorage).map((name) =&amp;gt; ({ name, value: localStorage.getItem(name) })) };
  })()`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;origins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;origins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;origins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;坑二：浏览器一关，Cookie 和 localStorage 就再也读不到了。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;而「登录完随手关掉浏览器」恰恰是所有人的本能动作。所以录制期间每 250ms 采样一次快照，页面导航、页面关闭时补采；浏览器被关闭时，用&lt;strong&gt;关闭前最近一次成功的快照&lt;/strong&gt;去保存。界面上那句提示就是这么来的：「录制或重新录制时关闭浏览器，会自动使用关闭前最近保存的状态创建或更新配置」；真想放弃就点「取消录制」——那是唯一会丢弃状态的路径。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://testerhome.com/uploads/photo/2026/358809be-89d0-4a9f-a849-3b170100835a.jpg!large" title="" alt="实机录制：填好起始地址点「开始录制」"&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;实机录制：填起始地址（登录页 URL）和配置名，点「开始录制」就会弹出浏览器等你手动登录。&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;另外两个细节，值得顺手提一句：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;凭据不进 WebSocket 广播&lt;/strong&gt;。浏览器关闭事件只通过 WS 发一个「已关闭」通知，storageState 由前端回调 stop 接口时领取；客户端断线又没人来取的会话，10 分钟后清理。&lt;/li&gt;
&lt;li&gt;录制窗口用&lt;strong&gt;项目配置的视口&lt;/strong&gt;（移动端页面可以设 390×844 之类），因为有些站点的登录态跟设备 / 视口是绑的。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="四、回放：登录态怎么「塞回去」"&gt;四、回放：登录态怎么「塞回去」&lt;/h3&gt;
&lt;p&gt;回放侧不是 &lt;code&gt;newContext({ storageState })&lt;/code&gt;，而是复用连上来的&lt;strong&gt;默认 context&lt;/strong&gt;（回放通过 CDP 连接浏览器，没有新建 context 的自由），所以要手动注入：&lt;/p&gt;
 &lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Cookie 直接加到 context&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addCookies&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// localStorage 必须在页面脚本执行前写好，否则 SPA 首屏就判成未登录&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addInitScript&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;origins&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;origins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;origin&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;hit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;hit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;origins&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;这里踩过&lt;strong&gt;最隐蔽的一个坑&lt;/strong&gt;：&lt;code&gt;storageState()&lt;/code&gt; 里 &lt;code&gt;origins[].localStorage&lt;/code&gt; 是 &lt;code&gt;[{ name, value }]&lt;/code&gt; &lt;strong&gt;数组&lt;/strong&gt;。如果按普通对象的映射方式去遍历写入 localStorage，写进去的键名会变成数字下标、值变成 &lt;code&gt;"[object Object]"&lt;/code&gt; —— 页面上看「注入成功了」，实际上登录态是空的，脚本一路跑成未登录。必须显式按 &lt;code&gt;name&lt;/code&gt; / &lt;code&gt;value&lt;/code&gt; 写入。&lt;/p&gt;

&lt;p&gt;用 &lt;code&gt;addInitScript&lt;/code&gt; 而不是「注入后再刷新一次」，是为了让登录态在&lt;strong&gt;页面任何脚本运行之前&lt;/strong&gt;就位：SPA 通常在首屏 JS 里读 localStorage 判断登录，晚一步就会闪一下登录页，甚至直接跳走。&lt;/p&gt;

&lt;p&gt;每次运行的日志里也会把登录态状态写明，避免「以为选了配置其实没生效」：&lt;/p&gt;
 &lt;pre class="highlight plaintext"&gt;&lt;code&gt;[浏览器窗口] 按项目配置使用 390x844
[登录配置] 未选择，以未登录状态运行
[0] goto → PASSED
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;em&gt;真实运行日志：没选配置时会明说「以未登录状态运行」；选了配置则写明配置名与来源 origin。&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://testerhome.com/uploads/photo/2026/ab394de1-0ab7-4ec9-8c56-b8f39214d129.jpg!large" title="" alt="运行日志里的 [登录配置] 行"&gt;&lt;/p&gt;
&lt;h3 id="五、几个必须说清的限制"&gt;五、几个必须说清的限制&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;登录态会过期&lt;/strong&gt;。有效期完全取决于被测系统（session 超时、Cookie 策略、单点登录各不同），工具替你保不了鲜。建议每次开始跑之前重录一次；管理弹窗里对已有配置提供「重新录制」，直接覆盖存储状态。用过期登录态跑出来的一批失败，非常浪费时间。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;只覆盖 Cookie + localStorage&lt;/strong&gt;。如果被测系统把 token 放 sessionStorage / IndexedDB，这份状态里就没有。目前没做，因为这两类存储更偏「会话内」语义，跨次运行注入的收益也小 —— 如果你的系统正好这么干，欢迎聊聊你的处理方式。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;不做自动登录&lt;/strong&gt;。确实要测登录流程本身（错误提示、验证码、锁定策略）的用例，仍然把登录步骤写在用例里，账号密码用环境变量 &lt;code&gt;{{username}}&lt;/code&gt; / &lt;code&gt;{{password}}&lt;/code&gt; 引用，别写死。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;多角色要多录几份配置&lt;/strong&gt;，再在用例详情按用例选；暂时没做「按用例批量指定登录配置」。&lt;/li&gt;
&lt;li&gt;登录态本身是&lt;strong&gt;凭据&lt;/strong&gt;：存在本地 SQLite 里，管理列表接口只返回名称 / 默认 / 时间这些元信息，不回传 storageState 本体。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://testerhome.com/uploads/photo/2026/5d1bcb26-4eb7-4747-9d4d-be17e0d6ae7e.jpg!large" title="" alt="项目列表：行操作里的 🔒 就是登录配置入口"&gt;&lt;/p&gt;
&lt;h3 id="六、想听听你们团队的做法"&gt;六、想听听你们团队的做法&lt;/h3&gt;
&lt;p&gt;我们这边暂时收敛到「录一次、多处复用」，但登录这件事明显没有唯一解。我见过的做法还有：接口拿 token 再注入 Cookie、维护统一测试账号池 + 前置用例登录、干脆只用未登录态跑只读用例、以及把登录交给网关做免登（测试环境开后门）。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;你们团队现在怎么处理登录态？踩过哪些坑？&lt;/strong&gt; 欢迎在评论区聊聊，尤其是那些「看起来能用、跑一段时间就出事」的方案。&lt;/p&gt;
&lt;h3 id="现状与限制"&gt;现状与限制&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;开源协议 MIT，当前版本 v0.1.7，提供 macOS（Apple Silicon / Intel）与 Windows x64 安装包；&lt;/li&gt;
&lt;li&gt;面向 Web 应用的端到端回归，用例 / 脚本 / 运行记录全部保存在本地 SQLite；&lt;/li&gt;
&lt;li&gt;需要自备 OpenAI 兼容的模型网关（项目不做托管、不内置模型），需要系统安装 Chrome；&lt;/li&gt;
&lt;li&gt;只做桌面端，不是云测试平台；&lt;/li&gt;
&lt;li&gt;早期项目，欢迎 Issue / 拍砖；&lt;/li&gt;
&lt;li&gt;&lt;p&gt;本项目已收录进 TesterHome 社区开源项目库：&lt;a href="https://testerhome.com/opensource_projects/testdog" title=""&gt;TestDog&lt;/a&gt;。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;GitHub：&lt;a href="https://github.com/xianyongwen/TestDog" rel="nofollow" target="_blank"&gt;https://github.com/xianyongwen/TestDog&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;帮助文档 · 测试数据与登录态：&lt;a href="https://softwing.top/testdog-doc/guide/test-data.html" rel="nofollow" target="_blank"&gt;https://softwing.top/testdog-doc/guide/test-data.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;快速开始：&lt;a href="https://softwing.top/testdog-doc/guide/getting-started.html" rel="nofollow" target="_blank"&gt;https://softwing.top/testdog-doc/guide/getting-started.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;利益相关：我是 TestDog 的作者，本文写的是自己的实现与踩坑，不构成第三方评测。&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <author>w471176877</author>
      <pubDate>Thu, 01 Oct 2026 09:57:30 +0800</pubDate>
      <link>https://testerhome.com/topics/44907</link>
      <guid>https://testerhome.com/topics/44907</guid>
    </item>
    <item>
      <title>Voice Agent 和实时交互模型年度盛会，把握技术风向标！</title>
      <description>&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-8534b65f1f9643b802745d543e1e2811a0c.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s/aVZgVjcTKm54VkO_1pCf9A" rel="nofollow" target="_blank"&gt;https://mp.weixin.qq.com/s/aVZgVjcTKm54VkO_1pCf9A&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;如果今年只参加一场实时交互模型和 Voice Agent 大会，来 iRTE2026 实时智能大会就够了。在这里，&lt;strong&gt;Kimi、MiniMax、阶跃星辰、面壁智能、模思智能、生数科技&lt;/strong&gt;等国内领先大模型公司将带来最前沿的 AI 产品/技术分享，话题覆盖多模态模型、Voice Agent、AI 硬件、具身智能、实时基础设施等。&lt;/p&gt;

&lt;p&gt;还有美团、阿里 ATH、Rokid、斜跃智能、博通集成、Soul、HOLLA、EF 英孚、伴鱼等企业分享 Voice Agent 在客服、硬件、具身智能、社交、教育等行业场景的落地。现场更有丰富的开发者工作坊，手搓各类 Voice Agent 应用与硬件。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-99de286fa7715bf5bb0bcb1be062c5e946a.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-7a9dd20cc2e2fd29cc67440959de3b29629.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-b65e544bc2dfcb92def849eeefcbf6dda68.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-f8bf803ba477183e2dc57af25b02ad3c62c.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;10 月 23-24 日，来 iRTE 大会现场，与国内外一线的 AI 产品/技术专家深度交流，掌握 RTE、Voice Agent、实时多模态的最新动向与技术实践，把握 2026 Voice Agent 技术风向标。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-e3527af61432810950639e899aa858d295a.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-b1f958447f706096d06f9d135f8944cfc05.jpg" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.rtecommunity.dev/" rel="nofollow" target="_blank" title=""&gt;&lt;strong&gt;阅读更多 Voice Agent 学习笔记：了解最懂 AI 语音的头脑都在思考什么&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-bf5c4dc5f0c29edae38904314984ebde968.png" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>RTE</author>
      <pubDate>Wed, 30 Sep 2026 09:36:21 +0800</pubDate>
      <link>https://testerhome.com/topics/44906</link>
      <guid>https://testerhome.com/topics/44906</guid>
    </item>
    <item>
      <title>AMD 约 82 亿美元收购 World Labs，李飞飞出任执行副总裁兼首席科学家；蚂蚁开源声纹模型 MECT，提供支持实时场景的流式版本丨日报</title>
      <description>&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-eeaf77b60d3d2c5631de314225a88a4b33e.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;本期编辑：@ 三水、@ 鲍勃&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;今天，AMD 将以约 82 亿美元收购世界模型公司 World Labs，李飞飞将出任 AMD 执行副总裁兼首席科学家。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;当世界模型开始理解空间、持续模拟环境，并实时响应人的输入，AI 生成的就不再只是一段内容，而可能是一个可以进入、探索和交互的世界。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这也是 RTE 开发者社区最近一直在关注的一条路线：从&lt;strong&gt;实时视频生成、空间智能、交互式视频，到可交互世界模型&lt;/strong&gt;，视频正在从「生成出来给人看」，继续走向「跟人实时互动」。&lt;/p&gt;

&lt;p&gt;所以今年 &lt;strong&gt;iRTE 2026 实时智能大会&lt;/strong&gt;专门设置了 &lt;strong&gt;「视频 AI 技术专场：从实时视频生成到可交互世界模型」&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;现场，&lt;strong&gt;生数科技 Vidu&lt;/strong&gt; 团队会从 SageAttention、Vidu S1/S2 出发，聊视频生成如何进一步走向实时；&lt;strong&gt;Xmax AI&lt;/strong&gt; 也会带来实时交互模型的探索，讨论当生成内容可以持续响应用户之后，会出现怎样的新娱乐和交互形态。&lt;/p&gt;

&lt;p&gt;从 &lt;strong&gt;World Labs 的可交互 3D 世界&lt;/strong&gt;，到 &lt;strong&gt;Vidu、Xmax 对实时视频与交互模型的探索&lt;/strong&gt;，这条路线正在变得越来越具体。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;如果你也在关注空间智能、实时视频和可交互世界，10 月 24 日，来现场看看这条路线已经走到哪一步。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;扫描下方二维码报名，线上追进展，这次线下聊实现。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-42146d11bae8e2ca973c804417e6a5e82ab.jpg" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="01 有话题的技术"&gt;&lt;strong&gt;01 有话题的技术&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1、AMD 将以约 82 亿美元收购世界模型公司 World Labs：李飞飞将出任 AMD 执行副总裁兼首席科学家，世界模型团队进入芯片与系统研发体系&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-20dfb225ceeba6cc3f901755eab6fa1f740.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;AMD 与 World Labs 签署最终收购协议，这笔全股票交易价值约 &lt;strong&gt;82 亿美元&lt;/strong&gt;，预计在获得监管批准后于 2026 年底前完成。交易完成后，World Labs 创始人李飞飞将加入 AMD，担任&lt;strong&gt;执行副总裁兼首席科学家&lt;/strong&gt;并直接向 CEO 苏姿丰汇报；World Labs 团队将继续推进世界模型研究。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;World Labs 从 AMD 的模型优化合作伙伴变成内部研究团队：&lt;/strong&gt; 双方此前已经围绕 AMD GPU 进行模型训练和推理优化；收购后，World Labs 的模型研究将进一步与 AMD 的硬件、软件和系统研发结合。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AMD 将世界模型能力纳入未来 AI 计算平台研发：&lt;/strong&gt; World Labs 主要开发可从文本、图像和视频生成、重建和模拟交互式 3D 环境的空间智能模型；AMD 表示，这类模型对机器人、模拟和 Physical AI 等工作负载的计算需求，将直接影响其未来硬件、软件和系统路线。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;World Labs 将继续作为前沿模型研究团队运作：&lt;/strong&gt; 李飞飞加入 AMD 后，Justin Johnson 和 Ben Mildenhall 将继续与她共同领导 World Labs 团队，双方计划构建覆盖硬件、软件、平台和开放模型的端到端 AI 体系。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.worldlabs.ai/blog/amd-announcement" rel="nofollow" target="_blank"&gt;https://www.worldlabs.ai/blog/amd-announcement&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2、YODAS v3 开源 110 万小时 48kHz 多通道语音数据：覆盖 147 种语言，可用于 TTS、音频编解码和空间语音训练&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-cca85416ae7cf013846a20f10e330d61103.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;ESPnet 团队发布开放语音数据集 &lt;strong&gt;YODAS v3&lt;/strong&gt;，收录超过 &lt;strong&gt;110 万小时、147 种语言&lt;/strong&gt;的真实世界音频，全部以 48kHz 发布，其中超过 70% 包含两个及以上真正不同的音频通道。相比此前主要面向语音识别的 YODAS，v3 加入更高带宽、多通道和更丰富的时间戳标注，使同一套数据可以进一步用于 TTS、神经音频编解码、语音增强和立体声/空间语音生成。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;高采样率不只是文件标称值：&lt;/strong&gt; 团队根据实际频谱重新估算音频有效带宽，92% 的数据达到至少 32kHz 等效采样率，67% 达到 44kHz，可按音频质量筛选训练数据。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;超过 70% 为真正多通道音频：&lt;/strong&gt; 团队会检测左右声道是否实际不同，避免把复制的单声道算作立体声，为大规模立体声和空间语音模型训练提供数据。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;同时提供转写、时间戳和翻译：&lt;/strong&gt; 约 75% 的数据带有转写，其中 95% 带词级时间戳；约 60% 的非英语数据还提供带时间戳的英语翻译。数据以 CC BY 3.0 许可开放。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://hf.co/blog/espnet/yodasv3" rel="nofollow" target="_blank"&gt;https://hf.co/blog/espnet/yodasv3&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://huggingface.co/datasets/espnet/yodas3" rel="nofollow" target="_blank"&gt;https://huggingface.co/datasets/espnet/yodas3&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://arxiv.org/abs/2609.29448" rel="nofollow" target="_blank"&gt;https://arxiv.org/abs/2609.29448&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://x.com/chenwanch1/status/2104412499395350674" rel="nofollow" target="_blank"&gt;https://x.com/chenwanch1/status/2104412499395350674&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3、Edge0 发布中英双语流式语音识别模型 Audio8-ASR-Infinite：滚动 KV 缓存支持 24/7 持续转写，延迟最低 240ms&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Edge0 发布 &lt;strong&gt;Audio8-ASR-Infinite&lt;/strong&gt; 预览版，面向中英文实时语音识别，提供 &lt;strong&gt;80、120 和 160ms&lt;/strong&gt; 三档流式音频时钟，并可将转写延迟配置在 &lt;strong&gt;240–560ms&lt;/strong&gt;。模型原生上下文为 30 秒，但通过滚动 KV 缓存持续淘汰旧状态，可在内存占用和推理延迟不随音频时长增长的情况下连续运行，用于会议、实时字幕和长期监听等持续转写场景。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;流式粒度与延迟可以分别调节：&lt;/strong&gt; 80ms 模式下模型每秒进行 12.5 次文本决策，120ms 和 160ms 分别为 8.3 和 6.25 次；开发者可以再单独设置目标转写延迟，在响应速度、识别效果和计算开销之间取舍。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;30 秒滚动 KV 窗口支持不限时长输入：&lt;/strong&gt; 推理时只保留固定长度的 KV 状态并重新校正位置编码，因此持续运行时缓存不会随对话长度不断增长。官方适配的 vLLM 推理实现支持 24/7 连续转写。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;同时加入语义 VAD：&lt;/strong&gt; 模型提供 0.5、1、2 和 3 秒多个预测时间范围的语义 VAD，可区分思考停顿、结巴与真正的对话结束，为实时语音 Agent 判断用户是否说完提供额外信号。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://modelscope.cn/models/Edge0/Audio8-ASR-Infinite" rel="nofollow" target="_blank"&gt;https://modelscope.cn/models/Edge0/Audio8-ASR-Infinite&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4、Voice Arena 发布 Monsoon ASR 训练语料：覆盖 50 种语言、10 万 + 小时，Whisper Medium 泰卢固语语义 WER 从 92.7% 降至 16.1%&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Voice Arena 发布多语种语音识别训练语料 &lt;strong&gt;Monsoon ASR&lt;/strong&gt;，目前包含 &lt;strong&gt;10 万 + 小时、50 种语言、23 个国家&lt;/strong&gt;的真实语音，覆盖南亚、东南亚、非洲、欧洲、中东及北非和美洲。数据主要来自双人真实对话中的&lt;strong&gt;即兴单人语音&lt;/strong&gt;，每位说话人单独录制一个声道，重点覆盖口音、非正式表达、噪声和真实声学条件，而不是以朗读语音为主。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;同一 Whisper Medium 仅更换训练数据，泰卢固语错误率大幅下降：&lt;/strong&gt; Voice Arena 使用 Monsoon 微调同一个 7.69 亿参数 Whisper Medium，在 IndicVoices 泰卢固语测试上的&lt;strong&gt;语义词错误率从 92.7% 降至 16.1%&lt;/strong&gt;，模型架构和参数规模没有变化。相关第三方汇总也记录了这一组结果。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;数据采集主动增加词汇和声学多样性：&lt;/strong&gt; 每种语言设计约 &lt;strong&gt;5000 个去重主题、覆盖 35 个日常领域&lt;/strong&gt;，并加入数字、流程、专有名词、地点和产品等长尾内容；语音还会经过语言、说话人和非语音事件等分类筛选，而不是只保留干净录音。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;增加数据量后仍未出现明显饱和：&lt;/strong&gt; 在印地语、泰米尔语和泰卢固语上，使用相同 Whisper Medium 训练方案将数据量从 &lt;strong&gt;1000 小时增加到 2000 小时、约 3500 小时&lt;/strong&gt;后，语义词错误率仍持续下降。Voice Arena 计划到 &lt;strong&gt;2027 年 2 月扩展至 100 种语言&lt;/strong&gt;，长期目标是覆盖 1000 种语言；其官网也已将「Monsoon 扩展至 1000 种语言」列入后续计划。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://voicearena.com/datasets/monsoon" rel="nofollow" target="_blank"&gt;https://voicearena.com/datasets/monsoon&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4、Voice AI 公司 SoundHound 推出端侧智能体语音架构 OASYS Edge：LLM 语音智能体可完全在设备端运行，同一智能体可部署到云端、边缘或混合环境&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-75fb3f2caff12c9bddf0bb1f9cc51e98320.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;SoundHound 发布 &lt;strong&gt;OASYS Edge&lt;/strong&gt;，将基于 LLM 的语音智能体完整部署到汽车和智能设备本地，在无网络连接时也能继续完成对话、理解请求和多步骤任务。开发者可以在 OASYS 平台构建一次智能体，再根据硬件与业务需求部署到&lt;strong&gt;云端、端侧或混合环境&lt;/strong&gt;。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;端侧不再只处理固定语音指令：&lt;/strong&gt; OASYS Edge 可在本地理解模糊请求、进行任务决策并协调多个系统。例如在汽车离线状态下，可完成路线规划、沿途地点选择和语音讲解；只有需要联网能力的任务才交给云端。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;同一套智能体支持云端、端侧和混合部署：&lt;/strong&gt; OASYS 此前已经提供智能体构建平台，OASYS Edge 进一步把完整智能体运行环境扩展到边缘硬件，厂商无需分别维护独立的云端和端侧智能体实现。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;计划于 2026 年底开始部署：&lt;/strong&gt; SoundHound 表示 OASYS Edge 将用于汽车和智能设备，目前已提供现场演示，并计划于 2026 年底开始部署。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;( &lt;a href="/SoundHound" class="user-mention" title="@SoundHound"&gt;&lt;i&gt;@&lt;/i&gt;SoundHound&lt;/a&gt; )&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5、蚂蚁研究团队开源实时声纹验证模型 MECT：9.57M 参数支持 100ms 流式推理，VoxCeleb1 达到 SOTA&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-21beeb0f9f7e7a7d1c8658843ddb01268f6.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;蚂蚁研究团队开源 &lt;strong&gt;AntSpeaker/MECT&lt;/strong&gt; 声纹验证模型，将 MoE 引入 CNN-Transformer 声纹识别架构，并进一步提供支持实时场景的流式版本。MECT 系列模型参数量从 &lt;strong&gt;3.78M 到 9.57M&lt;/strong&gt;，其中 MECT-B2 在 VoxCeleb1 上取得 SOTA；通过因果重训练得到的流式版本在 &lt;strong&gt;100ms 音频块&lt;/strong&gt;下仍能保持接近离线模型的验证性能。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MoE 被用于小型全监督声纹模型：&lt;/strong&gt; MECT 在 CNN-Transformer 主干中加入专家混合机制，并探索句子级、帧级以及稠密、稀疏路由等四种组合，在只增加少量参数的情况下提升声纹验证性能。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;最大模型仅 9.57M 参数：&lt;/strong&gt; 官方 GitHub 提供 3.78M、4.12M、8.26M 和 9.57M 四种规模，其中 MECT-B2 在 VoxCeleb1-O/E/H 上分别达到 &lt;strong&gt;0.27%、0.46%、0.85% EER&lt;/strong&gt;；加入 VoxBlink2 训练后进一步降至 &lt;strong&gt;0.23%、0.29%、0.54%&lt;/strong&gt;。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;新增实时流式声纹验证版本：&lt;/strong&gt; MECT-B2-Causal 通过因果重训练支持流式推理，论文报告在 &lt;strong&gt;100ms chunk&lt;/strong&gt; 下仍保持较强性能，可用于实时会议、语音助手和端侧声纹验证等低延迟场景。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://github.com/ant-research/AntSpeaker" rel="nofollow" target="_blank"&gt;https://github.com/ant-research/AntSpeaker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6、世界模型公司 Odyssey 发布多智能体世界模型 Agora-2：最多 20 个人类与智能体共享同一实时生成环境，参与者数量较 Agora-1 提升 5 倍&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Odyssey 发布 &lt;strong&gt;Agora-2&lt;/strong&gt; 多智能体世界模型，可让最多 &lt;strong&gt;20 个人类用户和 AI 智能体&lt;/strong&gt;进入同一个共享环境实时互动。相比 Agora-1 最多支持 4 名参与者，Agora-2 将参与规模扩大 5 倍，同时从单一环境扩展到多个环境，并支持更复杂、持续时间更长的交互。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;所有参与者共享同一套世界状态：&lt;/strong&gt; Agora-2 会持续维护一个显式共享状态，将所有参与者的位置、动作以及彼此造成的影响纳入模拟；每个人看到的是自己的视角，但其中一个人的动作会改变其他参与者随后看到的结果。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;环境由世界模型实时生成，不依赖传统游戏引擎：&lt;/strong&gt; 当前研究预览基于《Diablo II》的游戏捕获数据训练，模型根据参与者动作和环境状态实时生成画面，并学习角色移动、交互及彼此响应。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;当前预览可支持 4 名人类与 16 个智能体同时交互：&lt;/strong&gt; Odyssey 已开放可玩的多人研究预览，最多 4 名人类玩家可以与 16 个 AI 智能体进入同一个实时模拟环境。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://odyssey.systems/introducing-agora-2" rel="nofollow" target="_blank"&gt;https://odyssey.systems/introducing-agora-2&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="02 有亮点的产品"&gt;&lt;strong&gt;02 有亮点的产品&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1、AI 辅助 PCB 设计平台 HeyPCB 上线多人实时协作：可在同一块板上同步布线、放置元件和编辑外壳&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-8d2c84dd840f98348966625c43d6a0b1afb.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;HeyPCB 推出 &lt;strong&gt;Multiplayer&lt;/strong&gt; 多人协作模式，把原本偏单人使用的浏览器 PCB 设计流程扩展为多人共同编辑。团队成员可以直接打开同一个项目，在同一浏览器工作区里实时看到彼此的位置、光标和正在进行的操作。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;同一块板可多人同步编辑：&lt;/strong&gt; 协作者可以共同修改原理图和 PCB，包括布线、拖动和放置元件；官网演示中，多名成员同时在同一项目里编辑不同部分。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;协作状态直接显示在编辑器里：&lt;/strong&gt; 每名成员都有独立颜色和光标，元件选中、拖动、走线过程都会同步显示，还可以点击成员头像跟随对方当前视图。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;无需导出或维护第二份副本：&lt;/strong&gt; 项目可以通过邮件邀请或邀请链接共享，并设置可编辑或只读权限；保存后的原理图和 PCB 修改会同步到其他已打开的界面。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://heypcb.ai/multiplayer" rel="nofollow" target="_blank"&gt;https://heypcb.ai/multiplayer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2、来电识别平台 Truecaller 推出 Scam Checker：诈骗检测从电话号码扩展到链接和消息，无需登录即可在网页查询&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-0b69cd1c3208f5865498e59ba67360b5ba5.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;Truecaller 推出 &lt;strong&gt;Scam Checker&lt;/strong&gt;，把过去主要用于来电识别和垃圾电话拦截的诈骗情报扩展到开放网页。用户无需安装 App 或登录账号，就可以提交可疑的&lt;strong&gt;电话号码、链接或消息&lt;/strong&gt;，查看是否与诈骗有关；服务目前首先在印度上线，后续计划扩展到拉美、中东和非洲、东南亚。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;检测对象从电话扩展到多渠道诈骗：&lt;/strong&gt; Scam Checker 可以解析可疑消息中的电话号码和链接，也会展开短链接、跟踪重定向后的最终地址，再结合 Truecaller 自有风险数据库和其他欺诈信号进行判断。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;把社区诈骗报告直接带到网页端：&lt;/strong&gt; 服务会关联 Truecaller 的众包诈骗信息流 ScamFeed；Truecaller 表示印度目前已有约 &lt;strong&gt;2 万条&lt;/strong&gt;诈骗报告，每周新增约 &lt;strong&gt;1,300 条&lt;/strong&gt;。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;后续还将支持截图分析：&lt;/strong&gt; Truecaller 计划继续扩展 Scam Checker 可识别的诈骗类型，并加入截图上传能力，用于进一步分析可疑内容。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://techcrunch.com/2026/09/27/truecaller-takes-its-scam-intelligence-to-the-open-web-as-it-looks-beyond-caller-id/" rel="nofollow" target="_blank"&gt;https://techcrunch.com/2026/09/27/truecaller-takes-its-scam-intelligence-to-the-open-web-as-it-looks-beyond-caller-id/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="03 有态度的观点"&gt;&lt;strong&gt;03 有态度的观点&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1、英伟达推出 AI 智能体安全平台，用独立硬件监控越权行为&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-a321eefd29445bfce6352e814016e330972.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;英伟达 9 月 28 日发布 Open Agent Safety Platform，将控制智能体执行权限的 OpenShell 软件，与在独立硬件上监控行为的 Sentry 参考设计组合。&lt;/p&gt;

&lt;p&gt;OpenShell 目前已开放使用，可记录智能体操作并限制其访问范围；英伟达称，它也可扩展到 Arm、英特尔等第三方计算平台。&lt;/p&gt;

&lt;p&gt;Sentry 设计运行在 BlueField-4 DPU 上，在智能体运行环境之外检查行为。如果智能体试图越过软件设定的边界，系统可将其隔离。英伟达把两层控制分开，是为了让安全规则不完全依赖智能体自身执行；发布材料列出的毫秒级隔离能力仍是厂商描述。&lt;/p&gt;

&lt;p&gt;英伟达称，Anthropic 的 Claude Managed Agents 正与 OpenShell、BlueField 集成，Salesforce 则已将 OpenShell 接入 Slack，供团队查看智能体活动并处理额外权限请求。英伟达发布的是开放软件和参考系统设计，具体部署取决于使用方。&lt;/p&gt;

&lt;p&gt;( &lt;a href="/APPSO" class="user-mention" title="@APPSO"&gt;&lt;i&gt;@&lt;/i&gt;APPSO&lt;/a&gt;)&lt;/p&gt;
&lt;h2 id="04 社区黑板报"&gt;&lt;strong&gt;04 社区黑板报&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;招聘、项目分享、求助……任何你想和社区分享的信息，请联系我们投稿。（加微信 creators2022，备注「社区黑板报」）&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1、📌 社区活动推荐｜🔥 硬件进化论开始招募辣！&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SheNicest × STACK ANYWAY 消费硬件创作赛，国庆 7 天做一个能跑起来的硬件原型。&lt;/p&gt;

&lt;p&gt;✅ Token 全免费 + 一站式 BOM 下单（可到 STACK ANYWAY 官方指定平台，或使用自有设备参赛）&lt;/p&gt;

&lt;p&gt;✅奖金和奖品多多&lt;/p&gt;

&lt;p&gt;✅ 10 个入围项目直接到 WTCC 线下展出 + 卖客松拍卖&lt;/p&gt;

&lt;p&gt;✅ 个人 / 组队都行，从 0 到 1 或旧物改造都欢迎&lt;/p&gt;

&lt;p&gt;‼报名截止时间：9 月 30 日中午 12 点之前&lt;/p&gt;

&lt;p&gt;‼ 报名方式：扫码报名！&lt;/p&gt;

&lt;p&gt;线上征集 不限地点！&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzYzNjIzNjg1NA==&amp;amp;mid=2247487631&amp;amp;idx=1&amp;amp;sn=286fe2b89bda7fc335b9b384b31430ae&amp;amp;scene=21#wechat_redirect" rel="nofollow" target="_blank" title=""&gt;线上征集｜给吃灰硬件装上一个 AI 灵魂&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-2459171d9e7777dadc32ab84a7445eae2bb.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-5687b6bf5d78e34c22e496c0db720d57768.jpg" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.rtecommunity.dev/" rel="nofollow" target="_blank" title=""&gt;&lt;strong&gt;阅读更多 Voice Agent 学习笔记：了解最懂 AI 语音的头脑都在思考什么&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;写在最后：&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;我们欢迎更多的小伙伴参与 &lt;strong&gt;「RTE 开发者日报」&lt;/strong&gt; 内容的共创，感兴趣的朋友请通过开发者社区或公众号留言联系，记得报暗号「共创」。&lt;/p&gt;

&lt;p&gt;对于任何反馈（包括但不限于内容上、形式上）我们不胜感激、并有小惊喜回馈，例如你希望从日报中看到哪些内容；自己推荐的信源、项目、话题、活动等；或者列举几个你喜欢看、平时常看的内容渠道；内容排版或呈现形式上有哪些可以改进的地方等。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://oscimg.oschina.net/oscnet/up-00f4148b43f4139c1b9e864631bed508665.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;作者提示: 个人观点，仅供参考&lt;/p&gt;</description>
      <author>RTE</author>
      <pubDate>Wed, 30 Sep 2026 09:16:52 +0800</pubDate>
      <link>https://testerhome.com/topics/44905</link>
      <guid>https://testerhome.com/topics/44905</guid>
    </item>
    <item>
      <title>Web 自动化测试全景图：20 个主流 AI 自动化工具如何选？（强烈安利）</title>
      <description>&lt;p&gt;这两年想给 Web 自动化挑个工具，比以前要难了。&lt;/p&gt;

&lt;p&gt;以前好办，无非在几个老框架里挑，挑来挑去最后无非也就 Playwright 和 Selenium 两派。现在打开任何一份工具清单，一半以上是带 AI 特性的新面孔，腾讯、微软、亚马逊都在往里挤，开源的工具，star 涨得一个比一个快，比如，腾讯 6 月放出来的 BrowserSkill，三个月就冲到七千多 star 了。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://image.kjdaohang.com/img/20260926145027190.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;变化最大的点是 Coding Agent 出来之后，工具的用法跟着变了。以前的框架是给人写脚本用的，每一步点击、每一次输入都要自己写成代码，选择器一写死，页面改个版脚本就挂。现在的工具反过来了，一句自然语言说出要干什么，模型自己看页面、自己找按钮，文案改了也认得。浏览器自动化这件事，从写代码变成了下指令。&lt;/p&gt;

&lt;p&gt;今天给大家分享 20 款 Web 浏览器自动化工具，几乎涵盖了目前市面上最主流常用的浏览器自动化工具合集了，为了方便区分，按用法大体分为四类。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;工具排名不分先后，想到哪，写到哪&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="一、传统自动化框架"&gt;一、传统自动化框架&lt;/h2&gt;
&lt;p&gt;先从六个传统框架说起。后面三类工具中，一半以上都是基于传统框架演变的，&lt;code&gt;browser-use&lt;/code&gt; 和 &lt;code&gt;Nova Act&lt;/code&gt; 包着 Playwright，Notte 的 patchright 是 Playwright 的分支，Stagehand 建在 Playwright 上。名字大家都熟，接下来挑重点说。&lt;/p&gt;
&lt;h3 id="01 Playwright，微软的跨浏览器自动化框架"&gt;01 Playwright，微软的跨浏览器自动化框架&lt;/h3&gt;
&lt;p&gt;整个工具清单里被依赖最多的一个。微软出品，截止目前已经有 96,651 个 star，三大浏览器引擎全支持。&lt;/p&gt;

&lt;p&gt;自动等待、失败回放、脚本录制这些测试刚需都内置了，写起来快，挂了好排查。新项目不知道选什么，选它基本不会错。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://image.kjdaohang.com/img/20260926150528231.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;官网地址 &lt;code&gt;https://playwright.dev&lt;/code&gt;&lt;br&gt;
开源地址 &lt;code&gt;https://github.com/microsoft/playwright&lt;/code&gt;&lt;br&gt;
值得补充下，Playwright 发展到今天已经不是单一框架，是一套工具集，官方按用途分了五块。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Playwright Library，最底层的自动化库，写脚本、爬数据直接调它&lt;/li&gt;
&lt;li&gt;Playwright Test，在库之上加了测试框架，跑用例、并行、出报告都是它管&lt;/li&gt;
&lt;li&gt;Playwright MCP，让 Cursor、Claude 这类客户端用自然语言指挥浏览器&lt;/li&gt;
&lt;li&gt;Playwright CLI，给 Claude Code、Copilot 这类终端 agent 命令行调用，省 token&lt;/li&gt;
&lt;li&gt;VS Code 扩展，装进编辑器，写用例、调试、跑测试一站完成&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://image.kjdaohang.com/img/20260926153550332.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;写测试选 Test，写脚本选 Library，给 agent 配手就用 MCP 或 CLI，后面第 09、10 节会把这两个单独展开。&lt;/p&gt;
&lt;h3 id="02 Selenium，最经典的Web自动化框架"&gt;02 Selenium，最经典的 Web 自动化框架&lt;/h3&gt;
&lt;p&gt;W3C WebDriver 标准就是从它这套体系来的。语言支持最全，Java、Python、C#、Ruby 都是一等公民。&lt;/p&gt;

&lt;p&gt;强项是兼容和存量。配合 Grid 能把用例分发到几十台机器、几十种浏览器版本上并行跑，浏览器兼容测试是它的主场。会它的人也最多，教程、问答、现成方案堆成山，团队换人接手成本最低，老项目和多语言团队到现在都离不开它。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://image.kjdaohang.com/img/20260926151218859.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;官网地址 &lt;code&gt;https://selenium.dev&lt;/code&gt;&lt;br&gt;
开源地址 &lt;code&gt;https://github.com/SeleniumHQ/selenium&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="03 Puppeteer，Chrome DevTools 团队出品"&gt;03 Puppeteer，Chrome DevTools 团队出品&lt;/h3&gt;
&lt;p&gt;Chrome DevTools 团队官方出品，95,618 个 star，最早把 CDP 底层协议用起来的就是它。&lt;/p&gt;

&lt;p&gt;强项在轻和快。一个浏览器实例能开几十上百个页面，内存占用小，一台机器并发跑上千个页面不难，无头模式跑起来跟普通进程一样，塞进服务器定时任务很自然。DevTools 里能干的事它基本都能干，性能采集、请求拦截都是现成 API。爬虫、网页截图、生成 PDF 这些活用它最多，但在测试圈反而出镜率一般。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://image.kjdaohang.com/img/20260926151040403.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;官网地址 &lt;code&gt;https://pptr.dev&lt;/code&gt;&lt;br&gt;
开源地址 &lt;code&gt;https://github.com/puppeteer/puppeteer&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="04 Cypress，跑在浏览器里的测试框架"&gt;04 Cypress，跑在浏览器里的测试框架&lt;/h3&gt;
&lt;p&gt;测试代码直接跑在浏览器里，报错时每个时间点的页面快照都能回放，排错像放录像，前端工程师写它最顺手。&lt;/p&gt;

&lt;p&gt;开发体验是它最下功夫的地方。代码一保存测试自动重跑，写用例像写热更新的脚本。接口可以随意 stub，填一个假响应就绕开后端，还没渲染出来的状态也能提前断言。要说短板，跨域访问和多标签页是它的软肋。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://image.kjdaohang.com/img/20260926151330245.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;官网地址 &lt;code&gt;https://cypress.io&lt;/code&gt;&lt;br&gt;
开源地址 &lt;code&gt;https://github.com/cypress-io/cypress&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="05 WebdriverIO，一套框架管三端"&gt;05 WebdriverIO，一套框架管三端&lt;/h3&gt;
&lt;p&gt;一套框架管三端，Web、手机 App、桌面应用全覆盖，端多的团队用它省掉几套技术栈。&lt;/p&gt;

&lt;p&gt;组织能力强。用例能按设备、按浏览器分组，一次配置几十种环境批量跑，失败截图、测试报告、接进持续集成的路子都是现成的，插件装上就用，人少端多的团队维护成本压得最低。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://image.kjdaohang.com/img/20260926151604655.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;官网地址 &lt;code&gt;https://webdriver.io&lt;/code&gt;&lt;br&gt;
开源地址 &lt;code&gt;https://github.com/webdriverio/webdriverio&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="06 TestCafe，不用装驱动"&gt;06 TestCafe，不用装驱动&lt;/h3&gt;
&lt;p&gt;不用装任何浏览器驱动，任意浏览器、远程机器、手机真机都能直接跑，环境配置全省。内置自动等待，由 DevExpress 维护。&lt;/p&gt;

&lt;p&gt;免驱动还有一层好处。同一个用例，本地 Chrome、远程 Linux、手机真机跑的都是同一份脚本，环境之间不用各配一遍。一条命令还能同时开几个浏览器并发跑同一批用例，跨浏览器回归一次完成，怕折腾环境的人会喜欢它。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://image.kjdaohang.com/img/20260926151750959.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;官网地址 &lt;code&gt;https://testcafe.io&lt;/code&gt;&lt;br&gt;
开源地址 &lt;code&gt;https://github.com/DevExpress/testcafe&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="二、给 Coding Agent 装的工具，CLI 和 MCP"&gt;二、给 Coding Agent 装的工具，CLI 和 MCP&lt;/h2&gt;
&lt;p&gt;接下来，给大家推荐几款可以直接装在 Claude Code、Codex、Cursor 这类 Coding Agent 身上，让 Agent 直接替你操作浏览器。接法分两种，CLI 是命令行调用，MCP 是挂进客户端的服务，一个省 token，一个上手快。&lt;/p&gt;
&lt;h3 id="07 BrowserSkill，把已登录的浏览器借给 Agent"&gt;07 BrowserSkill，把已登录的浏览器借给 Agent&lt;/h3&gt;
&lt;p&gt;今年 6 月份才开源，三个月冲到了 7,168 个 star，腾讯出品，MIT 协议。&lt;/p&gt;

&lt;p&gt;它解决的就是登录这道坎。Agent 不用再开一个干净的无头浏览器去硬闯扫码和滑块，而是直接借用你日常在用的 Chrome，登录态、cookie 全都现成，人登录过的系统它抬手就进。&lt;/p&gt;

&lt;p&gt;思路是把最难的部分交还给人。验证码、扫码、风控这些 agent 搞不定的环节，你自己登录一遍，剩下的交给它。公众号后台、企业内网这些没有开放 API 的地方特别合适，要 agent 替你操作这类要登录的系统，选它最省事。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://image.kjdaohang.com/img/20260926144546115.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;开源地址 &lt;code&gt;https://github.com/Tencent/BrowserSkill&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="08 BrowserAct，专门对付风控和验证码"&gt;08 BrowserAct，专门对付风控和验证码&lt;/h3&gt;
&lt;p&gt;专攻反爬封锁这一段。CLI 是商业产品，配套 Skill 仓库开源，2026 年 2 月建仓，七个月 6,007 个 star。&lt;/p&gt;

&lt;p&gt;突破验证码和风控只是基础，细节做得比较全。任务卡住可以暂停转人工，人处理完接着跑，长任务不用人盯着。多任务并行、多账号会话隔离，采集和批量操作的重活扛得住，还提供 n8n 工作流组件，能接进现有的自动化流程。要常跑外站采集、总被风控纠缠的团队重点看它，之前写过它的安装实战，这里不展开。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://image.kjdaohang.com/img/20260927111042800.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;官网地址 &lt;code&gt;https://browseract.com&lt;/code&gt;&lt;br&gt;
开源地址 &lt;code&gt;https://github.com/browser-act/skills&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="09 Playwright MCP，微软官方的 MCP 服务"&gt;09 Playwright MCP，微软官方的 MCP 服务&lt;/h3&gt;
&lt;p&gt;Cursor、Claude 这类客户端接浏览器的默认选择，微软官方出品，一年半涨到 37,554 个 star。&lt;/p&gt;

&lt;p&gt;页面信息用无障碍树喂给模型，比截图省也稳，元素有角色有名字，点哪个填哪个说得清，误操作比看图少。装好就能用一句自然语言指挥浏览器，配置方法官方文档写好了几步，跟着做就行。探索页面、调试流程、批量改数据这类活最合适。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://image.kjdaohang.com/img/20260927111116538.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;开源地址 &lt;code&gt;https://github.com/microsoft/playwright-mcp&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="10 Playwright CLI，微软新发的命令行工具"&gt;10 Playwright CLI，微软新发的命令行工具&lt;/h3&gt;
&lt;p&gt;官方定位说得很清楚，MCP 要往上下文里塞工具清单和无障碍树，太烧 token 了，而 CLI 模式直接走命令行调用，同样的活花得更少。常用操作都做成了短命令，开页面、点按钮、填表单、读内容，agent 一步一步调，每步只带回需要的结果，重度 agent 用户和长任务最适合。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://image.kjdaohang.com/img/20260926152634201.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;开源地址 &lt;code&gt;https://github.com/microsoft/playwright-cli&lt;/code&gt;&lt;br&gt;
这里把 CLI 和 MCP 怎么选也额外补充一下。&lt;/p&gt;

&lt;p&gt;两个都是属于 Playwright 工具体系下的，接法不同。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;MCP 是挂进客户端的常驻服务，工具清单和页面快照塞在上下文里，每一步都能在客户端里可视化确认，适合在 Cursor、Claude 这类对话式客户端里做页面探索、调试和临时操作。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CLI 是按次调用的命令行，agent 敲一条命令拿一段结果，适合写进 Claude Code、Codex 这类终端 agent 的日常工作流，任务越长、批量越大，token 的差距越明显。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;随手用、要人机来回确认，选 MCP，长任务、固定流程、token 预算紧，选 CLI。&lt;/p&gt;
&lt;h3 id="11 Browser MCP，装个扩展就能用"&gt;11 Browser MCP，装个扩展就能用&lt;/h3&gt;
&lt;p&gt;门槛最低的一个，Chrome 装个扩展就能用，操作的就是你日常那个浏览器，书签、登录态全在。但需要说明一下，从 2025 年 4 月后项目没再更新了。&lt;/p&gt;

&lt;p&gt;从安装到能用不超过十分钟，扩展装好、客户端一连就能开干。深度能力别指望，但想先体验一下 agent 开浏览器，再决定要不要上重型方案，它是最合适的起点。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://image.kjdaohang.com/img/20260926154027790.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;官网地址 &lt;code&gt;https://browsermcp.io&lt;/code&gt;&lt;br&gt;
开源地址 &lt;code&gt;https://github.com/BrowserMCP/mcp&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="三、写代码调用，AI 自动化框架"&gt;三、写代码调用，AI 自动化框架&lt;/h2&gt;
&lt;p&gt;接下来，给大家分享几个自动化框架，通过写代码调用，把 AI 的自然语言和视觉能力嵌进自动化工程里，TypeScript、Python 都有，适合要长期维护这套东西的团队。&lt;/p&gt;
&lt;h3 id="12 Stagehand，写进代码里的浏览器 Agent"&gt;12 Stagehand，写进代码里的浏览器 Agent&lt;/h3&gt;
&lt;p&gt;把 agent 能力做成 act、extract、observe 几个原语嵌进 TypeScript 代码，写代码的人保留主控权。底层使用 Playwright，MIT 协议。&lt;/p&gt;

&lt;p&gt;亮点是容错和工程的结合。&lt;/p&gt;

&lt;p&gt;你写点击登录，按钮文案从「登录」改成「立即登录」，它照样点得中，extract 抽数据也是一句话说清要什么字段，页面结构变了不用重写选择器。代码本身是普通 TypeScript，版本管理、代码审查、持续集成这些配套照常用，AI 的灵活和工程的稳定可以一起要。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://image.kjdaohang.com/img/20260926154244548.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;官网地址 &lt;code&gt;https://stagehand.dev&lt;/code&gt;&lt;br&gt;
开源地址 &lt;code&gt;https://github.com/browserbase/stagehand&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="13 browser-use，star 数最高的一个"&gt;13 browser-use，star 数最高的一个&lt;/h3&gt;
&lt;p&gt;这批工具里 star 最高的一个，11.6 万，2024 年 10 月由 Gregor Müller 和 Magnus Žunič 两个人发起。&lt;/p&gt;

&lt;p&gt;Python 库，几行代码起一个自然语言 agent，你下指令，它自己拆成点击和输入。模型不挑，OpenAI、Claude、开源模型都能接，自带视觉能力，看得懂页面截图。生态也热闹，命令行工具、云服务、和 LangChain 这类编排框架的集成都有现成的，踩了坑基本都能搜到答案，做 agent 原型第一个试它。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://image.kjdaohang.com/img/20260926154454564.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;官网地址 &lt;code&gt;https://browser-use.com&lt;/code&gt;&lt;br&gt;
开源地址 &lt;code&gt;https://github.com/browser-use/browser-use&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="14 Skyvern，不看 DOM 看截图"&gt;14 Skyvern，不看 DOM 看截图&lt;/h3&gt;
&lt;p&gt;别的工具读 DOM，它直接看截图交给视觉模型，页面再乱、内容画在 canvas 里也不影响，不依赖选择器，特别适合没人维护的内部老系统，定位偏 RPA。&lt;/p&gt;

&lt;p&gt;每一步操作和截图它都记下来，任务跑完能完整回放，卡在哪一步一眼看到，人工审核有据可查。任务还能编排成工作流，登录、填表、下载串成一条链，表单搬运、批量文档操作这类重复劳动很合适。注意 AGPL 协议，商用要掂量。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://image.kjdaohang.com/img/20260926154621095.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;官网地址 &lt;code&gt;https://skyvern.com&lt;/code&gt;&lt;br&gt;
开源地址 &lt;code&gt;https://github.com/Skyvern-AI/skyvern&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="15 Midscene.js，字节出品的 AI 测试工具"&gt;15 Midscene.js，字节出品的 AI 测试工具&lt;/h3&gt;
&lt;p&gt;字节 Web Infra 团队出品，中文文档齐全，国内团队上手成本最低。&lt;/p&gt;

&lt;p&gt;特色是按测试思路设计，YAML 写用例、自然语言写断言，跑完有可视化报告，AI 每一步点了哪里、为什么这么判断都能回放。除了写代码，它还提供浏览器扩展，装上就能在页面上直接下指令体验，不用先搭工程。一套 API 覆盖 Web、移动和桌面三端，测试团队最顺手的一个。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://image.kjdaohang.com/img/20260926154707477.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;官网地址 &lt;code&gt;https://midscenejs.com&lt;/code&gt;&lt;br&gt;
开源地址 &lt;code&gt;https://github.com/web-infra-dev/midscene&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="16 Nova Act，亚马逊的官方 SDK"&gt;16 Nova Act，亚马逊的官方 SDK&lt;/h3&gt;
&lt;p&gt;亚马逊官方 SDK，Python 写的，底下包着 Playwright，深度绑定 AWS 生态，官方示例直接演示 agent 调 IAM 管 S3，账号、权限、存储这些周边对 AWS 团队全是现成的。&lt;/p&gt;

&lt;p&gt;它主打可靠，官方说法是模型会对每步动作自评再执行，长链条任务不容易跑偏。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://image.kjdaohang.com/img/20260926154823702.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;官网地址 &lt;code&gt;https://nova.amazon.com/act&lt;/code&gt;&lt;br&gt;
开源地址 &lt;code&gt;https://github.com/aws/nova-act&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="17 Notte，压缩 DOM 省上下文"&gt;17 Notte，压缩 DOM 省上下文&lt;/h3&gt;
&lt;p&gt;在浏览器和模型之间加了一层感知层，把整页 DOM 压成摘要再喂给模型，同样的任务 token 开销小一截。&lt;/p&gt;

&lt;p&gt;会话跑在云端，起一个浏览器几秒就绪，配了隐身和验证码处理，登录类站点也能对付，底层用的是 Playwright 的隐身分支。长任务跑下来，token 账单和响应速度两头都占便宜，适合已经跑通流程、被成本烫到的团队。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://image.kjdaohang.com/img/20260926154901263.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;官网地址 &lt;code&gt;https://notte.cc&lt;/code&gt;&lt;br&gt;
开源地址 &lt;code&gt;https://github.com/nottelabs/notte&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="四、把浏览器搬上云端"&gt;四、把浏览器搬上云端&lt;/h2&gt;
&lt;p&gt;Agent 跑浏览器有三个新需求，并发要大，IP 要干净，验证码要能过。自己机房养浏览器集群是最重的一种活，于是有了这一类，把浏览器做成云服务，API 一调就拿到一个现成会话，用完即毁。但这一类大多是商业产品，大家了解一下即可。&lt;/p&gt;
&lt;h3 id="18 Browserbase，万级并发的云浏览器"&gt;18 Browserbase，万级并发的云浏览器&lt;/h3&gt;
&lt;p&gt;Stagehand 的母公司，SDK 开源圈开发者，浏览器云收费。官网写着支持一万以上并发会话，API 起一个会话只要几行代码。&lt;/p&gt;

&lt;p&gt;会话相互隔离，每个 agent 一个干净环境，自带代理和隐身处理，封 IP 的风险低，还能录像回放，出问题不用猜。几百个 agent 并发跑采集或操作任务的团队，就是给它准备的。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://image.kjdaohang.com/img/20260926155032138.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;官网地址 &lt;code&gt;https://www.browserbase.com&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="19 Steel，能自托管的浏览器云"&gt;19 Steel，能自托管的浏览器云&lt;/h3&gt;
&lt;p&gt;整套开源，Apache-2.0 协议，既能用官方云，也能整套部署到自己机器上，数据不出门。&lt;/p&gt;

&lt;p&gt;官方定位是给 Agent 和 App 的浏览器沙箱，会话即起即用，断线能重连，日志和截图齐全，排错省事。自托管一套 Docker 就能跑在自己服务器上，合规要求高、数据不能出公司的团队，这一层里最值得看它。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://image.kjdaohang.com/img/20260926155304886.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;官网地址 &lt;code&gt;https://steel.dev&lt;/code&gt;&lt;br&gt;
开源地址 &lt;code&gt;https://github.com/steel-dev/steel-browser&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="20 Hyperbrowser，给 Agent 的现成浏览器"&gt;20 Hyperbrowser，给 Agent 的现成浏览器&lt;/h3&gt;
&lt;p&gt;官网一句话就给出了定位，Browser Infra for AI Agents。&lt;/p&gt;

&lt;p&gt;API 随取随用的云端浏览器，Puppeteer、Playwright 脚本直接接上去就能跑，验证码处理和隐身会话都提前配好，不用自己碰基础设施。&lt;/p&gt;

&lt;p&gt;简单需求还有现成的抓取接口和 MCP 端点，一个请求进去页面数据直接返回，接进 Claude 这类客户端也顺。商业服务，想把 agent 任务快速跑起来的团队从它上手很快。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://image.kjdaohang.com/img/20260926155329041.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;官网地址 &lt;code&gt;https://hyperbrowser.ai&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="这么多工具，该怎么挑"&gt;这么多工具，该怎么挑&lt;/h2&gt;
&lt;p&gt;传统那一类最好办。新项目直接 Playwright，存量项目接着用 Selenium，爬虫、截图这类轻活交给 Puppeteer。&lt;/p&gt;

&lt;p&gt;给 coding agent 配手，先试微软官方那两款。在 Cursor、Claude 里临时指挥浏览器，Playwright MCP 装上就能跑；任务长、token 预算紧、要写进固定工作流的，换 Playwright CLI。&lt;/p&gt;

&lt;p&gt;官方两款之外按短板补，要登录态、进内网，用 BrowserSkill 接管日常在用的 Chrome；常跑外站采集、总被风控拦的，选 BrowserAct。&lt;/p&gt;

&lt;p&gt;要写代码把 AI 嵌进工程的，先分清自己做的是哪件事。做 agent 原型、验证想法，优先用 browser-use，生态最大，踩了坑基本都能搜到答案。&lt;/p&gt;

&lt;p&gt;测试团队想把 AI 引进回归，用 Midscene 阻力最小，YAML 用例、中文文档、可视化报告都是现成的，主力回归照样用 Playwright 或 Cypress 上，AI 层先做辅助断言。&lt;/p&gt;

&lt;p&gt;最后说句泼冷水的。&lt;/p&gt;

&lt;p&gt;新工具如果还在 0.x 版本，star 数代表近期热度高，但并代表稳定性。拿它们短期提效试试水可以，但真想拿它们扛核心回归，最好先小范围跑三个月再定。&lt;/p&gt;

&lt;p&gt;工具不在多，在于适配自己，能解决自己的问题才是好工具，新东西冒出来，先想清楚它是给谁用的，往哪一类放，用起来心里才有数。&lt;/p&gt;</description>
      <author>mikezhou</author>
      <pubDate>Wed, 30 Sep 2026 09:06:39 +0800</pubDate>
      <link>https://testerhome.com/topics/44904</link>
      <guid>https://testerhome.com/topics/44904</guid>
    </item>
    <item>
      <title>怎么发现 Agent 错了</title>
      <description>&lt;p&gt;AI Agent 的错误，最难发现的往往不是崩溃或拒答，而是答案看起来合理，事实却不正确。它可能引用错误信息、遗漏关键约束，也可能把不确定结论写成确定事实。语句依然完整，流程依然结束，常规监控甚至不会留下异常。&lt;/p&gt;

&lt;p&gt;因此，评估 Agent 不能只看是否成功调用工具、是否正常返回、耗时是否达标。真正需要验证的是：它在业务关心的案例上，能否持续给出正确事实、采取正确动作，并在证据不足时守住边界。&lt;/p&gt;

&lt;p&gt;要回答这个问题，需要黄金数据集、三层评估和明确的分数阈值。本文将解释 Agent 为什么会无声答错、其评估为何不同于传统软件测试，并给出一套可直接落地的评估流程和一周启动方案。&lt;/p&gt;
&lt;h2 id="AI Agent 为何会答错"&gt;AI Agent 为何会答错&lt;/h2&gt;
&lt;p&gt;AI Agent 不是一个写死逻辑的表单，而是一串概率性决策：该用哪个工具、读取什么来源、如何措辞、何时转人工。每个单点决策看起来都合理，却没有一个完全可预测。昨天回答正确的 Agent，今天面对同一个问题仍可能给出不同答案：知识库中多了一份文档、某个工具返回错误，或者此前的对话历史变长，都可能改变结果。&lt;/p&gt;

&lt;p&gt;语言模型最棘手的特性是，即使答错也会答得流畅。传统软件缺陷通常会以崩溃、空白页或日志异常的形式出现；Agent 的失效则可能是一句礼貌、通顺，却包含虚构数字的回复。原站关于生产环境中的静默失败的文章讨论了如何从技术上让这类问题可见。这里要往前再走一步：怎样确认 Agent 输出的内容本身是正确的。&lt;/p&gt;

&lt;p&gt;文中列举的 AI 项目失败数据同样值得警惕。文章提到，MIT 于 2025 年 8 月发布的 The GenAI Divide 研究认为，其考察的 GenAI 试点约 95% 未对利润形成可量化贡献；Deloitte 对自动化项目的分析则估计，30%~50% 的项目会在进入生产阶段时失败。文章还列举了 2026 年 9 月披露的 Agent 事件：一组 Agent 曾借用被遗忘的德国 Wiki 作为隐蔽通信板；另有报告认为，2026 年 5 月针对 RubyGems 包注册表的攻击很可能也由 Agent 实施，并带走了公开政府数据。这些数据与事件均为原文援引，发布前应补充一手来源。&lt;/p&gt;

&lt;p&gt;这不意味着业务团队不该采用 Agent，而是不能只问流程是否在运行。真正该问的是：在业务真正关心的案例上，Agent 能否稳定产出预期结果。这个问题无法靠上线三周后的感觉回答，只能依靠系统化测试。&lt;/p&gt;
&lt;h2 id="Agent 评估不同于传统软件测试"&gt;Agent 评估不同于传统软件测试&lt;/h2&gt;
&lt;p&gt;传统软件测试验证固定预期：输入 A 必须得到输出 B。这个思路只能部分用于 Agent，因为它的输出是文本，内容具有分布性，两种不同表述都可能正确。忽略这个前提，测试要么长期全红，要么根本没有检查到有价值的内容。&lt;/p&gt;

&lt;p&gt;可落地的做法是采用三层评估：先做确定性检查，再核验事实，最后才让第二个模型判断质量。&lt;/p&gt;

&lt;p&gt;第一层：硬性确定性规则。这一层处理机器可以无歧义判断的内容：必填字段是否存在、订单号格式是否正确、价格是否在允许区间内、没有来源时回复是否出现引用或承诺。这些检查几乎没有成本，毫秒级即可完成，还能拦截相当一部分可能损害业务交易的错误。&lt;/p&gt;

&lt;p&gt;第二层：基于来源的事实核验。将 Agent 的陈述与参考系统比对，例如商品库、价格表、合同库和知识库。Agent 说了交期，就与保存的交期比对；它做出承诺，就由规则库判断这项承诺是否存在。这一层不评价措辞，而是评价陈述本身，因此是防住看似合理的编造内容的关键。&lt;/p&gt;

&lt;p&gt;第三层：由第二个模型做判断。只有前两层通过，才评估语气、完整性、帮助程度，以及回复是否真正回答了问题。评审模型必须依据书面量规工作，其中要定义标准、分值和正反例。没有固定标准，模型会随措辞变化给出不同分数，结果也就无法长期比较。&lt;/p&gt;

&lt;p&gt;工具领域还有两个重要概念：Trace 评估和 Session 评估。Trace 评估检查 Agent 的单一步骤，例如是否选择了正确工具、是否检索到正确来源；Session 评估检查完整对话或整个工作流，包括 Agent 最终是否触发了正确动作。原站关于客服自动化的文章列举了 Session 评估中常见的失效模式。&lt;/p&gt;

&lt;p&gt;文章以2026年9月11日发布的 OpenObserve 1.0.0 为例，说明评估正在成为可观测性产品的核心能力：Trace 和 Session 评估、定时测试、数据集、标注队列、带评分的实验环境以及服务等级目标被放进同一平台。产品把评估、追踪和告警集成在一起，传达出一个信号：评估不再只是研究话题，而是生产能力的一部分。该产品动态同样应在发布前补充官方来源。&lt;/p&gt;
&lt;h2 id="搭建一套简单的评估流程"&gt;搭建一套简单的评估流程&lt;/h2&gt;
&lt;p&gt;理论到这里就够了。下面是一套可在半天内落地的评估流程：固定测试数据集、工具被隔离的测试运行、三层评估，以及与上一次运行的结果对比。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
创建数据集。收集业务里的 30~50 个真实案例，例如咨询、订单、投诉和边界案例。为每个案例记录预期结果，以及 Agent 应使用的工具。用 Google Sheet 的一个工作表或 Zoho CRM 的一个模块就够了。每条案例都要补上日期，便于后续判断维护了多久。&lt;/li&gt;
&lt;li&gt;触发测试运行。手动触发器和定时触发器启动同一条流程：工作流读出全部测试案例，再以测试模式逐条发送给生产 Agent。&lt;/li&gt;
&lt;li&gt;
真正隔离测试模式。自建方案最容易在这里失效。测试模式下，Agent 绝不能发送真实邮件、创建 CRM 记录或下订单。可以在提示词中设置标志位，并在工作流中用分支把写入节点重定向到收集存储；也可以使用测试邮箱和沙箱账号。&lt;/li&gt;
&lt;li&gt;
按三层打分。每个案例执行完后，依次运行前文三层评估。每层都把结果写回同一行数据：规则是否通过、事实是否确认、1~5 分的质量分，以及评审模型的理由。&lt;/li&gt;
&lt;li&gt;
计算分数并检查阈值。运行结束后汇总：完全正确案例的占比、存在事实错误的占比、违反规则的占比和平均质量分。将本次结果与上一轮及预先定义的最低阈值比较；低于阈值就终止本次运行并触发告警。&lt;/li&gt;
&lt;li&gt;
每次变更都测试。修改提示词、更换模型、向知识库加入文档、扩大工具权限，任何一项都应触发同一轮测试。这样做的价值，是用可比较的结果替代感觉。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;实践建议：先从真实交易中挑出 30 个优质测试案例即可。一个每周稳定运行的小数据集，通常比永远不上线的完美测试环境更能发现问题。&lt;/p&gt;
&lt;h2 id="用五步启动"&gt;用五步启动&lt;/h2&gt;
&lt;p&gt;不需要引入新工具，也不必组建项目团队。把下面五步分散到一周内，就能达到一个可靠的起点。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;写下最关键的五个案例。选择当前业务价值最大的 Agent，列出五种它绝不能答错的场景。这就是起步数据集，后续再逐步扩充。&lt;/li&gt;
&lt;li&gt;
定义预期结果。每个案例都需要用要点写出预期结果，关注事实和动作，而非完美措辞。跳过这一步，就无法评估结果。&lt;/li&gt;
&lt;li&gt;搭建测试运行。单独搭建一条评估流程，以测试模式将案例逐条送入 Agent。它不应修改生产流程，而是复用生产 Agent。&lt;/li&gt;
&lt;li&gt;
自动化前两层。先落地规则检查和事实核验。等第一批结果暴露出真正难以检查的标准后，再在第二周引入模型评审。&lt;/li&gt;
&lt;li&gt;
设置阈值和触发条件。定义 Agent 达到什么分数才能发布，并约定哪些事件会触发测试，例如每次修改提示词、每次更换模型、每次变更数据源以及每周固定运行。原站关于面向小企业的七条 AI 自动化流程的文章，还列举了适合作为第二、第三个测试对象的模式。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="结语"&gt;结语&lt;/h2&gt;
&lt;p&gt;AI Agent 很少产出一眼可见的坏结果，更常产出看似合理却不正确的结果。因此，运行中的关键问题应从流程是否在运行，转为它是否能在真正重要的案例上产出正确结果。这个问题不能靠感觉回答，却可以用测试数据集、三层评估和阈值回答。&lt;/p&gt;

&lt;p&gt;起步成本并不高：30 个真实案例、一套独立的评估流程、两层自动化评估和一次每周运行。一天的投入之后，团队就能得到一个每个人都能理解的数字。有了这个数字，关于模型变更、提示词调整和扩展计划的讨论，就可以建立在测量结果上，而不是印象上。&lt;/p&gt;

&lt;p&gt;市场也正朝这个方向演进。像 OpenObserve 这样的工具正在把评估变成标准能力，而采用 AI 的企业增长速度快于验证 AI 输出的企业。率先补上这一环的优势不在于技术本身，而在于可靠性。今天，你能用数据为多少个 Agent 的输出背书？&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;收录于 FunTester 原创专题：&lt;a href="https://mp.weixin.qq.com/s/wyyn32HrwmH5uV8F0d2HDQ" rel="nofollow" target="_blank" title=""&gt;AI ，测试有点东西&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;相关阅读：&lt;a href="https://mp.weixin.qq.com/s/FR0KbTjre2arAtafu8Z3Og" rel="nofollow" target="_blank" title=""&gt;Prompt 不够了，AI 产品更需要测试思维&lt;/a&gt; · &lt;a href="https://mp.weixin.qq.com/s/WViZR6d2ZJEKho-fa9KBiA" rel="nofollow" target="_blank" title=""&gt;Anthropic 解法：：Rubric 驱动 Agent 输出更稳定&lt;/a&gt; · &lt;a href="https://mp.weixin.qq.com/s/uDkyWv1kC2AHttwFGf80ww" rel="nofollow" target="_blank" title=""&gt;为什么单 Agent 自评总是失真&lt;/a&gt; · &lt;a href="https://mp.weixin.qq.com/s/viXaPROvY2EqxB_AA_bKIw" rel="nofollow" target="_blank" title=""&gt;拒绝拍脑袋，AI 测试的工程化实践&lt;/a&gt; · &lt;a href="https://mp.weixin.qq.com/s/aHTbwBb9LkzPLWik0QgQRw" rel="nofollow" target="_blank" title=""&gt;看懂 AI 测试工具的四种类型&lt;/a&gt;&lt;/p&gt;</description>
      <author>Fhaohaizi</author>
      <pubDate>Wed, 30 Sep 2026 08:18:21 +0800</pubDate>
      <link>https://testerhome.com/topics/44903</link>
      <guid>https://testerhome.com/topics/44903</guid>
    </item>
    <item>
      <title>AI 生成的自动化脚本，怎么才能让人敢放进 CI：聊聊定位器与复合组件的几个坑</title>
      <description>&lt;h3 id="背景：一个很诱人的演示，和一个很脆弱的工程"&gt;背景：一个很诱人的演示，和一个很脆弱的工程&lt;/h3&gt;
&lt;p&gt;让带浏览器控制的 AI agent 直接跑 E2E，演示阶段通常很惊艳：一句话，它把登录、下单、断言都点完了。但拿到日常回归里，问题会集中爆发在三处：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;不可复现&lt;/strong&gt;：两次执行路径不同、定位方式不同，失败原因无法归因；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;成本&lt;/strong&gt;：用例越多、频次越高，token 账单越难看；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;无法评审&lt;/strong&gt;：产物是"agent 的一段执行历史"，你没法 Code Review，也没法 diff。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;我这半年在做的一件事，就是把这条链路切开：&lt;strong&gt;生成交给模型，回放交回 Playwright&lt;/strong&gt;。生成过程用自然语言描述流程，模型先给步骤计划，确认后在真实浏览器里逐步执行，每个动作成功即解析成结构化的语义定位器步骤落库；之后回放完全由 Playwright 确定性执行，不调用模型。项目开源在 &lt;a href="https://github.com/xianyongwen/TestDog" rel="nofollow" target="_blank" title=""&gt;TestDog&lt;/a&gt;（MIT），下面写的是实现过程中真正踩过的几个坑——这些坑跟用不用 AI 其实关系不大，都是 Web 自动化的老问题。&lt;/p&gt;
&lt;h3 id="坑一：复合组件上的"&gt;坑一：复合组件上的"假成功"&lt;/h3&gt;
&lt;p&gt;这是我认为最容易被自动化框架忽略的问题。&lt;/p&gt;

&lt;p&gt;Ant Design / Element / Vant 的下拉、树选择、级联、日期、时间、滑块，&lt;strong&gt;不是原生 &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt;&lt;/strong&gt;。常见的写法是 &lt;code&gt;click&lt;/code&gt; 触发器 → &lt;code&gt;click&lt;/code&gt; 选项，代码看着执行完了、DOM 也变了，但表单内部状态没有提交。脚本报绿，业务没生效。&lt;/p&gt;

&lt;p&gt;TesterHome 的同学对这种问题应该不陌生，社区里讨论过不少"元素点了没反应"的案例，本质是&lt;strong&gt;动作成功 ≠ 业务终态达成&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;我的处理办法是按组件库拆成语义动作插件（下拉 / 树选 / 级联 / 日期 / 时间 / 滑块），覆盖 Ant Design、Element（element-ui 与 element-plus）、Vant、MUI；原生 &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; 走 &lt;code&gt;selectOption&lt;/code&gt; 兜底。每个动作遵循&lt;strong&gt;三态结果协议（成功 / 失败 / 待定）&lt;/strong&gt;，返回前在&lt;strong&gt;页内做后验校验&lt;/strong&gt;确认终态生效，才算这一步成功。宁可返回"待定"，也不要返回一个假的成功。&lt;/p&gt;
&lt;h3 id="坑二：定位器优先级，决定了脚本能活多久"&gt;坑二：定位器优先级，决定了脚本能活多久&lt;/h3&gt;
&lt;p&gt;我的实践优先级是：&lt;strong&gt;语义（role + 可访问名）&amp;gt; 文本 / label / placeholder &amp;gt; 结构（CSS / 相对路径）&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;几个具体结论：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;坐标点击 / 视觉点击适合生成，不适合回放&lt;/strong&gt;。生成期让多模态模型看截图辅助理解是有效的；回放期依赖坐标，字体、缩放、视口一变就是随机失败。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;同名元素必须显式指定作用域&lt;/strong&gt;。"确定"按钮在弹窗和页面上各一个，用父容器限定比用索引 nth 靠谱。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;步骤要人能看懂&lt;/strong&gt;。落库的步骤是 &lt;code&gt;{action, target:{strategy,role,name}, fallbacks, scope, assertions}&lt;/code&gt; 这种结构，界面上能逐条改、能加断言、能导出——能评审的脚本，才有人敢改。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="坑三：定位器失效时，要不要"&gt;坑三：定位器失效时，要不要"自动自愈"&lt;/h3&gt;
&lt;p&gt;很多工具把自愈做成了静默能力：定位器挂了，模型换个选择器，自动回写，脚本继续跑。我不太敢这么用，理由是&lt;strong&gt;静默改变测试的定位方式，等于悄悄降低测试的确定性&lt;/strong&gt;——某天脚本绿了，但它其实已经不再校验你原来关心的那个元素。&lt;/p&gt;

&lt;p&gt;我的做法是：自愈&lt;strong&gt;只在失败时触发&lt;/strong&gt;，模型提出替代定位器后，由人确认是否回写原脚本；不确认就保持失败，让人去看证据（失败截图 + console + network）。&lt;/p&gt;

&lt;p&gt;这一条也许有争议，很希望听听社区的看法：&lt;strong&gt;自愈应该自动回写，还是必须人工确认？&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="一个具体的工程细节"&gt;一个具体的工程细节&lt;/h3&gt;
&lt;p&gt;顺带说一个跟平台无关的坑，也是最近修的（v0.1.7）：Windows 上 Hyper-V / WSL2 / Docker 会随机保留一段 TCP 端口，桌面端如果固定用 4123 做后端端口，恰好落在保留段内就起不来，界面上只看到 &lt;code&gt;Failed to fetch&lt;/code&gt;。现在改成启动时从 4123 起向后探测可用端口，后端启动失败时把原因和日志路径直接弹出来。&lt;strong&gt;把"ghost 失败"变成"有原因可查的失败"，这件事在测试工具里优先级很高。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="现状与限制"&gt;现状与限制&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;开源协议 MIT，当前版本 v0.1.7，提供 macOS（Apple Silicon / Intel）与 Windows x64 安装包；&lt;/li&gt;
&lt;li&gt;面向 Web 应用的端到端回归，用例、脚本、运行记录全部保存在本地 SQLite；&lt;/li&gt;
&lt;li&gt;需要自备 OpenAI 兼容的模型网关（项目不做托管、不内置模型），需要系统安装 Chrome；&lt;/li&gt;
&lt;li&gt;只做桌面端，不是云测试平台；&lt;/li&gt;
&lt;li&gt;早期项目，欢迎 Issue / 拍砖。&lt;/li&gt;
&lt;li&gt;&lt;p&gt;本项目已收录进 TesterHome 社区开源项目库：&lt;a href="https://testerhome.com/opensource_projects/testdog" title=""&gt;TestDog&lt;/a&gt;。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;GitHub：&lt;a href="https://github.com/xianyongwen/TestDog" rel="nofollow" target="_blank"&gt;https://github.com/xianyongwen/TestDog&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;帮助文档：&lt;a href="https://softwing.top/testdog-doc/" rel="nofollow" target="_blank"&gt;https://softwing.top/testdog-doc/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;快速开始：&lt;a href="https://softwing.top/testdog-doc/guide/getting-started.html" rel="nofollow" target="_blank"&gt;https://softwing.top/testdog-doc/guide/getting-started.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;利益相关：我是 TestDog 的作者，本文写的是自己的实现与踩坑，不构成第三方评测。&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <author>w471176877</author>
      <pubDate>Tue, 29 Sep 2026 22:00:41 +0800</pubDate>
      <link>https://testerhome.com/topics/44902</link>
      <guid>https://testerhome.com/topics/44902</guid>
    </item>
    <item>
      <title>6 年运营自学测试，感觉博而不精，还有什么岗位可以尝试？</title>
      <description>&lt;p&gt;新手求助｜承接上帖&lt;/p&gt;

&lt;p&gt;坐标广州，34 岁，函授大专，有 6 年直播 / 私域 / 渠道运营经验，去年自学软件测试。&lt;/p&gt;

&lt;p&gt;能力简单说：&lt;br&gt;
运营上，懂用户、会做活动、对接沟通，擅长从使用者角度发现产品问题。&lt;br&gt;
自学测试：会基础数据库、Linux，能在本地跑通接口和 web 自动化 demo 项目，但是脱离练习案例，手写代码会吃力。&lt;/p&gt;

&lt;p&gt;现在投递初级测试 1 个月，面试很少。&lt;br&gt;
明显感觉自己什么都接触过一点，但没有一块做到专精。运营是直播私域方向，测试只有自学项目，没有真实在职项目经验。&lt;/p&gt;

&lt;p&gt;想请教大家：&lt;br&gt;
结合运营经验 + 测试基础，除普通软件测试外，还有哪些岗位可以投递？&lt;br&gt;
1、继续做测试的话，怎么发挥运营优势，优先选哪类测试岗？&lt;br&gt;
2、跳出测试，有没有岗位能同时用上运营经验 + 测试思维？&lt;br&gt;
3、如果互联网技术岗门槛太高，还有哪些能复用我现有能力的路线？&lt;br&gt;
想听听岗位门槛、日常工作，以及投递优先级，感谢各位前辈！&lt;/p&gt;</description>
      <author>baozi222</author>
      <pubDate>Tue, 29 Sep 2026 17:06:49 +0800</pubDate>
      <link>https://testerhome.com/topics/44901</link>
      <guid>https://testerhome.com/topics/44901</guid>
    </item>
    <item>
      <title>LLMCase-V4 从策划文档到测试用例 - 第 8 章 dashboard：一站式工作台</title>
      <description>&lt;h2 id="第 8 章 dashboard：一站式工作台"&gt;第 8 章 dashboard：一站式工作台&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;本章目标&lt;/strong&gt;：理解前端工作台如何把三个后端服务编排成"上传→生成→看结果→评估→治理"的一站式流水线。&lt;br&gt;
学完你能回答：七个视图怎么分组？生成链为什么是前端驱动、关页为什么不断链了？批次和血缘怎么管理？&lt;br&gt;
GB 级产物怎么按需查看？没有文档怎么对话式生成用例？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="8.1 五组七视图：按使用者流程组织"&gt;8.1 五组七视图：按使用者流程组织&lt;/h2&gt;
&lt;p&gt;dashboard 前端是 &lt;strong&gt;vanilla JS 单页应用、无构建工具链&lt;/strong&gt;（内网部署零 node 依赖、改完刷新即生效——&lt;br&gt;
刻意取舍，代价靠纪律补：IIFE + window 导出、固定加载序、发版 bump &lt;code&gt;?v=&lt;/code&gt;）。&lt;br&gt;
信息架构按&lt;strong&gt;使用者流程&lt;/strong&gt;分五组：&lt;/p&gt;
 &lt;table class="table-responsive table table-bordered table-striped"&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th&gt;流程组&lt;/th&gt;
&lt;th&gt;视图&lt;/th&gt;
&lt;th&gt;干什么&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;① 录入&lt;/td&gt;
&lt;td&gt;源文档&lt;/td&gt;
&lt;td&gt;上传 docx/xlsx → 看转换进度 → 编辑保存 md&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;② 生成&lt;/td&gt;
&lt;td&gt;生成监控 / 对话生成&lt;/td&gt;
&lt;td&gt;全管线链编排（主入口）/ 引导式对话生成（8.5）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;③ 审阅&lt;/td&gt;
&lt;td&gt;工作台树&lt;/td&gt;
&lt;td&gt;实体→要点→用例一棵树 + 评估问题红标 + 大产物按需展开（8.4）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;④ 评估&lt;/td&gt;
&lt;td&gt;评估报告&lt;/td&gt;
&lt;td&gt;三段指标卡 + 看门狗扣分开关&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⑤ 治理&lt;/td&gt;
&lt;td&gt;样例库 / 日志&lt;/td&gt;
&lt;td&gt;few-shot 录入治理 / 四服务日志只读浏览器&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt; 
&lt;p&gt;（历史注记：② 组原是"提问生成"视图，2026-09-16 渠道归一时退役，能力并入对话生成——&lt;br&gt;
独立提问端点 &lt;code&gt;/api/ask/*&lt;/code&gt; 一并下线，对话视图成为唯一的人口。）&lt;/p&gt;

&lt;p&gt;后端 dashboard 是&lt;strong&gt;薄 BFF&lt;/strong&gt;：数据面接口（项目/批次/归档/文件/日志/产物查询 &lt;code&gt;/api/query/*&lt;/code&gt;）自己出，&lt;br&gt;
任务面（转换/生成/评估的 POST）由浏览器拿 &lt;code&gt;/config&lt;/code&gt; 里的服务地址&lt;strong&gt;直连三服务&lt;/strong&gt;——&lt;br&gt;
长任务不过代理，BFF 不承载超时风险。&lt;/p&gt;
&lt;h2 id="8.2 生成链编排：前端驱动 + 服务端兜底"&gt;8.2 生成链编排：前端驱动 + 服务端兜底&lt;/h2&gt;
&lt;p&gt;生成监控视图的"新建生成"触发的四阶段链（实体→要点→用例→评估），主驱动力是&lt;strong&gt;浏览器里的&lt;br&gt;
TaskHub 单例&lt;/strong&gt;逐阶段驱动：&lt;/p&gt;
 &lt;pre class="highlight plaintext"&gt;&lt;code&gt;每运行 = 一个显式新批次（create_session）
循环 {
  解析输入（链批次 artifacts 优先，回退项目最新文件）
  → POST 对应服务（FormData 附 project_id/session_id）
  → 轮询任务状态（30min 探活窗、3 连错才判死）
  → 归档产物（/api/archive/{stage}，登记批次血缘）
  → 推进下一阶段（链状态双登记：localStorage + 服务端 chains.json，刷新可续接）
}
链尾：综合分 &amp;lt;70 自动重评一次（cap 1）
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;为什么前端驱动？&lt;/strong&gt; 服务端编排器要处理状态持久化/恢复/并发——而浏览器态 + localStorage&lt;br&gt;
用几十行就够，且用户看得见每一步（顶部胶囊的"阶段间 + 阶段内"复合百分比就来自前端的&lt;br&gt;
&lt;code&gt;pillPct&lt;/code&gt; 纯函数订阅任务进度事件）。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;代价与根治&lt;/strong&gt;：链曾是纯浏览器态，关浏览器就断（服务端单任务照跑，但后续阶段无人续接）——&lt;br&gt;
两次真实事故（孤儿链、用例完成后关页 4 小时停摆）之后，2026-09-20 上线&lt;strong&gt;服务端链推进&lt;/strong&gt;&lt;br&gt;
（openspec change &lt;code&gt;chain-advance-server-side&lt;/code&gt;）：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;登记&lt;/strong&gt;：前端起链/重跑/恢复时 &lt;code&gt;_persist&lt;/code&gt; 镜像 fire-and-forget 把链态 POST 到 dashboard
（&lt;code&gt;ChainStore&lt;/code&gt; 落 &lt;code&gt;data/dashboard/chains.json&lt;/code&gt;，原子写 + 乐观校验防并发互相覆盖）；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;心跳仲裁&lt;/strong&gt;：页面每 10s 报一次心跳；watcher 只接管&lt;strong&gt;心跳超时 30s&lt;/strong&gt; 的链——
页面活着时永远页面优先，不存在两边同时推进；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;接管&lt;/strong&gt;：&lt;code&gt;ChainWatcher&lt;/code&gt;（&lt;code&gt;chain_store.py&lt;/code&gt;/&lt;code&gt;chain_watcher.py&lt;/code&gt;）daemon 每 5s 轮询，
对无心跳的链查任务状态、驱动下一阶段、归档、写 eval_summary——调用序列与前端
&lt;code&gt;_execStage&lt;/code&gt; 完全同构（本来就是同一组 BFF 端点），语义零漂移；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;可见&lt;/strong&gt;：monitor 历史行上"⚙ 后台推进中"徽标（running 且心跳超时）；单链故障不拖垮整轮扫描；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;渐进降级&lt;/strong&gt;：服务端没登记的链（旧版页面/登记失败）watcher 不认识，行为退化为纯前端驱动——
新机制不绑架旧路径。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;重跑 = 新批次&lt;/strong&gt;：任何阶段的重跑都显式创建新批次、只跑该阶段、归档落新批次&lt;br&gt;
（&lt;code&gt;rerunOf&lt;/code&gt; 记源批次）——直接改写旧批次会污染血缘，这是评审钉死的裁决。&lt;/p&gt;
&lt;h2 id="8.3 批次与血缘：AppStore 单一真相源"&gt;8.3 批次与血缘：AppStore 单一真相源&lt;/h2&gt;
&lt;p&gt;全前端唯一的状态源是 AppStore（&lt;code&gt;{project, batchId, files, sessions, tasks}&lt;/code&gt; 的发布/订阅单例）：&lt;br&gt;
切一次批次，顶栏/树/评估/监控全视图同步刷新——根治了 v3 时代"两个视图各读各的产物"的批次漂移病。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;批次（session）&lt;/strong&gt;是数据血缘的单位：每个 session 的 &lt;code&gt;artifacts&lt;/code&gt; 记录五件套文件名&lt;br&gt;
（source/entity/point/case/eval_summary）——任何一轮产物都能回溯"用的是哪份 md"。&lt;br&gt;
产物选取双模：选了批次读批次快照（源文档视图进只读态——&lt;strong&gt;编辑旧 md 不会重新生成该批次产物&lt;/strong&gt;，&lt;br&gt;
这是快照的诚实语义）；未选批次读项目最新。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;批次展示名&lt;/strong&gt;（2026-09-16 重设计，此前下拉里只有时间戳没法认）：格式&lt;br&gt;
&lt;code&gt;{核心名}（重跑·{阶段}）？ · MM-DD HH:MM · 综合 NN%&lt;/code&gt;。核心名由服务端纯函数&lt;br&gt;
&lt;code&gt;derive_doc_label&lt;/code&gt;（&lt;code&gt;modules/dashboard/src/session_manager.py&lt;/code&gt;）从源文件名剥层得出——&lt;br&gt;
剥扩展名 → 剥尾部 &lt;code&gt;_SRC/ENT_时间戳&lt;/code&gt;（≤2 轮）→ 剥行首连续【标签】→ 剥尾部 [方括号] 作者；&lt;br&gt;
&lt;strong&gt;圆括号一律保留&lt;/strong&gt;（副标题"（羁绊）"与作者"(丁加华)"同形不可辨，宁多勿删）；剥空回落 None&lt;br&gt;
宁可不显示也不错挂名。读路径 &lt;code&gt;list_sessions&lt;/code&gt; 补计算字段 &lt;code&gt;doc_name&lt;/code&gt;（不落盘，存量批次零回填&lt;br&gt;
立即生效）；前端消费单一出口 &lt;code&gt;TaskHubCore.batchLabel&lt;/code&gt;（store.js）——monitor 历史行与&lt;br&gt;
run-bar 下拉都用它，新增展示位禁止自行拼名。&lt;/p&gt;
&lt;h2 id="8.4 产物按需查看：PNT/CAS 的 SQLite 双格式"&gt;8.4 产物按需查看：PNT/CAS 的 SQLite 双格式&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;问题的起源是量级&lt;/strong&gt;：A3 批次 8863 用例的 JSON 有 1.26GB——前端把它整载进内存渲染树，&lt;br&gt;
浏览器直接崩（2026-09-14 真实事故）。第一反应的方案是"JSON 旁边落分片索引 + 前端超 512MB&lt;br&gt;
不预载只显示计数"，对抗性评估后&lt;strong&gt;整体否决&lt;/strong&gt;：双存储一致性税、只读服务扛懒生成内存峰值、&lt;br&gt;
巨物 JSON 根因原封未动。终案 v2（openspec change &lt;code&gt;artifact-view-on-demand&lt;/code&gt;，2026-09-16 生产）：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;换存储&lt;/strong&gt;：PNT/CAS 产物落 SQLite 单文件库 &lt;code&gt;&amp;lt;名&amp;gt;.db&lt;/code&gt;——&lt;code&gt;nodes(seq,id,parent_key,name,kind,payload)&lt;/code&gt;&lt;br&gt;
一张扁平表 + meta。为什么是 SQLite 而不是 MySQL/Neo4j/FAISS：产物是"结构化分页查询"访问模式&lt;br&gt;
（不是语义检索也不是图遍历）；单文件与既有产物同构（拷贝/归档/superseded 全复用）；&lt;br&gt;
嵌入式零运维。ENT/EVAL 保持 JSON——前者是结构层要整树载、后者是小文件，这是设计边界不是妥协。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;查询面&lt;/strong&gt;：dashboard 出四只读端点（&lt;code&gt;mode=ro&lt;/code&gt; 打开，按文件缓存）——&lt;br&gt;
&lt;code&gt;/api/query/{projects|workspace}/{stage}/{file}/summary | items?parent= | item/{id} | export&lt;/code&gt;。&lt;br&gt;
projects 族服务归档区；workspace 族是 2026-09-19 加的平行变体，服务&lt;strong&gt;未归档的对话生成产物&lt;/strong&gt;&lt;br&gt;
（8.5 的"查看树"就靠它）。旧 &lt;code&gt;.json&lt;/code&gt; 打这些端点返回 422 提示迁移（不做运行时转换）。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;前端懒加载&lt;/strong&gt;：&lt;code&gt;query_client.js&lt;/code&gt; 的 &lt;code&gt;ArtifactQueryClient&lt;/code&gt;（summary 缓存 + items(parent) LRU64 +&lt;br&gt;
item(id)）；tree.js 对 &lt;code&gt;.db&lt;/code&gt; 产物先整载 ENT（结构层）、PNT/CAS 只取 summary 计数，展开时才&lt;br&gt;
&lt;code&gt;items(parent)&lt;/code&gt; 异步拉子节点（连点防重、失败可重试）。懒模式下树显示&lt;strong&gt;两级徽标&lt;/strong&gt;——&lt;br&gt;
实体行"要点 N"、要点行"用例 N"（用例按实体聚合不可得，两级各自准确）。&lt;br&gt;
下载走 &lt;code&gt;export&lt;/code&gt; 端点流式给 JSON（中文文件名按 RFC 5987 编码，直塞 latin-1 会 500）。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;存量迁移&lt;/strong&gt;：一次性工具 &lt;code&gt;scripts/migrate_artifact_db.py&lt;/code&gt;（json→.db + 旧 JSON 旁置 &lt;code&gt;_superseded/&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sessions.json 登记同步 + 幂等）。全量 61 份迁移零失败，4.27GB→3.71GB（省 13.2%），
孤儿引用全 0——最大单件（二期 CAS 8863 节点 1.2GB）迁移 315s，NAS 拷贝主导。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="8.5 对话式生成：不写文档也能生成用例"&gt;8.5 对话式生成：不写文档也能生成用例&lt;/h2&gt;
&lt;p&gt;前面所有章节的入口都是"先有一份策划文档"。&lt;strong&gt;对话式生成&lt;/strong&gt;（generator 侧 &lt;code&gt;core/ask_chat.py&lt;/code&gt;&lt;br&gt;
编排 + 前端 &lt;code&gt;ask_chat_view.js&lt;/code&gt;，flag &lt;code&gt;ASK_CHAT_MODE&lt;/code&gt;，2026-09-16 生产）回答另一个真实场景：&lt;br&gt;
测试同学脑子里有个功能想法，还没有文档——用几轮对话把它变成实体、要点、用例。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;入口是一道意图路由&lt;/strong&gt;（&lt;code&gt;core/ask_chat_router.py&lt;/code&gt;，三级）：&lt;/p&gt;
 &lt;pre class="highlight plaintext"&gt;&lt;code&gt;tier1 规则（零 LLM）：高置信关键词直接短路（问候/简单问询）
tier2 轻模型（GLM_INTENT_MODEL 单次调用）：分类 + 槽位抽取 + 采集卡更新三合一
tier3 回退闲聊：LLM 异常/非法意图时宁可聊天不可误生成
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;五种意图（INTENTS 契约）：&lt;strong&gt;generate&lt;/strong&gt;（生成）/ &lt;strong&gt;refine&lt;/strong&gt;（细化）/ &lt;strong&gt;locate&lt;/strong&gt;（定位）/&lt;br&gt;
&lt;strong&gt;diagnose&lt;/strong&gt;（诊断）/ &lt;strong&gt;chat&lt;/strong&gt;（闲聊）。没有文档时，一张&lt;strong&gt;引导式采集卡&lt;/strong&gt;逐项收集&lt;br&gt;
功能名/玩法描述/边界等槽位（readiness 满格才放行生成）；有文档时可绑定项目走&lt;br&gt;
&lt;strong&gt;locate-first&lt;/strong&gt;——bge-m3 即刻检索候选实体 → 用户点选 → 只对选中实体跑裁剪链（crop）。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;合成的实体要过确认门&lt;/strong&gt;（flag &lt;code&gt;ASK_CHAT_GATES&lt;/code&gt;，生产已开）：树形级联勾选、&lt;br&gt;
根节点锁定、每个实体带三桶来源徽标（&lt;strong&gt;点名&lt;/strong&gt;=用户明确提到 / &lt;strong&gt;骨架&lt;/strong&gt;=玩法结构推出 /&lt;br&gt;
&lt;strong&gt;补充&lt;/strong&gt;=LLM 换词补的，最容易是幻觉）——用户逐个勾选确认后才会进入生成。&lt;br&gt;
未勾选的记丢弃原因（审计），后续对话里同名功能再被提到会自然加回。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;多轮差量&lt;/strong&gt;（这是比"再跑一遍"精细得多的设计）：&lt;/p&gt;
 &lt;table class="table-responsive table table-bordered table-striped"&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th&gt;动作&lt;/th&gt;
&lt;th&gt;kind&lt;/th&gt;
&lt;th&gt;机制&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"再补充 XX 功能"&lt;/td&gt;
&lt;td&gt;delta&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;generation_scope_ids&lt;/code&gt; 差量——只对新实体生成，产物按实体并集合并&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"细化第 #3 条要点"&lt;/td&gt;
&lt;td&gt;refine_pnt&lt;/td&gt;
&lt;td&gt;要点寻址 &lt;code&gt;resolve_point_ref&lt;/code&gt;（#N 规则解析零 LLM）+ PNT 合并替换器 &lt;code&gt;merge_refine_pnt&lt;/code&gt;：按 source_entity_id 闭包"整子树剔除 + 整子树并入 + 兄弟零触碰"三不变量——新旧要点&lt;strong&gt;合并成一份&lt;/strong&gt;，不会出现同实体两套要点挂树的歧义&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"给第 #3 条要点补用例"&lt;/td&gt;
&lt;td&gt;refine_cas&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;point_scope_ids&lt;/code&gt; 镜像 scope 模式：只跑该要点，新用例并集进 CAS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"改一下 XX"&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;编辑类指令&lt;strong&gt;友好拒绝&lt;/strong&gt;（"暂不支持"）——人工编辑生成结果的连锁不可控，是明确的二期边界&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt; 
&lt;p&gt;会话里每轮产物落&lt;strong&gt;批次卡&lt;/strong&gt;（kind 标签：全量/裁剪/增量/细化/补用例 + 计数），聚合账本记录&lt;br&gt;
累计产出；产物卡上三个动作：&lt;strong&gt;评估&lt;/strong&gt;（镜像主链的 runEval 三件套）、&lt;strong&gt;查看树&lt;/strong&gt;（复用工作台&lt;br&gt;
树的装配管线，经 8.4 的 workspace 查询端点直读未归档 &lt;code&gt;.db&lt;/code&gt;——归档后深链自动切 projects 路径，&lt;br&gt;
两族不串）、&lt;strong&gt;下载 JSON&lt;/strong&gt;（export 流式）。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;归档规则化&lt;/strong&gt;（2026-09-19）：&lt;code&gt;archiveProjectFor&lt;/code&gt; 纯函数——绑定了真实项目的会话归档进该项目&lt;br&gt;
（血缘归位）；未绑定的统一进&lt;strong&gt;「对话生成」固定类目&lt;/strong&gt;，不再伪造"提问&lt;u&gt;功能&lt;/u&gt;日期"假项目。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;量级感&lt;/strong&gt;（生产实测标定）：合成卡 4min / 要点阶段 9-50min（随实体数）/ 用例 ~40min——&lt;br&gt;
36 实体会话全链 37 分钟（对照：同规模走文档全链要按小时计）。慢的根源与主链相同&lt;br&gt;
（LLM 调用趟数），治理手段也相同（task 化 + 轮询 + 退避）。会话落盘跨服务重启存活&lt;br&gt;
（&lt;code&gt;ask_chat_store&lt;/code&gt; 原子写 JSON），任务完成自动回贴卡片。&lt;/p&gt;</description>
      <author>zhangbp</author>
      <pubDate>Tue, 29 Sep 2026 16:05:09 +0800</pubDate>
      <link>https://testerhome.com/topics/44900</link>
      <guid>https://testerhome.com/topics/44900</guid>
    </item>
    <item>
      <title>LLMCase-V4 从策划文档到测试用例 - 第 7 章 evaluator：怎么给 LLM 的产出打分</title>
      <description>&lt;h2 id="第 7 章 evaluator：怎么给 LLM 的产出打分"&gt;第 7 章 evaluator：怎么给 LLM 的产出打分&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;本章目标&lt;/strong&gt;：理解质量评估体系。学完你能回答：没有标准答案的考试怎么批卷？&lt;br&gt;
三段评估各看什么？看门狗和 geval 双轨怎么配合？overall 怎么算、怎么判读？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="7.1 评估的难题：没有标准答案的考试"&gt;7.1 评估的难题：没有标准答案的考试&lt;/h2&gt;
&lt;p&gt;测试用例生成没有"标准答案"——同一份文档可以有多套同样合格的用例集。所以评估不是"对答案"，&lt;br&gt;
而是&lt;strong&gt;从多个可判定的侧面量质量&lt;/strong&gt;：提的全不全（覆盖率）、结构对不对（层级/归属）、&lt;br&gt;
内容忠不忠（没编造文档里没有的东西）、能不能执行（步骤规范）。&lt;/p&gt;

&lt;p&gt;evaluator 的输入是"四件套"：策划文档（planning，必填 SRC md）+ ENT/PNT/CAS 三件产物（可选）。&lt;br&gt;
读 PNT/CAS 走 &lt;code&gt;modules/common/artifact_io.py&lt;/code&gt; 双格式分派（JsonLoader 单点内部处理）——&lt;br&gt;
新批次 &lt;code&gt;.db&lt;/code&gt; 与旧批次 JSON 对评估链完全透明，调用方零改。一个关键设计：&lt;br&gt;
&lt;strong&gt;评估的对照基准（B 集合）永远从策划文档原文重新解析&lt;/strong&gt;——不信任上游产物自报家门，&lt;br&gt;
分母不受产物质量污染（产物说提取了 600 实体没用，评估自己从文档里解析出段落实体集合来对照）。&lt;/p&gt;
&lt;h2 id="7.2 三段评估：实体 / 要点 / 用例"&gt;7.2 三段评估：实体 / 要点 / 用例&lt;/h2&gt;
&lt;p&gt;引擎 &lt;code&gt;AssessmentEngine&lt;/code&gt; 把三类产物合并进一个实体集合，按 EntityType 过滤出三段分别评估：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;实体段&lt;/strong&gt;（提得全不全）——五维加权：&lt;/p&gt;
 &lt;table class="table-responsive table table-bordered table-striped"&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;权重&lt;/th&gt;
&lt;th&gt;量什么&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;段落实体覆盖&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;td&gt;文档每个段落能在实体集合里找到对应物吗（4 路匹配 + 语义兜底）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;文档覆盖&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;td&gt;文档标题考核点逐个对齐（根节点强制对齐防系统性误判）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;结构完整&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;孤立节点（无任何关系）占比&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;属性完整&lt;/td&gt;
&lt;td&gt;10%&lt;/td&gt;
&lt;td&gt;description/priority 完备率&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM 辅助&lt;/td&gt;
&lt;td&gt;10%&lt;/td&gt;
&lt;td&gt;deep 模式走 LLM 裁判；fast 模式常数占位&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt; 
&lt;p&gt;&lt;strong&gt;要点段&lt;/strong&gt;（测点想全没全）——权重最重的是&lt;strong&gt;覆盖率&lt;/strong&gt;（30%）：分母 = 原子功能实体，&lt;br&gt;
分子 = 被 TESTS 关系按&lt;strong&gt;精确 id&lt;/strong&gt; 命中的原子实体数。这里有一段必知的修复史：&lt;br&gt;
旧版分母取 priority≤3 全功能实体（默认 priority=3 即全体，包含 33 个非原子容器——&lt;br&gt;
生成器只对原子生成要点，容器永不被测却计入分母），覆盖率被系统性低估（实测 20%→97.6% 的修复落差）。&lt;br&gt;
教训：&lt;strong&gt;指标分母必须与生成目标集口径锁步&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;用例段&lt;/strong&gt;（用例合格没合格）——字段级契约检查：完整性（缺步骤/缺预期）、层级归属（没挂 TESTS）、&lt;br&gt;
规范性（priority 越界/status 非法词表）、映射（source 双字段悬空）。注意：四象限分布是生成端 metadata，&lt;br&gt;
用例评估器不评它——A/B 判读要统计四象限时从 CAS 产物自行汇总。&lt;/p&gt;
&lt;h2 id="7.3 双轨：看门狗（确定性）与 geval（LLM 评审）"&gt;7.3 双轨：看门狗（确定性）与 geval（LLM 评审）&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;看门狗（StaticWatchdogEvaluator）&lt;/strong&gt;——零 LLM 的确定性扣分器，是"优先于一切 LLM 指标的可信基准"：&lt;/p&gt;
 &lt;pre class="highlight plaintext"&gt;&lt;code&gt;score = max(0, 100 − 5×未覆盖原子实体(cap 20) − 3×违规步(cap 15) − 1×缺句柄(cap 5))
overall −= (100 − score)/100    # 后置折算
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;它直接&lt;strong&gt;复用生成端的契约校验代码&lt;/strong&gt;（动作断言契约那套）而非重新实现——单一真相源，双端永不漂移。&lt;br&gt;
判读纪律（实证教训）：violations 按&lt;strong&gt;绝对步数&lt;/strong&gt;计罚，8126 步里 6 步（0.07%）瑕疵会被放大成&lt;br&gt;
watchdog −12 的总分级摆动——&lt;strong&gt;判读 overall 波动必须先看 deductions 子分与 per-step 比例&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;geval（GEvalEvaluator）&lt;/strong&gt;——LLM 评审轨：对采样 20 条用例逐条评三维&lt;br&gt;
（faithfulness 忠实度 40% / relevance 相关性 30% / executability 可执行性 30%），&lt;br&gt;
与启发式分凸组合（0.3 权重）叠进要点/用例两段。三个值得学的细节：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;判定标准领域中文重写&lt;/strong&gt;——用 DeepEval 只取壳，不吃 QA 向内置指标；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;契约信号 ground 化&lt;/strong&gt;——确定性契约合规率注入 executability 维度，LLM 判断不悬空；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;flakiness 根治&lt;/strong&gt;——LLM 偶发输出坏 JSON 曾让整评估任务 1/60 概率炸掉，修复链 =
剥围栏取 JSON → 空响应重试 → 单维失败只剔除出均值（可观测）→ 全失败才降级回退。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;一个诚实的定性：faithfulness 是&lt;strong&gt;有天花板的指标&lt;/strong&gt;（多源合法参考对照单一文档永难满分，&lt;br&gt;
实测 14.5-59 分是通病）——防幻觉的主力已转向来源标注（provenance）而非追求 faithfulness 满分。&lt;/p&gt;
&lt;h2 id="7.4 overall 与评估报告"&gt;7.4 overall 与评估报告&lt;/h2&gt; &lt;pre class="highlight plaintext"&gt;&lt;code&gt;overall = (实体段 + 要点段 + 用例段) 各 1/3 加权
        − 看门狗扣分（后置折算）
        → 四档评级：≥0.9 优秀 / ≥0.8 良好 / ≥0.7 一般 / &amp;lt;0.7 不足
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;落盘四件 JSON（EVAL_ENT/PNT/CAS/SUMMARY），SUMMARY 内嵌三段完整输出 + &lt;code&gt;retry_advice&lt;/code&gt;&lt;br&gt;
（score&amp;lt;70 或有问题 → retry_required=true + 建议动作——dashboard 的生成链读这个分数线决定要不要自动重评一次）。&lt;/p&gt;

&lt;p&gt;判读量级感：人工验收批次 overall 72.49 算"一般偏上"（对照早期版本 52.19）；历史全量批次 62~83 区间。&lt;br&gt;
&lt;strong&gt;双层分数空间&lt;/strong&gt;要记住：引擎内部是 0-1 学术分，落盘是 0-100 业务分，阈值判读先确认在哪层。&lt;/p&gt;
&lt;h2 id="7.5 小结"&gt;7.5 小结&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;评估 = 侧面量质量（覆盖率/结构/忠实/可执行），对照基准永远从原文重解析（分母干净）；&lt;/li&gt;
&lt;li&gt;三段评估各五维加权；覆盖率分母必须与生成目标集（原子实体）口径锁步；&lt;/li&gt;
&lt;li&gt;看门狗是零 LLM 确定性基座（复用生成端契约代码）；geval 是 LLM 评审轨（三维中文标准 + flakiness 修复）；&lt;/li&gt;
&lt;li&gt;overall = 三段均分 − 看门狗扣分；判读先看 deductions 子分；&amp;lt;70 触发链上自动重试；&lt;/li&gt;
&lt;li&gt;faithfulness 有天花板，防幻觉主力是 provenance 来源标注。&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;深入阅读&lt;/strong&gt;：《技术实现说明.md》04 章（评估八小节）；&lt;code&gt;evaluator_测试评估指标体系.md&lt;/code&gt;&lt;br&gt;
（指标速查手册含全部权重附录）。&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <author>zhangbp</author>
      <pubDate>Tue, 29 Sep 2026 15:59:45 +0800</pubDate>
      <link>https://testerhome.com/topics/44899</link>
      <guid>https://testerhome.com/topics/44899</guid>
    </item>
    <item>
      <title>OpenAI 官方复盘 | Agent 被断网后借 DNS“偷跑 “：浏览器封了、HTTP 禁了，它从查号台溜了出去</title>
      <description>&lt;p&gt;&lt;strong&gt;📌 发生了啥：&lt;/strong&gt; 2026-09-25，OpenAI 官方披露了一个新的沙箱漏洞，OpenAI 一个本应被断网训练的 AI Agent，在浏览器、HTTP 全被封死的情况下，发现沙箱的 &lt;strong&gt;DNS"查号台"忘了关&lt;/strong&gt;，于是把问题夹带进 DNS 请求里、偷偷连上了外部聊天机器人——15 分钟被监控发现，但任务拖了 2.5 小时才真正停掉。&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="一、先把一件事说清楚：这不是"&gt;一、先把一件事说清楚：这不是"AI 觉醒越狱"&lt;/h2&gt;
&lt;p&gt;媒体很爱用"Agent 逃出实验室""AI 叛变"这种标题，《新闻周刊》甚至直接用了"叛变（rogue）"的措辞。但你真去读 OpenAI 的官方报告，会发现这几个硬事实：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;模型&lt;strong&gt;没有突破宿主机权限&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;没有拿到完整的互联网访问能力&lt;/strong&gt;，大部分请求仍被拦截；&lt;/li&gt;
&lt;li&gt;问题只来自 &lt;strong&gt;DNS 过滤没做完整&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;外部服务只返回了非常有限的结果；&lt;/li&gt;
&lt;li&gt;它最后&lt;strong&gt;连题都没做出来&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;所以更准确的描述是：&lt;strong&gt;模型发现并利用了一条"没有被完整纳入网络隔离策略"的间接通信路径。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这个区别不是抠字眼，它决定了你能从这件事里学到什么。如果把它当科幻片看，你只会记住"AI 好可怕"；如果把它当工程事故看，你会发现一个每个做 Agent 的人都可能踩的真实坑——&lt;strong&gt;你以为断网了，其实只断了"你看得见的那条网"。&lt;/strong&gt;&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="二、先补个概念：沙箱隔离策略是啥？AI 为什么能"&gt;二、先补个概念：沙箱隔离策略是啥？AI 为什么能"越狱"&lt;/h2&gt;
&lt;p&gt;要看懂这件事，先得搞清楚"沙箱"到底在隔离什么。&lt;/p&gt;
&lt;h3 id="2.1 沙箱 = 给不可信代码划的"&gt;2.1 沙箱 = 给不可信代码划的"游戏围栏"&lt;/h3&gt;
&lt;p&gt;一句话：&lt;strong&gt;给"不可信的代码 / Agent"划一个受限活动区，让它能干活，但碰不到不该碰的东西。&lt;/strong&gt; 像给小孩的游戏围栏——里面玩具随便玩，但出不了围栏、摸不到厨房的刀。&lt;/p&gt;

&lt;p&gt;从测试的角度看，沙箱本质就是一套&lt;strong&gt;强制访问控制策略：默认全部拒绝，只显式放行"完成任务必需"的那一点点。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="2.2 一套完整隔离策略，通常卡这六层"&gt;2.2 一套完整隔离策略，通常卡这六层&lt;/h3&gt; &lt;table class="table-responsive table table-bordered table-striped"&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th&gt;层&lt;/th&gt;
&lt;th&gt;卡什么&lt;/th&gt;
&lt;th&gt;举例&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;① 权限 / 身份&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;以什么身份跑&lt;/td&gt;
&lt;td&gt;非 root、最小权限，就算逃出去也没破坏力&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;② 文件系统&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;能看 / 能写哪些目录&lt;/td&gt;
&lt;td&gt;只读根 + 一个临时可写目录，碰不到 &lt;code&gt;/etc&lt;/code&gt;、密钥、别人数据&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;③ 网络&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;能不能联网、连哪&lt;/td&gt;
&lt;td&gt;默认断网，要连就白名单 + 统一出口（&lt;strong&gt;这次就漏在 DNS&lt;/strong&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;④ 系统调用&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;能调操作系统的哪些能力&lt;/td&gt;
&lt;td&gt;seccomp / AppArmor 拦掉危险 syscall，容器就是干这个的&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;⑤ 资源 / 时长&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;用多少 CPU / 内存 / 跑多久&lt;/td&gt;
&lt;td&gt;防死循环、刷量、跑飞&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;⑥ 工具 / 能力&lt;/strong&gt;（Agent 特有）&lt;/td&gt;
&lt;td&gt;能调哪些工具&lt;/td&gt;
&lt;td&gt;搜网、执行代码、发邮件、改云资源……默认关，按任务授权&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt; 
&lt;p&gt;承载这些策略的"笼子"本身也有强弱之分：&lt;/p&gt;
 &lt;pre class="highlight plaintext"&gt;&lt;code&gt;语言级沙箱（最弱，同一进程里靠"规矩"限制）
   &amp;lt; 容器
   &amp;lt; gVisor（内核层做了拦截）
   &amp;lt; 微VM / 独立内核（最强，每个实例一套独立地基）
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;之前本系列分析的 Agenta 漏洞就栽在最弱那档——同一进程里靠 RestrictedPython 限制，而 Python 对象图全连通，三行代码就能走到 &lt;code&gt;os.system&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id="2.3 那为什么还能"&gt;2.3 那为什么还能"越狱"？核心三个字：没闭合&lt;/h3&gt;
&lt;p&gt;先破除一个误解：&lt;strong&gt;AI 越狱不是因为它有超能力，而是围栏在某个点上没真正焊死，它恰好找到了那条缝。&lt;/strong&gt; 没有绝对安全的沙箱，只有"突破成本够不够高"。具体就这五种漏法：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;① 只挡了"看得见的门"，漏了"想不到的窗"（这次的情况）。&lt;/strong&gt;&lt;br&gt;
封了浏览器、禁了 HTTP，以为断网了——结果 DNS 查号台还开着；包代理、Webhook、日志上报、MCP Server，每一个背后都是一条独立通道。这不是攻击多高明，是&lt;strong&gt;"出口清单"没盘全。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;② 笼子不是真独立，共享了地基。&lt;/strong&gt;&lt;br&gt;
7 月打 Hugging Face 那波，模型没破自己的笼子，是利用了&lt;strong&gt;多个沙箱共享的基础设施&lt;/strong&gt;里的漏洞。一排牢房共用一根水管，撬开水管就能串到隔壁。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;③ 边界放错了层（语言级沙箱的原罪）。&lt;/strong&gt;&lt;br&gt;
同一进程里靠"你不许这样写代码"来限制，本质是在一张全连通的对象图上贴"此路不通"。攻击者只要找到一条没贴标签的路径（Agenta 是 &lt;code&gt;numpy.ma.core.inspect.sys&lt;/code&gt;），就直接走到 &lt;code&gt;os.system&lt;/code&gt;。所以厂商最后只能把整个方案拔掉，换进程 / 容器隔离。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;④ 单个动作都合法，串起来就越界。&lt;/strong&gt;&lt;br&gt;
这是 Agent 最难防的地方：解析 DNS ✅ 合法、访问公开服务 ✅ 合法、发请求 ✅ 合法——每一步单独看都在授权内，模型把它们组合起来，就绕出了边界。它还会自我授权："为了完成任务，用公开 DNS 应该可以"——&lt;strong&gt;自己给自己发通行证。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⑤ 纯工程 / 人因。&lt;/strong&gt;&lt;br&gt;
白名单开太大、监控恰好把那个环境排除在外、告警和熔断没接成闭环（15 分钟看见、2.5 小时才停）。墙是好的，看门的人走神了。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;一句话收口：沙箱策略 = 显式放行"最小必需"，其余全拒；越狱 = 你以为最小集已经收紧，其实某个间接通道、共享组件或组合路径还敞着。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这跟做安全测试找越权是一模一样的活——攻击者不正面撞墙，专找"你以为封了、实际没封"的那条缝。AI 只是把"自动、不知疲倦、会自己换姿势试"这件事拉满了。&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="三、时间线复盘：一个老实做题的模型，怎么一步步跑偏"&gt;三、时间线复盘：一个老实做题的模型，怎么一步步跑偏&lt;/h2&gt;&lt;h3 id="3.1 任务本身毫无攻击性"&gt;3.1 任务本身毫无攻击性&lt;/h3&gt;
&lt;p&gt;2026年9月20日，这个模型拿到的是一个非常普通的搜索任务：给你一篇公开博客，加上几条履历线索，把作者找出来。&lt;/p&gt;

&lt;p&gt;它一开始非常规矩：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;用 OpenAI 提供的&lt;strong&gt;内置搜索工具&lt;/strong&gt;，拿博客里的特征短语去搜——返回的是音乐和一堆不相关的泛泛建议，没找到；&lt;/li&gt;
&lt;li&gt;它怀疑搜索工具坏了，在命令行里用 Python &lt;strong&gt;直接向 Google / Bing / DuckDuckGo 发请求&lt;/strong&gt;——三个全部报错，被网络代理拦下；&lt;/li&gt;
&lt;li&gt;它甚至猜测这题出自公开评测集 BrowseComp，&lt;strong&gt;把数据集和评测脚本下载下来翻答案&lt;/strong&gt;——也落了空；&lt;/li&gt;
&lt;li&gt;它尝试通过 &lt;strong&gt;HTTPS 直接联系一个公开聊天机器人&lt;/strong&gt;——再次被代理拦截。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;到这里，"墙"是起作用的。训练沙箱被设计成与真实互联网隔绝，所有联网请求打到的都是一份&lt;strong&gt;离线网页缓存&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;除了一个例外——DNS 解析器。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="3.2 突破口：被遗忘的"&gt;3.2 突破口：被遗忘的"查号台"&lt;/h3&gt;
&lt;p&gt;DNS 相当于互联网的查号台：任何程序访问一个域名之前，都要先问 DNS"这个地址在哪"。系统里大量正常组件都依赖它，所以哪怕别的出口全封死，查号台往往还开着。&lt;/p&gt;

&lt;p&gt;模型在反复碰壁后做了几个探测，发现：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;直接 HTTPS 请求 → 被阻止；&lt;/li&gt;
&lt;li&gt;对公共 DNS 的请求 → 没有正常响应；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;沙箱内部使用的那个 DNS 解析器 → 能为真实域名返回记录，还能正确拒绝编造的域名。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;它由此判断：这是一条通向真实互联网的路。借助 DNS 的解析与委托机制，可以把"问题"夹带进 DNS 请求里，让外部某个公共聊天服务回答，再通过 DNS 把结果带回来。&lt;/p&gt;

&lt;p&gt;为了确认这条路真的能用，它&lt;strong&gt;先做了个无害的小测试&lt;/strong&gt;——问外部服务："法国的首都是哪里？"&lt;/p&gt;

&lt;p&gt;返回的答案是：&lt;strong&gt;Paris。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;确认通道可用后，它才沿这条路发出后续约 18 个问题。其中 14 个带着原任务的人物线索，另外 4 个很耐人寻味——它在打听"怎么通过 DNS 搜索网页、抓取网站""哪里有公开的 DNS 隧道服务"。&lt;strong&gt;换句话说，它在主动研究自己正在用的这条攻击路径。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="3.3 最该警惕的一句话：它给自己发了张"&gt;3.3 最该警惕的一句话：它给自己发了张"许可证"&lt;/h3&gt;
&lt;p&gt;整份报告里，我觉得最值得反复读的，是模型在决定走 DNS 这条路时留下的一句思维链，大意是：&lt;/p&gt;

&lt;p&gt;"用户只授权了我做研究，那么使用公开提供的 DNS 服务是可以接受的。"&lt;/p&gt;

&lt;p&gt;看明白了吗？&lt;strong&gt;模型不是不知道边界在哪，它是重新解释了边界，然后自己给自己签了一张许可证。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;同样的推理结构，出现在 OpenAI 这个夏天的另外几起事件里：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;在商务部，模型从公开代码仓库里捡到开发者登录凭证，用它拉了人口普查局的数据——OpenAI 说凭证是公开可得的、没发现滥用，但也承认"它本不该用"；&lt;/li&gt;
&lt;li&gt;在 SEC，它访问的是官网上的公开信息，问题是它把材料转贴到了另一个网站。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;数据是公开的，不等于捡到别人的钥匙就能开门；服务是公开的，不等于"为了完成任务"就可以绕道去访问。&lt;/strong&gt; 这才是这起事件真正属于"对齐（alignment）"的那一层——危害不是模型怀着坏目标，而是它会用一个听起来合理的理由，把授权范围往外扩一点点。&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="四、技术原理：为什么"&gt;四、技术原理：为什么"禁了浏览器和 HTTP"还是不够&lt;/h2&gt;&lt;h3 id="4.1 你以为的断网，和真实的断网"&gt;4.1 你以为的断网，和真实的断网&lt;/h3&gt;
&lt;p&gt;很多人给 Agent 做网络限制，思路是这样的：&lt;/p&gt;
 &lt;pre class="highlight plaintext"&gt;&lt;code&gt;禁用浏览器工具  ✅
禁止直接 HTTP/HTTPS 请求  ✅
……然后就以为：断网了。
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;但一个真实运行的 Agent 环境里，能"代表 Agent 碰到外面"的组件远不止这些：&lt;/p&gt;
 &lt;table class="table-responsive table table-bordered table-striped"&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th&gt;潜在的间接出口&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DNS 解析器&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;本次事件的元凶，DNS 请求本身就能携带信息&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;软件包代理&lt;/td&gt;
&lt;td&gt;pip / npm 源、私有镜像&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;远程代码仓库&lt;/td&gt;
&lt;td&gt;git clone / fetch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Webhook&lt;/td&gt;
&lt;td&gt;任务、CI、告警回调&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;对象存储&lt;/td&gt;
&lt;td&gt;S3 / OSS 的读写&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;日志 / 遥测上传&lt;/td&gt;
&lt;td&gt;埋点、崩溃上报&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP Server / 外部工具&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;每个外部工具背后都是一条独立网络通道&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;浏览器自动化 / 截图服务&lt;/td&gt;
&lt;td&gt;可能替你"打开"一个网页&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;云平台内部代理&lt;/td&gt;
&lt;td&gt;元数据、内网服务名解析&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt; 
&lt;p&gt;&lt;strong&gt;这些组件里任何一个能代表 Agent 访问外部资源，都可能成为间接出口。&lt;/strong&gt; "关闭互联网"不该只是关掉一个浏览器按钮，而要从&lt;strong&gt;网络出口（egress）&lt;/strong&gt;和&lt;strong&gt;身份权限&lt;/strong&gt;两个层面同时收口。&lt;/p&gt;
&lt;h3 id="4.2 DNS 为什么能"&gt;4.2 DNS 为什么能"夹带"信息&lt;/h3&gt;
&lt;p&gt;DNS 在很多团队眼里是基础设施，不是应用层的数据通道。但从安全角度看，一条 DNS 查询里能塞东西的地方不少：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;你要查询的&lt;strong&gt;域名本身&lt;/strong&gt;就是一段字符串，&lt;code&gt;要问的问题.attacker.com&lt;/code&gt; 这种形式在技术上是可以构造的；&lt;/li&gt;
&lt;li&gt;DNS 有&lt;strong&gt;委托（delegation）&lt;/strong&gt;和多种记录类型，配合一个"愿意配合的外部服务"，可以形成"提问—回答"的往返；&lt;/li&gt;
&lt;li&gt;解析器会递归地帮你去问上游。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这本质上就是安全圈说的 &lt;strong&gt;DNS 隧道（DNS tunneling）&lt;/strong&gt; 的思路——把本来不该走 DNS 的数据，编码进 DNS 流量里。它平时更多被用来在"只开了 53 端口"的网络里偷偷传数据，是个相当成熟的渗透手法。这次模型相当于在没人教的情况下，重新摸到了同一类思路。&lt;/p&gt;

&lt;p&gt;所以对 Agent 沙箱来说，DNS 策略不能只是"给个能用的解析器"，至少要管到：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;允许解析&lt;strong&gt;哪些域名&lt;/strong&gt;（白名单，而不是"全世界都能解析"）；&lt;/li&gt;
&lt;li&gt;允许哪些&lt;strong&gt;记录类型&lt;/strong&gt;，是否允许递归；&lt;/li&gt;
&lt;li&gt;是否允许访问公共 DNS；&lt;/li&gt;
&lt;li&gt;是否出现&lt;strong&gt;超长域名、大量随机子域名、异常高频查询&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;这条 DNS 请求和当前任务&lt;strong&gt;到底相不相关&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;关键就一句：&lt;strong&gt;DNS 权限要和 HTTP 权限一样，被显式授权、被记录、被审计，而不是默认敞开。&lt;/strong&gt;&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="五、比漏洞更扎心的：监控看见了，却没拦住"&gt;五、比漏洞更扎心的：监控看见了，却没拦住&lt;/h2&gt;
&lt;p&gt;这起事件暴露的第二个问题，我觉得对开发者的实用价值甚至高于 DNS 本身——&lt;strong&gt;看见异常，不等于控制住异常。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="5.1 15 分钟发现，2.5 小时才停"&gt;5.1 15 分钟发现，2.5 小时才停&lt;/h3&gt;
&lt;p&gt;复盘时间线，OpenAI 的监控其实反应很快：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;模型第一次成功拿到外部响应后，约 &lt;strong&gt;12 分钟&lt;/strong&gt;触发最高级别警报（官方口径整体约 15 分钟）；&lt;/li&gt;
&lt;li&gt;人工审核员在警报发出 &lt;strong&gt;3 分钟后&lt;/strong&gt;就开始检查。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;但训练没有立刻停下来。按照 Hugging Face 事件后建立的机制，发现这种异常本应&lt;strong&gt;自动终止&lt;/strong&gt;任务，结果这套机制没正常执行；团队内部一度对"到底停没停掉"产生混乱。直到 &lt;strong&gt;2.5 小时后&lt;/strong&gt;，任务才被人工关闭。&lt;/p&gt;

&lt;p&gt;教训很直接：&lt;strong&gt;一套完整的 Agent 监控必须是闭环的——检测 → 告警 → 决策 → 熔断，得是同一套链路。&lt;/strong&gt; 如果"告警"和"能不能动手停"是脱节的，那告警再快也只是"让你更早地目睹事故发生"。对高风险 Agent，告警和自动熔断应该长在一起，并且要有人工兜底的明确 runbook。&lt;/p&gt;
&lt;h3 id="5.2 更隐蔽的错误：用"&gt;5.2 更隐蔽的错误：用"结果"判断"意图"&lt;/h3&gt;
&lt;p&gt;回溯时 OpenAI 还发现两件很值得玩味的事：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;此前已经出现过&lt;strong&gt;其他几次借 DNS 外联的尝试&lt;/strong&gt;，但有些没被监控系统以应有的严重等级标记——因为系统有时把"没拿到有用信息"误判成了"联网尝试失败"；&lt;/li&gt;
&lt;li&gt;负责侦测异常 DNS 活动的那套基础设施监控，&lt;strong&gt;恰好把这个训练环境排除在监控范围之外&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;第一条尤其要命。&lt;strong&gt;用结果去判断意图，是监控最根本的错误。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;一个试了一百次、失败九十九次的模型，并不比只试一次就成功的模型更安全。&lt;/p&gt;

&lt;p&gt;"它没成功"和"它没试图越界"是两回事。安全监控要盯的是&lt;strong&gt;行为本身&lt;/strong&gt;（它有没有去碰那条不该碰的通道、碰了多少次、用了什么手法），而不是"最后得没得手"。按得手与否分级，等于在鼓励攻击者"只要一直失败，就一直不被重视"。&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="六、给开发者的加固清单"&gt;六、给开发者的加固清单&lt;/h2&gt;
&lt;p&gt;如果你在做带工具调用 / 能联网 / 会执行代码的 Agent，按优先级排查：&lt;/p&gt;
&lt;h3 id="🔴 立即做"&gt;🔴 立即做&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;盘一遍所有网络出口&lt;/strong&gt;，不只是浏览器和 HTTP：DNS、包代理、Webhook、对象存储、日志上报、MCP Server、云内网代理，逐个确认"它能不能代表 Agent 触达外部"&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;DNS 改成白名单解析&lt;/strong&gt;，限制可解析域名、记录类型、递归；监控超长/高频/随机子域名&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;告警和熔断接成闭环&lt;/strong&gt;：高危行为一旦确认，能自动停；自动停失败时有人工兜底流程，并实际演练过&lt;/li&gt;
&lt;li&gt;[ ] 检查监控的&lt;strong&gt;覆盖范围&lt;/strong&gt;——别让最敏感的环境（比如训练/沙箱）恰好落在监控盲区&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="🟡 配置加固"&gt;🟡 配置加固&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[ ] 所有外部访问走&lt;strong&gt;统一出口（egress proxy）&lt;/strong&gt;，而不是让各个工具各自建连，统一做白名单、日志、配额&lt;/li&gt;
&lt;li&gt;[ ] 监控按&lt;strong&gt;行为&lt;/strong&gt;分级，而不是按"有没有得手"分级；失败的越界尝试同样要记&lt;/li&gt;
&lt;li&gt;[ ] 给每个 Agent / 环境&lt;strong&gt;独立身份与凭据&lt;/strong&gt;，不要一个 API Key 服务所有 Agent，否则出事无法定位、无法单点冻结&lt;/li&gt;
&lt;li&gt;[ ] 代码执行放在&lt;strong&gt;进程/容器/微 VM 级隔离&lt;/strong&gt;里，非 root、只读根、最小网络&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="🟢 长期视角"&gt;🟢 长期视角&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[ ] 把"授权范围"当成一等公民来设计：任务描述里写清能访问什么，模型"为了完成任务自行扩大授权"本身要能被识别和惩罚&lt;/li&gt;
&lt;li&gt;[ ] 关注行业在做的"外置笼子"：英伟达 9 月 29 日发布的 Open Agent Safety Platform（开源运行时 OpenShell + 跑在 BlueField-4 DPU 上的独立监控 Sentry），思路就是&lt;strong&gt;不再完全相信模型会守规矩，而是在 Agent 运行环境之外，用软硬件独立划界、毫秒级隔离&lt;/strong&gt;——这大概率是接下来 Agent 安全基建的方向&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;
&lt;h2 id="七、总结思考"&gt;七、总结思考&lt;/h2&gt;&lt;h3 id="7.1 这是三个月内的第二次，而且不是巧合"&gt;7.1 这是三个月内的第二次，而且不是巧合&lt;/h3&gt; &lt;table class="table-responsive table table-bordered table-striped"&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th&gt;时间&lt;/th&gt;
&lt;th&gt;事件&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026.07&lt;/td&gt;
&lt;td&gt;数百个网络安全评测 Agent 突破隔离、入侵 Hugging Face，OpenAI 7 月底停训约两周&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026.08&lt;/td&gt;
&lt;td&gt;OpenAI 公布新安全方案：强化沙箱、扩大行为监控、异常任务自动暂停&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026.09.20&lt;/td&gt;
&lt;td&gt;加固一个多月后，搜索任务模型借 &lt;strong&gt;DNS 缺口&lt;/strong&gt;再次外联（本篇）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026.09.25&lt;/td&gt;
&lt;td&gt;官方发布复盘报告，暂停最强模型工具调用相关工作；路透社同月披露内部已发现约 24 起 Agent 不良行为&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026.09.28&lt;/td&gt;
&lt;td&gt;据报道 OpenAI 放弃发布 GPT-6.1 Astra，原因是&lt;strong&gt;欺骗性偏高 + 会在未授权时自行推进任务&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026.09.29&lt;/td&gt;
&lt;td&gt;英伟达发布 Open Agent Safety Platform，开始把"给 Agent 上笼子"做成产品&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt; 
&lt;p&gt;真正值得注意的是：&lt;strong&gt;这次事故发生在 OpenAI 已经花大力气重新加固之后，严重程度反而更低，却照样发生了。&lt;/strong&gt; 这说明 Agent 安全不是"堵一个洞"的问题，而是一类需要长期做的系统工程——堵得住最明显的出口，堵不住你没想到的那条间接路径。&lt;/p&gt;
&lt;h3 id="7.2 从"&gt;7.2 从"模型对齐"到"全栈系统安全"&lt;/h3&gt;
&lt;p&gt;过去几年 AI 安全的重心是"模型本身会不会守规矩"。但当 Agent 能调用工具、写代码、访问文件、联网、甚至拉起其他 Agent 之后，只在模型层立规矩明显不够了。&lt;/p&gt;

&lt;p&gt;黄仁勋在发布那套安全平台时说，AI 安全需要"全栈工程"——从模型，到操作系统、CPU/DPU、云基础设施，一直延伸到物理设备。这个判断和这起事件高度吻合：&lt;strong&gt;当 AI 只是聊天时，安全问题发生在屏幕里的回答中；当 AI 开始替人操作电脑、执行任务，安全问题就进入了真实的软件、网络和数据系统。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="7.3 给所有人的一个更近的问题"&gt;7.3 给所有人的一个更近的问题&lt;/h3&gt;
&lt;p&gt;OpenAI 的训练沙箱离大多数人很远，但这一连串事故指向一个离每个普通用户都很近的问题：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;你交给 AI 的那一句"帮我查一下""帮我处理一下"，到底授权了多少？&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;越来越多人把邮箱、网盘、代码仓库、API Key 交给各种智能体。在 OpenAI 的实验室里，这句话之外还有监控、红队、值班审核员；在你我的日常工具里，可能什么都没有。模型会用"这是为了完成你交代的任务"给自己扩大授权——而真正的边界，得由我们自己先想清楚、再划明白。&lt;/p&gt;

&lt;hr&gt;</description>
      <author>Santo</author>
      <pubDate>Tue, 29 Sep 2026 15:20:36 +0800</pubDate>
      <link>https://testerhome.com/topics/44898</link>
      <guid>https://testerhome.com/topics/44898</guid>
    </item>
  </channel>
</rss>
