<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>沙箱 on CloudLake</title><link>https://cloudlake.eu.org/tags/%E6%B2%99%E7%AE%B1/</link><description>Recent content in 沙箱 on CloudLake</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Tue, 20 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://cloudlake.eu.org/tags/%E6%B2%99%E7%AE%B1/index.xml" rel="self" type="application/rss+xml"/><item><title>让 AI 给自己写决策函数</title><link>https://cloudlake.eu.org/p/ai-evolution/</link><pubDate>Tue, 20 Oct 2026 00:00:00 +0000</pubDate><guid>https://cloudlake.eu.org/p/ai-evolution/</guid><description>&lt;img src="https://cloudlake.eu.org/p/ai-evolution/cover.jpg" alt="Featured image of post 让 AI 给自己写决策函数" /&gt;&lt;p&gt;表面上看，这是个网页小游戏。&lt;/p&gt;&#10;&lt;p&gt;一个机器人在地图上走，收集正分地块，躲开负分地块，在限定步数内拿最高分。&lt;/p&gt;&#10;&lt;p&gt;但真正被测试的不是机器人。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;是 AI 会不会给自己写一个能赢的函数。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="第一轮ai-亲自玩"&gt;&lt;a href="#%e7%ac%ac%e4%b8%80%e8%bd%aeai-%e4%ba%b2%e8%87%aa%e7%8e%a9" class="header-anchor"&gt;&lt;/a&gt;第一轮：AI 亲自玩&#10;&lt;/h2&gt;&lt;p&gt;Round 1，机器人每一步都由 API 驱动：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;观察 → 调 DeepSeek → 返回「思考 + 行动」→ 移动 → 下一步&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;每步的响应是两行：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;思考: 右下角有正分格，但中间隔着墙，先向右绕&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;行动: RIGHT&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;「思考」显示在日志面板里，「行动」驱动移动。&lt;/p&gt;&#10;&lt;p&gt;这一轮很慢，也很贵——&lt;strong&gt;每一步都是一次 API 调用&lt;/strong&gt;。一局 60 步，就是 60 次请求。&lt;/p&gt;&#10;&lt;p&gt;但它产出了一样极有价值的东西：&lt;strong&gt;一份完整的决策日志。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="反思把日志变成代码"&gt;&lt;a href="#%e5%8f%8d%e6%80%9d%e6%8a%8a%e6%97%a5%e5%bf%97%e5%8f%98%e6%88%90%e4%bb%a3%e7%a0%81" class="header-anchor"&gt;&lt;/a&gt;反思：把日志变成代码&#10;&lt;/h2&gt;&lt;p&gt;一局结束后，我把整局记录发回给 AI：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;每一步它看到了什么&lt;/li&gt;&#10;&lt;li&gt;每一步它决定了什么&lt;/li&gt;&#10;&lt;li&gt;最终的得分与路径&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;然后要求它：&lt;strong&gt;不要再一步一步决定。写一个函数，让函数来替你做决定。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;产出长这样：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;decide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;observation&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;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// observation: 周围 8 格（NW/N/NE/W/E/SW/S/SE）&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// state: 已走步数、剩余步数、已收集分数&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// config: 网格配置&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// memory: 跨轮记忆&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;moves&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;UP&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;DOWN&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;LEFT&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;RIGHT&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 优先走向正分且未收集的格子&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;moves&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;observation&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cell&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;collected&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 没有正分就随机&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;moves&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;这就是 &lt;strong&gt;v1&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="关键转折成本从-o步数-变成-o1"&gt;&lt;a href="#%e5%85%b3%e9%94%ae%e8%bd%ac%e6%8a%98%e6%88%90%e6%9c%ac%e4%bb%8e-o%e6%ad%a5%e6%95%b0-%e5%8f%98%e6%88%90-o1" class="header-anchor"&gt;&lt;/a&gt;关键转折：成本从 O(步数) 变成 O(1)&#10;&lt;/h2&gt;&lt;p&gt;&lt;img alt="AI 决策函数进化循环" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="evolution-loop.jpg"&gt;&lt;/p&gt;&#10;&lt;p&gt;对比一下两种驱动方式：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;API 模式&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;函数模式&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;驱动&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;每步一次 API 调用&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;本地执行一个函数&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;成本&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;O(步数)&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;O(1)&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;速度&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;每秒 1~2 步（受网络限制）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;每秒上万步&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;可复现&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;依赖模型版本&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;完全确定&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;strong&gt;同一个 AI，在第二轮里变成了一个 100 行的函数。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;然后这个函数可以跑几千局——不需要再花任何 API 费用。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="进化让函数一代代变强"&gt;&lt;a href="#%e8%bf%9b%e5%8c%96%e8%ae%a9%e5%87%bd%e6%95%b0%e4%b8%80%e4%bb%a3%e4%bb%a3%e5%8f%98%e5%bc%ba" class="header-anchor"&gt;&lt;/a&gt;进化：让函数一代代变强&#10;&lt;/h2&gt;&lt;p&gt;第二轮结束后，把「函数表现」和「上一轮表现」一起发回给 AI，让它改进。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Round 1 API 亲自玩 → 收集日志&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;反思 日志 → v1 函数&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Round 2 v1 函数跑 → 记录得分&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;反思 对比 → v2 函数&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Round 3 v2 函数跑 → 记录得分&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;……&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;最终 最优函数 + 完整进化轨迹&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;默认 5 轮。每一轮的函数版本都存进 localStorage，可以：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;查看任意版本的代码&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;手动编辑&lt;/strong&gt;再测&lt;/li&gt;&#10;&lt;li&gt;导出/导入&lt;/li&gt;&#10;&lt;li&gt;对比各代得分&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="一个反直觉的地方"&gt;&lt;a href="#%e4%b8%80%e4%b8%aa%e5%8f%8d%e7%9b%b4%e8%a7%89%e7%9a%84%e5%9c%b0%e6%96%b9" class="header-anchor"&gt;&lt;/a&gt;一个反直觉的地方&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;函数变得更长，不一定变得更强。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;我观察到的情况是：前两代函数通常一路膨胀（加启发式、加规则、加特判），但从第三代开始往往会&lt;strong&gt;缩短&lt;/strong&gt;——AI 会主动删掉那些在实测里没帮助的分支。&lt;/p&gt;&#10;&lt;p&gt;这其实很像人类写代码的过程：先什么都想加，再靠数据砍掉。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="沙箱ai-写的代码不能直接信任"&gt;&lt;a href="#%e6%b2%99%e7%ae%b1ai-%e5%86%99%e7%9a%84%e4%bb%a3%e7%a0%81%e4%b8%8d%e8%83%bd%e7%9b%b4%e6%8e%a5%e4%bf%a1%e4%bb%bb" class="header-anchor"&gt;&lt;/a&gt;沙箱：AI 写的代码不能直接信任&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;decide&lt;/code&gt; 是 AI 生成的任意 JavaScript。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;直接 &lt;code&gt;eval&lt;/code&gt; 等于把浏览器交出去。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;所以：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;代码在 &lt;strong&gt;Web Worker&lt;/strong&gt; 里执行，拿不到 DOM 和网络&lt;/li&gt;&#10;&lt;li&gt;执行前做语法校验（&lt;code&gt;new Function&lt;/code&gt; 能构造出来才算合法）&lt;/li&gt;&#10;&lt;li&gt;必须有名为 &lt;code&gt;decide&lt;/code&gt; 的函数，否则拒绝装载&lt;/li&gt;&#10;&lt;li&gt;抛异常就捕获、记录、&lt;strong&gt;不回退到默认策略&lt;/strong&gt;（否则你永远不知道它坏了）&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;runDecide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;observation&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;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fn&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;Function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;observation&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;state&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;config&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;memory&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sb"&gt;`&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sb"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sb"&gt; return decide(observation, state, config, memory);&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sb"&gt; `&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;observation&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;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;一个 AI 写的函数，要么在受限环境里跑，要么别跑。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="顺带测的第二件事长上下文记忆"&gt;&lt;a href="#%e9%a1%ba%e5%b8%a6%e6%b5%8b%e7%9a%84%e7%ac%ac%e4%ba%8c%e4%bb%b6%e4%ba%8b%e9%95%bf%e4%b8%8a%e4%b8%8b%e6%96%87%e8%ae%b0%e5%bf%86" class="header-anchor"&gt;&lt;/a&gt;顺带测的第二件事：长上下文记忆&#10;&lt;/h2&gt;&lt;p&gt;这个游戏还测了另一条线——&lt;strong&gt;AI 在不同信息密度下的决策质量&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;历史信息可以切换成两种模式：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;模式&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;每步传给 API 的内容&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;上下文大小&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;完整历史&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;每步观察 + 决策 + 完整路径&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;线性增长&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;压缩摘要&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;已收集分数列表 + 已访问坐标集合&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;基本恒定&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;这就是一个很干净的对照实验：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;同一个模型，给它线性增长的上下文，和给它固定大小的摘要，决策质量会不会下降？&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;而且这个问题在当前特别实际——所有做长上下文应用的人都要面对。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="网格本身也是变量"&gt;&lt;a href="#%e7%bd%91%e6%a0%bc%e6%9c%ac%e8%ba%ab%e4%b9%9f%e6%98%af%e5%8f%98%e9%87%8f" class="header-anchor"&gt;&lt;/a&gt;网格本身也是变量&#10;&lt;/h2&gt;&lt;p&gt;为了不让实验退化成「一张随机图上的运气」，网格可以精细配置：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;分数分布&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;均匀分布 / 正态分布（可调均值、标准差）&lt;/li&gt;&#10;&lt;li&gt;正分格占比（默认 60%）&lt;/li&gt;&#10;&lt;li&gt;数值取整，正态钳制到 &lt;code&gt;[min, max]&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;墙壁结构&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;corridor&lt;/code&gt; — 曲折走廊，终点高奖励&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;room&lt;/code&gt; — 封闭房间，1~2 个入口，内部高奖励&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;maze&lt;/code&gt; — 递归分割小迷宫，死胡同里藏高奖励&lt;/li&gt;&#10;&lt;li&gt;随机递归分割（可设递归深度）&lt;/li&gt;&#10;&lt;li&gt;结构深处的格子奖励 &lt;strong&gt;2x~3x&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;同一份决策函数，在开放地图上可能很聪明，在迷宫里可能直接走进死胡同。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;所以只测一种地图是不够的。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="一个必须处理的边界情况"&gt;&lt;a href="#%e4%b8%80%e4%b8%aa%e5%bf%85%e9%a1%bb%e5%a4%84%e7%90%86%e7%9a%84%e8%be%b9%e7%95%8c%e6%83%85%e5%86%b5" class="header-anchor"&gt;&lt;/a&gt;一个必须处理的边界情况&#10;&lt;/h2&gt;&lt;p&gt;设计文档里我列了一张边缘情况表，其中一条特别重要：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;场景&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;行为&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;函数代码执行异常&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;捕获错误，日志提示，&lt;strong&gt;不回退&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;为什么不回退到「随机走」？&lt;/p&gt;&#10;&lt;p&gt;因为&lt;strong&gt;静默降级会让统计数据失真&lt;/strong&gt;。如果函数坏了却自动换成随机策略，你会看到「这一代得分下降了」，但不知道为什么——你会以为是策略变差了，实际上是崩溃了。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;让失败暴露出来，比让它看起来能跑更重要。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="这个项目真正在问什么"&gt;&lt;a href="#%e8%bf%99%e4%b8%aa%e9%a1%b9%e7%9b%ae%e7%9c%9f%e6%ad%a3%e5%9c%a8%e9%97%ae%e4%bb%80%e4%b9%88" class="header-anchor"&gt;&lt;/a&gt;这个项目真正在问什么&#10;&lt;/h2&gt;&lt;p&gt;表面上它在问：AI 能不能在网格游戏里拿高分？&lt;/p&gt;&#10;&lt;p&gt;实际上它在问三个问题：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;AI 能不能从「做决策」上升到「写决策程序」？&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;写出来的程序，能不能在一代代反馈中变好？&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;上下文从线性增长换成固定摘要，它的判断会退步多少？&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;第一个是能力边界，第二个是进化机制，第三个是工程现实。&lt;/p&gt;&#10;&lt;p&gt;而这三件事，恰好也是今天做 AI 应用的人每天在纠结的。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="技术栈"&gt;&lt;a href="#%e6%8a%80%e6%9c%af%e6%a0%88" class="header-anchor"&gt;&lt;/a&gt;技术栈&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;原生 JavaScript&lt;/code&gt; · &lt;code&gt;Canvas&lt;/code&gt; · &lt;code&gt;DeepSeek API&lt;/code&gt; · &lt;code&gt;Web Worker 沙箱&lt;/code&gt; · &lt;code&gt;localStorage&lt;/code&gt; · 零构建步骤&lt;/p&gt;&#10;&lt;hr&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;这个项目让我改了一个看法。&lt;/p&gt;&#10;&lt;p&gt;以前我觉得「AI 会不会写代码」是个演示性问题。&lt;/p&gt;&#10;&lt;p&gt;现在我觉得它是&lt;strong&gt;成本问题&lt;/strong&gt;——&lt;strong&gt;当 AI 学会写一个函数来代替自己反复推理时，它就从「一次服务」变成了「一份资产」。&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;</description></item></channel></rss>