@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.
Files changed (54) hide show
  1. package/LICENSE +21 -0
  2. package/dist/BenchmarkSuite.d.ts +63 -0
  3. package/dist/BenchmarkSuite.d.ts.map +1 -0
  4. package/dist/BenchmarkSuite.js +152 -0
  5. package/dist/BenchmarkSuite.js.map +1 -0
  6. package/dist/DatasetManager.d.ts +68 -0
  7. package/dist/DatasetManager.d.ts.map +1 -0
  8. package/dist/DatasetManager.js +161 -0
  9. package/dist/DatasetManager.js.map +1 -0
  10. package/dist/ExperimentRunner.d.ts +51 -0
  11. package/dist/ExperimentRunner.d.ts.map +1 -0
  12. package/dist/ExperimentRunner.js +170 -0
  13. package/dist/ExperimentRunner.js.map +1 -0
  14. package/dist/evaluators/CompositeEvaluator.d.ts +66 -0
  15. package/dist/evaluators/CompositeEvaluator.d.ts.map +1 -0
  16. package/dist/evaluators/CompositeEvaluator.js +122 -0
  17. package/dist/evaluators/CompositeEvaluator.js.map +1 -0
  18. package/dist/evaluators/HeuristicEvaluator.d.ts +82 -0
  19. package/dist/evaluators/HeuristicEvaluator.d.ts.map +1 -0
  20. package/dist/evaluators/HeuristicEvaluator.js +233 -0
  21. package/dist/evaluators/HeuristicEvaluator.js.map +1 -0
  22. package/dist/evaluators/LLMJudgeEvaluator.d.ts +93 -0
  23. package/dist/evaluators/LLMJudgeEvaluator.d.ts.map +1 -0
  24. package/dist/evaluators/LLMJudgeEvaluator.js +296 -0
  25. package/dist/evaluators/LLMJudgeEvaluator.js.map +1 -0
  26. package/dist/evaluators/RAGASEvaluators.d.ts +128 -0
  27. package/dist/evaluators/RAGASEvaluators.d.ts.map +1 -0
  28. package/dist/evaluators/RAGASEvaluators.js +521 -0
  29. package/dist/evaluators/RAGASEvaluators.js.map +1 -0
  30. package/dist/evaluators/index.d.ts +13 -0
  31. package/dist/evaluators/index.d.ts.map +1 -0
  32. package/dist/evaluators/index.js +12 -0
  33. package/dist/evaluators/index.js.map +1 -0
  34. package/dist/index.d.ts +20 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +24 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/reporting/EvaluationReporter.d.ts +135 -0
  39. package/dist/reporting/EvaluationReporter.d.ts.map +1 -0
  40. package/dist/reporting/EvaluationReporter.js +285 -0
  41. package/dist/reporting/EvaluationReporter.js.map +1 -0
  42. package/dist/reporting/index.d.ts +8 -0
  43. package/dist/reporting/index.d.ts.map +1 -0
  44. package/dist/reporting/index.js +8 -0
  45. package/dist/reporting/index.js.map +1 -0
  46. package/dist/reporting/templates.d.ts +91 -0
  47. package/dist/reporting/templates.d.ts.map +1 -0
  48. package/dist/reporting/templates.js +150 -0
  49. package/dist/reporting/templates.js.map +1 -0
  50. package/dist/types.d.ts +408 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +8 -0
  53. package/dist/types.js.map +1 -0
  54. package/package.json +47 -0
@@ -0,0 +1,128 @@
1
+ /**
2
+ * RAGAS Evaluators
3
+ *
4
+ * RAG評価用のRAGASメトリクスを実装する評価器群
5
+ *
6
+ * @requirement REQ-EVAL-102
7
+ * @design DES-KATASHIRO-003-EVAL §3.4
8
+ */
9
+ import type { Evaluator, EvaluationInput, EvaluationResult, RAGEvaluationInput, RAGASEvaluationResult } from '../types.js';
10
+ interface LLMProviderLike {
11
+ generate(request: {
12
+ messages: Array<{
13
+ role: string;
14
+ content: string;
15
+ }>;
16
+ temperature?: number;
17
+ responseFormat?: {
18
+ type: string;
19
+ };
20
+ }): Promise<{
21
+ content: string;
22
+ usage?: {
23
+ promptTokens: number;
24
+ completionTokens: number;
25
+ totalTokens: number;
26
+ };
27
+ }>;
28
+ }
29
+ /**
30
+ * RAG評価入力かどうかを判定
31
+ */
32
+ export declare function isRAGEvaluationInput(input: EvaluationInput): input is RAGEvaluationInput;
33
+ /**
34
+ * RAG評価共通設定
35
+ */
36
+ export interface RAGEvaluatorConfig {
37
+ /** 評価器名 */
38
+ name?: string;
39
+ /** リトライ回数 */
40
+ maxRetries?: number;
41
+ /** 温度パラメータ */
42
+ temperature?: number;
43
+ }
44
+ /**
45
+ * Faithfulness評価器
46
+ *
47
+ * 回答がコンテキストに基づいているか(幻覚がないか)を評価
48
+ */
49
+ export declare class FaithfulnessEvaluator implements Evaluator {
50
+ readonly name: string;
51
+ private llmProvider;
52
+ private temperature;
53
+ constructor(llmProvider: LLMProviderLike, config?: RAGEvaluatorConfig);
54
+ evaluate(input: EvaluationInput): Promise<EvaluationResult>;
55
+ private extractStatementsFromText;
56
+ }
57
+ /**
58
+ * Context Relevancy評価器
59
+ *
60
+ * 取得されたコンテキストがクエリに関連しているかを評価
61
+ */
62
+ export declare class ContextRelevancyEvaluator implements Evaluator {
63
+ readonly name: string;
64
+ private llmProvider;
65
+ private temperature;
66
+ constructor(llmProvider: LLMProviderLike, config?: RAGEvaluatorConfig);
67
+ evaluate(input: EvaluationInput): Promise<EvaluationResult>;
68
+ }
69
+ /**
70
+ * Answer Relevancy評価器
71
+ *
72
+ * 回答がクエリに対して関連しているかを評価
73
+ */
74
+ export declare class AnswerRelevancyEvaluator implements Evaluator {
75
+ readonly name: string;
76
+ private llmProvider;
77
+ private temperature;
78
+ constructor(llmProvider: LLMProviderLike, config?: RAGEvaluatorConfig);
79
+ evaluate(input: EvaluationInput): Promise<EvaluationResult>;
80
+ }
81
+ /**
82
+ * Context Recall評価器
83
+ *
84
+ * コンテキストがグラウンドトゥルースをカバーしているかを評価
85
+ */
86
+ export declare class ContextRecallEvaluator implements Evaluator {
87
+ readonly name: string;
88
+ private llmProvider;
89
+ private temperature;
90
+ constructor(llmProvider: LLMProviderLike, config?: RAGEvaluatorConfig);
91
+ evaluate(input: EvaluationInput): Promise<EvaluationResult>;
92
+ }
93
+ /**
94
+ * RAGAS複合評価器設定
95
+ */
96
+ export interface RAGASCompositeEvaluatorConfig {
97
+ /** 評価器名 */
98
+ name?: string;
99
+ /** 有効化するメトリクス */
100
+ enabledMetrics?: Array<'faithfulness' | 'contextRelevancy' | 'answerRelevancy' | 'contextRecall'>;
101
+ /** 各メトリクスの重み */
102
+ weights?: {
103
+ faithfulness?: number;
104
+ contextRelevancy?: number;
105
+ answerRelevancy?: number;
106
+ contextRecall?: number;
107
+ };
108
+ /** 共通設定 */
109
+ evaluatorConfig?: RAGEvaluatorConfig;
110
+ }
111
+ /**
112
+ * RAGAS複合評価器
113
+ *
114
+ * 複数のRAGASメトリクスを組み合わせて評価
115
+ */
116
+ export declare class RAGASCompositeEvaluator implements Evaluator {
117
+ readonly name: string;
118
+ private evaluators;
119
+ private enabledMetrics;
120
+ constructor(llmProvider: LLMProviderLike, config?: RAGASCompositeEvaluatorConfig);
121
+ evaluate(input: EvaluationInput): Promise<RAGASEvaluationResult>;
122
+ /**
123
+ * 有効化されているメトリクスを取得
124
+ */
125
+ getEnabledMetrics(): string[];
126
+ }
127
+ export {};
128
+ //# sourceMappingURL=RAGASEvaluators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RAGASEvaluators.d.ts","sourceRoot":"","sources":["../../src/evaluators/RAGASEvaluators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,521 @@
1
+ /**
2
+ * RAGAS Evaluators
3
+ *
4
+ * RAG評価用のRAGASメトリクスを実装する評価器群
5
+ *
6
+ * @requirement REQ-EVAL-102
7
+ * @design DES-KATASHIRO-003-EVAL §3.4
8
+ */
9
+ /**
10
+ * RAG評価入力かどうかを判定
11
+ */
12
+ export function isRAGEvaluationInput(input) {
13
+ return ('query' in input &&
14
+ 'retrievedContexts' in input &&
15
+ 'generatedAnswer' in input &&
16
+ typeof input.query === 'string' &&
17
+ Array.isArray(input.retrievedContexts) &&
18
+ typeof input.generatedAnswer === 'string');
19
+ }
20
+ /**
21
+ * Faithfulness評価器
22
+ *
23
+ * 回答がコンテキストに基づいているか(幻覚がないか)を評価
24
+ */
25
+ export class FaithfulnessEvaluator {
26
+ name;
27
+ llmProvider;
28
+ temperature;
29
+ constructor(llmProvider, config = {}) {
30
+ this.llmProvider = llmProvider;
31
+ this.name = config.name ?? 'faithfulness';
32
+ this.temperature = config.temperature ?? 0.1;
33
+ }
34
+ async evaluate(input) {
35
+ if (!isRAGEvaluationInput(input)) {
36
+ return {
37
+ evaluator: this.name,
38
+ score: 0,
39
+ normalizedScore: 0,
40
+ passed: false,
41
+ reasoning: 'RAG評価入力ではありません',
42
+ };
43
+ }
44
+ const { generatedAnswer, retrievedContexts } = input;
45
+ const context = retrievedContexts.join('\n\n');
46
+ // ステートメント抽出プロンプト
47
+ const extractPrompt = `以下の回答から、主要なファクト/ステートメントを抽出してください。
48
+
49
+ ## 回答
50
+ ${generatedAnswer}
51
+
52
+ ## 出力形式
53
+ JSON配列形式で出力してください:
54
+ ["ステートメント1", "ステートメント2", ...]`;
55
+ // 各ステートメントのサポート確認プロンプト
56
+ const verifyPromptTemplate = (statements) => `以下のステートメントがコンテキストでサポートされているか確認してください。
57
+
58
+ ## コンテキスト
59
+ ${context}
60
+
61
+ ## ステートメント
62
+ ${statements.map((s, i) => `${i + 1}. ${s}`).join('\n')}
63
+
64
+ ## 出力形式
65
+ JSON形式で出力してください:
66
+ {
67
+ "supported": ["サポートされているステートメント"],
68
+ "unsupported": ["サポートされていないステートメント"]
69
+ }`;
70
+ try {
71
+ // ステートメント抽出
72
+ const extractResponse = await this.llmProvider.generate({
73
+ messages: [{ role: 'user', content: extractPrompt }],
74
+ temperature: this.temperature,
75
+ responseFormat: { type: 'json_object' },
76
+ });
77
+ let statements;
78
+ try {
79
+ const parsed = JSON.parse(extractResponse.content);
80
+ statements = Array.isArray(parsed) ? parsed : (parsed.statements ?? []);
81
+ }
82
+ catch {
83
+ statements = this.extractStatementsFromText(extractResponse.content);
84
+ }
85
+ if (statements.length === 0) {
86
+ return {
87
+ evaluator: this.name,
88
+ score: 1,
89
+ normalizedScore: 1,
90
+ passed: true,
91
+ reasoning: '抽出されたステートメントがありません',
92
+ };
93
+ }
94
+ // サポート確認
95
+ const verifyResponse = await this.llmProvider.generate({
96
+ messages: [{ role: 'user', content: verifyPromptTemplate(statements) }],
97
+ temperature: this.temperature,
98
+ responseFormat: { type: 'json_object' },
99
+ });
100
+ let supported = [];
101
+ let unsupported = [];
102
+ try {
103
+ const parsed = JSON.parse(verifyResponse.content);
104
+ supported = parsed.supported ?? [];
105
+ unsupported = parsed.unsupported ?? [];
106
+ }
107
+ catch {
108
+ // フォールバック: 全てサポートされていると仮定
109
+ supported = statements;
110
+ }
111
+ const total = supported.length + unsupported.length;
112
+ const score = total > 0 ? supported.length / total : 1;
113
+ return {
114
+ evaluator: this.name,
115
+ score,
116
+ normalizedScore: score,
117
+ passed: score >= 0.7,
118
+ reasoning: `${supported.length}/${total} ステートメントがコンテキストでサポートされています`,
119
+ metadata: {
120
+ statements,
121
+ supportedStatements: supported,
122
+ unsupportedStatements: unsupported,
123
+ },
124
+ };
125
+ }
126
+ catch (error) {
127
+ return {
128
+ evaluator: this.name,
129
+ score: 0,
130
+ normalizedScore: 0,
131
+ passed: false,
132
+ reasoning: `評価に失敗しました: ${error instanceof Error ? error.message : 'Unknown error'}`,
133
+ };
134
+ }
135
+ }
136
+ extractStatementsFromText(text) {
137
+ // 箇条書きや番号付きリストからステートメントを抽出
138
+ const lines = text.split('\n').filter((line) => line.trim());
139
+ return lines
140
+ .map((line) => line.replace(/^[\d\-\*\.]+\s*/, '').trim())
141
+ .filter((line) => line.length > 10);
142
+ }
143
+ }
144
+ /**
145
+ * Context Relevancy評価器
146
+ *
147
+ * 取得されたコンテキストがクエリに関連しているかを評価
148
+ */
149
+ export class ContextRelevancyEvaluator {
150
+ name;
151
+ llmProvider;
152
+ temperature;
153
+ constructor(llmProvider, config = {}) {
154
+ this.llmProvider = llmProvider;
155
+ this.name = config.name ?? 'context-relevancy';
156
+ this.temperature = config.temperature ?? 0.1;
157
+ }
158
+ async evaluate(input) {
159
+ if (!isRAGEvaluationInput(input)) {
160
+ return {
161
+ evaluator: this.name,
162
+ score: 0,
163
+ normalizedScore: 0,
164
+ passed: false,
165
+ reasoning: 'RAG評価入力ではありません',
166
+ };
167
+ }
168
+ const { query, retrievedContexts } = input;
169
+ const prompt = `以下のクエリに対して、各コンテキストの関連性を0-1のスコアで評価してください。
170
+
171
+ ## クエリ
172
+ ${query}
173
+
174
+ ## コンテキスト
175
+ ${retrievedContexts.map((c, i) => `### コンテキスト ${i + 1}\n${c}`).join('\n\n')}
176
+
177
+ ## 出力形式
178
+ JSON形式で出力してください:
179
+ {
180
+ "scores": [0.8, 0.6, ...],
181
+ "reasoning": "関連性の説明"
182
+ }`;
183
+ try {
184
+ const response = await this.llmProvider.generate({
185
+ messages: [{ role: 'user', content: prompt }],
186
+ temperature: this.temperature,
187
+ responseFormat: { type: 'json_object' },
188
+ });
189
+ let scores = [];
190
+ let reasoning = '';
191
+ try {
192
+ const parsed = JSON.parse(response.content);
193
+ scores = parsed.scores ?? [];
194
+ reasoning = parsed.reasoning ?? '';
195
+ }
196
+ catch {
197
+ // フォールバック: 中央値スコア
198
+ scores = retrievedContexts.map(() => 0.5);
199
+ reasoning = 'スコアを抽出できませんでした';
200
+ }
201
+ const avgScore = scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : 0;
202
+ return {
203
+ evaluator: this.name,
204
+ score: avgScore,
205
+ normalizedScore: avgScore,
206
+ passed: avgScore >= 0.6,
207
+ reasoning,
208
+ metadata: {
209
+ contextScores: scores,
210
+ contextCount: retrievedContexts.length,
211
+ },
212
+ };
213
+ }
214
+ catch (error) {
215
+ return {
216
+ evaluator: this.name,
217
+ score: 0,
218
+ normalizedScore: 0,
219
+ passed: false,
220
+ reasoning: `評価に失敗しました: ${error instanceof Error ? error.message : 'Unknown error'}`,
221
+ };
222
+ }
223
+ }
224
+ }
225
+ /**
226
+ * Answer Relevancy評価器
227
+ *
228
+ * 回答がクエリに対して関連しているかを評価
229
+ */
230
+ export class AnswerRelevancyEvaluator {
231
+ name;
232
+ llmProvider;
233
+ temperature;
234
+ constructor(llmProvider, config = {}) {
235
+ this.llmProvider = llmProvider;
236
+ this.name = config.name ?? 'answer-relevancy';
237
+ this.temperature = config.temperature ?? 0.1;
238
+ }
239
+ async evaluate(input) {
240
+ if (!isRAGEvaluationInput(input)) {
241
+ return {
242
+ evaluator: this.name,
243
+ score: 0,
244
+ normalizedScore: 0,
245
+ passed: false,
246
+ reasoning: 'RAG評価入力ではありません',
247
+ };
248
+ }
249
+ const { query, generatedAnswer } = input;
250
+ const prompt = `以下のクエリに対する回答の関連性を評価してください。
251
+
252
+ ## クエリ
253
+ ${query}
254
+
255
+ ## 回答
256
+ ${generatedAnswer}
257
+
258
+ ## 評価基準
259
+ - 回答がクエリの質問に直接答えているか
260
+ - 回答が質問の意図を理解しているか
261
+ - 不要な情報が含まれていないか
262
+
263
+ ## 出力形式
264
+ JSON形式で出力してください:
265
+ {
266
+ "score": 0.0-1.0,
267
+ "reasoning": "評価の根拠",
268
+ "directlyAnswers": true/false,
269
+ "hasIrrelevantInfo": true/false
270
+ }`;
271
+ try {
272
+ const response = await this.llmProvider.generate({
273
+ messages: [{ role: 'user', content: prompt }],
274
+ temperature: this.temperature,
275
+ responseFormat: { type: 'json_object' },
276
+ });
277
+ let score = 0;
278
+ let reasoning = '';
279
+ let directlyAnswers = false;
280
+ let hasIrrelevantInfo = false;
281
+ try {
282
+ const parsed = JSON.parse(response.content);
283
+ score = typeof parsed.score === 'number' ? parsed.score : 0.5;
284
+ reasoning = parsed.reasoning ?? '';
285
+ directlyAnswers = parsed.directlyAnswers ?? false;
286
+ hasIrrelevantInfo = parsed.hasIrrelevantInfo ?? false;
287
+ }
288
+ catch {
289
+ score = 0.5;
290
+ reasoning = 'スコアを抽出できませんでした';
291
+ }
292
+ return {
293
+ evaluator: this.name,
294
+ score,
295
+ normalizedScore: score,
296
+ passed: score >= 0.6,
297
+ reasoning,
298
+ metadata: {
299
+ directlyAnswers,
300
+ hasIrrelevantInfo,
301
+ },
302
+ };
303
+ }
304
+ catch (error) {
305
+ return {
306
+ evaluator: this.name,
307
+ score: 0,
308
+ normalizedScore: 0,
309
+ passed: false,
310
+ reasoning: `評価に失敗しました: ${error instanceof Error ? error.message : 'Unknown error'}`,
311
+ };
312
+ }
313
+ }
314
+ }
315
+ /**
316
+ * Context Recall評価器
317
+ *
318
+ * コンテキストがグラウンドトゥルースをカバーしているかを評価
319
+ */
320
+ export class ContextRecallEvaluator {
321
+ name;
322
+ llmProvider;
323
+ temperature;
324
+ constructor(llmProvider, config = {}) {
325
+ this.llmProvider = llmProvider;
326
+ this.name = config.name ?? 'context-recall';
327
+ this.temperature = config.temperature ?? 0.1;
328
+ }
329
+ async evaluate(input) {
330
+ if (!isRAGEvaluationInput(input)) {
331
+ return {
332
+ evaluator: this.name,
333
+ score: 0,
334
+ normalizedScore: 0,
335
+ passed: false,
336
+ reasoning: 'RAG評価入力ではありません',
337
+ };
338
+ }
339
+ const { retrievedContexts, groundTruth } = input;
340
+ if (!groundTruth) {
341
+ return {
342
+ evaluator: this.name,
343
+ score: 0,
344
+ normalizedScore: 0,
345
+ passed: false,
346
+ reasoning: 'グラウンドトゥルースが指定されていません',
347
+ };
348
+ }
349
+ const context = retrievedContexts.join('\n\n');
350
+ const prompt = `以下のグラウンドトゥルース(正解)が、取得されたコンテキストでカバーされているかを評価してください。
351
+
352
+ ## グラウンドトゥルース
353
+ ${groundTruth}
354
+
355
+ ## 取得コンテキスト
356
+ ${context}
357
+
358
+ ## 出力形式
359
+ JSON形式で出力してください:
360
+ {
361
+ "coveredPoints": ["カバーされているポイント"],
362
+ "missedPoints": ["カバーされていないポイント"],
363
+ "score": 0.0-1.0,
364
+ "reasoning": "評価の根拠"
365
+ }`;
366
+ try {
367
+ const response = await this.llmProvider.generate({
368
+ messages: [{ role: 'user', content: prompt }],
369
+ temperature: this.temperature,
370
+ responseFormat: { type: 'json_object' },
371
+ });
372
+ let score = 0;
373
+ let reasoning = '';
374
+ let coveredPoints = [];
375
+ let missedPoints = [];
376
+ try {
377
+ const parsed = JSON.parse(response.content);
378
+ score = typeof parsed.score === 'number' ? parsed.score : 0.5;
379
+ reasoning = parsed.reasoning ?? '';
380
+ coveredPoints = parsed.coveredPoints ?? [];
381
+ missedPoints = parsed.missedPoints ?? [];
382
+ }
383
+ catch {
384
+ score = 0.5;
385
+ reasoning = 'スコアを抽出できませんでした';
386
+ }
387
+ return {
388
+ evaluator: this.name,
389
+ score,
390
+ normalizedScore: score,
391
+ passed: score >= 0.7,
392
+ reasoning,
393
+ metadata: {
394
+ coveredPoints,
395
+ missedPoints,
396
+ coverageRatio: coveredPoints.length /
397
+ Math.max(1, coveredPoints.length + missedPoints.length),
398
+ },
399
+ };
400
+ }
401
+ catch (error) {
402
+ return {
403
+ evaluator: this.name,
404
+ score: 0,
405
+ normalizedScore: 0,
406
+ passed: false,
407
+ reasoning: `評価に失敗しました: ${error instanceof Error ? error.message : 'Unknown error'}`,
408
+ };
409
+ }
410
+ }
411
+ }
412
+ /**
413
+ * RAGAS複合評価器
414
+ *
415
+ * 複数のRAGASメトリクスを組み合わせて評価
416
+ */
417
+ export class RAGASCompositeEvaluator {
418
+ name;
419
+ evaluators;
420
+ enabledMetrics;
421
+ constructor(llmProvider, config = {}) {
422
+ this.name = config.name ?? 'ragas-composite';
423
+ const evaluatorConfig = config.evaluatorConfig ?? {};
424
+ const weights = config.weights ?? {};
425
+ const defaultMetrics = [
426
+ 'faithfulness',
427
+ 'contextRelevancy',
428
+ 'answerRelevancy',
429
+ ];
430
+ this.enabledMetrics = config.enabledMetrics ?? defaultMetrics;
431
+ this.evaluators = new Map();
432
+ if (this.enabledMetrics.includes('faithfulness')) {
433
+ this.evaluators.set('faithfulness', {
434
+ evaluator: new FaithfulnessEvaluator(llmProvider, evaluatorConfig),
435
+ weight: weights.faithfulness ?? 1,
436
+ });
437
+ }
438
+ if (this.enabledMetrics.includes('contextRelevancy')) {
439
+ this.evaluators.set('contextRelevancy', {
440
+ evaluator: new ContextRelevancyEvaluator(llmProvider, evaluatorConfig),
441
+ weight: weights.contextRelevancy ?? 1,
442
+ });
443
+ }
444
+ if (this.enabledMetrics.includes('answerRelevancy')) {
445
+ this.evaluators.set('answerRelevancy', {
446
+ evaluator: new AnswerRelevancyEvaluator(llmProvider, evaluatorConfig),
447
+ weight: weights.answerRelevancy ?? 1,
448
+ });
449
+ }
450
+ if (this.enabledMetrics.includes('contextRecall')) {
451
+ this.evaluators.set('contextRecall', {
452
+ evaluator: new ContextRecallEvaluator(llmProvider, evaluatorConfig),
453
+ weight: weights.contextRecall ?? 1,
454
+ });
455
+ }
456
+ }
457
+ async evaluate(input) {
458
+ if (!isRAGEvaluationInput(input)) {
459
+ return {
460
+ evaluator: this.name,
461
+ score: 0,
462
+ normalizedScore: 0,
463
+ passed: false,
464
+ reasoning: 'RAG評価入力ではありません',
465
+ metrics: {},
466
+ };
467
+ }
468
+ // 全評価器を並列実行
469
+ const results = await Promise.all(Array.from(this.evaluators.entries()).map(async ([name, { evaluator }]) => ({
470
+ name,
471
+ result: await evaluator.evaluate(input),
472
+ })));
473
+ // メトリクスを集約
474
+ const metrics = {};
475
+ let weightedSum = 0;
476
+ let totalWeight = 0;
477
+ for (const { name, result } of results) {
478
+ const metricName = name;
479
+ metrics[metricName] = result.normalizedScore;
480
+ const weight = this.evaluators.get(name)?.weight ?? 1;
481
+ weightedSum += result.normalizedScore * weight;
482
+ totalWeight += weight;
483
+ }
484
+ const avgScore = totalWeight > 0 ? weightedSum / totalWeight : 0;
485
+ const reasoning = results
486
+ .map(({ name, result }) => `${name}: ${result.normalizedScore.toFixed(2)} (${result.reasoning})`)
487
+ .join('; ');
488
+ // 分析情報を集約
489
+ const analysis = {};
490
+ const faithfulnessResult = results.find((r) => r.name === 'faithfulness');
491
+ if (faithfulnessResult?.result.metadata) {
492
+ analysis.statements = faithfulnessResult.result.metadata.statements;
493
+ analysis.supportedStatements = faithfulnessResult.result.metadata.supportedStatements;
494
+ analysis.unsupportedStatements = faithfulnessResult.result.metadata.unsupportedStatements;
495
+ }
496
+ return {
497
+ evaluator: this.name,
498
+ score: avgScore,
499
+ normalizedScore: avgScore,
500
+ passed: avgScore >= 0.6,
501
+ reasoning,
502
+ metrics,
503
+ analysis: Object.keys(analysis).length > 0 ? analysis : undefined,
504
+ metadata: {
505
+ enabledMetrics: this.enabledMetrics,
506
+ individualResults: results.map(({ name, result }) => ({
507
+ metric: name,
508
+ score: result.normalizedScore,
509
+ passed: result.passed,
510
+ })),
511
+ },
512
+ };
513
+ }
514
+ /**
515
+ * 有効化されているメトリクスを取得
516
+ */
517
+ getEnabledMetrics() {
518
+ return [...this.enabledMetrics];
519
+ }
520
+ }
521
+ //# sourceMappingURL=RAGASEvaluators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RAGASEvaluators.js","sourceRoot":"","sources":["../../src/evaluators/RAGASEvaluators.ts"],"names":[],"mappings":"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"}