yuangs 5.59.0 → 5.63.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/DualAgentRuntime.d.ts +15 -1
- package/dist/agent/DualAgentRuntime.js +62 -37
- package/dist/agent/DualAgentRuntime.js.map +1 -1
- package/dist/agent/PlanCache.d.ts +207 -0
- package/dist/agent/PlanCache.js +468 -0
- package/dist/agent/PlanCache.js.map +1 -0
- package/dist/agent/executor.d.ts +4 -0
- package/dist/agent/executor.js +48 -2
- package/dist/agent/executor.js.map +1 -1
- package/dist/agent/governance/riskScoring.d.ts +118 -0
- package/dist/agent/governance/riskScoring.js +422 -0
- package/dist/agent/governance/riskScoring.js.map +1 -0
- package/dist/agent/governance.d.ts +26 -0
- package/dist/agent/governance.js +86 -5
- package/dist/agent/governance.js.map +1 -1
- package/dist/agent/protocolV2_2.js +31 -10
- package/dist/agent/protocolV2_2.js.map +1 -1
- package/dist/agent/relevance.d.ts +93 -0
- package/dist/agent/relevance.js +345 -1
- package/dist/agent/relevance.js.map +1 -1
- package/dist/agent/smartContextManager.d.ts +22 -1
- package/dist/agent/smartContextManager.js +108 -4
- package/dist/agent/smartContextManager.js.map +1 -1
- package/dist/agent/state.d.ts +3 -0
- package/dist/commands/contextStorage.d.ts +32 -0
- package/dist/commands/contextStorage.js +81 -0
- package/dist/commands/contextStorage.js.map +1 -1
- package/dist/core/modelRouter/AdaptiveWeights.d.ts +134 -0
- package/dist/core/modelRouter/AdaptiveWeights.js +300 -0
- package/dist/core/modelRouter/AdaptiveWeights.js.map +1 -0
- package/dist/core/modelRouter/ModelRouter.d.ts +45 -3
- package/dist/core/modelRouter/ModelRouter.js +138 -6
- package/dist/core/modelRouter/ModelRouter.js.map +1 -1
- package/dist/core/modelRouter/MultiMetricSupervisor.d.ts +99 -0
- package/dist/core/modelRouter/MultiMetricSupervisor.js +267 -0
- package/dist/core/modelRouter/MultiMetricSupervisor.js.map +1 -0
- package/dist/core/modelRouter/policies/DslPolicy.d.ts +16 -1
- package/dist/core/modelRouter/policies/DslPolicy.js +22 -1
- package/dist/core/modelRouter/policies/DslPolicy.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,3 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 清理过期配置
|
|
3
|
+
*/
|
|
4
|
+
export interface CleanupOptions {
|
|
5
|
+
/** 最大保留天数(默认 90 天) */
|
|
6
|
+
maxAge?: number;
|
|
7
|
+
/** 最低重要性阈值(默认 0.2) */
|
|
8
|
+
minImportance?: number;
|
|
9
|
+
/** 最大保留项目数(默认 1000) */
|
|
10
|
+
maxItems?: number;
|
|
11
|
+
/** 是否保留 pinned 项目(默认 true) */
|
|
12
|
+
respectPinned?: boolean;
|
|
13
|
+
}
|
|
1
14
|
export declare function loadContext(): Promise<any[]>;
|
|
2
15
|
export declare function saveContext(items: any[]): Promise<void>;
|
|
3
16
|
export declare function clearContextStorage(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* 主动遗忘:清理过期和低价值的上下文项
|
|
19
|
+
*
|
|
20
|
+
* 清理策略:
|
|
21
|
+
* 1. 高重要性(>0.7)的项目永久保留
|
|
22
|
+
* 2. Pinned 项目永久保留(除非 respectPinned=false)
|
|
23
|
+
* 3. 超过 maxAge 天数的低价值项目被移除
|
|
24
|
+
* 4. 低于 minImportance 的项目被移除
|
|
25
|
+
* 5. 最终按重要性排序,保留最多 maxItems 个项目
|
|
26
|
+
*
|
|
27
|
+
* @param options 清理配置选项
|
|
28
|
+
* @returns 清理统计信息
|
|
29
|
+
*/
|
|
30
|
+
export declare function cleanupStaleContext(options?: CleanupOptions): Promise<{
|
|
31
|
+
beforeCount: number;
|
|
32
|
+
afterCount: number;
|
|
33
|
+
removedCount: number;
|
|
34
|
+
removedPaths: string[];
|
|
35
|
+
}>;
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.loadContext = loadContext;
|
|
7
7
|
exports.saveContext = saveContext;
|
|
8
8
|
exports.clearContextStorage = clearContextStorage;
|
|
9
|
+
exports.cleanupStaleContext = cleanupStaleContext;
|
|
9
10
|
const promises_1 = __importDefault(require("fs/promises"));
|
|
10
11
|
const path_1 = __importDefault(require("path"));
|
|
11
12
|
const CONTEXT_DIR = path_1.default.resolve(process.cwd(), '.ai');
|
|
@@ -26,4 +27,84 @@ async function saveContext(items) {
|
|
|
26
27
|
async function clearContextStorage() {
|
|
27
28
|
await promises_1.default.rm(CONTEXT_FILE, { force: true });
|
|
28
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* 主动遗忘:清理过期和低价值的上下文项
|
|
32
|
+
*
|
|
33
|
+
* 清理策略:
|
|
34
|
+
* 1. 高重要性(>0.7)的项目永久保留
|
|
35
|
+
* 2. Pinned 项目永久保留(除非 respectPinned=false)
|
|
36
|
+
* 3. 超过 maxAge 天数的低价值项目被移除
|
|
37
|
+
* 4. 低于 minImportance 的项目被移除
|
|
38
|
+
* 5. 最终按重要性排序,保留最多 maxItems 个项目
|
|
39
|
+
*
|
|
40
|
+
* @param options 清理配置选项
|
|
41
|
+
* @returns 清理统计信息
|
|
42
|
+
*/
|
|
43
|
+
async function cleanupStaleContext(options = {}) {
|
|
44
|
+
const { maxAge = 90, // 默认 90 天
|
|
45
|
+
minImportance = 0.2, // 默认最低重要性 0.2
|
|
46
|
+
maxItems = 1000, // 默认最多 1000 个项目
|
|
47
|
+
respectPinned = true // 默认保留 pinned 项目
|
|
48
|
+
} = options;
|
|
49
|
+
const items = await loadContext();
|
|
50
|
+
const now = Date.now();
|
|
51
|
+
const beforeCount = items.length;
|
|
52
|
+
const removedPaths = [];
|
|
53
|
+
const filtered = items.filter((item) => {
|
|
54
|
+
// 高重要性永久保留
|
|
55
|
+
if (item.importance && item.importance > 0.7)
|
|
56
|
+
return true;
|
|
57
|
+
// Pinned 项目永久保留(除非配置不尊重 pinned)
|
|
58
|
+
if (respectPinned && item.pinned)
|
|
59
|
+
return true;
|
|
60
|
+
// 计算年龄
|
|
61
|
+
const createdAt = item.addedAt || item.lastUsedAt;
|
|
62
|
+
if (!createdAt) {
|
|
63
|
+
// 没有时间戳的项目,如果是低重要性则移除
|
|
64
|
+
if (item.importance !== undefined && item.importance < minImportance) {
|
|
65
|
+
removedPaths.push(item.path);
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
const ageDays = (now - createdAt) / (1000 * 60 * 60 * 24);
|
|
71
|
+
// 超过最大年龄,移除
|
|
72
|
+
if (ageDays > maxAge) {
|
|
73
|
+
removedPaths.push(item.path);
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
// 低于最低重要性,移除
|
|
77
|
+
if (item.importance !== undefined && item.importance < minImportance) {
|
|
78
|
+
removedPaths.push(item.path);
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
return true;
|
|
82
|
+
});
|
|
83
|
+
// 如果仍超限,按重要性排序后截断
|
|
84
|
+
let final = filtered;
|
|
85
|
+
if (filtered.length > maxItems) {
|
|
86
|
+
const sorted = filtered.sort((a, b) => {
|
|
87
|
+
// 优先保留 pinned
|
|
88
|
+
if (respectPinned) {
|
|
89
|
+
if (a.pinned && !b.pinned)
|
|
90
|
+
return -1;
|
|
91
|
+
if (!a.pinned && b.pinned)
|
|
92
|
+
return 1;
|
|
93
|
+
}
|
|
94
|
+
// 按重要性降序
|
|
95
|
+
return (b.importance || 0.5) - (a.importance || 0.5);
|
|
96
|
+
});
|
|
97
|
+
const removed = sorted.slice(maxItems);
|
|
98
|
+
removedPaths.push(...removed.map((item) => item.path));
|
|
99
|
+
final = sorted.slice(0, maxItems);
|
|
100
|
+
}
|
|
101
|
+
// 保存清理后的数据
|
|
102
|
+
await saveContext(final);
|
|
103
|
+
return {
|
|
104
|
+
beforeCount,
|
|
105
|
+
afterCount: final.length,
|
|
106
|
+
removedCount: beforeCount - final.length,
|
|
107
|
+
removedPaths
|
|
108
|
+
};
|
|
109
|
+
}
|
|
29
110
|
//# sourceMappingURL=contextStorage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contextStorage.js","sourceRoot":"","sources":["../../src/commands/contextStorage.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"contextStorage.js","sourceRoot":"","sources":["../../src/commands/contextStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { RoutingStrategy } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* 执行结果,用于学习
|
|
4
|
+
*/
|
|
5
|
+
export interface ExecutionOutcome {
|
|
6
|
+
success: boolean;
|
|
7
|
+
executionTime: number;
|
|
8
|
+
costLevel: number;
|
|
9
|
+
timestamp: number;
|
|
10
|
+
strategy: RoutingStrategy;
|
|
11
|
+
modelName: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 权重配置
|
|
15
|
+
*/
|
|
16
|
+
export interface WeightConfig {
|
|
17
|
+
taskMatch?: number;
|
|
18
|
+
context?: number;
|
|
19
|
+
latency?: number;
|
|
20
|
+
cost?: number;
|
|
21
|
+
history?: number;
|
|
22
|
+
quality?: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 权重历史记录
|
|
26
|
+
*/
|
|
27
|
+
interface WeightSnapshot {
|
|
28
|
+
weights: WeightConfig;
|
|
29
|
+
timestamp: number;
|
|
30
|
+
outcomeCount: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 学习超参数配置
|
|
34
|
+
*/
|
|
35
|
+
export interface LearningConfig {
|
|
36
|
+
/** 学习率 (0-1),默认 0.1 */
|
|
37
|
+
learningRate: number;
|
|
38
|
+
/** 最小样本数才开始学习,默认 10 */
|
|
39
|
+
minSamples: number;
|
|
40
|
+
/** 历史窗口大小,默认 100 */
|
|
41
|
+
historyWindow: number;
|
|
42
|
+
/** 权重衰减因子,防止权重无限增长,默认 0.01 */
|
|
43
|
+
weightDecay: number;
|
|
44
|
+
/** 奖励归一化因子 */
|
|
45
|
+
rewardNormalization: {
|
|
46
|
+
latency: number;
|
|
47
|
+
cost: number;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 自适应权重学习系统
|
|
52
|
+
*
|
|
53
|
+
* 使用强化学习思想,根据执行结果动态调整策略权重
|
|
54
|
+
*
|
|
55
|
+
* 核心算法:
|
|
56
|
+
* 1. 收集执行结果
|
|
57
|
+
* 2. 计算奖励函数 (综合考虑延迟、成本、成功率)
|
|
58
|
+
* 3. 使用梯度上升更新权重
|
|
59
|
+
* 4. 应用权重衰减防止过拟合
|
|
60
|
+
*
|
|
61
|
+
* 奖励函数设计:
|
|
62
|
+
* reward = w_latency * (-latency/normalize) +
|
|
63
|
+
* w_cost * (-cost/normalize) +
|
|
64
|
+
* w_success * (success ? 1 : -1)
|
|
65
|
+
*/
|
|
66
|
+
export declare class AdaptiveWeights {
|
|
67
|
+
private weightsHistory;
|
|
68
|
+
private outcomeHistory;
|
|
69
|
+
private currentWeights;
|
|
70
|
+
private config;
|
|
71
|
+
private readonly DEFAULT_WEIGHTS;
|
|
72
|
+
constructor(config?: Partial<LearningConfig>);
|
|
73
|
+
/**
|
|
74
|
+
* 记录执行结果
|
|
75
|
+
*/
|
|
76
|
+
recordOutcome(outcome: ExecutionOutcome): void;
|
|
77
|
+
/**
|
|
78
|
+
* 获取当前策略权重
|
|
79
|
+
*/
|
|
80
|
+
getWeights(strategy: RoutingStrategy): WeightConfig;
|
|
81
|
+
/**
|
|
82
|
+
* 获取权重历史
|
|
83
|
+
*/
|
|
84
|
+
getWeightHistory(strategy: RoutingStrategy): WeightSnapshot[];
|
|
85
|
+
/**
|
|
86
|
+
* 核心权重更新算法 (梯度上升)
|
|
87
|
+
*
|
|
88
|
+
* 对于每个权重维度:
|
|
89
|
+
* new_weight = old_weight + learning_rate * reward_gradient
|
|
90
|
+
*
|
|
91
|
+
* 奖励梯度计算:
|
|
92
|
+
* - 延迟权重: 如果延迟低,增加延迟权重
|
|
93
|
+
* - 成本权重: 如果成本低,增加成本权重
|
|
94
|
+
* - 历史权重: 如果成功,增加历史权重
|
|
95
|
+
*/
|
|
96
|
+
private updateWeights;
|
|
97
|
+
/**
|
|
98
|
+
* 计算平均奖励
|
|
99
|
+
*/
|
|
100
|
+
private calculateAverageReward;
|
|
101
|
+
/**
|
|
102
|
+
* 计算单个执行的奖励
|
|
103
|
+
*
|
|
104
|
+
* 奖励函数:
|
|
105
|
+
* reward = -0.4 * (latency / normalize_latency)
|
|
106
|
+
* -0.3 * (cost / normalize_cost)
|
|
107
|
+
* +0.3 * (success ? 1 : -1)
|
|
108
|
+
*/
|
|
109
|
+
private calculateReward;
|
|
110
|
+
/**
|
|
111
|
+
* 计算每个权重维度的梯度
|
|
112
|
+
*
|
|
113
|
+
* 梯度表示: 该权重的增加对奖励的正向影响程度
|
|
114
|
+
*/
|
|
115
|
+
private calculateGradients;
|
|
116
|
+
/**
|
|
117
|
+
* 重置权重为默认值
|
|
118
|
+
*/
|
|
119
|
+
reset(strategy?: RoutingStrategy): void;
|
|
120
|
+
/**
|
|
121
|
+
* 获取学习统计信息
|
|
122
|
+
*/
|
|
123
|
+
getStats(): Record<string, {
|
|
124
|
+
currentWeights: WeightConfig;
|
|
125
|
+
sampleCount: number;
|
|
126
|
+
avgReward: number;
|
|
127
|
+
improvement: number;
|
|
128
|
+
}>;
|
|
129
|
+
/**
|
|
130
|
+
* 计算权重改进幅度
|
|
131
|
+
*/
|
|
132
|
+
private calculateImprovement;
|
|
133
|
+
}
|
|
134
|
+
export {};
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AdaptiveWeights = void 0;
|
|
4
|
+
const types_1 = require("./types");
|
|
5
|
+
const DEFAULT_LEARNING_CONFIG = {
|
|
6
|
+
learningRate: 0.1,
|
|
7
|
+
minSamples: 10,
|
|
8
|
+
historyWindow: 100,
|
|
9
|
+
weightDecay: 0.01,
|
|
10
|
+
rewardNormalization: {
|
|
11
|
+
latency: 5000, // 5秒作为基准
|
|
12
|
+
cost: 3 // cost level 3 作为基准
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* 自适应权重学习系统
|
|
17
|
+
*
|
|
18
|
+
* 使用强化学习思想,根据执行结果动态调整策略权重
|
|
19
|
+
*
|
|
20
|
+
* 核心算法:
|
|
21
|
+
* 1. 收集执行结果
|
|
22
|
+
* 2. 计算奖励函数 (综合考虑延迟、成本、成功率)
|
|
23
|
+
* 3. 使用梯度上升更新权重
|
|
24
|
+
* 4. 应用权重衰减防止过拟合
|
|
25
|
+
*
|
|
26
|
+
* 奖励函数设计:
|
|
27
|
+
* reward = w_latency * (-latency/normalize) +
|
|
28
|
+
* w_cost * (-cost/normalize) +
|
|
29
|
+
* w_success * (success ? 1 : -1)
|
|
30
|
+
*/
|
|
31
|
+
class AdaptiveWeights {
|
|
32
|
+
weightsHistory = new Map();
|
|
33
|
+
outcomeHistory = new Map();
|
|
34
|
+
currentWeights = new Map();
|
|
35
|
+
config;
|
|
36
|
+
// 默认权重配置 (与 DslPolicy 保持一致)
|
|
37
|
+
DEFAULT_WEIGHTS = {
|
|
38
|
+
[types_1.RoutingStrategy.AUTO]: {
|
|
39
|
+
taskMatch: 0.4,
|
|
40
|
+
context: 0.2,
|
|
41
|
+
latency: 0.2,
|
|
42
|
+
cost: 0.1,
|
|
43
|
+
history: 0.1
|
|
44
|
+
},
|
|
45
|
+
[types_1.RoutingStrategy.FASTEST_FIRST]: {
|
|
46
|
+
taskMatch: 0.2,
|
|
47
|
+
context: 0.0,
|
|
48
|
+
latency: 0.7,
|
|
49
|
+
cost: 0.0,
|
|
50
|
+
history: 0.1
|
|
51
|
+
},
|
|
52
|
+
[types_1.RoutingStrategy.CHEAPEST_FIRST]: {
|
|
53
|
+
taskMatch: 0.2,
|
|
54
|
+
context: 0.0,
|
|
55
|
+
latency: 0.0,
|
|
56
|
+
cost: 0.7,
|
|
57
|
+
history: 0.1
|
|
58
|
+
},
|
|
59
|
+
[types_1.RoutingStrategy.BEST_QUALITY]: {
|
|
60
|
+
taskMatch: 0.2,
|
|
61
|
+
context: 0.0,
|
|
62
|
+
latency: 0.0,
|
|
63
|
+
cost: 0.0,
|
|
64
|
+
history: 0.2,
|
|
65
|
+
quality: 0.6
|
|
66
|
+
},
|
|
67
|
+
[types_1.RoutingStrategy.MANUAL]: {
|
|
68
|
+
taskMatch: 1.0,
|
|
69
|
+
context: 0.0,
|
|
70
|
+
latency: 0.0,
|
|
71
|
+
cost: 0.0,
|
|
72
|
+
history: 0.0
|
|
73
|
+
},
|
|
74
|
+
[types_1.RoutingStrategy.ROUND_ROBIN]: {
|
|
75
|
+
taskMatch: 1.0,
|
|
76
|
+
context: 0.0,
|
|
77
|
+
latency: 0.0,
|
|
78
|
+
cost: 0.0,
|
|
79
|
+
history: 0.0
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
constructor(config = {}) {
|
|
83
|
+
this.config = { ...DEFAULT_LEARNING_CONFIG, ...config };
|
|
84
|
+
// 初始化所有策略的权重
|
|
85
|
+
for (const strategy of Object.keys(this.DEFAULT_WEIGHTS)) {
|
|
86
|
+
const strategyKey = strategy;
|
|
87
|
+
this.currentWeights.set(strategyKey, { ...this.DEFAULT_WEIGHTS[strategyKey] });
|
|
88
|
+
this.weightsHistory.set(strategyKey, []);
|
|
89
|
+
this.outcomeHistory.set(strategyKey, []);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 记录执行结果
|
|
94
|
+
*/
|
|
95
|
+
recordOutcome(outcome) {
|
|
96
|
+
const strategy = outcome.strategy;
|
|
97
|
+
const history = this.outcomeHistory.get(strategy);
|
|
98
|
+
if (!history)
|
|
99
|
+
return;
|
|
100
|
+
history.push(outcome);
|
|
101
|
+
// 限制历史窗口大小
|
|
102
|
+
if (history.length > this.config.historyWindow) {
|
|
103
|
+
history.shift();
|
|
104
|
+
}
|
|
105
|
+
// 达到最小样本数后触发学习
|
|
106
|
+
if (history.length >= this.config.minSamples) {
|
|
107
|
+
this.updateWeights(strategy);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* 获取当前策略权重
|
|
112
|
+
*/
|
|
113
|
+
getWeights(strategy) {
|
|
114
|
+
return { ...this.currentWeights.get(strategy) || this.DEFAULT_WEIGHTS[strategy] };
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* 获取权重历史
|
|
118
|
+
*/
|
|
119
|
+
getWeightHistory(strategy) {
|
|
120
|
+
return [...this.weightsHistory.get(strategy) || []];
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* 核心权重更新算法 (梯度上升)
|
|
124
|
+
*
|
|
125
|
+
* 对于每个权重维度:
|
|
126
|
+
* new_weight = old_weight + learning_rate * reward_gradient
|
|
127
|
+
*
|
|
128
|
+
* 奖励梯度计算:
|
|
129
|
+
* - 延迟权重: 如果延迟低,增加延迟权重
|
|
130
|
+
* - 成本权重: 如果成本低,增加成本权重
|
|
131
|
+
* - 历史权重: 如果成功,增加历史权重
|
|
132
|
+
*/
|
|
133
|
+
updateWeights(strategy) {
|
|
134
|
+
const history = this.outcomeHistory.get(strategy);
|
|
135
|
+
if (!history || history.length < this.config.minSamples)
|
|
136
|
+
return;
|
|
137
|
+
const currentWeights = this.currentWeights.get(strategy);
|
|
138
|
+
if (!currentWeights)
|
|
139
|
+
return;
|
|
140
|
+
// 计算最近一批结果的平均奖励
|
|
141
|
+
const recentOutcomes = history.slice(-this.config.minSamples);
|
|
142
|
+
const avgReward = this.calculateAverageReward(recentOutcomes);
|
|
143
|
+
// 计算每个维度的梯度
|
|
144
|
+
const gradients = this.calculateGradients(recentOutcomes, currentWeights);
|
|
145
|
+
// 梯度上升更新权重
|
|
146
|
+
const newWeights = { ...currentWeights };
|
|
147
|
+
let totalWeight = 0;
|
|
148
|
+
for (const [key, gradient] of Object.entries(gradients)) {
|
|
149
|
+
if (key === 'quality')
|
|
150
|
+
continue; // quality 权重固定不学习
|
|
151
|
+
const oldValue = currentWeights[key];
|
|
152
|
+
const weightDecay = oldValue * this.config.weightDecay;
|
|
153
|
+
// new_weight = old_weight + lr * gradient - decay
|
|
154
|
+
let newValue = oldValue + this.config.learningRate * gradient - weightDecay;
|
|
155
|
+
// 确保权重非负
|
|
156
|
+
newValue = Math.max(0, newValue);
|
|
157
|
+
newWeights[key] = newValue;
|
|
158
|
+
totalWeight += newValue;
|
|
159
|
+
}
|
|
160
|
+
// 归一化权重 (使总和为 1)
|
|
161
|
+
if (totalWeight > 0) {
|
|
162
|
+
for (const key of Object.keys(newWeights)) {
|
|
163
|
+
if (key === 'quality')
|
|
164
|
+
continue;
|
|
165
|
+
const value = newWeights[key];
|
|
166
|
+
if (typeof value === 'number') {
|
|
167
|
+
newWeights[key] = value / totalWeight;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// 保存权重快照
|
|
172
|
+
const snapshot = {
|
|
173
|
+
weights: { ...currentWeights },
|
|
174
|
+
timestamp: Date.now(),
|
|
175
|
+
outcomeCount: history.length
|
|
176
|
+
};
|
|
177
|
+
const weightHistory = this.weightsHistory.get(strategy);
|
|
178
|
+
if (weightHistory) {
|
|
179
|
+
weightHistory.push(snapshot);
|
|
180
|
+
if (weightHistory.length > this.config.historyWindow) {
|
|
181
|
+
weightHistory.shift();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// 应用新权重
|
|
185
|
+
this.currentWeights.set(strategy, newWeights);
|
|
186
|
+
// 如果改进显著,记录日志
|
|
187
|
+
const improvement = avgReward - this.calculateAverageReward(history.slice(-2 * this.config.minSamples, -this.config.minSamples));
|
|
188
|
+
if (improvement > 0.1) {
|
|
189
|
+
console.log(`[AdaptiveWeights] Strategy ${strategy} improved by ${improvement.toFixed(3)}`);
|
|
190
|
+
console.log(`[AdaptiveWeights] New weights:`, JSON.stringify(newWeights, null, 2));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* 计算平均奖励
|
|
195
|
+
*/
|
|
196
|
+
calculateAverageReward(outcomes) {
|
|
197
|
+
if (outcomes.length === 0)
|
|
198
|
+
return 0;
|
|
199
|
+
const sum = outcomes.reduce((acc, outcome) => acc + this.calculateReward(outcome), 0);
|
|
200
|
+
return sum / outcomes.length;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* 计算单个执行的奖励
|
|
204
|
+
*
|
|
205
|
+
* 奖励函数:
|
|
206
|
+
* reward = -0.4 * (latency / normalize_latency)
|
|
207
|
+
* -0.3 * (cost / normalize_cost)
|
|
208
|
+
* +0.3 * (success ? 1 : -1)
|
|
209
|
+
*/
|
|
210
|
+
calculateReward(outcome) {
|
|
211
|
+
const norm = this.config.rewardNormalization;
|
|
212
|
+
// 延迟惩罚: 越快越好
|
|
213
|
+
const latencyScore = -0.4 * (outcome.executionTime / norm.latency);
|
|
214
|
+
// 成本惩罚: 越便宜越好
|
|
215
|
+
const costScore = -0.3 * (outcome.costLevel / norm.cost);
|
|
216
|
+
// 成功奖励
|
|
217
|
+
const successScore = 0.3 * (outcome.success ? 1 : -1);
|
|
218
|
+
return latencyScore + costScore + successScore;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* 计算每个权重维度的梯度
|
|
222
|
+
*
|
|
223
|
+
* 梯度表示: 该权重的增加对奖励的正向影响程度
|
|
224
|
+
*/
|
|
225
|
+
calculateGradients(outcomes, _weights) {
|
|
226
|
+
const gradients = {};
|
|
227
|
+
// 延迟梯度: 延迟越低,延迟权重应该越高
|
|
228
|
+
const avgLatency = outcomes.reduce((sum, o) => sum + o.executionTime, 0) / outcomes.length;
|
|
229
|
+
const latencyGradient = -(avgLatency / this.config.rewardNormalization.latency) * 2;
|
|
230
|
+
gradients.latency = latencyGradient;
|
|
231
|
+
// 成本梯度: 成本越低,成本权重应该越高
|
|
232
|
+
const avgCost = outcomes.reduce((sum, o) => sum + o.costLevel, 0) / outcomes.length;
|
|
233
|
+
const costGradient = -(avgCost / this.config.rewardNormalization.cost) * 2;
|
|
234
|
+
gradients.cost = costGradient;
|
|
235
|
+
// 历史梯度: 成功率越高,历史权重应该越高
|
|
236
|
+
const successRate = outcomes.filter(o => o.success).length / outcomes.length;
|
|
237
|
+
const historyGradient = (successRate - 0.5) * 2;
|
|
238
|
+
gradients.history = historyGradient;
|
|
239
|
+
// 任务匹配梯度: 保持高权重
|
|
240
|
+
gradients.taskMatch = 0.1;
|
|
241
|
+
// 上下文梯度: 根据策略调整
|
|
242
|
+
gradients.context = 0.05;
|
|
243
|
+
return gradients;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* 重置权重为默认值
|
|
247
|
+
*/
|
|
248
|
+
reset(strategy) {
|
|
249
|
+
if (strategy) {
|
|
250
|
+
this.currentWeights.set(strategy, { ...this.DEFAULT_WEIGHTS[strategy] });
|
|
251
|
+
this.outcomeHistory.set(strategy, []);
|
|
252
|
+
this.weightsHistory.set(strategy, []);
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
for (const s of Object.keys(this.DEFAULT_WEIGHTS)) {
|
|
256
|
+
const strategyKey = s;
|
|
257
|
+
this.currentWeights.set(strategyKey, { ...this.DEFAULT_WEIGHTS[strategyKey] });
|
|
258
|
+
this.outcomeHistory.set(strategyKey, []);
|
|
259
|
+
this.weightsHistory.set(strategyKey, []);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* 获取学习统计信息
|
|
265
|
+
*/
|
|
266
|
+
getStats() {
|
|
267
|
+
const stats = {};
|
|
268
|
+
for (const strategy of Object.keys(this.DEFAULT_WEIGHTS)) {
|
|
269
|
+
const strategyKey = strategy;
|
|
270
|
+
const history = this.outcomeHistory.get(strategyKey);
|
|
271
|
+
const weightHistory = this.weightsHistory.get(strategyKey);
|
|
272
|
+
stats[strategy] = {
|
|
273
|
+
currentWeights: this.currentWeights.get(strategyKey),
|
|
274
|
+
sampleCount: history?.length || 0,
|
|
275
|
+
avgReward: history && history.length > 0 ? this.calculateAverageReward(history) : 0,
|
|
276
|
+
improvement: this.calculateImprovement(weightHistory || [])
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
return stats;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* 计算权重改进幅度
|
|
283
|
+
*/
|
|
284
|
+
calculateImprovement(history) {
|
|
285
|
+
if (history.length < 2)
|
|
286
|
+
return 0;
|
|
287
|
+
const latest = history[history.length - 1].weights;
|
|
288
|
+
const earliest = history[0].weights;
|
|
289
|
+
// 计算权重变化幅度
|
|
290
|
+
let change = 0;
|
|
291
|
+
for (const key of Object.keys(latest)) {
|
|
292
|
+
const latestValue = latest[key];
|
|
293
|
+
const earliestValue = earliest[key];
|
|
294
|
+
change += Math.abs(latestValue - earliestValue);
|
|
295
|
+
}
|
|
296
|
+
return change;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
exports.AdaptiveWeights = AdaptiveWeights;
|
|
300
|
+
//# sourceMappingURL=AdaptiveWeights.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdaptiveWeights.js","sourceRoot":"","sources":["../../../src/core/modelRouter/AdaptiveWeights.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { AIRequestMessage } from '../../core/validation';
|
|
2
|
-
import { ModelAdapter, TaskConfig, RoutingConfig, RoutingResult, ModelExecutionResult, ModelStats, SupervisorConfig } from './types';
|
|
2
|
+
import { ModelAdapter, TaskConfig, RoutingConfig, RoutingResult, RoutingStrategy, ModelExecutionResult, ModelStats, SupervisorConfig } from './types';
|
|
3
3
|
import { RoutingPolicy } from './policies/types';
|
|
4
4
|
import { MetricsCollector } from '../metrics/MetricsCollector';
|
|
5
5
|
import { SupervisorActionLogger } from '../observability/SupervisorActionLog';
|
|
6
|
+
import { AdaptiveWeights } from './AdaptiveWeights';
|
|
6
7
|
/**
|
|
7
8
|
* 模型路由器 - 执行面 (Execution Plane)
|
|
8
9
|
* 负责人调配和执行,保持核心逻辑简单
|
|
@@ -14,9 +15,10 @@ export declare class ModelRouter {
|
|
|
14
15
|
private metrics;
|
|
15
16
|
private supervisor;
|
|
16
17
|
private supervisorLogger;
|
|
18
|
+
private adaptiveWeights;
|
|
17
19
|
private roundRobinIndex;
|
|
18
20
|
private supervisorContext;
|
|
19
|
-
constructor(supervisorConfig?: SupervisorConfig, metrics?: MetricsCollector, logger?: SupervisorActionLogger);
|
|
21
|
+
constructor(supervisorConfig?: SupervisorConfig, metrics?: MetricsCollector, logger?: SupervisorActionLogger, adaptiveWeights?: AdaptiveWeights);
|
|
20
22
|
private registerDefaultPolicies;
|
|
21
23
|
registerPolicy(policy: RoutingPolicy): void;
|
|
22
24
|
registerAdapter(adapter: ModelAdapter): void;
|
|
@@ -26,11 +28,51 @@ export declare class ModelRouter {
|
|
|
26
28
|
getStats(modelName?: string): ModelStats | ModelStats[];
|
|
27
29
|
route(taskConfig: TaskConfig, routingConfig: RoutingConfig): Promise<RoutingResult>;
|
|
28
30
|
private executePolicyWithExploration;
|
|
29
|
-
executeTask(adapter: ModelAdapter, prompt: string | AIRequestMessage[], config: TaskConfig, onChunk?: (chunk: string) => void): Promise<ModelExecutionResult>;
|
|
31
|
+
executeTask(adapter: ModelAdapter, prompt: string | AIRequestMessage[], config: TaskConfig, onChunk?: (chunk: string) => void, strategy?: RoutingStrategy): Promise<ModelExecutionResult>;
|
|
30
32
|
private getAvailableAdapters;
|
|
31
33
|
private selectRoundRobin;
|
|
32
34
|
private updateDomainHealthStates;
|
|
35
|
+
/**
|
|
36
|
+
* 计算域的平均成功率
|
|
37
|
+
*/
|
|
38
|
+
private calculateDomainAverageSuccessRate;
|
|
33
39
|
private isAdapterAllowedByCircuitBreaker;
|
|
40
|
+
/**
|
|
41
|
+
* 计算半开状态的流量通过比例
|
|
42
|
+
*
|
|
43
|
+
* 策略: 基于最近的成功率动态调整
|
|
44
|
+
* - 成功率 < 30%: 0% 流量 (继续熔断)
|
|
45
|
+
* - 成功率 30-50%: 10% 流量
|
|
46
|
+
* - 成功率 50-70%: 30% 流量
|
|
47
|
+
* - 成功率 70-90%: 50% 流量
|
|
48
|
+
* - 成功率 > 90%: 100% 流量 (恢复到 closed)
|
|
49
|
+
*/
|
|
50
|
+
private calculateHalfOpenPassRate;
|
|
34
51
|
private calculateUCB1;
|
|
35
52
|
private createEmptyStats;
|
|
53
|
+
/**
|
|
54
|
+
* 应用自适应权重到所有策略
|
|
55
|
+
*/
|
|
56
|
+
private applyLearnedWeights;
|
|
57
|
+
/**
|
|
58
|
+
* 根据策略获取对应的策略名称
|
|
59
|
+
*/
|
|
60
|
+
private getPolicyName;
|
|
61
|
+
/**
|
|
62
|
+
* 记录执行结果用于自适应学习
|
|
63
|
+
*/
|
|
64
|
+
private recordExecutionOutcome;
|
|
65
|
+
/**
|
|
66
|
+
* 获取自适应权重统计
|
|
67
|
+
*/
|
|
68
|
+
getAdaptiveWeightsStats(): Record<string, {
|
|
69
|
+
currentWeights: any;
|
|
70
|
+
sampleCount: number;
|
|
71
|
+
avgReward: number;
|
|
72
|
+
improvement: number;
|
|
73
|
+
}>;
|
|
74
|
+
/**
|
|
75
|
+
* 重置自适应权重
|
|
76
|
+
*/
|
|
77
|
+
resetAdaptiveWeights(strategy?: RoutingStrategy): void;
|
|
36
78
|
}
|