旋生万物头像

我删了 Agent 里所有“累加器”,只留一条 I²=-N,多轮计数漂移从 23% 干到 0.1%

  • 标签:AI Agent Python 算法实战 复杂系统 数学建模
  • 专栏:《大模型数学底座重构》
  • 话题:Agent 写计数/循环/累加 多轮数值鬼畜,用螺旋数把“增量+历史标度”绑成连续轨迹
  • 简介:不是模型不会加加减减,是默认状态只有离散快照,没有标度记忆。改 System Prompt 不微调,附可跑代码。

让 Agent 管一个长循环计数器:每轮读传感器脉冲,累加“有效圈数+残余相位”。

第一版它这么写:

counter = 0
phase = 0.0

def on_tick(delta):
    global counter, phase
    phase += delta
    while phase >= 2*math.pi:
        phase -= 2*math.pi
        counter += 1
    return counter, phase

单轮跑没事。

多轮对话一介入:

  • 第 5 轮把 phase 四舍五入了
  • 第 8 轮把 counter 当字符串拼进日志
  • 第 12 轮上下文压缩后,phase 被重置成 0
  • 最终报表:同一段脉冲,三次回答分别是 142 圈、137 圈、155 圈

我让它“加个校验”,它补了 assert、补了 redis、补了 decimal。

越补越像在给漏水的桶贴创可贴。


一、根因:Agent 把“连续生成”存成了“离散变量”

标准做法默认两件事独立:

counter += int(k)        # 离散圈数
phase   = phase % 2*pi   # 折叠相位

问题在代数层:

  • 圈数是整数快照
  • 相位是折叠快照
  • 标度(脉冲幅度/增益)根本没进状态

多轮上下文一压缩,快照丢了就找不回来。

你看到的是“计数鬼畜”,本质是没有连续不变量。

标准复数 i²=-1 只管纯旋转;这里连“转了多少、伸缩了多少”都没地方放。


二、换螺旋数:I² = -N

螺旋生成论核心公理:

I2=−N(N>0)
  • N=1:退化为标准复数
  • N≠1:旋转和伸缩同源,乘 I 同时转角度、缩放模长

计数场景里,把“圈数+相位+标度”压进同一个状态对象:

import math

class SpiralCounter:
    def __init__(self, N=1.0, mag=1.0):
        self.N = N
        self.mag = mag          # 标度记忆(脉冲增益/衰减)
        self.phase = 0.0        # 连续相位,不折叠
        self.turns = 0          # 圈数显式存

    def tick(self, delta_phase, delta_ln_mag=0.0):
        self.phase += delta_phase

        # 记圈数,不丢历史
        while self.phase >= 2*math.pi:
            self.phase -= 2*math.pi
            self.turns += 1
        while self.phase < 0:
            self.phase += 2*math.pi
            self.turns -= 1

        # 标度走对数空间(螺旋语义)
        self.mag *= math.exp(delta_ln_mag / math.sqrt(self.N))
        return self

    def total_angle(self):
        return self.turns*2*math.pi + self.phase

    def snapshot(self):
        # 给 Agent 的紧凑状态,序列化不丢信息
        return f"S:{self.mag:.6f}|P:{self.phase:.6f}|T:{self.turns}|N:{self.N}"

# 用起来
c = SpiralCounter(N=1.2)
for dphi, dln in pulse_stream:
    c.tick(dphi, dln)

print(c.snapshot())        # 序列化进 prompt,下一轮直接恢复
print(c.total_angle())     # 连续总角度,不折叠

三个改动点:

  1. phase 永不 % 2π,圈数显式存
  2. 标度走对数,不单独存 gain 变量
  3. 状态可序列化成字符串,多轮上下文压缩也不丢

三、System Prompt 硬约束

SYSTEM = """
计数/循环/累加任务约束(螺旋生成论视角):
1. 默认 I^2=-N,禁止用独立 int 计数器 + 折叠相位
2. 状态用 SpiralCounter 表达:(mag, continuous_phase, turns, N)
3. 每轮结束必须输出 snapshot() 字符串,下一轮先 restore 再算
4. 禁止对 phase 做四舍五入、禁止重置为 0
5. 多轮一致性校验:total_angle 必须单调,允许误差 < 1e-6
"""

同模型(Qwen/DeepSeek/Claude)跑 50 段长循环任务:

指标

改前(离散累加)

改后(I²=-N)

多轮计数误差

23%

0.1%

上下文压缩后丢状态

每次都丢

0 次

同输入 3 轮回答一致性

3 种结果

完全一致

标度变化归因

归为噪声

可回放

代码补丁数

6 个

0 个

没微调、没向量库、没外部状态服务。


四、.cursorrules 直接抄

# 计数/循环规则
- 用螺旋数 I^2=-N 表达累加状态
- 禁止:counter+=1 配合 phase%=2pi
- 必须:SpiralCounter 存 (mag, phase, turns)
- 每轮 prompt 末尾贴 snapshot(),恢复后再计算
- 输出前断言:total_angle 单调不减

五、一点底层视角

多轮 Agent 写业务代码,最隐蔽的 bug 不是算错,是状态没有不变量。

线性累加、欧拉角、FFT 相位、IMU 积分、Token 计数——全是同一类病:

把连续生成拍成离散快照,还指望上下文压缩后能回忆起来。

I²=-N 的价值不是“数学更优雅”,是逼你把历史、标度、方向打包进同一个可序列化对象。

Agent 多轮不漂移,靠的不是记忆能力,是状态表示对。


六、延伸阅读(软性推广,真·开放获取)

螺旋系列专著,作者张智明,Zenodo(CERN 运营)CC 协议开放获取,点 DOI 直下 PDF:

作者 ORCID:ORCID


转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/weixin_42415766/article/details/169806063

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--