mirror of
https://github.com/justlovemaki/AIClient-2-API.git
synced 2026-04-25 09:25:59 +03:00
[PR #232] [CLOSED] fix:通过消息分类,语义去重方式进行上下文压缩 #312
Labels
No labels
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
starred/AIClient-2-API-justlovemaki#312
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
📋 Pull Request Information
Original PR: https://github.com/justlovemaki/AIClient-2-API/pull/232
Author: @LTctfer
Created: 1/14/2026
Status: ❌ Closed
Base:
main← Head:fix-By-performing-information-categorization-and-semantic-deduplication,-the-context-is-compressed📝 Commits (1)
8b950c7fix:通过消息分类,语义去重方式进行上下文压缩📊 Changes
10 files changed (+2862 additions, -1 deletions)
View changed files
📝
package-lock.json(+3 -1)➕
src/context-compression/ContextCompressor.js(+449 -0)➕
src/context-compression/FileModificationTracker.js(+298 -0)➕
src/context-compression/ManualCompressor.js(+405 -0)➕
src/context-compression/MessageClassifier.js(+298 -0)➕
src/context-compression/SemanticDeduplicator.js(+555 -0)➕
src/context-compression/WeightScorer.js(+344 -0)➕
src/context-compression/index.js(+80 -0)➕
src/context-compression/test-manual.js(+197 -0)➕
src/context-compression/test.js(+233 -0)📄 Description
Problem
长对话上下文会导致:
典型场景:
┌──────────────────┬────────┬──────────────┐
│ 场景 │ 重复率 │ Token 浪费 │
├──────────────────┼────────┼──────────────┤
│ 多次读取同一文件 │ 高 │ ~5000 tokens │
├──────────────────┼────────┼──────────────┤
│ 相似搜索重复执行 │ 中 │ ~1500 tokens │
├──────────────────┼────────┼──────────────┤
│ 目录列表重复 │ 高 │ ~500 tokens │
├──────────────────┼────────┼──────────────┤
│ 相同错误信息 │ 高 │ ~2000 tokens │
└──────────────────┴────────┴──────────────┘
Solution
实现两层压缩策略:
原始消息 → 语义去重 → 消息分类 → 权重打分 → 压缩处理 → 压缩后消息
消息分类与权重:
USER_INSTRUCTION: 100 // 永不压缩
KEY_STATE: 80 // 轻度压缩
INTERMEDIATE_REASONING: 40 // 激进压缩
FAILURE_RECORD: 20 // 可丢弃
语义去重:
调用 Kiro API 让 AI 生成压缩摘要:
const compressor = new ManualCompressor({
apiEndpoint: 'http://localhost:3060/claude-kiro-oauth/v1/messages',
apiKey: 'optional-key',
model: 'claude-opus-4-5-20251101'
});
const result = await compressor.compress(messages);
Architecture
src/context-compression/
├── index.js # 入口,导出所有组件
├── ContextCompressor.js # 主压缩器(整合流水线)
├── MessageClassifier.js # 消息分类器(4类)
├── WeightScorer.js # 权重打分(时间衰减+长度惩罚)
├── SemanticDeduplicator.js # 语义去重(指纹+相似度)
├── FileModificationTracker.js # 文件修改追踪
├── ManualCompressor.js # 手动压缩(调用 Kiro API)
└── test.js / test-manual.js # 测试文件
Test Results
本地压缩测试 - ALL PASSED ✅
┌──────────┬────────────┬────────────┬──────┐
│ 指标 │ 压缩前 │ 压缩后 │ 效果 │
├──────────┼────────────┼────────────┼──────┤
│ 消息数 │ 22 │ 12 │ -45% │
├──────────┼────────────┼────────────┼──────┤
│ 大小 │ 6138 chars │ 1018 chars │ -83% │
├──────────┼────────────┼────────────┼──────┤
│ 处理时间 │ - │ 2ms │ 极快 │
└──────────┴────────────┴────────────┴──────┘
分类分布:
Usage
// 方式1: 本地快速压缩
import { ContextCompressor } from './context-compression/index.js';
const compressor = new ContextCompressor();
const result = compressor.compress(messages);
// 方式2: 手动 AI 压缩 (/compact 命令)
import { ManualCompressor } from './context-compression/index.js';
const manual = new ManualCompressor({ apiKey: 'xxx' });
const result = await manual.compress(messages);
// 方式3: 快捷函数
import { compressContext, manualCompress } from './context-compression/index.js';
compressContext(messages); // 本地压缩
await manualCompress(messages, { apiKey }); // AI 压缩
Impact
✅ 压缩率 83%:大幅减少 token 消耗
✅ 处理速度 2ms:本地压缩几乎无延迟
✅ 保留关键信息:用户指令永不丢失
✅ 智能去重:相同文件读取自动合并
✅ 文件变化感知:修改后的文件不会被错误去重
✅ 双模式支持:本地规则 + AI 压缩可选
Changes
新增: src/context-compression/index.js
新增: src/context-compression/ContextCompressor.js
新增: src/context-compression/MessageClassifier.js
新增: src/context-compression/WeightScorer.js
新增: src/context-compression/SemanticDeduplicator.js
新增: src/context-compression/FileModificationTracker.js
新增: src/context-compression/ManualCompressor.js
新增: src/context-compression/test.js
新增: src/context-compression/test-manual.js
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.