@nahisaho/katashiro-evaluation 2.0.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/LICENSE +21 -0
- package/dist/BenchmarkSuite.d.ts +63 -0
- package/dist/BenchmarkSuite.d.ts.map +1 -0
- package/dist/BenchmarkSuite.js +152 -0
- package/dist/BenchmarkSuite.js.map +1 -0
- package/dist/DatasetManager.d.ts +68 -0
- package/dist/DatasetManager.d.ts.map +1 -0
- package/dist/DatasetManager.js +161 -0
- package/dist/DatasetManager.js.map +1 -0
- package/dist/ExperimentRunner.d.ts +51 -0
- package/dist/ExperimentRunner.d.ts.map +1 -0
- package/dist/ExperimentRunner.js +170 -0
- package/dist/ExperimentRunner.js.map +1 -0
- package/dist/evaluators/CompositeEvaluator.d.ts +66 -0
- package/dist/evaluators/CompositeEvaluator.d.ts.map +1 -0
- package/dist/evaluators/CompositeEvaluator.js +122 -0
- package/dist/evaluators/CompositeEvaluator.js.map +1 -0
- package/dist/evaluators/HeuristicEvaluator.d.ts +82 -0
- package/dist/evaluators/HeuristicEvaluator.d.ts.map +1 -0
- package/dist/evaluators/HeuristicEvaluator.js +233 -0
- package/dist/evaluators/HeuristicEvaluator.js.map +1 -0
- package/dist/evaluators/LLMJudgeEvaluator.d.ts +93 -0
- package/dist/evaluators/LLMJudgeEvaluator.d.ts.map +1 -0
- package/dist/evaluators/LLMJudgeEvaluator.js +296 -0
- package/dist/evaluators/LLMJudgeEvaluator.js.map +1 -0
- package/dist/evaluators/RAGASEvaluators.d.ts +128 -0
- package/dist/evaluators/RAGASEvaluators.d.ts.map +1 -0
- package/dist/evaluators/RAGASEvaluators.js +521 -0
- package/dist/evaluators/RAGASEvaluators.js.map +1 -0
- package/dist/evaluators/index.d.ts +13 -0
- package/dist/evaluators/index.d.ts.map +1 -0
- package/dist/evaluators/index.js +12 -0
- package/dist/evaluators/index.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/reporting/EvaluationReporter.d.ts +135 -0
- package/dist/reporting/EvaluationReporter.d.ts.map +1 -0
- package/dist/reporting/EvaluationReporter.js +285 -0
- package/dist/reporting/EvaluationReporter.js.map +1 -0
- package/dist/reporting/index.d.ts +8 -0
- package/dist/reporting/index.d.ts.map +1 -0
- package/dist/reporting/index.js +8 -0
- package/dist/reporting/index.js.map +1 -0
- package/dist/reporting/templates.d.ts +91 -0
- package/dist/reporting/templates.d.ts.map +1 -0
- package/dist/reporting/templates.js +150 -0
- package/dist/reporting/templates.js.map +1 -0
- package/dist/types.d.ts +408 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Experiment Runner
|
|
3
|
+
*
|
|
4
|
+
* @requirement REQ-EVAL-005
|
|
5
|
+
* @design DES-KATASHIRO-003-EVAL §3.5
|
|
6
|
+
*/
|
|
7
|
+
import { getDatasetManager } from './DatasetManager.js';
|
|
8
|
+
import { getEvaluatorRegistry } from './evaluators/CompositeEvaluator.js';
|
|
9
|
+
/**
|
|
10
|
+
* 実験ランナー
|
|
11
|
+
*/
|
|
12
|
+
export class ExperimentRunner {
|
|
13
|
+
config;
|
|
14
|
+
experiments = new Map();
|
|
15
|
+
constructor(config) {
|
|
16
|
+
this.config = {
|
|
17
|
+
concurrency: config?.concurrency ?? 5,
|
|
18
|
+
timeout: config?.timeout ?? 30000,
|
|
19
|
+
onProgress: config?.onProgress ?? (() => { }),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 実験実行
|
|
24
|
+
*/
|
|
25
|
+
async run(experimentConfig, generator) {
|
|
26
|
+
const startTime = Date.now();
|
|
27
|
+
const experimentId = `exp-${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
28
|
+
// データセット取得
|
|
29
|
+
const datasetMgr = getDatasetManager();
|
|
30
|
+
const items = datasetMgr.getItems(experimentConfig.datasetId);
|
|
31
|
+
if (items.length === 0) {
|
|
32
|
+
throw new Error(`Dataset ${experimentConfig.datasetId} is empty or not found`);
|
|
33
|
+
}
|
|
34
|
+
// 評価器取得
|
|
35
|
+
const registry = getEvaluatorRegistry();
|
|
36
|
+
const evaluators = [];
|
|
37
|
+
for (const name of experimentConfig.evaluators) {
|
|
38
|
+
const evaluator = registry.get(name);
|
|
39
|
+
if (evaluator) {
|
|
40
|
+
evaluators.push(evaluator);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (evaluators.length === 0) {
|
|
44
|
+
throw new Error('No evaluators found');
|
|
45
|
+
}
|
|
46
|
+
// 実験実行
|
|
47
|
+
const details = [];
|
|
48
|
+
let successCount = 0;
|
|
49
|
+
let errorCount = 0;
|
|
50
|
+
for (let i = 0; i < items.length; i++) {
|
|
51
|
+
const item = items[i];
|
|
52
|
+
this.config.onProgress(i + 1, items.length);
|
|
53
|
+
try {
|
|
54
|
+
// 出力生成
|
|
55
|
+
const output = await Promise.race([
|
|
56
|
+
generator(item.input),
|
|
57
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Generation timeout')), this.config.timeout)),
|
|
58
|
+
]);
|
|
59
|
+
// 評価実行
|
|
60
|
+
const evalInput = {
|
|
61
|
+
input: item.input,
|
|
62
|
+
output,
|
|
63
|
+
expected: item.expected,
|
|
64
|
+
context: item.metadata,
|
|
65
|
+
};
|
|
66
|
+
const evaluations = await Promise.all(evaluators.map((e) => e.evaluate(evalInput)));
|
|
67
|
+
details.push({
|
|
68
|
+
itemId: item.id,
|
|
69
|
+
input: item.input,
|
|
70
|
+
output,
|
|
71
|
+
expected: item.expected,
|
|
72
|
+
evaluations,
|
|
73
|
+
success: true,
|
|
74
|
+
});
|
|
75
|
+
successCount++;
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
details.push({
|
|
79
|
+
itemId: item.id,
|
|
80
|
+
input: item.input,
|
|
81
|
+
output: '',
|
|
82
|
+
expected: item.expected,
|
|
83
|
+
evaluations: [],
|
|
84
|
+
success: false,
|
|
85
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
86
|
+
});
|
|
87
|
+
errorCount++;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// サマリー計算
|
|
91
|
+
const summary = this.calculateSummary(details, evaluators);
|
|
92
|
+
const result = {
|
|
93
|
+
id: experimentId,
|
|
94
|
+
name: experimentConfig.name,
|
|
95
|
+
timestamp: new Date().toISOString(),
|
|
96
|
+
datasetId: experimentConfig.datasetId,
|
|
97
|
+
summary,
|
|
98
|
+
details,
|
|
99
|
+
durationMs: Date.now() - startTime,
|
|
100
|
+
metadata: {
|
|
101
|
+
tags: experimentConfig.tags,
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
this.experiments.set(experimentId, result);
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* 実験結果取得
|
|
109
|
+
*/
|
|
110
|
+
getResult(experimentId) {
|
|
111
|
+
return this.experiments.get(experimentId);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 全実験結果取得
|
|
115
|
+
*/
|
|
116
|
+
listResults() {
|
|
117
|
+
return Array.from(this.experiments.values());
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* サマリー計算
|
|
121
|
+
*/
|
|
122
|
+
calculateSummary(details, evaluators) {
|
|
123
|
+
const successDetails = details.filter((d) => d.success);
|
|
124
|
+
const averageScores = {};
|
|
125
|
+
const stdDevs = {};
|
|
126
|
+
for (const evaluator of evaluators) {
|
|
127
|
+
const scores = successDetails
|
|
128
|
+
.map((d) => d.evaluations.find((e) => e.evaluator === evaluator.name))
|
|
129
|
+
.filter((e) => e !== undefined)
|
|
130
|
+
.map((e) => e.normalizedScore);
|
|
131
|
+
if (scores.length > 0) {
|
|
132
|
+
const avg = scores.reduce((a, b) => a + b, 0) / scores.length;
|
|
133
|
+
averageScores[evaluator.name] = avg;
|
|
134
|
+
const variance = scores.reduce((sum, s) => sum + Math.pow(s - avg, 2), 0) /
|
|
135
|
+
scores.length;
|
|
136
|
+
stdDevs[evaluator.name] = Math.sqrt(variance);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
const overallScore = Object.keys(averageScores).length > 0
|
|
140
|
+
? Object.values(averageScores).reduce((a, b) => a + b, 0) /
|
|
141
|
+
Object.keys(averageScores).length
|
|
142
|
+
: 0;
|
|
143
|
+
return {
|
|
144
|
+
averageScores,
|
|
145
|
+
stdDevs,
|
|
146
|
+
overallScore,
|
|
147
|
+
totalItems: details.length,
|
|
148
|
+
successCount: successDetails.length,
|
|
149
|
+
errorCount: details.length - successDetails.length,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// シングルトン
|
|
154
|
+
let experimentRunner = null;
|
|
155
|
+
/**
|
|
156
|
+
* グローバル実験ランナー取得
|
|
157
|
+
*/
|
|
158
|
+
export function getExperimentRunner() {
|
|
159
|
+
if (!experimentRunner) {
|
|
160
|
+
experimentRunner = new ExperimentRunner();
|
|
161
|
+
}
|
|
162
|
+
return experimentRunner;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* 実験ランナーリセット(テスト用)
|
|
166
|
+
*/
|
|
167
|
+
export function resetExperimentRunner() {
|
|
168
|
+
experimentRunner = null;
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=ExperimentRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExperimentRunner.js","sourceRoot":"","sources":["../src/ExperimentRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composite Evaluator
|
|
3
|
+
*
|
|
4
|
+
* @requirement REQ-EVAL-002
|
|
5
|
+
* @design DES-KATASHIRO-003-EVAL §3.2
|
|
6
|
+
*/
|
|
7
|
+
import type { Evaluator, EvaluationInput, EvaluationResult } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* 複合評価器設定
|
|
10
|
+
*/
|
|
11
|
+
export interface CompositeEvaluatorConfig {
|
|
12
|
+
/** 評価器名 */
|
|
13
|
+
name?: string;
|
|
14
|
+
/** 評価器リスト */
|
|
15
|
+
evaluators: Array<{
|
|
16
|
+
evaluator: Evaluator;
|
|
17
|
+
weight?: number;
|
|
18
|
+
}>;
|
|
19
|
+
/** 集約方法 */
|
|
20
|
+
aggregation?: 'weighted' | 'min' | 'max' | 'average';
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 複合評価器
|
|
24
|
+
*/
|
|
25
|
+
export declare class CompositeEvaluator implements Evaluator {
|
|
26
|
+
readonly name: string;
|
|
27
|
+
private evaluators;
|
|
28
|
+
private aggregation;
|
|
29
|
+
constructor(config: CompositeEvaluatorConfig);
|
|
30
|
+
evaluate(input: EvaluationInput): Promise<EvaluationResult>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 評価器レジストリ
|
|
34
|
+
*/
|
|
35
|
+
export declare class EvaluatorRegistry {
|
|
36
|
+
private evaluators;
|
|
37
|
+
/**
|
|
38
|
+
* 評価器登録
|
|
39
|
+
*/
|
|
40
|
+
register(name: string, evaluator: Evaluator): void;
|
|
41
|
+
/**
|
|
42
|
+
* 評価器取得
|
|
43
|
+
*/
|
|
44
|
+
get(name: string): Evaluator | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* 評価器削除
|
|
47
|
+
*/
|
|
48
|
+
unregister(name: string): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* 全評価器取得
|
|
51
|
+
*/
|
|
52
|
+
getAll(): Evaluator[];
|
|
53
|
+
/**
|
|
54
|
+
* 評価器名一覧
|
|
55
|
+
*/
|
|
56
|
+
list(): string[];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* グローバル評価器レジストリ取得
|
|
60
|
+
*/
|
|
61
|
+
export declare function getEvaluatorRegistry(): EvaluatorRegistry;
|
|
62
|
+
/**
|
|
63
|
+
* 評価器レジストリリセット(テスト用)
|
|
64
|
+
*/
|
|
65
|
+
export declare function resetEvaluatorRegistry(): void;
|
|
66
|
+
//# sourceMappingURL=CompositeEvaluator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CompositeEvaluator.d.ts","sourceRoot":"","sources":["../../src/evaluators/CompositeEvaluator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,WAAW;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa;IACb,UAAU,EAAE,KAAK,CAAC;QAChB,SAAS,EAAE,SAAS,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,WAAW;IACX,WAAW,CAAC,EAAE,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC;CACtD;AAED;;GAEG;AACH,qBAAa,kBAAmB,YAAW,SAAS;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,UAAU,CAAkD;IACpE,OAAO,CAAC,WAAW,CAA0C;gBAEjD,MAAM,EAAE,wBAAwB;IAStC,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAoDlE;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAAqC;IAEvD;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAIlD;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIxC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC;;OAEG;IACH,MAAM,IAAI,SAAS,EAAE;IAIrB;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE;CAGjB;AAKD;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,iBAAiB,CAKxD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composite Evaluator
|
|
3
|
+
*
|
|
4
|
+
* @requirement REQ-EVAL-002
|
|
5
|
+
* @design DES-KATASHIRO-003-EVAL §3.2
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* 複合評価器
|
|
9
|
+
*/
|
|
10
|
+
export class CompositeEvaluator {
|
|
11
|
+
name;
|
|
12
|
+
evaluators;
|
|
13
|
+
aggregation;
|
|
14
|
+
constructor(config) {
|
|
15
|
+
this.name = config.name ?? 'composite';
|
|
16
|
+
this.evaluators = config.evaluators.map((e) => ({
|
|
17
|
+
evaluator: e.evaluator,
|
|
18
|
+
weight: e.weight ?? 1,
|
|
19
|
+
}));
|
|
20
|
+
this.aggregation = config.aggregation ?? 'weighted';
|
|
21
|
+
}
|
|
22
|
+
async evaluate(input) {
|
|
23
|
+
const results = await Promise.all(this.evaluators.map((e) => e.evaluator.evaluate(input)));
|
|
24
|
+
const scores = results.map((r, i) => ({
|
|
25
|
+
score: r.normalizedScore,
|
|
26
|
+
weight: this.evaluators[i]?.weight ?? 1,
|
|
27
|
+
}));
|
|
28
|
+
let aggregatedScore;
|
|
29
|
+
switch (this.aggregation) {
|
|
30
|
+
case 'min':
|
|
31
|
+
aggregatedScore = Math.min(...scores.map((s) => s.score));
|
|
32
|
+
break;
|
|
33
|
+
case 'max':
|
|
34
|
+
aggregatedScore = Math.max(...scores.map((s) => s.score));
|
|
35
|
+
break;
|
|
36
|
+
case 'average':
|
|
37
|
+
aggregatedScore =
|
|
38
|
+
scores.reduce((sum, s) => sum + s.score, 0) / scores.length;
|
|
39
|
+
break;
|
|
40
|
+
case 'weighted':
|
|
41
|
+
default: {
|
|
42
|
+
const totalWeight = scores.reduce((sum, s) => sum + s.weight, 0);
|
|
43
|
+
aggregatedScore =
|
|
44
|
+
totalWeight > 0
|
|
45
|
+
? scores.reduce((sum, s) => sum + s.score * s.weight, 0) / totalWeight
|
|
46
|
+
: 0;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const reasoning = results
|
|
50
|
+
.map((r) => `${r.evaluator}: ${r.score.toFixed(2)} (${r.reasoning})`)
|
|
51
|
+
.join('; ');
|
|
52
|
+
return {
|
|
53
|
+
evaluator: this.name,
|
|
54
|
+
score: aggregatedScore,
|
|
55
|
+
normalizedScore: aggregatedScore,
|
|
56
|
+
reasoning: `複合評価 [${this.aggregation}]: ${reasoning}`,
|
|
57
|
+
passed: aggregatedScore >= 0.5,
|
|
58
|
+
metadata: {
|
|
59
|
+
componentResults: results,
|
|
60
|
+
componentScores: results.map((r, i) => ({
|
|
61
|
+
evaluator: this.evaluators[i]?.evaluator.name ?? 'unknown',
|
|
62
|
+
score: r.normalizedScore,
|
|
63
|
+
})),
|
|
64
|
+
aggregation: this.aggregation,
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 評価器レジストリ
|
|
71
|
+
*/
|
|
72
|
+
export class EvaluatorRegistry {
|
|
73
|
+
evaluators = new Map();
|
|
74
|
+
/**
|
|
75
|
+
* 評価器登録
|
|
76
|
+
*/
|
|
77
|
+
register(name, evaluator) {
|
|
78
|
+
this.evaluators.set(name, evaluator);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 評価器取得
|
|
82
|
+
*/
|
|
83
|
+
get(name) {
|
|
84
|
+
return this.evaluators.get(name);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 評価器削除
|
|
88
|
+
*/
|
|
89
|
+
unregister(name) {
|
|
90
|
+
return this.evaluators.delete(name);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 全評価器取得
|
|
94
|
+
*/
|
|
95
|
+
getAll() {
|
|
96
|
+
return Array.from(this.evaluators.values());
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* 評価器名一覧
|
|
100
|
+
*/
|
|
101
|
+
list() {
|
|
102
|
+
return Array.from(this.evaluators.keys());
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// シングルトンレジストリ
|
|
106
|
+
let evaluatorRegistry = null;
|
|
107
|
+
/**
|
|
108
|
+
* グローバル評価器レジストリ取得
|
|
109
|
+
*/
|
|
110
|
+
export function getEvaluatorRegistry() {
|
|
111
|
+
if (!evaluatorRegistry) {
|
|
112
|
+
evaluatorRegistry = new EvaluatorRegistry();
|
|
113
|
+
}
|
|
114
|
+
return evaluatorRegistry;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* 評価器レジストリリセット(テスト用)
|
|
118
|
+
*/
|
|
119
|
+
export function resetEvaluatorRegistry() {
|
|
120
|
+
evaluatorRegistry = null;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=CompositeEvaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CompositeEvaluator.js","sourceRoot":"","sources":["../../src/evaluators/CompositeEvaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heuristic Evaluators
|
|
3
|
+
*
|
|
4
|
+
* @requirement REQ-EVAL-002
|
|
5
|
+
* @design DES-KATASHIRO-003-EVAL §3.2
|
|
6
|
+
*/
|
|
7
|
+
import type { Evaluator, EvaluationInput, EvaluationResult } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* 長さ評価器設定
|
|
10
|
+
*/
|
|
11
|
+
export interface LengthEvaluatorConfig {
|
|
12
|
+
minLength?: number;
|
|
13
|
+
maxLength?: number;
|
|
14
|
+
optimalLength?: number;
|
|
15
|
+
tolerance?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 長さベース評価器
|
|
19
|
+
*/
|
|
20
|
+
export declare class LengthEvaluator implements Evaluator {
|
|
21
|
+
private config;
|
|
22
|
+
readonly name = "length";
|
|
23
|
+
constructor(config?: LengthEvaluatorConfig);
|
|
24
|
+
evaluate(input: EvaluationInput): Promise<EvaluationResult>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* キーワード評価器設定
|
|
28
|
+
*/
|
|
29
|
+
export interface KeywordEvaluatorConfig {
|
|
30
|
+
requiredKeywords?: string[];
|
|
31
|
+
forbiddenKeywords?: string[];
|
|
32
|
+
caseSensitive?: boolean;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* キーワード評価器
|
|
36
|
+
*/
|
|
37
|
+
export declare class KeywordEvaluator implements Evaluator {
|
|
38
|
+
private config;
|
|
39
|
+
readonly name = "keyword";
|
|
40
|
+
constructor(config?: KeywordEvaluatorConfig);
|
|
41
|
+
evaluate(input: EvaluationInput): Promise<EvaluationResult>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 正規表現評価器設定
|
|
45
|
+
*/
|
|
46
|
+
export interface RegexEvaluatorConfig {
|
|
47
|
+
patterns: RegExp[];
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 正規表現評価器
|
|
51
|
+
*/
|
|
52
|
+
export declare class RegexEvaluator implements Evaluator {
|
|
53
|
+
private config;
|
|
54
|
+
readonly name = "regex";
|
|
55
|
+
constructor(config: RegexEvaluatorConfig);
|
|
56
|
+
evaluate(input: EvaluationInput): Promise<EvaluationResult>;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* JSON構造評価器
|
|
60
|
+
*/
|
|
61
|
+
export declare class JsonStructureEvaluator implements Evaluator {
|
|
62
|
+
private config;
|
|
63
|
+
readonly name = "json-structure";
|
|
64
|
+
constructor(config?: {
|
|
65
|
+
requiredFields?: string[];
|
|
66
|
+
types?: Record<string, string>;
|
|
67
|
+
});
|
|
68
|
+
evaluate(input: EvaluationInput): Promise<EvaluationResult>;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 類似度評価器(Jaccard係数)
|
|
72
|
+
*/
|
|
73
|
+
export declare class SimilarityEvaluator implements Evaluator {
|
|
74
|
+
private config;
|
|
75
|
+
readonly name = "similarity";
|
|
76
|
+
constructor(config?: {
|
|
77
|
+
threshold?: number;
|
|
78
|
+
tokenize?: (text: string) => string[];
|
|
79
|
+
});
|
|
80
|
+
evaluate(input: EvaluationInput): Promise<EvaluationResult>;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=HeuristicEvaluator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HeuristicEvaluator.d.ts","sourceRoot":"","sources":["../../src/evaluators/HeuristicEvaluator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,SAAS;IAGnC,OAAO,CAAC,MAAM;IAF1B,QAAQ,CAAC,IAAI,YAAY;gBAEL,MAAM,GAAE,qBAA0B;IAEhD,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAwClE;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,qBAAa,gBAAiB,YAAW,SAAS;IAGpC,OAAO,CAAC,MAAM;IAF1B,QAAQ,CAAC,IAAI,aAAa;gBAEN,MAAM,GAAE,sBAA2B;IAEjD,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAoDlE;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,cAAe,YAAW,SAAS;IAGlC,OAAO,CAAC,MAAM;IAF1B,QAAQ,CAAC,IAAI,WAAW;gBAEJ,MAAM,EAAE,oBAAoB;IAE1C,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAwBlE;AAED;;GAEG;AACH,qBAAa,sBAAuB,YAAW,SAAS;IAIpD,OAAO,CAAC,MAAM;IAHhB,QAAQ,CAAC,IAAI,oBAAoB;gBAGvB,MAAM,GAAE;QACd,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC3B;IAGF,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;CA+DlE;AAED;;GAEG;AACH,qBAAa,mBAAoB,YAAW,SAAS;IAIjD,OAAO,CAAC,MAAM;IAHhB,QAAQ,CAAC,IAAI,gBAAgB;gBAGnB,MAAM,GAAE;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;KAClC;IAGF,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAoClE"}
|