lean-ctx 超越了模式匹配。六种来自信息论、图论和统计力学的算法协同工作,自动决定保留什么、删除什么、以及如何排列--全部自动化,完全本地运行,无需配置。
这些算法驱动自主智能层。它们在每次 ctx_read、ctx_preload 和 ctx_overview 调用时激活--您无需直接调用它们。
各层如何协同工作
| 算法 | 决定 | 基于 |
|---|---|---|
| Spectral Relevance | 哪些文件重要 | 依赖图 + PageRank |
| Boltzmann Allocation | 每个文件分配多少 token | 任务具体性 + 相关性分数 |
| Predictive Surprise | 保留哪些行 | BPE token 的交叉熵 |
| MMR Deduplication | 哪些行是冗余的 | bigram Jaccard 相似度 |
| Semantic Chunking | 如何排序输出 | AST 边界 + 注意力流 |
| BPE Optimization | 如何编码最终文本 | token 级压缩规则 |
预测惊奇度评分
传统压缩过滤器使用原始字符的 Shannon 熵,将 aaaa 和 import 视为同等可预测。预测惊奇度改为测量相对于 BPE token 频率的交叉熵--衡量每行对 LLM 分词器的惊奇程度。
工作原理
- 使用
o200k_base(GPT-4o / Claude 分词器)对每行进行分词。 - 对每个 token,基于排名的 Zipf 先验估计预期频率。
- 计算交叉熵:包含常见 token 的行(样板代码)得分低;包含罕见 token 的行(复杂逻辑)得分高。
- 低于惊奇度阈值的行在激进压缩中成为移除候选。
示例
// Low surprise (boilerplate) - candidate for removal:
return Ok(()); // surprise: 0.12
use std::collections::HashMap; // surprise: 0.18
// High surprise (unique logic) - always preserved:
let decay = (-alpha * dist as f64).exp(); // surprise: 0.89
scores[j] += heat[i] * decay / degree; // surprise: 0.94 为什么重要
与字符级熵相比,预测惊奇度额外移除 15–30% 的样板代码,同时保留复杂逻辑。它直接建模 LLM 认为"有信息量"的内容,因为它使用相同的 BPE 词汇表。
谱相关性传播
当您要求 lean-ctx 为某个任务预加载上下文时,它需要决定哪些文件重要。简单的关键词匹配只能找到提及搜索词的文件。谱相关性能找到与相关文件在结构上相连的文件--即使它们没有共同的关键词。
工作原理
两种图算法在项目的依赖图上运行:
- 热扩散 - 与任务描述匹配的种子文件获得初始"热量"。热量沿导入边以指数衰减传播,模拟信息在代码库中的流动。
- PageRank 中心性 - 被许多其他文件导入的文件获得更高的中心性分数。这可以识别结构枢纽(例如,被 20 个模块导入的
db.ts)。
最终相关性分数综合两者:0.7 × heat + 0.3 × pagerank。低于阈值的文件不会被预加载。
示例
Task: "fix authentication bug"
Direct matches: auth.ts, login.ts
Heat diffusion adds: middleware.ts (imports auth.ts)
session.ts (imported by auth.ts)
PageRank promotes: db.ts (imported by 18 files - structural hub)
Result: 5 files preloaded instead of 2, covering the full blast radius. 零配置
依赖图在首次使用时通过 load_or_build() 自动构建。无需 ctx_graph build--开箱即用。
Boltzmann 上下文分配
当谱相关性选出相关文件后,每个文件需要分配 token 预算。简单的方法是平均分配或按相关性排序。Boltzmann 分配使用统计力学来最优分配 token。
工作原理
- 每个文件都有一个来自谱相关性的相关性分数 Ei。
- 温度参数 β 由任务推导得出:具体任务("修复 login.ts 中的认证 bug")产生低温(将预算集中分配给顶部文件);宽泛任务("重构代码库")产生高温(均匀分配)。
- token 预算遵循 Boltzmann 分布:
budgeti = total × (eβ·Ei / Σ eβ·Ej) - 强制执行最小和最大预算限制(每文件 128–4096 个 token),并根据分配的预算选择压缩模式(
full、map、signatures)。
示例
Task: "fix the JWT validation in auth middleware"
Task specificity: 0.85 (specific) → β = 4.2
File | Relevance | Budget | Mode
auth.ts | 0.92 | 3,200 | full
middleware.ts | 0.78 | 1,800 | full
session.ts | 0.45 | 420 | map
db.ts | 0.31 | 180 | signatures
routes.ts | 0.22 | 128 | signatures
─────
Total: 5,728 tokens (within 8,000 budget) Reciprocal Rank Fusion (RRF) Cache Eviction
lean-ctx uses Reciprocal Rank Fusion for cache eviction decisions, replacing the earlier Boltzmann-inspired weighted scoring. RRF handles incomparable signals (time in seconds, frequency as counts, size in tokens) without arbitrary weight tuning.
| Aspect | Legacy (Boltzmann) | Current (RRF) |
|---|---|---|
| Signal handling | Mixed units in one formula (0.4×recency + 0.3×frequency + 0.3×size) | Each signal ranked independently, then fused |
| Weight tuning | Requires manual weight calibration (arbitrary 0.4/0.3/0.3) | No weights - only K=60 (standard IR parameter) |
| Edge cases | Large files dominate due to log-scaling of size | Fair treatment - each signal contributes equally via rank |
Formula: RRF(d) = Σ 1/(K + ranki(d)) - entries with the lowest fused score are evicted first. This produces monotonically correct ordering regardless of signal magnitude differences.
语义分块与注意力桥接
LLM 存在"中间遗失"问题:上下文开头和结尾的信息比中间内容获得更多注意力。语义分块重新组织输出以最小化信息损失。
工作原理
- 分块检测 - 源代码行根据 AST 边界启发式算法分组为语义块(函数、类型、导入、松散逻辑)。
- 相关性排序 - 与当前任务匹配的块被提升到顶部(高注意力位置)。其余块按类型优先级排序。
- 注意力桥接 - 在块之间,lean-ctx 插入最小化的桥接标记(
---),以便 LLM 识别结构边界。 - 尾部锚点 - 最高优先级块的最后 2–3 行在输出末尾重复,利用近因偏差来强调关键信息。
示例
// Without chunking (flat output):
import { db } from '../pages/docs/db';
import { hash } from '../pages/docs/crypto';
const MAX_RETRIES = 3;
export function createUser(...) { ... }
export function validateToken(...) { ... } ← lost in the middle
export function deleteUser(...) { ... }
// With semantic chunking (task: "fix token validation"):
export function validateToken(...) { ... } ← promoted to top
---
export function createUser(...) { ... }
export function deleteUser(...) { ... }
---
import { db } from '../pages/docs/db';
const MAX_RETRIES = 3;
---
// anchor: validateToken signature ← tail anchor MMR 去重
当多个文件加载到上下文中时,它们通常包含重复的导入、共享的样板代码或非常相似的代码模式。最大边际相关性(MMR)在保留唯一信息的同时移除这些冗余。
工作原理
- 对每一行,计算与所有已选行("覆盖集")的 bigram Jaccard 相似度。
- MMR 分数在相关性和冗余之间取得平衡:
MMR(l) = λ × relevance(l) - (1 - λ) × max_similarity(l, selected) MMR < 0的行被抑制--它们增加的冗余多于信息。λ 参数默认为 0.7(倾向于相关性而非多样性)。
影响
在典型的多文件预加载中,MMR 移除 10–28% 的冗余内容--主要是共享的导入和重复的工具函数模式。
BPE 对齐 token 优化
在所有内容被选择和排序之后,最终阶段会针对 LLM 的 BPE 分词器优化原始文本。微小的格式调整可以在不改变语义的情况下显著减少 token 数量。
优化规则
| 之前 | 之后 | token 节省 |
|---|---|---|
function | fn | 每次出现节省 1 个 token |
-> | -> | 2 → 1 个 token |
=> | => | 2 → 1 个 token |
{ } | {} | 2 → 1 个 token |
(4 个空格) | (2 个空格) | 约 50% 的缩进节省 |
'static 'static 生命周期 | 在安全的情况下省略 | 每次出现节省 2 个 token |
工作原理
每条规则是一个简单的字符串替换,在所有其他压缩阶段之后逐行应用。规则源自 BPE token 边界分析--它们针对分词器为语义等价文本产生过多 token 的模式。
影响
BPE 优化通常在已压缩的输出上额外节省 3–8% 的 token。这些节省在多个文件之间累积,对冗长的语言(TypeScript、Java、C#)效果最为显著。
验证效果
在项目中运行 lean-ctx benchmark run 以衡量所有六种算法的综合效果。基准报告显示每个文件的 token 节省、保留度评分(AST、标识符、行数)和整体压缩率。
$ lean-ctx benchmark run
──────────────────────────────────────────
BENCHMARK - /Users/you/project
──────────────────────────────────────────
Files: 143
Total: 285,401 → 42,810 tokens (85% reduction)
Avg/file: 1,997 → 300 tokens
Preservation:
AST: 98.2%
Identifiers: 97.4%
Lines: 96.1%
Mode breakdown:
full: 68% of files
map: 22% of files
signatures: 8% of files
aggressive: 2% of files 结构化意图识别
lean-ctx将每个交互分类为StructuredIntent--一种基于槽位的表示,包含任务类型、置信度、目标文件、范围、语言提示、紧急程度和动作动词。这驱动所有下游决策:使用哪种压缩模式、如何路由上下文以及优先处理什么。
识别9种任务类型:Explore、Generate、FixBug、Refactor、Test、Review、Config、Deploy和Document。每种类型触发不同的压缩策略和上下文路由。
IntentScope从SingleFile到MultiFile、CrossModule再到ProjectWide--决定上下文收集的广度。
工作原理
压缩按意图自适应:FixBug任务通过信息瓶颈过滤器优先处理错误行和测试文件,Explore任务使用轻量清理保留结构,Generate任务聚焦于签名和类型。
ctx_read的自动模式选择器使用当前任务类型优化决策--为大文件的错误修复选择task模式,为探索选择map模式,为文档任务选择signatures模式。
示例
Query: "fix the NaN bug in entropy.rs"
StructuredIntent:
task_type: FixBug (confidence: 0.95)
targets: ["entropy.rs"]
scope: SingleFile
language: Rust
urgency: 0.8
action_verb: "fix"
→ Compression: Information Bottleneck filter (error lines boosted)
→ Mode: task (error-focused extraction)
→ Suggestions: tests/entropy_test.rs (deficit detection) 上下文管道架构
上下文管道通过六个不同层处理信息:Input → Intent → Relevance → Compression → Translation → Delivery。每层有定义的契约(输入/输出类型)并输出指标。
工作原理
Input → Intent → Relevance → Compression → Terse Engine → Delivery
│ │ │ │ │ │
│ │ │ │ │ └─ Final output to LLM
│ │ │ │ └─ 4-layer terse pipeline (see below)
│ │ │ └─ AST-aware compression per intent
│ │ └─ Graph heat + relevance scoring
│ └─ StructuredIntent classification
└─ Raw file content / shell output 每层指标跟踪输入token、输出token、压缩率和处理时间。在整个会话中汇总后,揭示最大节省发生在哪里以及哪些层是瓶颈。
4-Layer Terse Engine
The terse engine applies four composable compression layers, controlled by
compression_level
(Off / Lite / Standard / Max). Each layer is independently verified by Lean4 proofs
(TerseQuality, TerseEngine — part of 82 total theorems).
| Layer | Name | What it does |
|---|---|---|
| 1 | Dictionary | Common token substitutions and abbreviations (function → fn, return → ret) |
| 2 | Residual | Whitespace normalization, blank-line collapse, boilerplate removal |
| 3 | Scoring | Information-theoretic ranking — keeps high-surprise blocks, prunes low-entropy filler |
| 4 | Pipeline | CEP v1 protocol: delta-only output, structured notation (+/-/~), token budgets |
上下文账本与压力管理
ContextLedger跟踪发送给AI的每个文件:路径、压缩模式、原始token、发送token和时间戳。实时计算上下文窗口利用率和压力。
工作原理
三个压力级别:None(利用率低于70%)、Compress(70-90%)和Evict(超过90%)。在每个级别,系统采取不同操作--降级相关性较低文件的压缩模式或建议驱逐。
示例
Context Window: 128,000 tokens
Loaded: 89,600 tokens (70% utilization)
Pressure: None → safe
After loading 3 more files:
Loaded: 115,200 tokens (90% utilization)
Pressure: Compress → downgrade non-target files
Re-Injection Plan:
utils.rs: full → signatures (save 2,400 tokens)
helpers.rs: full → map (save 1,800 tokens)
config.rs: full → signatures (save 1,200 tokens)
Protected: auth.rs, login.ts (target files) 上下文缺陷检测识别缺失信息:如果修复错误任务针对auth.rs但未加载测试文件,系统建议tests/auth_test.rs。对于配置任务,推荐Cargo.toml、.env或Dockerfile。
智能重注入生成计划,通过降级非目标文件(如从full模式切换到signatures模式)释放上下文预算,同时保护对当前意图至关重要的文件。
多代理智能
当多个AI代理协作时(如编码者和审查者),lean-ctx提供结构化交接、基于角色的上下文深度和跨代理知识共享。
工作原理
HandoffPackage将当前会话账本、结构化意图和上下文快照打包成一个可转移单元--让接收代理以完整的情境意识开始,而不是从空白开始。
识别七种代理角色:Coder、Reviewer、Planner、Explorer、Debugger、Tester和Orchestrator。每个角色获得定制的ContextDepthConfig--编码者获得更多完整文件读取,审查者获得更多签名,探索者获得更广泛的图上下文。
示例
Agent "coder-1" (role: Coder):
max_files_full: 8
preferred_mode: full
context_budget: 80%
Agent "reviewer-1" (role: Reviewer):
max_files_full: 3
preferred_mode: signatures
context_budget: 60%
Shared Knowledge:
K:discovery:auth_bug = "null check missing in line 42"
K:decision:fix_approach = "add Option<T> wrapper"
→ reviewer-1 inherits these facts without re-reading files 跨代理知识共享允许代理通过共享便签本交换结构化事实(如"discovery:auth_bug=第42行缺少空检查")。新代理继承相关知识,无需重新发现。
Community Detection (Louvain)
The core::community module clusters files by their dependency graph using the
Louvain algorithm. This groups tightly-coupled files into communities, enabling
more intelligent context selection — files in the same community as your target are prioritized
for preloading and receive higher relevance scores during task-driven reads.
Code Smell Detection
The ctx_smells tool detects long functions, deep nesting, and high cyclomatic complexity
using the core::smells module. Detected smells are scored with graph-enriched weighting —
files with high PageRank or many dependents receive amplified smell scores, surfacing maintenance
hotspots that have the widest blast radius across the codebase.