[PR #232] [CLOSED] fix:通过消息分类,语义去重方式进行上下文压缩 #312

Closed
opened 2026-02-27 07:18:55 +03:00 by kerem · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/justlovemaki/AIClient-2-API/pull/232
Author: @LTctfer
Created: 1/14/2026
Status: Closed

Base: mainHead: fix-By-performing-information-categorization-and-semantic-deduplication,-the-context-is-compressed


📝 Commits (1)

  • 8b950c7 fix:通过消息分类,语义去重方式进行上下文压缩

📊 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 消耗过高:重复读取同一文件、相同搜索结果占用大量 token
  • 上下文溢出:超过模型上下文窗口限制
  • 响应变慢:处理大量历史消息增加延迟

典型场景:
┌──────────────────┬────────┬──────────────┐
│ 场景 │ 重复率 │ Token 浪费 │
├──────────────────┼────────┼──────────────┤
│ 多次读取同一文件 │ 高 │ ~5000 tokens │
├──────────────────┼────────┼──────────────┤
│ 相似搜索重复执行 │ 中 │ ~1500 tokens │
├──────────────────┼────────┼──────────────┤
│ 目录列表重复 │ 高 │ ~500 tokens │
├──────────────────┼────────┼──────────────┤
│ 相同错误信息 │ 高 │ ~2000 tokens │
└──────────────────┴────────┴──────────────┘
Solution

实现两层压缩策略:

  1. 本地压缩(规则驱动)

原始消息 → 语义去重 → 消息分类 → 权重打分 → 压缩处理 → 压缩后消息

消息分类与权重:
USER_INSTRUCTION: 100 // 永不压缩
KEY_STATE: 80 // 轻度压缩
INTERMEDIATE_REASONING: 40 // 激进压缩
FAILURE_RECORD: 20 // 可丢弃

语义去重:

  • 幂等工具(Read/Grep/Glob)相同调用合并
  • 文件修改追踪,避免错误去重已变化内容
  • 指纹生成:hash(tool_name + params)
  1. 手动压缩(AI 驱动)

调用 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 │ 极快 │
└──────────┴────────────┴────────────┴──────┘
分类分布:

  • 用户指令: 6 条 (保留)
  • 中间推理: 11 条 (压缩/丢弃)
  • 关键状态: 3 条 (轻压缩)
  • 失败记录: 2 条 (丢弃)

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.

## 📋 Pull Request Information **Original PR:** https://github.com/justlovemaki/AIClient-2-API/pull/232 **Author:** [@LTctfer](https://github.com/LTctfer) **Created:** 1/14/2026 **Status:** ❌ Closed **Base:** `main` ← **Head:** `fix-By-performing-information-categorization-and-semantic-deduplication,-the-context-is-compressed` --- ### 📝 Commits (1) - [`8b950c7`](https://github.com/justlovemaki/AIClient-2-API/commit/8b950c7f4d4ed670a43d5c83d68f122540eabb3e) fix:通过消息分类,语义去重方式进行上下文压缩 ### 📊 Changes **10 files changed** (+2862 additions, -1 deletions) <details> <summary>View changed files</summary> 📝 `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) </details> ### 📄 Description Problem 长对话上下文会导致: - Token 消耗过高:重复读取同一文件、相同搜索结果占用大量 token - 上下文溢出:超过模型上下文窗口限制 - 响应变慢:处理大量历史消息增加延迟 典型场景: ┌──────────────────┬────────┬──────────────┐ │ 场景 │ 重复率 │ Token 浪费 │ ├──────────────────┼────────┼──────────────┤ │ 多次读取同一文件 │ 高 │ ~5000 tokens │ ├──────────────────┼────────┼──────────────┤ │ 相似搜索重复执行 │ 中 │ ~1500 tokens │ ├──────────────────┼────────┼──────────────┤ │ 目录列表重复 │ 高 │ ~500 tokens │ ├──────────────────┼────────┼──────────────┤ │ 相同错误信息 │ 高 │ ~2000 tokens │ └──────────────────┴────────┴──────────────┘ Solution 实现两层压缩策略: 1. 本地压缩(规则驱动) 原始消息 → 语义去重 → 消息分类 → 权重打分 → 压缩处理 → 压缩后消息 消息分类与权重: USER_INSTRUCTION: 100 // 永不压缩 KEY_STATE: 80 // 轻度压缩 INTERMEDIATE_REASONING: 40 // 激进压缩 FAILURE_RECORD: 20 // 可丢弃 语义去重: - 幂等工具(Read/Grep/Glob)相同调用合并 - 文件修改追踪,避免错误去重已变化内容 - 指纹生成:hash(tool_name + params) 2. 手动压缩(AI 驱动) 调用 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 │ 极快 │ └──────────┴────────────┴────────────┴──────┘ 分类分布: - 用户指令: 6 条 (保留) - 中间推理: 11 条 (压缩/丢弃) - 关键状态: 3 条 (轻压缩) - 失败记录: 2 条 (丢弃) 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 --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
kerem 2026-02-27 07:18:55 +03:00
Sign in to join this conversation.
No labels
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/AIClient-2-API-justlovemaki#312
No description provided.