# LLM + Dataset ≡ Lambda Calculus

## 核心命题

**LLM + 数据集构成的计算系统（LDS），与概率 Lambda 演算在计算能力上等价。**

这不只是理论推导。我们发现：**现有的 Agent 配置文件（如 YAML）已经在不自觉地使用 Lambda 演算的结构**。本研究做的是揭示这一隐藏的数学等价，并将其显式化为可执行的 DSL。

```
理论:  LDS ≡ 概率 Lambda 演算
实证:  60/60 Church 原语实验全部通过
实例:  agent-config.yml 每一行都对应一个 Lambda 构造
工具:  lambdagent DSL — ~11,300 行 Python，81 个导出符号
       11 核心构造 + 5 多智能体构造 + 4 Skill 构造
       + MCP Client + A2A Protocol + RAG + Checkpoint + Sandbox
```

---

## 一、为什么这个问题重要

LLM 正在改变软件工程的实践，但缺乏理论基础：
- Lambda 演算 → 函数式编程的理论基础
- Turing 机 → 命令式编程的理论基础
- **LLM + Dataset → ？**

业界已经在用 YAML/JSON 配置文件来"编程" Agent，但没有人意识到这些配置文件本质上是 Lambda 表达式的序列化。Prompt 工程师在写函数体，Agent 架构师在组合高阶函数——只是缺少了形式化的语言来表达这一点。

本研究的目标：**揭示这一等价性，并提供可执行的工具。**

---

## 二、一个真实案例：agent-config.yml 就是 Lambda 项

以下是一个真实的 Agent 配置文件（`agent-cofig.yml`）：

```yaml
agentId: seeCoderManus
type: react
model:
  provider: dashscope
  name: qwen3-max-2026-01-23
  temperature: 0.7
  maxTokens: 4096
systemPrompt: |
  你是 SeeCoderManus，一个智能编程助手...
react:
  maxSteps: 20
mcp:
  onlineTool:
    example-mcp-server:
      - everything_get_sum
      - chat_improve_prompt
  localTools:
    - terminate
memory:
  strategy: redis
  size: 20
  ttl: 7200
```

**这个 YAML 就是一个 Lambda 表达式：**

```
SeeCoderManus = Memory(                          ← memory: {redis, size=20}
    Loop(                                         ← type: react
        think >> act >> observe,                   ← ReAct 三步循环
        max_steps = 20                             ← react.maxSteps
    ),
    store = redis(size=20, ttl=7200)
)

where:
    think   = Lam("SeeCoderManus",                ← agentId
                  prompt = "你是 SeeCoderManus...", ← systemPrompt
                  model = qwen3-max,               ← model.name
                  temperature = 0.7)               ← model.temperature

    act     = Route(think_output, {                ← mcp 配置
                  "everything_get_sum": Tool(MCP),  ← onlineTool
                  "chat_improve_prompt": Tool(MCP),
                  "terminate": Tool(λx.x)           ← localTools: 恒等函数 = 递归终止
              })
```

逐字段对应：

| YAML 字段 | Lambda 演算概念 | 说明 |
|---|---|---|
| `model` + `systemPrompt` | **λ 抽象** `λx.body` | 模型参数 = 求值引擎，prompt = 函数体 |
| `agent(input)` | **函数应用** `(f x)` | 将输入送入 Agent = β-规约 |
| `type: react` | **Y 组合子** | ReAct = 反复 think-act-observe 直到终止 |
| `react.maxSteps: 20` | **Y 展开次数上界** | 最多 β-规约 20 步 |
| `temperature: 0.7` | **概率选择** `⊕_p` | 0 = 确定性 Lambda，>0 = 概率 Lambda |
| `mcp.onlineTool` | **Tool（外部 Oracle）** | 外部函数提升为 Lambda 项 |
| `localTools: [terminate]` | **恒等函数** `λx.x` | Y 组合子的 base case — 停止递归 |
| `memory: redis` | **环境扩展** `Γ' = Γ ∪ store` | 持久化的变量绑定 |
| `memory.ttl: 7200` | **变量生命周期** | 绑定存活 2 小时后过期 |
| `rag` | **外部存储（无界纸带）** | 突破上下文窗口限制 |

关键发现：**`terminate` 工具就是恒等函数 λx.x**——它不做任何变换，只是返回输入本身。这正是 Y 组合子的 base case：没有 base case，ReAct 循环将无限展开。这不是巧合，这是递归终止条件的数学本质。

**意义**：行业已经在不自觉地使用 Lambda 演算结构来设计 Agent。YAML 配置就是 Lambda 项的声明式序列化。我们的理论不是在创造新的东西，而是在**命名和形式化已经存在的实践**。

---

## 三、理论框架

### 3.1 五环论证链

**第一环：Church 编码——数据即计算**

```
c_n = λf.λx. f^n(x)
```

数据被表示为函数的行为。LLM 也是如此：它不存储"3"这个符号，而是通过训练数据学习"3"的行为模式。

**第二环：LLM 作为函数学习器**

LLM 在数据集 D 上训练/提示后，学习到映射 `F_{M,D} : Input → Output`。

两种绑定方式：
- **训练时绑定**：梯度下降 → θ_D（编译时）
- **运行时绑定**：Few-shot prompt（运行时 / 动态作用域）

**第三环：构造 Lambda 原语**

用 LDS 实现所有 Church 编码原语：

| 原语 | Lambda 定义 | LDS 实现 | 实验结果 |
|---|---|---|---|
| SUCC | `λn.λf.λx. f(n f x)` | 7 个示例 → 泛化到 255 | ✓ 8/8 |
| TRUE/FALSE | `λa.λb. a` / `λa.λb. b` | 各 5 个示例 | ✓ 8/8 |
| AND/OR/NOT | 逻辑运算 | 2-4 个示例 | ✓ 10/10 |
| IF | `λc.λt.λe. c t e` | 6 个示例 | ✓ 6/6 |
| PAIR/FST/SND | Church 对 | 3-4 个示例 | ✓ 8/8 |
| 函数组合 | `λx.g(f(x))` | DOUBLE ∘ SUCC | ✓ 6/6 |
| 递归 | Y 组合子 | CoT 展开 FACTORIAL | ✓ 6/6 |
| Church 数 | `λf.λx. f^n(x)` | add1/double 重复应用 | ✓ 8/8 |
| **总计** | | | **60/60** |

**第四环：组合封闭性**

- 串行组合 `f >> g`：DOUBLE ∘ SUCC 6/6 通过
- 有序对 + 解构：`Pair(SUCC, DOUBLE) >> Fst()` 通过
- 递归展开：FACTORIAL 10! = 3,628,800 正确

**第五环：等价性定理**

- **LDS → Lambda**（平凡）：LLM 是可计算函数的组合
- **Lambda → LDS**（利用已有结果）：Schuurmans 2024 证明自回归 LLM = Turing 完备

### 3.2 关键理论难题与解法

| 难题 | 解法 | 对应到 agent-config.yml |
|---|---|---|
| **近似 vs 精确** | 概率 Lambda 演算（Dal Lago 2012），仍 Turing 完备 | `temperature: 0.7` = 概率参数 |
| **有限上下文** | 自回归 = 无界带（Schuurmans 2024） | `memory: redis` = 外部存储增强 |
| **训练 vs 编程** | 指称语义（说明做什么）vs 操作语义（说明怎么做） | `systemPrompt` = 声明式规约 |

---

## 四、从理论到实践：lambdagent DSL

### 4.1 设计思想

既然 YAML 配置已经是 Lambda 项的序列化形式，那么我们可以设计一个 DSL，让这种对应**显式化、可执行、可验证**。

```python
# agent-config.yml 用 lambdagent DSL 表达：

from lambdagent import Lam, Tool, Loop, Memory, Route

think = Lam("SeeCoderManus",
            prompt="你是 SeeCoderManus...",
            model="qwen3-max",
            temperature=0.7)

tools = Route(think, {
    "everything_get_sum":   Tool("sum", mcp_call),
    "chat_improve_prompt":  Tool("improve", mcp_call),
    "terminate":            Tool("terminate", lambda x: x),  # λx.x = base case
})

react = Loop(think >> tools, max_steps=20)      # Y 组合子，最多展开 20 次
agent = Memory(react, store={"redis": True})     # 环境扩展 Γ ∪ store
```

### 4.2 DSL 构造与 Lambda 对应

**11 个核心构造**（Lambda 演算）：

| # | DSL 构造 | Lambda 演算 | 语法 |
|---|---|---|---|
| 1 | `Lam(name, prompt)` | λ 抽象 `λx.body` | 创建 Agent |
| 2 | `agent(input)` | 函数应用 `(f x)` | β-规约 |
| 3 | `f >> g` | 组合 `λx.g(f(x))` | 管道 |
| 4 | `If(cond, a, b)` | Church 条件 | 分支 |
| 5 | `Loop(body, cond)` | Y 组合子 | 递归/CoT |
| 6 | `Pair(f, g)` | PAIR `λa.λb.λf. f a b` | 并行+打包 |
| 7 | `Fst()` / `Snd()` | 投影 | 解构 |
| 8 | `Tool(name, fn)` | 原语/Oracle | 外部工具 |
| 9 | `Route(cls, routes)` | 广义 Church 布尔 CASE | N 路分发 |
| 10 | `Guard(agent, P)` | 依赖类型 `{x:T\|P(x)}` | 输出约束 |
| 11 | `Memory(agent, store)` | 环境扩展 `Γ'=Γ∪s` | 持久状态 |

**5 个多智能体构造**（扩展至 π-演算）：

| # | DSL 构造 | 进程演算对应 | 语法 |
|---|---|---|---|
| 12 | `Channel` + `Send` + `Receive` | π-calculus 通道 `c!(v)` / `c?(x)` | Agent 间通信 |
| 13 | `SharedMemory` | 共享环境 `Γ_shared` | 多 Agent 共享状态 |
| 14 | `GroupChat` | `Y_n(Loop + Route)` | 多 Agent 群组对话 |
| 15 | `Handoff` | 动态 CASE（运行时路由） | 动态委派 |
| 16 | `AsyncPar` | 并发 β-规约 | 线程池真并行 |

**4 个 Skill 系统构造**：

| 构造 | Lambda 语义 | 说明 |
|---|---|---|
| `Skill(name, term)` | `let name = term in ...` | 命名的可复用 Lambda 项 |
| `SkillPack` | `{name_i: skill_i}` | 技能集合（类似 package） |
| `SkillRegistry` | `Gamma_skills: Name -> Skill` | 全局注册表（可发现、可搜索） |
| `SkillAgent` | `lambda x. discover(x) >> execute` | 自动发现技能的 Agent |

**协议集成层**：

| 模块 | 说明 | Lambda 语义 |
|---|---|---|
| `MCPServer` / `MCPTool` | MCP 协议客户端 (HTTP + stdio) | `Tool(name, lambda x. mcp_call(x))` |
| `AgentCard` / `A2AServer` / `A2AClient` | Google A2A 协议 | Skill 发布/发现/远程调用 |
| `RAGTool` / `AgenticRAG` | 检索增强生成 | `Tool("rag", lambda x. retrieve(store, x, k))` |
| `Checkpoint` / `CheckpointManager` | 状态序列化与恢复 | `save(Gamma, trace) / load(path)` |

### 4.3 三层对应：YAML ↔ DSL ↔ Lambda

```
agent-config.yml          lambdagent DSL              Lambda 演算
════════════════          ══════════════              ══════════════

model + systemPrompt  →   Lam("name", prompt)     →   λx. body
type: react           →   Loop(body, cond)         →   Y(λself.λx. ...)
react.maxSteps: 20    →   Loop(max_steps=20)       →   Y 展开上界
mcp.onlineTool        →   Tool("name", fn)         →   原语 / Oracle
localTools: terminate →   Tool("t", λx.x)          →   λx.x (base case)
memory: redis         →   Memory(agent, store)     →   Γ' = Γ ∪ store
temperature: 0.7      →   Lam(temperature=0.7)     →   概率选择 ⊕₀.₇
rag                   →   (外部存储扩展)             →   无界纸带
```

这三层对应说明：**YAML 配置是 Lambda 表达式的声明式语法，DSL 是过程式语法，Lambda 演算是语义。**

### 4.4 DSL 实验结果

**实验 A：Church 原语验证（真实 API 调用）**
```
SUCC, TRUE/FALSE, AND/OR/NOT, IF, PAIR, 组合, Tool, Church 数
总计: 29/29 通过，43 步 β-规约
```

**实验 B：多步研究 Agent**
```
decompose >> map_research >> synthesize >> Loop(critique/refine)
总计: 15 步 β-规约，输出 5 段高质量研究报告
```

**实验 C：从 YAML 构建 Agent**
```
agent-cofig.yml → from_config() → 可执行 Lambda 项
ReAct 循环 = Loop(think >> act >> observe)
3 步 β-规约完成模拟执行
```

### 4.5 from_config()：YAML → Lambda 的编译器

```python
from lambdagent import from_config, describe_config

# 将 YAML 编译为 Lambda 项
agent = from_config("agent-cofig.yml")

# 打印 Lambda 结构
print(describe_config("agent-cofig.yml"))
# 输出:
# SeeCoderManus = Memory(Loop(think >> act >> observe, max_steps=20), redis)
# where: think = Lam(...), tools = [Tool(MCP), Tool(λx.x)]

# 执行 = β-规约链
ctx = Context()
result = agent("帮我写一个快速排序", ctx)
ctx.print_trace()  # 打印每步 β-规约
```

**`from_config()` 本质上是一个编译器：从 YAML 声明式语法到 Lambda 项的语义表示。**

---

## 五、文献支撑

### 计算完备性
1. **Pérez et al. (2021)** Attention is Turing Complete. *JMLR*.
2. **Giannou et al. (2023)** Looped Transformers as Programmable Computers. *ICML*.
3. **Schuurmans (2023)** Memory Augmented LLMs are Computationally Universal.
4. **Schuurmans et al. (2024)** Autoregressive LLMs are Computationally Universal.
5. **Merrill & Sabharwal (2023/2024)** 现实 Transformer ⊆ TC⁰，CoT 提升至 ≥ P.

### 近似性与概率性
6. **Cybenko (1989)** / **Hornik (1991)** 万能近似定理。
7. **Dal Lago & Zorzi (2012)** 概率 Lambda 演算，Turing 完备。
8. **Valiant (1984)** PAC 学习框架。

### In-Context Learning
9. **Xie et al. (2022)** ICL = 隐式贝叶斯推断。*ICLR*.
10. **Garg et al. (2022)** Transformer 可 ICL 整个函数类。*NeurIPS*.

### 直接相关
11. **Flach et al. (2023)** Towards a Neural Lambda Calculus.
12. **Wei et al. (2022)** Chain-of-Thought Prompting. *NeurIPS*.

---

## 六、推论与意义

### 推论 1：数据策展 = 编程

```
选择数据集 D  ⟺  编写 Lambda 项
训练/提示 LLM ⟺  编译程序
推理          ⟺  执行程序
```

### 推论 2：Prompt Engineering 有精确语义

```
System Prompt  = 全局环境 Γ            ← agent-config.yml 的 systemPrompt
Few-shot 示例  = 运行时 Lambda 绑定    ← Dataset 的 examples
CoT 提示       = Y 组合子展开策略      ← type: react
Temperature    = 概率参数 ⊕_p          ← model.temperature
```

### 推论 3：Agent 配置文件 = Lambda 程序

**这是本研究最具实践意义的推论。**

现有的 Agent 配置格式（YAML/JSON/TOML）已经是 Lambda 项的序列化——只是没有人用这个视角看待它。一旦认识到这一点：

- **Agent 架构设计** = 组合 Lambda 项（有严格的代数定律）
- **Agent 调试** = 追踪 β-规约链（Context.trace）
- **Agent 正确性** = Lambda 项的等价性（可形式化验证）
- **Agent 优化** = Lambda 项的规约策略（惰性求值 vs 急切求值）

### 推论 4：ReAct/CoT/Tool Use 都是 Lambda 构造

| 现有概念 | Lambda 本质 | 为什么有效 |
|---|---|---|
| ReAct | `Loop(think >> act >> observe)` | Y 组合子提供无界计算 |
| Chain-of-Thought | Y 组合子的逐步展开 | 每步 β-规约降低问题复杂度 |
| Tool Use | `Tool(name, fn)` — 外部 Oracle | 将不可计算/效率低的部分外包 |
| terminate | `λx.x` — 恒等函数 | Y 组合子的 base case |
| Memory / RAG | `Γ' = Γ ∪ store` — 环境扩展 | 突破有限上下文 = 无界纸带 |
| Multi-Agent | 高阶函数组合 | Agent 作为参数传递给其他 Agent |
| Routing | 广义 Church 布尔 | 分类器选择下游函数 |
| Output Validation | 依赖类型 `{x : T \| P(x)}` | 约束输出满足谓词 |

### 推论 5：AI 对齐 ≅ 程序验证

如果 LDS 是编程模型，则：
- **规约** = 定义 F_{M,D} 应满足的性质
- **验证** = 证明 F_{M,D} 满足规约（Hoare 逻辑 / 依赖类型）
- **测试** = 在关键输入上检验 F_{M,D}（红队测试）

---

## 七、研究路线图

```
Phase 1: 形式化 [THEORY.md — ✅ 已完成]
    ├── 定义 LDS 计算模型（定义 1-5）
    ├── 建立与 Lambda 项的对应关系
    └── 陈述等价性定理

Phase 2: 实验验证 — ✅ 已完成
    ├── Church 原语实验 60/60 通过（CLI），51/51 通过（API）
    └── 分析正确率、泛化能力、组合稳定性

Phase 3: Agent DSL [lambdagent/] — ✅ 已完成
    ├── 11 个核心构造，严格对应 Lambda 演算
    ├── 5 个多智能体构造（π-演算: Channel, SharedMemory, GroupChat, Handoff, AsyncPar）
    ├── Skill 系统（Skill, SkillPack, SkillRegistry, SkillAgent, @skill 装饰器）
    ├── MCP Client（MCPServer, MCPTool, HTTP + stdio 传输）
    ├── A2A Protocol（AgentCard, A2AServer, A2AClient — Google A2A v0.3）
    ├── RAG（RAGTool, AgenticRAG, SimpleVectorStore, ChromaDB 后端）
    ├── Checkpoint（Checkpoint, CheckpointManager, save/load_context）
    ├── Church 原语 29/29 通过（DSL + 真实 API）
    ├── 多步研究 Agent 成功运行（15 步 β-规约）
    ├── from_config()：YAML → Lambda 编译器 (v1 + v2 with lint)
    ├── Sandbox（SandboxedTool, SandboxPolicy, SecureExecutor, ResourceLimiter, @sandboxed）
    └── ~11,300 行 Python，81 个导出符号，4 项专利

Phase 4: 真实案例验证 [agent-cofig.yml] — ✅ 已完成
    ├── 逐字段建立 YAML ↔ Lambda 对应
    ├── 发现 terminate = λx.x（Y 组合子 base case）
    ├── 证明现有 Agent 配置已是 Lambda 项的序列化
    └── YAML → DSL → Lambda 三层对应

Phase 5: 严格证明 [进行中]
    ├── 方向一（LDS → Lambda）：LLM 是可计算的
    ├── 方向二（Lambda → LDS）：利用 Schuurmans 2024
    └── 处理近似性：概率 Lambda 演算 + PAC 框架

Phase 6: 论文撰写
    ├── 标题："Agent Configuration as Lambda Calculus:
    │         Theory, DSL, and Industrial Evidence"
    └── 投稿方向：ICML / NeurIPS / AAAI

Phase 7: 应用扩展
    ├── 类型系统（Agent 输入/输出类型推导）
    ├── 形式化验证工具
    ├── 异步并行（Par + asyncio）
    ├── Sandbox 进程隔离 — ✅ 已完成
    │   ├── SandboxedTool（pickle IPC + 子进程隔离）
    │   ├── SandboxPolicy 预设（strict / default / permissive）
    │   ├── SecureExecutor（递归包裹 Term 树中所有 Tool）
    │   ├── ResourceLimiter（RLIMIT_CPU / AS / NOFILE / NPROC）
    │   └── @sandboxed 装饰器 + 异常体系
    └── 与 LangChain/DSPy 的基准对比
```

---

## 八、开放问题

1. **Church-Turing-LDS 论题**：是否所有"自然可计算"函数都是 LDS-可计算的？

2. **LDS 复杂性理论**：模型参数量、数据集大小、上下文长度对应什么计算复杂性类？

3. **最小 LDS**：实现给定函数的最小数据集规模是多少？（类比 Kolmogorov 复杂性）

4. **LDS 等价性判定**：两个 LDS 是否计算同一函数？（类比 Lambda 项等价性不可判定）

5. **YAML 配置的形式化验证**：能否自动检查一个 agent-config.yml 是否满足给定规约？

6. **Agent 配置的等价变换**：两个不同的 YAML 配置是否定义了语义等价的 Agent？这对应 Lambda 项的 α-等价和 β-等价。

---

## 九、项目文件

```
Paper08/
├── IDEA.md                          ← 本文件：完整研究框架
├── PLAN.md                          ← 实验计划与结果记录
├── THEORY.md                        ← 形式化理论（定义、定理、证明）
├── RUNTIME_SPEC.md                  ← 运行时规格文档
├── FROM_CONFIG_SPEC.md              ← YAML → Lambda 编译器规格
├── EXPERIMENT_REPORT.md             ← 详细实验报告
├── agent-cofig.yml                  ← 真实 Agent 配置（Lambda 项实例）
│
├── experiment_church_primitives.py  ← 原始实验代码（API 版，51/51）
├── run_experiment.py                ← 原始实验代码（CLI 版，60/60）
├── experiment_results.json          ← 实验原始数据
│
├── lambdagent/                      ← Agent DSL 包（~11,300 行，46 个 .py 文件，62 个导出符号）
│   ├── core.py                         Term, Context, TraceEntry
│   ├── primitives.py                   Lam, Compose, If, Loop, Pair, Fst, Snd, Tool
│   ├── extensions.py                   Par, Route, Memory, Guard
│   ├── dataset.py                      Dataset 类
│   ├── from_config.py                  YAML → Lambda 编译器 (v1)
│   ├── fromconfig/                     YAML → Lambda 编译器 (v2, 带 lint)
│   ├── agentruntime/                   运行时：β-规约引擎、ReAct、LLM 适配器
│   ├── cli/                            命令行界面
│   ├── multiagent.py                   Channel, Send, Receive, SharedMemory,
│   │                                   GroupChat, Handoff, AsyncPar
│   ├── skills.py                       Skill, SkillPack, SkillRegistry, SkillAgent, @skill
│   ├── mcp_client.py                   MCPServer, MCPTool, mcp_tools (MCP 协议)
│   ├── checkpoint.py                   Checkpoint, CheckpointManager, save/load_context
│   ├── a2a.py                          AgentCard, A2AServer, A2AClient (Google A2A)
│   ├── rag.py                          RAGTool, AgenticRAG, SimpleVectorStore, create_rag
│   └── sandbox.py                      SandboxedTool, SandboxPolicy, SecureExecutor,
│                                       ResourceLimiter, @sandboxed, SandboxViolation
│
├── examples/                        ← 8 个示例文件 + 1 个 YAML 配置
│   ├── ex01_church_primitives.py    ← Church 原语验证（29/29）
│   ├── ex02_research_agent.py       ← 多步研究 Agent（15 步 β-规约）
│   ├── ex03_from_yaml.py            ← YAML → Lambda 解读与执行
│   ├── ex04_generalization.py       ← 泛化能力测试
│   ├── ex05_failure_boundary.py     ← 失败边界探索
│   ├── demo_advanced.py             ← 高级功能演示
│   ├── nl2agent_demo.py             ← 自然语言→Agent 演示
│   └── quick_start.py               ← 快速入门
│
└── patents/                          ← 4 项专利
    ├── patent-01-lint/               ← YAML → Lambda 静态分析
    ├── patent-02-trace/              ← β-规约追踪
    ├── patent-03-compiler/           ← YAML → Lambda 编译器
    └── patent-04-cli/                ← 命令行界面
```

---

## 十、核心结论

> **现有的 Agent 配置文件已经是 Lambda 表达式——只是没有人用这个视角看待它。**
>
> **systemPrompt 是 λ 抽象的 body。type: react 是 Y 组合子。terminate 是恒等函数 λx.x。memory 是环境扩展 Γ'。temperature 是概率参数 ⊕_p。**
>
> **我们的工作不是创造新的东西，而是命名和形式化已经存在的实践。**

编程范式的三次转变：

```
1930s  Lambda 演算 / Turing 机     → 理论计算
1950s  高级编程语言                 → 代码即程序
2020s  LLM + Dataset + YAML 配置   → 配置即程序（= Lambda 项的声明式序列化）
```

`lambdagent` DSL 和 `from_config()` 编译器是这一认知的可执行证明：

```python
# YAML 配置 → Lambda 项 → 可执行 Agent → β-规约追踪
agent = from_config("agent-cofig.yml")
result = agent("帮我写一个快速排序", ctx)
ctx.print_trace()  # 每步 β-规约可见、可调试、可验证
```

---

## 附录 A：YAML Agent Configuration Schema 完整参考

> `from_config("agent-config.yml")` 编译器接受的 YAML 配置格式完整说明。
> 每个字段标注：类型、是否必填、默认值、约束、对应的 Lambda 构造、相关 lint 规则。

### A.1 根级元数据

| 字段 | 类型 | 必填 | 默认值 | Lambda 语义 | 说明 |
|------|------|------|--------|-------------|------|
| `agentId` | string | 否 | `"agent"` | Term 标识符 | Agent 唯一标识 |
| `name` | string | 否 | 同 agentId | Term.name | 显示名称 |
| `description` | string | 否 | `""` | — | 描述性文本 |
| `type` | enum | **是** | — | 决定顶层 Lambda 构造 | `simple` \| `react` \| `chain` \| `router` \| `parallel` |

**Schema 规则**: S001 (type 缺失 → ERROR), S002 (type 非法值 → ERROR)

**Lint 规则**: L000 (框架检测, 自动识别 crewai/autogen/langchain/dify/lambdagent)

### A.2 Agent 类型与 Lambda 映射

| type | Lambda 构造 | 公式 | 说明 |
|------|------------|------|------|
| `simple` | Lam | `λx. LLM(prompt, x)` | 单次 LLM 调用 |
| `react` | Loop (Y combinator) | `Y_n(λself.λstate. think >> route >> observe)` | ReAct 循环，n = maxSteps |
| `chain` | Compose | `λx. step_N(... step_2(step_1(x)))` | 顺序管道 |
| `router` | Route (CASE) | `λx. CASE(classifier(x)) [(l₁,a₁), (l₂,a₂), ...]` | 条件分派 |
| `parallel` | Par (PAIR) | `λx. PAIR(a₁(x))(a₂(x))` | 并行执行 |

### A.3 systemPrompt — Lambda 函数体

| 字段 | 类型 | 必填 | 默认值 | Lambda 语义 |
|------|------|------|--------|-------------|
| `systemPrompt` | string (多行) | type=simple/react 时**是** | `"You are a helpful assistant."` | `λx. body` 中的 body |

**Schema 规则**: S003 (simple/react 缺失 → ERROR)
**Lint 规则**: L001 (空 prompt → ERROR, CrewAI 允许用 role+goal+backstory 替代)

```yaml
systemPrompt: |
  你是一个编程助手。
  你能使用工具解决问题。
```

### A.4 model — LLM 参数 (概率 Lambda 参数)

| 字段 | 类型 | 必填 | 默认值 | Lambda 语义 | 约束 |
|------|------|------|--------|-------------|------|
| `model.provider` | string | 否 | `"anthropic"` | LLM 后端选择 | `anthropic` \| `openai` \| `dashscope` \| `ollama` |
| `model.name` | string | 否 | 按 provider 默认 | 模型 ID | Anthropic 默认 `claude-sonnet-4-20250514`，OpenAI 默认 `gpt-4o`，DashScope 默认 `qwen-max` |
| `model.temperature` | float | 否 | `0.0` | `⊕_p` 概率参数 | `[0.0, 2.0]` |
| `model.maxTokens` | int | 否 | `1024` | 输出长度上限 | `> 0` |
| `model.topP` | float | 否 | — | 核采样参数 | `(0.0, 1.0]` |
| `model.stopSequences` | list[string] | 否 | `[]` | 停止序列 | — |
| `model.baseUrl` | string | 否 | `""` | 自定义 API 端点 | 完整 URL |

**Schema 规则**: S009 (temperature 超范围 → WARN)
**Lint 规则**: L002 (无 model → ERROR), L007 (temperature > 1.5 → WARN), L014 (temperature=0 → INFO)

**Provider 默认模型解析** (`_resolve_model()`):
```
provider=anthropic, name="" → "claude-sonnet-4-20250514"
provider=openai,    name="" → "gpt-4o"
provider=dashscope, name="" → "qwen-max"
provider≠anthropic, name有值 → "{provider}/{name}"
```

**子 Agent 继承**: chain.steps / router.routes / parallel.agents 中的子 Agent 若未指定 model，继承父级 model 配置。

```yaml
model:
  provider: dashscope
  name: qwen3-max-2026-01-23
  temperature: 0.7
  maxTokens: 4096
```

### A.5 react — ReAct 循环配置 (Y 组合子参数)

仅当 `type: react` 时生效。

| 字段 | 类型 | 必填 | 默认值 | Lambda 语义 | 约束 |
|------|------|------|--------|-------------|------|
| `react.maxSteps` | int | 否 | `10` | Y 组合子展开上限 `Y_n` | `> 0`，建议 `<= 1000` |
| `react.observationEnabled` | bool | 否 | `true` | 是否将工具输出注入状态 | — |
| `react.toolTimeout` | int | 否 | `30` | 单个工具调用超时 (秒) | `> 0` |
| `react.verbose` | bool | 否 | `false` | 打印每步 β-规约详情 | — |

**Schema 规则**: S004 (maxSteps <= 0 → ERROR)
**Lint 规则**:
- L003 (maxSteps=0 → ERROR: `Y_0(g) = ⊥`)
- L004a (无 terminate 工具且无替代终止 → ERROR)
- L004b (无 terminate 但有有界回退 → WARN)
- L004c/d (框架内置终止机制 → INFO)
- L010 (maxSteps > 50 → WARN: 高成本)
- L011 (无工具仅 terminate → WARN: 纯推理)
- L017 (未显式设置 maxSteps → WARN)
- L018 (maxSteps > 100 → WARN: 近似无界)
- L022 (有 terminate 但无 maxSteps 回退 → WARN)

**编译行为** (`_compile_react()`):
1. systemPrompt + model → `Lam("agent.think", prompt, model)`
2. MCP + localTools → `Dict[str, Tool]` (经 ToolGateway 包装)
3. 生成 `react_step` 闭包 (包含 state 压缩、隐式终止检测、工具缓存)
4. 包装为 `Loop(body=react_step, condition=stop_condition, max_steps=N)`

**内置优化**:
- **P0 状态压缩**: 仅保留最近 3 步完整内容，旧步骤摘要为 action+observation 前 120 字符
- **P1 隐式终止**: 检测 LLM 输出中的终止信号 ("final answer:", "task complete" 等 11 个中英文模式)
- **P2 工具缓存**: LRU 缓存 (64 条目)，相同 tool+input 不重复调用
- **P2 观察截断**: 工具输出超过 800 字符自动截断

```yaml
react:
  maxSteps: 20
  observationEnabled: true
  toolTimeout: 30
  verbose: true
```

### A.6 chain — 管道配置 (函数组合)

仅当 `type: chain` 时生效。

| 字段 | 类型 | 必填 | 默认值 | Lambda 语义 |
|------|------|------|--------|-------------|
| `chain.steps` | list[object] | **是** | — | `Compose(step1, step2, ...)` |
| `chain.steps[].name` | string | 否 | `"step_{i}"` | 步骤名称 |
| `chain.steps[].prompt` | string | **是** | `""` | `λx. body` |
| `chain.steps[].model` | object | 否 | 继承父级 | 可覆盖模型 |
| `chain.steps[].guard` | object | 否 | — | 步骤级 Guard |

**Schema 规则**: S005 (steps 为空 → ERROR)
**Lint 规则**: L006 (空 steps → ERROR), L024 (重复 agent name → WARN)

```yaml
type: chain
chain:
  steps:
    - name: researcher
      prompt: "研究以下主题..."
    - name: writer
      prompt: "基于研究结果撰写报告..."
      model:
        temperature: 0.8
```

### A.7 router — 路由配置 (CASE 分派)

仅当 `type: router` 时生效。

| 字段 | 类型 | 必填 | 默认值 | Lambda 语义 |
|------|------|------|--------|-------------|
| `router.classifier` | object | **是** | — | 分类器 Lam |
| `router.classifier.prompt` | string | **是** | `"Classify the input."` | 分类 prompt |
| `router.classifier.model` | object | 否 | 继承父级 | 可覆盖模型 |
| `router.routes` | Dict[string, object] | **是** | — | `{label: sub_agent}` |
| `router.default` | object | 否 | `None` | 默认路由 (未匹配时) |

**Schema 规则**: S006 (routes 为空 → ERROR), S007 (classifier 缺失 → ERROR)
**Lint 规则**: L005 (空 routes → ERROR), L013 (无 default → WARN), L023 (空 target → ERROR)

```yaml
type: router
router:
  classifier:
    prompt: "将输入分类为 'code' 或 'writing'"
  routes:
    code:
      type: react
      systemPrompt: "你是代码专家..."
    writing:
      type: simple
      systemPrompt: "你是写作专家..."
  default:
    type: simple
    systemPrompt: "通用助手..."
```

### A.8 parallel — 并行配置 (PAIR)

仅当 `type: parallel` 时生效。

| 字段 | 类型 | 必填 | 默认值 | Lambda 语义 |
|------|------|------|--------|-------------|
| `parallel.agents` | list[object] | **是** (>=2) | — | `Par(a1, a2, ...)` |
| `parallel.merge` | enum | 否 | `"tuple"` | 结果合并策略 |
| `parallel.mergePrompt` | string | 否 | `"Synthesize..."` | merge=custom 时的合并 prompt |

`merge` 取值:
- `tuple`: 返回原始元组 `(result1, result2, ...)`
- `concat`: 拼接所有结果 `"\n\n".join(results)`
- `custom`: 用 mergePrompt 的 Lam 合并 `Par >> format >> Lam(mergePrompt)`

**Schema 规则**: S008 (agents < 2 → ERROR)

```yaml
type: parallel
parallel:
  agents:
    - type: simple
      name: analyst
      systemPrompt: "分析市场趋势..."
    - type: simple
      name: researcher
      systemPrompt: "调研竞品..."
  merge: custom
  mergePrompt: "综合以上分析，给出结论..."
```

### A.9 mcp — 工具配置 (Tool / Oracle)

| 字段 | 类型 | 必填 | 默认值 | Lambda 语义 |
|------|------|------|--------|-------------|
| `mcp.onlineTool` | Dict[server, list[tool_name]] | 否 | `{}` | `Tool(name, mcp_caller)` |
| `mcp.localTools` | list[string] | 否 | `[]` | 本地工具列表 |
| `mcp.policy.mode` | enum | 否 | `"auto"` | 工具策略 |
| `mcp.policy.retryOnFail` | int | 否 | `0` | MCP 调用重试次数 |

`mcp.policy.mode` 取值: `auto` \| `force` \| `intelligence` \| `disable`
`mcp.localTools` 特殊值: `terminate` 编译为 `Tool("terminate", λx.x)` (恒等函数 = Y 组合子基 case)

**Lint 规则**: L004 系列 (react 无 terminate), L011 (无工具仅 terminate), L026 (远程依赖检测)

```yaml
mcp:
  onlineTool:
    example-mcp-server:
      - search_tool
      - calculate_tool
  localTools:
    - terminate
  policy:
    mode: auto
    retryOnFail: 1
```

### A.10 app.mcp.custom.nodes — MCP 服务器连接配置

| 字段 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `app.mcp.custom.nodes.{server_name}.url` | string | **是** | `""` | MCP 服务器 URL |
| `app.mcp.custom.nodes.{server_name}.endpoint` | string | 否 | `""` | API 路径 (拼接在 url 后) |
| `app.mcp.custom.nodes.{server_name}.headers` | Dict[string, string] | 否 | `{}` | 请求头 (支持 `${ENV_VAR}` 引用) |
| `app.mcp.custom.nodes.{server_name}.timeout` | int | 否 | `30` | 超时秒数 |
| `app.mcp.custom.nodes.{server_name}.retry` | int | 否 | `0` | 重试次数 |

```yaml
app:
  mcp:
    custom:
      nodes:
        my-server:
          url: https://mcp.example.com
          endpoint: /mcp/v1
          headers:
            Authorization: "${MCP_AUTH_TOKEN}"
          timeout: 30
```

### A.11 memory — 记忆配置 (环境扩展 Γ')

| 字段 | 类型 | 必填 | 默认值 | Lambda 语义 |
|------|------|------|--------|-------------|
| `memory.enabled` | bool | 否 | `false` | 是否启用 `Memory(agent, store)` |
| `memory.strategy` | enum | 否 | `"local"` | 存储后端 |
| `memory.size` | int | 否 | `20` | 最大条目数 (LRU) |
| `memory.ttl` | int | 否 | `3600` | 条目过期秒数 |

`memory.strategy` 取值: `local` (内存 dict) \| `redis` (分布式) \| `sqlite` (持久化)

**Lint 规则**:
- L008 (ttl=0 → WARN: 绑定永不过期)
- L009 (size=0 → WARN: 记忆无效)
- L015 (启用 → INFO: 显示策略参数)

**编译行为**: 编译为 `Memory(agent, store)` 包装在最外层（Guard 之后）

```yaml
memory:
  enabled: true
  strategy: redis
  size: 20
  ttl: 7200
```

### A.12 guard — 输出验证 + 安全策略 (依赖类型 `{x:T | P(x)}`)

| 字段 | 类型 | 必填 | 默认值 | Lambda 语义 | 说明 |
|------|------|------|--------|-------------|------|
| `guard.validator` | string (Python expr) | 否 | `"True"` | 谓词 `P(x)` | eval 执行，可用变量: `x, len, str, int, float` |
| `guard.retry` | int | 否 | `0` | 验证失败重试次数 | — |
| `guard.fallback` | enum | 否 | `"error"` | 最终失败策略 | `error` \| `empty` \| `last` |
| `guard.maxOutputLength` | int | 否 | `0` (不限) | 输出长度上限 | 超限 → 触发 retry 或 truncate |
| `guard.dangerousCommandBlock` | bool | 否 | `false` | 启用 ToolGateway | CRITICAL/HIGH 命令自动阻止 |
| `guard.highRiskConfirmation` | bool | 否 | `false` | HIGH 需确认 | 触发 confirm_callback |

**Lint 规则**: L012 (retry > 5 → WARN), L025 (有 guard 但无 retry → WARN)

**编译行为**:
1. `dangerousCommandBlock` / `highRiskConfirmation` / `maxOutputLength` → 构建 `ToolGateway(GatewayPolicy)` → 所有 Tool 包装为 `GatedTool`
2. `validator` / `retry` / `fallback` → 构建 `Guard(agent, validator_fn, retry, on_fail)` 包装在 Memory 之前

**ToolGateway 风险分级** (50+ regex 规则):

| 级别 | 示例命令 | 默认行为 |
|------|---------|---------|
| CRITICAL (22 规则) | `rm -rf /`, `curl\|sh`, `cat ~/.ssh/*`, fork bomb | 始终 BLOCK |
| HIGH (18 规则) | `sudo`, `rm -r`, `pip install`, `kill -9`, `git push --force` | `dangerousCommandBlock` → BLOCK；`highRiskConfirmation` → CONFIRM |
| MEDIUM (10 规则) | `mv`, `sed -i`, `git rebase`, `cp -r` | LOG_ONLY |
| LOW | 文件写入, MCP 远程调用 | ALLOW + log |
| SAFE | `ls`, `cat`, `git status`, `terminate` | ALLOW |

```yaml
guard:
  validator: "len(x) > 10 and 'error' not in x.lower()"
  retry: 2
  fallback: last
  maxOutputLength: 3000
  dangerousCommandBlock: true
  highRiskConfirmation: true
```

### A.13 rag — 检索增强生成

| 字段 | 类型 | 必填 | 默认值 | Lambda 语义 |
|------|------|------|--------|-------------|
| `rag.enabled` | bool | 否 | `false` | 是否启用 RAG |
| `rag.source` | string | 否 | `""` | 数据源路径 |
| `rag.topK` | int | 否 | `5` | 检索返回条数 |
| `rag.chunkSize` | int | 否 | `500` | 分块大小 |
| `rag.backend` | enum | 否 | `"simple"` | 向量存储后端 |
| `rag.minScore` | float | 否 | `0.0` | 最低相关度阈值 |

`rag.backend` 取值: `simple` (TF-IDF, 零依赖) \| `chroma` (ChromaDB)

**Lint 规则**: L016 (启用 → INFO)

```yaml
rag:
  enabled: true
  source: ./docs/
  topK: 5
  backend: simple
```

### A.14 完整示例

```yaml
# === 完整 Agent 配置示例 ===

agentId: seeCoderManus
name: SeeCoderManus
description: 智能编程助手
type: react

model:
  provider: dashscope
  name: qwen3-max-2026-01-23
  temperature: 0.7
  maxTokens: 4096

systemPrompt: |
  你是 SeeCoderManus，一个智能编程助手。
  你能够帮助用户解决编程问题。

react:
  maxSteps: 20
  observationEnabled: true
  toolTimeout: 30
  verbose: true

mcp:
  onlineTool:
    example-mcp-server:
      - search_tool
  localTools:
    - terminate
  policy:
    mode: auto

app:
  mcp:
    custom:
      nodes:
        example-mcp-server:
          url: https://mcp.example.com
          endpoint: /mcp/v1
          headers:
            Authorization: "${MCP_AUTH_TOKEN}"

memory:
  enabled: true
  strategy: redis
  size: 20
  ttl: 7200

guard:
  dangerousCommandBlock: true
  highRiskConfirmation: true
  maxOutputLength: 3000
  validator: "len(x) > 0"
  retry: 1
  fallback: last

rag:
  enabled: false
```

### A.15 编译流程总览

```
YAML 文件
    │
    ▼
[yaml.safe_load()] ← 安全加载，禁止 yaml.load()
    │
    ▼
[validate_schema(cfg)] ← S001-S009 规则
    │ 有 ERROR → 抛出 SchemaError
    ▼
[build_agent(cfg, overrides)]
    │
    ├─ [_build_gateway(guard_cfg)] → ToolGateway (如有安全字段)
    │
    ├─ 按 type 分派:
    │   ├─ simple  → _compile_simple()  → Lam
    │   ├─ react   → _compile_react()   → Loop(react_step, condition, maxSteps)
    │   ├─ chain   → _compile_chain()   → Compose(*steps)
    │   ├─ router  → _compile_router()  → Route(classifier, routes, default)
    │   └─ parallel→ _compile_parallel()→ Par(*agents) [>> merge]
    │
    ├─ [_compile_guard(agent, guard_cfg)] → Guard(agent, validator, retry, on_fail)
    │
    └─ [_compile_memory(agent, memory_cfg)] → Memory(agent, store)
    │
    ▼
  Term (可执行 Lambda 项)
```

### A.16 Schema 校验规则汇总

| ID | 级别 | 触发条件 |
|----|------|---------|
| S001 | ERROR | 缺失 `type` 字段 |
| S002 | ERROR | `type` 值不在 simple/react/chain/router/parallel 中 |
| S003 | ERROR | simple/react 缺失 `systemPrompt` |
| S004 | ERROR | `react.maxSteps <= 0` |
| S005 | ERROR | `chain.steps` 为空 |
| S006 | ERROR | `router.routes` 为空 |
| S007 | ERROR | `router.classifier` 缺失 |
| S008 | ERROR | `parallel.agents` 少于 2 个 |
| S009 | WARN | `temperature` 不在 [0, 2.0] 范围 |

### A.17 Lint 规则汇总 (L001-L026)

| ID | 级别 | 触发条件 | Lambda 含义 |
|----|------|---------|-------------|
| L000 | INFO | 始终 | 框架检测结果 |
| L001 | ERROR | 空 systemPrompt | `λx. ⊥` 函数体未定义 |
| L002 | ERROR | 无 model 配置 | 无法执行 β-规约 |
| L003 | ERROR | maxSteps=0 | `Y_0(g) = ⊥` |
| L004a | ERROR | react 无 terminate 且无替代终止 | Y 组合子无基 case，潜在无限循环 |
| L004b | WARN | 无 terminate 但有有界回退 | 有回退但无优雅终止 |
| L004c/d | INFO | 框架内置终止 | 框架运行时提供基 case |
| L005 | ERROR | router 空 routes | CASE 无分支 |
| L006 | ERROR | chain 空 steps | 空组合链 |
| L007 | WARN | temperature > 1.5 | 高熵，输出不稳定 |
| L008 | WARN | memory.ttl=0 | Γ' 绑定永不回收 |
| L009 | WARN | memory.size=0 | Γ' = Γ ∪ ∅ = Γ |
| L010 | WARN | maxSteps > 50 | `Y_{n>50}` 高成本 |
| L011 | WARN | react 无工具仅 terminate | 纯推理循环 |
| L012 | WARN | guard.retry > 5 | 过多重试 |
| L013 | WARN | router 无 default | CASE 不完备 |
| L014 | INFO | temperature=0 | 确定性 Lambda |
| L015 | INFO | memory 启用 | 显示策略参数 |
| L016 | INFO | rag 启用 | 外部知识 Oracle |
| L017 | WARN | 未显式设置 maxSteps | Y_n 的 n 由框架隐式决定 |
| L018 | WARN | maxSteps > 100 | `Y_{>100} ≈ Y` 近似无界 |
| L019 | INFO | is_termination_msg 检测到 | AutoGen 字符串匹配终止 |
| L020 | WARN | allow_delegation 但无 peer | 委派目标未定义 |
| L021 | ERROR | 多 Agent 无终止条件 | GroupChat Y 无基 case 且无界 |
| L022 | WARN | 有 terminate 但无 maxSteps | LLM 不调 terminate 则无限循环 |
| L023 | ERROR | router 路由目标为空 | CASE 分支 → ⊥ |
| L024 | WARN | chain 中重复 agent | `f >> g >> f` 冗余组合 |
| L025 | WARN | guard 无 retry | 验证失败无恢复 |
| L026 | INFO | 远程依赖检测 | Oracle 依赖外部服务 |

### A.18 运行时覆盖 (overrides)

`from_config(path, **overrides)` 支持以下运行时覆盖：

| Override | 覆盖字段 | 说明 |
|----------|---------|------|
| `model="gpt-4o"` | `model.name` | 替换模型 |
| `temperature=0.5` | `model.temperature` | 替换温度 |
| `max_steps=30` | `react.maxSteps` | 替换最大步数 |
| `tools={"search": fn}` | MCP 工具实现 | 注入自定义工具函数 |
| `memory_store={"key": "val"}` | Memory 初始值 | 注入初始记忆 |
| `_confirm_callback=fn` | ToolGateway 确认回调 | HIGH-risk 时调用 |
| `_audit_log_path="audit.jsonl"` | 审计日志路径 | 持久化审计记录 |

```python
agent = from_config("config.yml",
    model="gpt-4o",
    temperature=0.5,
    max_steps=30,
    tools={"search": my_search_fn},
    memory_store={"user_name": "Alice"}
)
```
