@nahisaho/musubix-neural-search 2.1.0 → 2.2.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/EnhancedNeuralSearchManager.d.ts +215 -0
- package/dist/EnhancedNeuralSearchManager.d.ts.map +1 -0
- package/dist/EnhancedNeuralSearchManager.js +307 -0
- package/dist/EnhancedNeuralSearchManager.js.map +1 -0
- package/dist/cache/EmbeddingCache.d.ts +93 -0
- package/dist/cache/EmbeddingCache.d.ts.map +1 -0
- package/dist/cache/EmbeddingCache.js +208 -0
- package/dist/cache/EmbeddingCache.js.map +1 -0
- package/dist/cache/index.d.ts +7 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +6 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/fusion/ModalFusion.d.ts +111 -0
- package/dist/fusion/ModalFusion.d.ts.map +1 -0
- package/dist/fusion/ModalFusion.js +127 -0
- package/dist/fusion/ModalFusion.js.map +1 -0
- package/dist/fusion/index.d.ts +6 -0
- package/dist/fusion/index.d.ts.map +1 -0
- package/dist/fusion/index.js +6 -0
- package/dist/fusion/index.js.map +1 -0
- package/dist/index.d.ts +14 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/learning/OnlineModelUpdater.d.ts +195 -0
- package/dist/learning/OnlineModelUpdater.d.ts.map +1 -0
- package/dist/learning/OnlineModelUpdater.js +231 -0
- package/dist/learning/OnlineModelUpdater.js.map +1 -0
- package/dist/learning/__tests__/OnlineModelUpdater.test.d.ts +9 -0
- package/dist/learning/__tests__/OnlineModelUpdater.test.d.ts.map +1 -0
- package/dist/learning/__tests__/OnlineModelUpdater.test.js +174 -0
- package/dist/learning/__tests__/OnlineModelUpdater.test.js.map +1 -0
- package/dist/learning/index.d.ts +2 -0
- package/dist/learning/index.d.ts.map +1 -1
- package/dist/learning/index.js +2 -0
- package/dist/learning/index.js.map +1 -1
- package/dist/logging/TrajectoryLogger.d.ts +115 -0
- package/dist/logging/TrajectoryLogger.d.ts.map +1 -0
- package/dist/logging/TrajectoryLogger.js +128 -0
- package/dist/logging/TrajectoryLogger.js.map +1 -0
- package/dist/logging/index.d.ts +9 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +8 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/pruning/LearnedPruningPolicy.d.ts +129 -0
- package/dist/pruning/LearnedPruningPolicy.d.ts.map +1 -0
- package/dist/pruning/LearnedPruningPolicy.js +332 -0
- package/dist/pruning/LearnedPruningPolicy.js.map +1 -0
- package/dist/pruning/index.d.ts +6 -0
- package/dist/pruning/index.d.ts.map +1 -0
- package/dist/pruning/index.js +6 -0
- package/dist/pruning/index.js.map +1 -0
- package/dist/scorer/ContextAwareScorer.d.ts +126 -0
- package/dist/scorer/ContextAwareScorer.d.ts.map +1 -0
- package/dist/scorer/ContextAwareScorer.js +281 -0
- package/dist/scorer/ContextAwareScorer.js.map +1 -0
- package/dist/scorer/index.d.ts +2 -0
- package/dist/scorer/index.d.ts.map +1 -1
- package/dist/scorer/index.js +2 -0
- package/dist/scorer/index.js.map +1 -1
- package/dist/search/AdaptiveBeamSearch.d.ts +98 -0
- package/dist/search/AdaptiveBeamSearch.d.ts.map +1 -0
- package/dist/search/AdaptiveBeamSearch.js +240 -0
- package/dist/search/AdaptiveBeamSearch.js.map +1 -0
- package/dist/search/index.d.ts +2 -0
- package/dist/search/index.d.ts.map +1 -1
- package/dist/search/index.js +2 -0
- package/dist/search/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OnlineModelUpdater - Online Model Updates from Feedback
|
|
3
|
+
* @module @nahisaho/musubix-neural-search
|
|
4
|
+
* @see TSK-NS-104
|
|
5
|
+
* @see DES-NS-104
|
|
6
|
+
* @see REQ-NS-104 Online model updates within 3 feedback cycles
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Feedback types
|
|
10
|
+
*/
|
|
11
|
+
export type FeedbackType = 'accept' | 'reject' | 'modify';
|
|
12
|
+
/**
|
|
13
|
+
* OnlineModelUpdater configuration
|
|
14
|
+
*/
|
|
15
|
+
export interface OnlineModelUpdaterConfig {
|
|
16
|
+
/** Number of feedbacks before update (default: 3) */
|
|
17
|
+
updateThreshold: number;
|
|
18
|
+
/** Learning rate for weight updates (default: 0.01) */
|
|
19
|
+
learningRate: number;
|
|
20
|
+
/** Auto-apply updates when threshold reached */
|
|
21
|
+
autoApply: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Feedback record
|
|
25
|
+
*/
|
|
26
|
+
export interface FeedbackRecord {
|
|
27
|
+
/** Candidate ID that received feedback */
|
|
28
|
+
candidateId: string;
|
|
29
|
+
/** Feedback type */
|
|
30
|
+
type: FeedbackType;
|
|
31
|
+
/** Candidate score at time of feedback */
|
|
32
|
+
score?: number;
|
|
33
|
+
/** Reason for rejection/modification */
|
|
34
|
+
reason?: string;
|
|
35
|
+
/** Modification details */
|
|
36
|
+
modification?: string;
|
|
37
|
+
/** Additional context */
|
|
38
|
+
context?: Record<string, unknown>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Feedback recording result
|
|
42
|
+
*/
|
|
43
|
+
export interface FeedbackResult {
|
|
44
|
+
/** Success flag */
|
|
45
|
+
success: boolean;
|
|
46
|
+
/** Feedback ID */
|
|
47
|
+
feedbackId: string;
|
|
48
|
+
/** Error message if failed */
|
|
49
|
+
error?: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Update application result
|
|
53
|
+
*/
|
|
54
|
+
export interface UpdateResult {
|
|
55
|
+
/** Whether updates were applied */
|
|
56
|
+
applied: boolean;
|
|
57
|
+
/** Number of updates applied */
|
|
58
|
+
updatesApplied: number;
|
|
59
|
+
/** New model version */
|
|
60
|
+
modelVersion: number;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Model weights
|
|
64
|
+
*/
|
|
65
|
+
export interface ModelWeights {
|
|
66
|
+
/** Semantic similarity weight */
|
|
67
|
+
semanticWeight: number;
|
|
68
|
+
/** Context matching weight */
|
|
69
|
+
contextWeight: number;
|
|
70
|
+
/** Pattern matching weight */
|
|
71
|
+
patternWeight: number;
|
|
72
|
+
/** Recency weight */
|
|
73
|
+
recencyWeight: number;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Update statistics
|
|
77
|
+
*/
|
|
78
|
+
export interface UpdateStatistics {
|
|
79
|
+
/** Total feedback received */
|
|
80
|
+
totalFeedback: number;
|
|
81
|
+
/** Accept count */
|
|
82
|
+
acceptCount: number;
|
|
83
|
+
/** Reject count */
|
|
84
|
+
rejectCount: number;
|
|
85
|
+
/** Modify count */
|
|
86
|
+
modifyCount: number;
|
|
87
|
+
/** Acceptance rate */
|
|
88
|
+
acceptanceRate: number;
|
|
89
|
+
/** Total updates applied */
|
|
90
|
+
totalUpdatesApplied: number;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* OnlineModelUpdater interface
|
|
94
|
+
*/
|
|
95
|
+
export interface OnlineModelUpdater {
|
|
96
|
+
/**
|
|
97
|
+
* Record feedback for a candidate
|
|
98
|
+
*/
|
|
99
|
+
recordFeedback(feedback: FeedbackRecord): FeedbackResult;
|
|
100
|
+
/**
|
|
101
|
+
* Apply pending updates to model
|
|
102
|
+
*/
|
|
103
|
+
applyUpdates(): Promise<UpdateResult>;
|
|
104
|
+
/**
|
|
105
|
+
* Get pending feedback count
|
|
106
|
+
*/
|
|
107
|
+
getPendingCount(): number;
|
|
108
|
+
/**
|
|
109
|
+
* Get current model weights
|
|
110
|
+
*/
|
|
111
|
+
getModelWeights(): ModelWeights;
|
|
112
|
+
/**
|
|
113
|
+
* Set model weights
|
|
114
|
+
*/
|
|
115
|
+
setModelWeights(weights: Partial<ModelWeights>): void;
|
|
116
|
+
/**
|
|
117
|
+
* Get statistics
|
|
118
|
+
*/
|
|
119
|
+
getStatistics(): UpdateStatistics;
|
|
120
|
+
/**
|
|
121
|
+
* Serialize to JSON
|
|
122
|
+
*/
|
|
123
|
+
toJSON(): string;
|
|
124
|
+
/**
|
|
125
|
+
* Deserialize from JSON
|
|
126
|
+
*/
|
|
127
|
+
fromJSON(json: string): void;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Default OnlineModelUpdater implementation
|
|
131
|
+
*/
|
|
132
|
+
export declare class DefaultOnlineModelUpdater implements OnlineModelUpdater {
|
|
133
|
+
private config;
|
|
134
|
+
private pendingFeedback;
|
|
135
|
+
private weights;
|
|
136
|
+
private statistics;
|
|
137
|
+
private modelVersion;
|
|
138
|
+
private feedbackCounter;
|
|
139
|
+
constructor(config?: Partial<OnlineModelUpdaterConfig>);
|
|
140
|
+
/**
|
|
141
|
+
* Record feedback for a candidate
|
|
142
|
+
*/
|
|
143
|
+
recordFeedback(feedback: FeedbackRecord): FeedbackResult;
|
|
144
|
+
/**
|
|
145
|
+
* Apply pending updates to model
|
|
146
|
+
*/
|
|
147
|
+
applyUpdates(): Promise<UpdateResult>;
|
|
148
|
+
/**
|
|
149
|
+
* Analyze feedback patterns
|
|
150
|
+
*/
|
|
151
|
+
private analyzeFeedback;
|
|
152
|
+
/**
|
|
153
|
+
* Adjust weights based on feedback analysis
|
|
154
|
+
*/
|
|
155
|
+
private adjustWeights;
|
|
156
|
+
/**
|
|
157
|
+
* Normalize weights to sum to 1
|
|
158
|
+
*/
|
|
159
|
+
private normalizeWeights;
|
|
160
|
+
/**
|
|
161
|
+
* Update statistics
|
|
162
|
+
*/
|
|
163
|
+
private updateStatistics;
|
|
164
|
+
/**
|
|
165
|
+
* Get pending feedback count
|
|
166
|
+
*/
|
|
167
|
+
getPendingCount(): number;
|
|
168
|
+
/**
|
|
169
|
+
* Get current model weights
|
|
170
|
+
*/
|
|
171
|
+
getModelWeights(): ModelWeights;
|
|
172
|
+
/**
|
|
173
|
+
* Set model weights
|
|
174
|
+
*/
|
|
175
|
+
setModelWeights(weights: Partial<ModelWeights>): void;
|
|
176
|
+
/**
|
|
177
|
+
* Get statistics
|
|
178
|
+
*/
|
|
179
|
+
getStatistics(): UpdateStatistics;
|
|
180
|
+
/**
|
|
181
|
+
* Serialize to JSON
|
|
182
|
+
*/
|
|
183
|
+
toJSON(): string;
|
|
184
|
+
/**
|
|
185
|
+
* Deserialize from JSON
|
|
186
|
+
*/
|
|
187
|
+
fromJSON(json: string): void;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Create an OnlineModelUpdater instance
|
|
191
|
+
* @param config - Optional configuration
|
|
192
|
+
* @returns OnlineModelUpdater instance
|
|
193
|
+
*/
|
|
194
|
+
export declare function createOnlineModelUpdater(config?: Partial<OnlineModelUpdaterConfig>): OnlineModelUpdater;
|
|
195
|
+
//# sourceMappingURL=OnlineModelUpdater.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OnlineModelUpdater.d.ts","sourceRoot":"","sources":["../../src/learning/OnlineModelUpdater.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OnlineModelUpdater - Online Model Updates from Feedback
|
|
3
|
+
* @module @nahisaho/musubix-neural-search
|
|
4
|
+
* @see TSK-NS-104
|
|
5
|
+
* @see DES-NS-104
|
|
6
|
+
* @see REQ-NS-104 Online model updates within 3 feedback cycles
|
|
7
|
+
*/
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Default Implementation
|
|
10
|
+
// ============================================================================
|
|
11
|
+
/**
|
|
12
|
+
* Default OnlineModelUpdater implementation
|
|
13
|
+
*/
|
|
14
|
+
export class DefaultOnlineModelUpdater {
|
|
15
|
+
config;
|
|
16
|
+
pendingFeedback;
|
|
17
|
+
weights;
|
|
18
|
+
statistics;
|
|
19
|
+
modelVersion;
|
|
20
|
+
feedbackCounter;
|
|
21
|
+
constructor(config) {
|
|
22
|
+
this.config = {
|
|
23
|
+
updateThreshold: config?.updateThreshold ?? 3,
|
|
24
|
+
learningRate: config?.learningRate ?? 0.01,
|
|
25
|
+
autoApply: config?.autoApply ?? false,
|
|
26
|
+
};
|
|
27
|
+
this.pendingFeedback = [];
|
|
28
|
+
this.weights = {
|
|
29
|
+
semanticWeight: 0.4,
|
|
30
|
+
contextWeight: 0.3,
|
|
31
|
+
patternWeight: 0.2,
|
|
32
|
+
recencyWeight: 0.1,
|
|
33
|
+
};
|
|
34
|
+
this.statistics = {
|
|
35
|
+
totalFeedback: 0,
|
|
36
|
+
acceptCount: 0,
|
|
37
|
+
rejectCount: 0,
|
|
38
|
+
modifyCount: 0,
|
|
39
|
+
acceptanceRate: 0,
|
|
40
|
+
totalUpdatesApplied: 0,
|
|
41
|
+
};
|
|
42
|
+
this.modelVersion = 1;
|
|
43
|
+
this.feedbackCounter = 0;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Record feedback for a candidate
|
|
47
|
+
*/
|
|
48
|
+
recordFeedback(feedback) {
|
|
49
|
+
const feedbackId = `FB-${++this.feedbackCounter}-${Date.now()}`;
|
|
50
|
+
const entry = {
|
|
51
|
+
...feedback,
|
|
52
|
+
feedbackId,
|
|
53
|
+
timestamp: new Date(),
|
|
54
|
+
};
|
|
55
|
+
this.pendingFeedback.push(entry);
|
|
56
|
+
this.updateStatistics(feedback.type);
|
|
57
|
+
// Check for auto-apply
|
|
58
|
+
if (this.config.autoApply &&
|
|
59
|
+
this.pendingFeedback.length >= this.config.updateThreshold) {
|
|
60
|
+
void this.applyUpdates();
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
success: true,
|
|
64
|
+
feedbackId,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Apply pending updates to model
|
|
69
|
+
*/
|
|
70
|
+
async applyUpdates() {
|
|
71
|
+
if (this.pendingFeedback.length < this.config.updateThreshold) {
|
|
72
|
+
return {
|
|
73
|
+
applied: false,
|
|
74
|
+
updatesApplied: 0,
|
|
75
|
+
modelVersion: this.modelVersion,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// Analyze feedback patterns
|
|
79
|
+
const analysis = this.analyzeFeedback();
|
|
80
|
+
// Update weights based on feedback
|
|
81
|
+
this.adjustWeights(analysis);
|
|
82
|
+
// Clear pending feedback
|
|
83
|
+
const updatesApplied = this.pendingFeedback.length;
|
|
84
|
+
this.pendingFeedback = [];
|
|
85
|
+
// Increment model version
|
|
86
|
+
this.modelVersion++;
|
|
87
|
+
this.statistics.totalUpdatesApplied++;
|
|
88
|
+
return {
|
|
89
|
+
applied: true,
|
|
90
|
+
updatesApplied,
|
|
91
|
+
modelVersion: this.modelVersion,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Analyze feedback patterns
|
|
96
|
+
*/
|
|
97
|
+
analyzeFeedback() {
|
|
98
|
+
const accepts = this.pendingFeedback.filter((f) => f.type === 'accept');
|
|
99
|
+
const rejects = this.pendingFeedback.filter((f) => f.type === 'reject');
|
|
100
|
+
// Calculate average score for accepts vs rejects
|
|
101
|
+
const avgAcceptScore = accepts.length > 0
|
|
102
|
+
? accepts.reduce((sum, f) => sum + (f.score ?? 0.5), 0) / accepts.length
|
|
103
|
+
: 0.5;
|
|
104
|
+
const avgRejectScore = rejects.length > 0
|
|
105
|
+
? rejects.reduce((sum, f) => sum + (f.score ?? 0.5), 0) / rejects.length
|
|
106
|
+
: 0.5;
|
|
107
|
+
return {
|
|
108
|
+
acceptRate: accepts.length / this.pendingFeedback.length,
|
|
109
|
+
avgAcceptScore,
|
|
110
|
+
avgRejectScore,
|
|
111
|
+
scoreDelta: avgAcceptScore - avgRejectScore,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Adjust weights based on feedback analysis
|
|
116
|
+
*/
|
|
117
|
+
adjustWeights(analysis) {
|
|
118
|
+
const lr = this.config.learningRate;
|
|
119
|
+
// If high accept rate, slightly increase semantic weight
|
|
120
|
+
if (analysis.acceptRate > 0.7) {
|
|
121
|
+
this.weights.semanticWeight = Math.min(0.6, this.weights.semanticWeight + lr);
|
|
122
|
+
}
|
|
123
|
+
// If low accept rate, increase context weight
|
|
124
|
+
if (analysis.acceptRate < 0.3) {
|
|
125
|
+
this.weights.contextWeight = Math.min(0.5, this.weights.contextWeight + lr);
|
|
126
|
+
}
|
|
127
|
+
// Normalize weights to sum to 1
|
|
128
|
+
this.normalizeWeights();
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Normalize weights to sum to 1
|
|
132
|
+
*/
|
|
133
|
+
normalizeWeights() {
|
|
134
|
+
const total = this.weights.semanticWeight +
|
|
135
|
+
this.weights.contextWeight +
|
|
136
|
+
this.weights.patternWeight +
|
|
137
|
+
this.weights.recencyWeight;
|
|
138
|
+
if (total > 0) {
|
|
139
|
+
this.weights.semanticWeight /= total;
|
|
140
|
+
this.weights.contextWeight /= total;
|
|
141
|
+
this.weights.patternWeight /= total;
|
|
142
|
+
this.weights.recencyWeight /= total;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Update statistics
|
|
147
|
+
*/
|
|
148
|
+
updateStatistics(type) {
|
|
149
|
+
this.statistics.totalFeedback++;
|
|
150
|
+
switch (type) {
|
|
151
|
+
case 'accept':
|
|
152
|
+
this.statistics.acceptCount++;
|
|
153
|
+
break;
|
|
154
|
+
case 'reject':
|
|
155
|
+
this.statistics.rejectCount++;
|
|
156
|
+
break;
|
|
157
|
+
case 'modify':
|
|
158
|
+
this.statistics.modifyCount++;
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
// Update acceptance rate
|
|
162
|
+
this.statistics.acceptanceRate =
|
|
163
|
+
this.statistics.acceptCount / this.statistics.totalFeedback;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get pending feedback count
|
|
167
|
+
*/
|
|
168
|
+
getPendingCount() {
|
|
169
|
+
return this.pendingFeedback.length;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get current model weights
|
|
173
|
+
*/
|
|
174
|
+
getModelWeights() {
|
|
175
|
+
return { ...this.weights };
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Set model weights
|
|
179
|
+
*/
|
|
180
|
+
setModelWeights(weights) {
|
|
181
|
+
this.weights = { ...this.weights, ...weights };
|
|
182
|
+
this.normalizeWeights();
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Get statistics
|
|
186
|
+
*/
|
|
187
|
+
getStatistics() {
|
|
188
|
+
return { ...this.statistics };
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Serialize to JSON
|
|
192
|
+
*/
|
|
193
|
+
toJSON() {
|
|
194
|
+
return JSON.stringify({
|
|
195
|
+
config: this.config,
|
|
196
|
+
weights: this.weights,
|
|
197
|
+
statistics: this.statistics,
|
|
198
|
+
modelVersion: this.modelVersion,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Deserialize from JSON
|
|
203
|
+
*/
|
|
204
|
+
fromJSON(json) {
|
|
205
|
+
const data = JSON.parse(json);
|
|
206
|
+
if (data.config) {
|
|
207
|
+
this.config = { ...this.config, ...data.config };
|
|
208
|
+
}
|
|
209
|
+
if (data.weights) {
|
|
210
|
+
this.weights = { ...this.weights, ...data.weights };
|
|
211
|
+
}
|
|
212
|
+
if (data.statistics) {
|
|
213
|
+
this.statistics = { ...this.statistics, ...data.statistics };
|
|
214
|
+
}
|
|
215
|
+
if (data.modelVersion) {
|
|
216
|
+
this.modelVersion = data.modelVersion;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// ============================================================================
|
|
221
|
+
// Factory Function
|
|
222
|
+
// ============================================================================
|
|
223
|
+
/**
|
|
224
|
+
* Create an OnlineModelUpdater instance
|
|
225
|
+
* @param config - Optional configuration
|
|
226
|
+
* @returns OnlineModelUpdater instance
|
|
227
|
+
*/
|
|
228
|
+
export function createOnlineModelUpdater(config) {
|
|
229
|
+
return new DefaultOnlineModelUpdater(config);
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=OnlineModelUpdater.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OnlineModelUpdater.js","sourceRoot":"","sources":["../../src/learning/OnlineModelUpdater.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OnlineModelUpdater.test.d.ts","sourceRoot":"","sources":["../../../src/learning/__tests__/OnlineModelUpdater.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OnlineModelUpdater Tests
|
|
3
|
+
* @module @nahisaho/musubix-neural-search
|
|
4
|
+
* @see TSK-NS-104
|
|
5
|
+
* @see DES-NS-104
|
|
6
|
+
* @see REQ-NS-104 Online model updates within 3 feedback cycles
|
|
7
|
+
*/
|
|
8
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
9
|
+
import { createOnlineModelUpdater, } from '../OnlineModelUpdater.js';
|
|
10
|
+
describe('OnlineModelUpdater', () => {
|
|
11
|
+
let updater;
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
updater = createOnlineModelUpdater();
|
|
14
|
+
});
|
|
15
|
+
describe('Factory Function', () => {
|
|
16
|
+
it('should create an OnlineModelUpdater instance', () => {
|
|
17
|
+
const instance = createOnlineModelUpdater();
|
|
18
|
+
expect(instance).toBeDefined();
|
|
19
|
+
expect(typeof instance.recordFeedback).toBe('function');
|
|
20
|
+
});
|
|
21
|
+
it('should create with custom config', () => {
|
|
22
|
+
const instance = createOnlineModelUpdater({
|
|
23
|
+
updateThreshold: 5,
|
|
24
|
+
learningRate: 0.05,
|
|
25
|
+
});
|
|
26
|
+
expect(instance).toBeDefined();
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
describe('recordFeedback', () => {
|
|
30
|
+
it('should record accept feedback', () => {
|
|
31
|
+
const result = updater.recordFeedback({
|
|
32
|
+
candidateId: 'CAND-001',
|
|
33
|
+
type: 'accept',
|
|
34
|
+
context: { query: 'test' },
|
|
35
|
+
});
|
|
36
|
+
expect(result.success).toBe(true);
|
|
37
|
+
expect(result.feedbackId).toBeDefined();
|
|
38
|
+
});
|
|
39
|
+
it('should record reject feedback', () => {
|
|
40
|
+
const result = updater.recordFeedback({
|
|
41
|
+
candidateId: 'CAND-001',
|
|
42
|
+
type: 'reject',
|
|
43
|
+
reason: 'Not relevant',
|
|
44
|
+
});
|
|
45
|
+
expect(result.success).toBe(true);
|
|
46
|
+
});
|
|
47
|
+
it('should record modify feedback', () => {
|
|
48
|
+
const result = updater.recordFeedback({
|
|
49
|
+
candidateId: 'CAND-001',
|
|
50
|
+
type: 'modify',
|
|
51
|
+
modification: 'Changed parameter',
|
|
52
|
+
});
|
|
53
|
+
expect(result.success).toBe(true);
|
|
54
|
+
});
|
|
55
|
+
it('should track pending feedback count', () => {
|
|
56
|
+
updater.recordFeedback({ candidateId: 'CAND-001', type: 'accept' });
|
|
57
|
+
updater.recordFeedback({ candidateId: 'CAND-002', type: 'accept' });
|
|
58
|
+
expect(updater.getPendingCount()).toBe(2);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe('applyUpdates', () => {
|
|
62
|
+
it('should apply updates after threshold', async () => {
|
|
63
|
+
// Default threshold is 3
|
|
64
|
+
updater.recordFeedback({ candidateId: 'CAND-001', type: 'accept' });
|
|
65
|
+
updater.recordFeedback({ candidateId: 'CAND-002', type: 'reject' });
|
|
66
|
+
updater.recordFeedback({ candidateId: 'CAND-003', type: 'accept' });
|
|
67
|
+
const result = await updater.applyUpdates();
|
|
68
|
+
expect(result.applied).toBe(true);
|
|
69
|
+
expect(result.updatesApplied).toBeGreaterThan(0);
|
|
70
|
+
});
|
|
71
|
+
it('should not apply if below threshold', async () => {
|
|
72
|
+
updater.recordFeedback({ candidateId: 'CAND-001', type: 'accept' });
|
|
73
|
+
const result = await updater.applyUpdates();
|
|
74
|
+
// Should still succeed but no updates if below threshold
|
|
75
|
+
expect(result.applied).toBe(false);
|
|
76
|
+
});
|
|
77
|
+
it('should clear pending after apply', async () => {
|
|
78
|
+
updater.recordFeedback({ candidateId: 'CAND-001', type: 'accept' });
|
|
79
|
+
updater.recordFeedback({ candidateId: 'CAND-002', type: 'reject' });
|
|
80
|
+
updater.recordFeedback({ candidateId: 'CAND-003', type: 'accept' });
|
|
81
|
+
await updater.applyUpdates();
|
|
82
|
+
expect(updater.getPendingCount()).toBe(0);
|
|
83
|
+
});
|
|
84
|
+
it('should update model weights based on feedback', async () => {
|
|
85
|
+
// Record multiple accept feedbacks
|
|
86
|
+
for (let i = 0; i < 5; i++) {
|
|
87
|
+
updater.recordFeedback({
|
|
88
|
+
candidateId: `CAND-${i}`,
|
|
89
|
+
type: 'accept',
|
|
90
|
+
score: 0.9,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
await updater.applyUpdates();
|
|
94
|
+
const newWeights = updater.getModelWeights();
|
|
95
|
+
// Weights should have changed
|
|
96
|
+
expect(newWeights).toBeDefined();
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
describe('Auto Updates', () => {
|
|
100
|
+
it('should auto-apply after reaching threshold', async () => {
|
|
101
|
+
const autoUpdater = createOnlineModelUpdater({
|
|
102
|
+
updateThreshold: 3,
|
|
103
|
+
autoApply: true,
|
|
104
|
+
});
|
|
105
|
+
// Record 3 feedbacks to trigger auto-apply
|
|
106
|
+
autoUpdater.recordFeedback({ candidateId: 'CAND-001', type: 'accept' });
|
|
107
|
+
autoUpdater.recordFeedback({ candidateId: 'CAND-002', type: 'accept' });
|
|
108
|
+
autoUpdater.recordFeedback({ candidateId: 'CAND-003', type: 'accept' });
|
|
109
|
+
// Wait for auto-apply
|
|
110
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
111
|
+
const stats = autoUpdater.getStatistics();
|
|
112
|
+
expect(stats.totalUpdatesApplied).toBeGreaterThanOrEqual(1);
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
describe('Statistics', () => {
|
|
116
|
+
it('should track feedback statistics', () => {
|
|
117
|
+
updater.recordFeedback({ candidateId: 'CAND-001', type: 'accept' });
|
|
118
|
+
updater.recordFeedback({ candidateId: 'CAND-002', type: 'reject' });
|
|
119
|
+
updater.recordFeedback({ candidateId: 'CAND-003', type: 'accept' });
|
|
120
|
+
const stats = updater.getStatistics();
|
|
121
|
+
expect(stats.totalFeedback).toBe(3);
|
|
122
|
+
expect(stats.acceptCount).toBe(2);
|
|
123
|
+
expect(stats.rejectCount).toBe(1);
|
|
124
|
+
});
|
|
125
|
+
it('should calculate acceptance rate', () => {
|
|
126
|
+
updater.recordFeedback({ candidateId: 'CAND-001', type: 'accept' });
|
|
127
|
+
updater.recordFeedback({ candidateId: 'CAND-002', type: 'accept' });
|
|
128
|
+
updater.recordFeedback({ candidateId: 'CAND-003', type: 'reject' });
|
|
129
|
+
const stats = updater.getStatistics();
|
|
130
|
+
expect(stats.acceptanceRate).toBeCloseTo(0.667, 2);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
describe('Model Weights', () => {
|
|
134
|
+
it('should get current model weights', () => {
|
|
135
|
+
const weights = updater.getModelWeights();
|
|
136
|
+
expect(weights).toBeDefined();
|
|
137
|
+
expect(typeof weights.semanticWeight).toBe('number');
|
|
138
|
+
expect(typeof weights.contextWeight).toBe('number');
|
|
139
|
+
});
|
|
140
|
+
it('should set model weights', () => {
|
|
141
|
+
// Set all weights to avoid normalization changing values
|
|
142
|
+
updater.setModelWeights({
|
|
143
|
+
semanticWeight: 0.5,
|
|
144
|
+
contextWeight: 0.3,
|
|
145
|
+
patternWeight: 0.15,
|
|
146
|
+
recencyWeight: 0.05,
|
|
147
|
+
});
|
|
148
|
+
const weights = updater.getModelWeights();
|
|
149
|
+
// After normalization, weights sum to 1.0
|
|
150
|
+
expect(weights.semanticWeight).toBe(0.5);
|
|
151
|
+
expect(weights.contextWeight).toBe(0.3);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
describe('Serialization', () => {
|
|
155
|
+
it('should serialize to JSON', () => {
|
|
156
|
+
updater.recordFeedback({ candidateId: 'CAND-001', type: 'accept' });
|
|
157
|
+
const json = updater.toJSON();
|
|
158
|
+
expect(typeof json).toBe('string');
|
|
159
|
+
const parsed = JSON.parse(json);
|
|
160
|
+
expect(parsed.statistics).toBeDefined();
|
|
161
|
+
expect(parsed.weights).toBeDefined();
|
|
162
|
+
});
|
|
163
|
+
it('should deserialize from JSON', () => {
|
|
164
|
+
const json = JSON.stringify({
|
|
165
|
+
weights: { semanticWeight: 0.7, contextWeight: 0.3 },
|
|
166
|
+
statistics: { totalFeedback: 10, acceptCount: 8, rejectCount: 2 },
|
|
167
|
+
});
|
|
168
|
+
updater.fromJSON(json);
|
|
169
|
+
const weights = updater.getModelWeights();
|
|
170
|
+
expect(weights.semanticWeight).toBe(0.7);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
//# sourceMappingURL=OnlineModelUpdater.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OnlineModelUpdater.test.js","sourceRoot":"","sources":["../../../src/learning/__tests__/OnlineModelUpdater.test.ts"],"names":[],"mappings":"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"}
|
package/dist/learning/index.d.ts
CHANGED
|
@@ -7,4 +7,6 @@ export { OnlineLearner } from './OnlineLearner.js';
|
|
|
7
7
|
export type { OnlineLearnerConfig } from './OnlineLearner.js';
|
|
8
8
|
export { ModelUpdater } from './ModelUpdater.js';
|
|
9
9
|
export type { ModelUpdaterConfig } from './ModelUpdater.js';
|
|
10
|
+
export { createOnlineModelUpdater, DefaultOnlineModelUpdater, } from './OnlineModelUpdater.js';
|
|
11
|
+
export type { OnlineModelUpdater, OnlineModelUpdaterConfig, FeedbackType, FeedbackRecord, FeedbackResult, UpdateResult, ModelWeights, UpdateStatistics, } from './OnlineModelUpdater.js';
|
|
10
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/learning/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/learning/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,OAAO,EACL,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,kBAAkB,EAClB,wBAAwB,EACxB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,gBAAgB,GACjB,MAAM,yBAAyB,CAAC"}
|
package/dist/learning/index.js
CHANGED
|
@@ -5,4 +5,6 @@
|
|
|
5
5
|
export { TrajectoryLog } from './TrajectoryLog.js';
|
|
6
6
|
export { OnlineLearner } from './OnlineLearner.js';
|
|
7
7
|
export { ModelUpdater } from './ModelUpdater.js';
|
|
8
|
+
// OnlineModelUpdater (v2.2.0 NEW!)
|
|
9
|
+
export { createOnlineModelUpdater, DefaultOnlineModelUpdater, } from './OnlineModelUpdater.js';
|
|
8
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/learning/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/learning/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,mCAAmC;AACnC,OAAO,EACL,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC"}
|