高级 📋 6 个步骤 第 542 / 545 篇

用可证伪规则库让 Agent 自己修正环境认知(EvoBelief 思路实操)

2026-10 论文提出:冻结大模型,让 Agent 维护一套可证伪规则,受控验证后晋升为活跃世界模型,置信度跌破阈值即退役。本教程落成可运行代码。

2026.10.18· 5 分钟上手· 约 1574 字· 🧠 EvoBelief / 🔬 自改进 Agent

你有没有遇到过这种情况:Agent 在一个环境里跑得好好的,换个依赖版本、换个接口返回格式,它却还按「旧认知」行动,然后一路出错?2026 年 10 月的一组论文(EvoBelief、VEPA、OGPO、ReTRAIL)给出的诊断很扎心:审计四个开源 Agent 发现,约 73% 的运行时错误来自「环境认知过时或错误」,而不是模型推理本身。本教程不推荐某个产品,而是把其中可落地的「可证伪规则库」思路落成可运行代码:让 Agent 把环境知识存成 IF 条件 THEN 预测 的规则,用受控实验验证后才提升为活跃世界模型,置信度跌破阈值就自动退役。

🧠 本教程适合:已经跑通基础 Agent 循环(ReAct / 工具调用)的开发者,想给 Agent 加一套「会自我纠错的环境认知」,减少因接口或依赖变化导致的反复踩坑。无需特定框架,纯 Python + SQLite 即可复现。

Step 1:把「环境认知」从模型脑子里搬出来

1 认清问题:错误大多来自过时认知

传统做法是把「某接口返回 code=0 表示成功」这类知识写进提示词,模型记住后用一辈子。一旦后端改成 code=200,提示词没更新,Agent 就持续误判。可证伪规则库的核心是:把这类知识外置成可验证、可更新的数据,而不是埋在提示词里。

旧做法(易过时):
  提示词里写死:「接口返回 code=0 表示成功」
  → 后端改了,Agent 不知道,持续错

新做法(可纠错):
  规则库里存:「IF 调用 order_api THEN 返回 code=0 表示成功」
  → 每次执行后拿真实结果校验这条规则
  → 连续出现反例,规则置信度下降,自动退役
💡 关键心智模型:把「世界模型」当成一份带版本和置信度的数据库,而不是模型权重里的一段记忆。模型只负责按当前活跃规则做规划,规则的真假由环境反馈决定。

Step 2:设计规则库 Schema

2 建一张 RuleStore 表

每条规则存成结构化字段:触发条件 condition、预测 prediction、适用范围 scope、证据列表 evidence、置信度 confidence。下面用 SQLite 建表,零依赖、好调试。

import sqlite3

def init_store(path="rules.db"):
    con = sqlite3.connect(path)
    con.execute("""CREATE TABLE IF NOT EXISTS rules(
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        condition TEXT NOT NULL,
        prediction TEXT NOT NULL,
        scope TEXT DEFAULT '*',
        evidence TEXT DEFAULT '[]',
        confidence REAL DEFAULT 0.5
    )""")
    con.commit()
    return con

真实性提示:本教程的规则模型改编自 2026-10 公开发表的 EvoBelief 论文思路(IF-THEN 可证伪假设 + 受控验证 + 置信度退役),代码为可复现的参考实现,具体 API 与字段命名以你自己的工程为准,不要照抄论文未公开的内部接口。

Step 3:让 Agent 在意外结果时提出可证伪假设

3 意外发生时,向模型要一条规则

当 Agent 的行动结果和预期不符(例如「门该开却没开」),让冻结的 LLM 产出一条可检验的规则,插入 RuleStore 待验证。

def propose_rule(llm, state, action, outcome):
    prompt = (
        f"当前状态 S:{state}\n行动 A:{action}\n"
        f"环境实际表现:{outcome}\n"
        "请产出一条可证伪的规则,格式:IF <条件> THEN <预测>"
    )
    rule_text = llm.complete(prompt)          # 调用你已有的模型接口
    return parse_rule(rule_text)              # 解析成 (condition, prediction)
🔑 让模型只负责「提假设」,不要让它直接改活跃世界模型。假设先进入待验证区,过了实验才晋升,这步把「模型的臆测」和「系统相信的事实」隔开。

Step 4:独立验证,达标才晋升

4 在环境里采样 N 次

晋升规则前,用环境真实采样做受控实验。成功率 ≥ 0.8 才提升为活跃规则,否则留在待验证区继续观察。

def validate_rule(con, rule, env, n=10):
    hits = 0
    for _ in range(n):
        s = env.sample_states(rule["condition"])
        a = rule["suggested_action"](s)
        o = env.step(s, a)
        if o.matches(rule["prediction"]):
            hits += 1
    rate = hits / n
    if rate >= 0.8:
        promote(con, rule)     # 写回 confidence=rate,标记活跃
    return rate

成本与抖动:每次验证要实跑环境 N 次,真实系统里可能是 N 次接口调用或 N 次部署。先在小范围、低代价的环境(如本地 mock 或预发)验证,再考虑晋升到生产相关规则,避免验证本身拖垮主流程。

Step 5:规则退役与范围收窄

5 反例累积,置信度跌破阈值就退役

规则被活跃使用后,继续收集反例。置信度随反例衰减,跌破 0.4 时要么收缩 scope(只在更小的上下文生效),要么直接退役。

def retire_or_narrow(con, rule, counterexample):
    decay(con, rule)                       # confidence 乘衰减系数
    if rule["confidence"] < 0.4:
        mark_retired(con, rule)            # 移出活跃世界模型
    else:
        narrow_scope(con, rule, counterexample)   # scope = scope 交 新上下文
💡 所有晋升、退役、收窄都写进不可变审计日志(谁、何时、哪条规则、依据什么证据)。Agent 跑偏时,这份日志就是可复现的调试线索。

Step 6:把规则库接进你的 Agent 循环

6 读活跃规则 → 规划 → 执行 → 记录反例

把规则库接到既有 ReAct 循环里:规划阶段加载当前活跃规则作为上下文,执行后把成功/失败结果回填,触发晋升或退役。下面是一个最小接法。

def agent_loop(con, llm, env, goal):
    active = load_active_rules(con)        # 只读活跃规则
    plan = llm.plan(goal, context=active)  # 用规则约束规划
    for step in plan:
        outcome = env.step(step.state, step.action)
        if not outcome.matches(active):
            r = propose_rule(llm, step.state, step.action, outcome)
            validate_rule(con, r, env)     # 新规则先验证
        else:
            record_evidence(con, step, outcome)

边界:规则库解决的是「环境认知」问题,不替代模型推理,也不该用来存储机密或会随会话消失的临时状态。把规则当成「Agent 的环境常识」,而不是万能记忆。

常见问题速查

现象原因与处理
规则一直不晋升验证环境代价高或样本不足,先调小 n 或在 mock 环境验证
Agent 反而更慢每次执行都触发验证,给验证加频率上限或只在异常时触发
规则互相打架同 scope 下多条冲突预测,晋升前做冲突检测,保留置信度高者
← 返回教程中心