返回机制实验室

W12 · S78—S84 · 总 Day 168174

综合连接:一条可解释的本地学习链路

连接历史特征、版本指纹、动作授权与重试去重。

作者准备的学习示例 · 不计真实学习进度 · 不代表生产 / GPU / 真机结果

在仓库根目录运行;只输出合成示例,不写文件、不访问网络

npm run learning:p2 -- w12
跳到完整源码 ↓

核心问题

单独看懂时间过滤、版本散列、权限和幂等后,能否说明它们如何共同影响一次任务?本周只连接四种已经学过的机制,形成一条足够小、能逐段解释的案例路径。

对应 S78~S84。S85~S90 接回学习指南的整合安排,不追加新项目或考试。

1. 案例边界与输入

案例是“依据第 10 分钟可见的合成特征,为 case-a 创建一份本地审核草稿”。没有客户数据,没有金融决策,也不调用语言模型。摘要是确定性字符串,用来把注意力放到系统连接。

W1 历史可见特征
    → W2 数据与配置指纹
    → 形成有证据 ID 的草稿
    → W9 检查租户、工具、目的地与字段
    → W6 模拟确认丢失后的幂等重试

实现直接 import 前几周函数,不复制它们。这样既能看到组件边界,也能在修改一处机制后观察整条链路变化。W3/W4 等性能模拟不强行接入,因为当前案例没有真实训练或推理服务,硬接只会制造假指标。

2. 一次运行应读到什么

npm run learning:p2 -- w12

特征选择应返回 original、value=20,而不是后来的 correction。数据数组被内容散列,再与 rule-v1、无 Prompt 和 draft-only 策略一起形成 bundleId。这里数据快照包含未来记录,但历史查询明确过滤它们;“保存完整数据”不等于“模型在历史时刻可以使用全部记录”。

草稿携带 caseId、summary、evidenceIds,bundleId 单独保存在追溯元数据中。授权通过后,operationId 使用租户/案例/动作/bundleId 组合,重试只产生一个内存 receipt。trace 是关联这些步骤的普通 JSON 对象,不是 OTel 采集结果。

特别注意:提案的 fields 直接取自实际草稿的键,避免检查一组字段却发送另一组字段;bundleId 不混入业务载荷。当前策略仍不检查 summary 内部内容,不能防止敏感信息藏在允许字段中。示例只把草稿序列化进内存接收方,不发送网络。

3. 已实现、模拟、未实现、未知

类别当前范围
已实现的本地逻辑历史选择、指纹计算、提案授权、重复操作去重
明确模拟身份、模型替代规则、调用方崩溃、接收方持续存活
未实现LLM 推理、真实数据库、并发事务、外部工具、生产服务、人工界面
仍需研究去重记录丢失后的恢复、数据更正后的草稿失效、版本变化是否应生成新动作

这个分类也会由程序输出。程序可运行并不意味着系统生产可用;它证明的是当前四种机制可以按代码中给定的条件连接起来。

4. 一个变化,走完因果链

任选一种,不必全部做:

  1. 在 W1 把 correction 的可见时间改到第 9 分钟,重新运行 W12。特征值、数据指纹、bundleId、草稿与操作身份都会变化。解释每一处变化由谁触发。
  2. 在 W12 把 identity 的 scope 清空。授权结果拒绝,recovery 为 null,没有执行接收方操作。与“执行后才发现越权”比较边界位置。
  3. 改 rule 版本。即使文本摘要暂时相同,bundle 与 operationId 仍变化。思考:系统应该把它视为新草稿,还是同一草稿的新修订?代码中的选择只是教学决策,不是所有业务通用规则。

修改观察结束后保留自己需要的版本即可,不要求提交或发布,也不自动更新学习进度。

5. 从机制实现进入系统设计

如果要向真实系统多走一步,建议只选一个缺口:为历史数据选合适存储;为接收方设计事务去重;为草稿增加来源字段;或画出真实身份来源。先写输入、状态、失败和恢复,再决定是否需要框架。

不建议在同一周同时引入 GPU、Kubernetes、MCP 服务、向量库和远程模型。那会改变学习问题,从“理解连接”变成“排查安装”。只有某个系统问题确实需要它时才追加技术。

6. 专业阅读与下一阶段路线

  • Stanford CS329S:用系统生命周期视角检查各层关系,而不把模型当作全部系统。
  • FSDL 2022:用端到端应用视角识别当前没有连接的数据、服务与反馈部分。

P3 可以从这个案例提出研究问题:如果规则换成模型,错误究竟来自知识、推理还是工具执行?多次尝试的改进来自学习还是搜索?记忆更新怎样影响跨任务泛化?这些问题需要另外设计实验,本地链路不提供 AGI 结论。

P4 再增加环境与动作:观测可能迟到,动作不可撤销,世界会在决策后变化。当前的内存草稿只能迁移思考方式,不能迁移为真机动作保证。

最后只写三个句子也足够:一条已经理解的因果链;一个最想继续研究的问题;一个目前不能宣称的能力。

配套日课:按需要补充理论

本实验贯穿一周,不要求一天做完。

可运行源码

src/learning/ai-systems/w12-local-system.ts · 构建时直接读取源文件,避免讲义代码与实现各自漂移。

import { features, historicalFeature } from './w01-point-in-time'
import { fingerprint } from './w02-release-bundle'
import { retryAfterLostAck } from './w06-durable-retry'
import { authorize, type Proposal } from './w09-trust-boundary'

export function run() {
  const feature = historicalFeature(features, 'case-a', 10)
  if (!feature) throw new Error('No historically available feature')
  const manifest = { model: 'deterministic-rule-v1', data: fingerprint(features.map(row => ({ ...row }))), prompt: 'none', policy: 'draft-only-v1' }
  const bundleId = fingerprint(manifest)
  const draft = { caseId: 'case-a', summary: `Historically visible value: ${feature.value}; human interpretation required.`, evidenceIds: [feature.id] }
  const proposal: Proposal = { tenant: 'learning', tool: 'create-review-draft', destination: 'local-review-queue', fields: Object.keys(draft) }
  const decision = authorize({ tenant: 'learning', scopes: ['draft:write'] }, proposal)
  const operationId = `learning/case-a/draft/${bundleId}`
  return {
    implemented: ['time-aware feature selection', 'manifest hashing', 'proposal authorization', 'receiver idempotency'],
    trace: { traceId: 'synthetic-case-a', featureId: feature.id, manifest, bundleId, decision, draft,
      recovery: decision.allowed ? retryAfterLostAck(operationId, JSON.stringify(draft)) : null },
    simulated: ['identity', 'model replaced with a rule', 'crash', 'receiver persistence'],
    notImplemented: ['LLM inference', 'database transactions', 'real external tools', 'production serving', 'human review UI'],
    openQuestions: ['What if the receiver loses its deduplication table?', 'How should changed evidence invalidate an old draft?'],
  }
}

本例复用 W01、W02、W06、W09 函数;依赖源码可从对应周的页面查看。