@nahisaho/katashiro-analyzer 2.0.13 → 2.1.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 (74) hide show
  1. package/LICENSE +21 -0
  2. package/dist/index.d.ts +3 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +2 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/research/agent/ActionRouter.d.ts +101 -0
  7. package/dist/research/agent/ActionRouter.d.ts.map +1 -0
  8. package/dist/research/agent/ActionRouter.js +284 -0
  9. package/dist/research/agent/ActionRouter.js.map +1 -0
  10. package/dist/research/agent/ActionTracker.d.ts +105 -0
  11. package/dist/research/agent/ActionTracker.d.ts.map +1 -0
  12. package/dist/research/agent/ActionTracker.js +219 -0
  13. package/dist/research/agent/ActionTracker.js.map +1 -0
  14. package/dist/research/agent/AnswerEvaluator.d.ts +156 -0
  15. package/dist/research/agent/AnswerEvaluator.d.ts.map +1 -0
  16. package/dist/research/agent/AnswerEvaluator.js +626 -0
  17. package/dist/research/agent/AnswerEvaluator.js.map +1 -0
  18. package/dist/research/agent/DeepResearchAgent.d.ts +136 -0
  19. package/dist/research/agent/DeepResearchAgent.d.ts.map +1 -0
  20. package/dist/research/agent/DeepResearchAgent.js +381 -0
  21. package/dist/research/agent/DeepResearchAgent.js.map +1 -0
  22. package/dist/research/agent/KnowledgeStore.d.ts +95 -0
  23. package/dist/research/agent/KnowledgeStore.d.ts.map +1 -0
  24. package/dist/research/agent/KnowledgeStore.js +189 -0
  25. package/dist/research/agent/KnowledgeStore.js.map +1 -0
  26. package/dist/research/agent/QueryRewriter.d.ts +111 -0
  27. package/dist/research/agent/QueryRewriter.d.ts.map +1 -0
  28. package/dist/research/agent/QueryRewriter.js +350 -0
  29. package/dist/research/agent/QueryRewriter.js.map +1 -0
  30. package/dist/research/agent/TokenTracker.d.ts +100 -0
  31. package/dist/research/agent/TokenTracker.d.ts.map +1 -0
  32. package/dist/research/agent/TokenTracker.js +150 -0
  33. package/dist/research/agent/TokenTracker.js.map +1 -0
  34. package/dist/research/agent/actions/AnswerActionHandler.d.ts +44 -0
  35. package/dist/research/agent/actions/AnswerActionHandler.d.ts.map +1 -0
  36. package/dist/research/agent/actions/AnswerActionHandler.js +158 -0
  37. package/dist/research/agent/actions/AnswerActionHandler.js.map +1 -0
  38. package/dist/research/agent/actions/BaseActionHandler.d.ts +87 -0
  39. package/dist/research/agent/actions/BaseActionHandler.d.ts.map +1 -0
  40. package/dist/research/agent/actions/BaseActionHandler.js +67 -0
  41. package/dist/research/agent/actions/BaseActionHandler.js.map +1 -0
  42. package/dist/research/agent/actions/CodingActionHandler.d.ts +66 -0
  43. package/dist/research/agent/actions/CodingActionHandler.d.ts.map +1 -0
  44. package/dist/research/agent/actions/CodingActionHandler.js +233 -0
  45. package/dist/research/agent/actions/CodingActionHandler.js.map +1 -0
  46. package/dist/research/agent/actions/ReflectActionHandler.d.ts +32 -0
  47. package/dist/research/agent/actions/ReflectActionHandler.d.ts.map +1 -0
  48. package/dist/research/agent/actions/ReflectActionHandler.js +107 -0
  49. package/dist/research/agent/actions/ReflectActionHandler.js.map +1 -0
  50. package/dist/research/agent/actions/SearchActionHandler.d.ts +30 -0
  51. package/dist/research/agent/actions/SearchActionHandler.d.ts.map +1 -0
  52. package/dist/research/agent/actions/SearchActionHandler.js +73 -0
  53. package/dist/research/agent/actions/SearchActionHandler.js.map +1 -0
  54. package/dist/research/agent/actions/VisitActionHandler.d.ts +33 -0
  55. package/dist/research/agent/actions/VisitActionHandler.d.ts.map +1 -0
  56. package/dist/research/agent/actions/VisitActionHandler.js +83 -0
  57. package/dist/research/agent/actions/VisitActionHandler.js.map +1 -0
  58. package/dist/research/agent/actions/index.d.ts +10 -0
  59. package/dist/research/agent/actions/index.d.ts.map +1 -0
  60. package/dist/research/agent/actions/index.js +10 -0
  61. package/dist/research/agent/actions/index.js.map +1 -0
  62. package/dist/research/agent/index.d.ts +62 -0
  63. package/dist/research/agent/index.d.ts.map +1 -0
  64. package/dist/research/agent/index.js +57 -0
  65. package/dist/research/agent/index.js.map +1 -0
  66. package/dist/research/agent/types.d.ts +421 -0
  67. package/dist/research/agent/types.d.ts.map +1 -0
  68. package/dist/research/agent/types.js +45 -0
  69. package/dist/research/agent/types.js.map +1 -0
  70. package/dist/research/index.d.ts +1 -0
  71. package/dist/research/index.d.ts.map +1 -1
  72. package/dist/research/index.js +2 -0
  73. package/dist/research/index.js.map +1 -1
  74. package/package.json +9 -8
@@ -0,0 +1,626 @@
1
+ /**
2
+ * AnswerEvaluator - 回答品質評価
3
+ *
4
+ * @requirement REQ-DR-004
5
+ * @design DES-v2.1.0-DeepResearchAgent
6
+ */
7
+ /**
8
+ * 回答の品質を評価するクラス
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * const evaluator = new AnswerEvaluator({
13
+ * llmClient,
14
+ * tokenTracker,
15
+ * });
16
+ *
17
+ * const result = await evaluator.evaluate(
18
+ * 'What is the population of Tokyo?',
19
+ * 'The population of Tokyo is approximately 14 million.',
20
+ * knowledge
21
+ * );
22
+ *
23
+ * if (result.pass) {
24
+ * console.log('Answer is acceptable');
25
+ * } else {
26
+ * console.log(`Improvement needed: ${result.improvementPlan}`);
27
+ * }
28
+ * ```
29
+ */
30
+ export class AnswerEvaluator {
31
+ // 将来のLLMベース評価用に保持
32
+ _llmClient;
33
+ _tokenTracker;
34
+ constructor(options) {
35
+ this._llmClient = options.llmClient;
36
+ this._tokenTracker = options.tokenTracker;
37
+ }
38
+ /**
39
+ * LLMクライアントを取得(将来の拡張用)
40
+ */
41
+ get llmClient() {
42
+ return this._llmClient;
43
+ }
44
+ /**
45
+ * トークントラッカーを取得(将来の拡張用)
46
+ */
47
+ get tokenTracker() {
48
+ return this._tokenTracker;
49
+ }
50
+ /**
51
+ * 回答を評価
52
+ */
53
+ async evaluate(question, answer, knowledge) {
54
+ // 質問タイプを分析
55
+ const analysis = await this.analyzeQuestion(question);
56
+ const requiredEvaluations = analysis.requiredEvaluations;
57
+ // KnowledgeItemをReferenceに変換
58
+ const references = this.toReferences(knowledge);
59
+ // 各評価を実行
60
+ const evaluations = [];
61
+ // 1. 基本的な回答品質チェック
62
+ const basicEval = this.evaluateBasic(answer);
63
+ if (!basicEval.pass) {
64
+ return basicEval;
65
+ }
66
+ // 2. 参照チェック(attribution)
67
+ if (requiredEvaluations.includes('attribution')) {
68
+ const attrEval = this.evaluateAttribution(answer, references);
69
+ evaluations.push(attrEval);
70
+ if (!attrEval.pass) {
71
+ return attrEval;
72
+ }
73
+ }
74
+ // 3. 鮮度チェック(freshness)
75
+ if (requiredEvaluations.includes('freshness')) {
76
+ const freshEval = this.evaluateFreshness(question, references);
77
+ evaluations.push(freshEval);
78
+ if (!freshEval.pass) {
79
+ return freshEval;
80
+ }
81
+ }
82
+ // 4. 複数例チェック(plurality)
83
+ if (requiredEvaluations.includes('plurality')) {
84
+ const pluralEval = this.evaluatePlurality(question, answer);
85
+ evaluations.push(pluralEval);
86
+ if (!pluralEval.pass) {
87
+ return pluralEval;
88
+ }
89
+ }
90
+ // 5. 網羅性チェック(completeness)
91
+ if (requiredEvaluations.includes('completeness')) {
92
+ const completeEval = this.evaluateCompleteness(question, answer, knowledge);
93
+ evaluations.push(completeEval);
94
+ if (!completeEval.pass) {
95
+ return completeEval;
96
+ }
97
+ }
98
+ // 全て合格
99
+ return {
100
+ pass: true,
101
+ think: 'The answer satisfies all evaluation criteria.',
102
+ type: 'definitive',
103
+ };
104
+ }
105
+ /**
106
+ * KnowledgeItemをReferenceに変換
107
+ */
108
+ toReferences(knowledge) {
109
+ return knowledge.map((item) => ({
110
+ url: item.sourceId ?? '',
111
+ title: item.summary ?? item.content?.substring(0, 100) ?? '',
112
+ dateTime: item.timestamp,
113
+ }));
114
+ }
115
+ /**
116
+ * 質問タイプを分析(同期版)
117
+ */
118
+ analyzeQuestionSync(question) {
119
+ const types = [];
120
+ const lowerQuestion = question.toLowerCase();
121
+ // 鮮度が必要なキーワード
122
+ const freshnessKeywords = [
123
+ 'latest',
124
+ 'recent',
125
+ 'current',
126
+ 'today',
127
+ 'now',
128
+ '最新',
129
+ '現在',
130
+ '今',
131
+ '2024',
132
+ '2025',
133
+ '2026',
134
+ ];
135
+ if (freshnessKeywords.some((k) => lowerQuestion.includes(k))) {
136
+ types.push('freshness');
137
+ }
138
+ // 複数例が必要なキーワード
139
+ const pluralityKeywords = [
140
+ 'list',
141
+ 'examples',
142
+ 'all',
143
+ 'many',
144
+ 'several',
145
+ 'multiple',
146
+ 'リスト',
147
+ '一覧',
148
+ '複数',
149
+ 'すべて',
150
+ ];
151
+ if (pluralityKeywords.some((k) => lowerQuestion.includes(k))) {
152
+ types.push('plurality');
153
+ }
154
+ // 網羅性が必要なキーワード
155
+ const completenessKeywords = [
156
+ 'explain',
157
+ 'describe',
158
+ 'detail',
159
+ 'comprehensive',
160
+ 'complete',
161
+ '説明',
162
+ '詳細',
163
+ '完全',
164
+ ];
165
+ if (completenessKeywords.some((k) => lowerQuestion.includes(k))) {
166
+ types.push('completeness');
167
+ }
168
+ // 参照が必要な質問(事実を問う質問)
169
+ const factKeywords = [
170
+ 'who',
171
+ 'what',
172
+ 'when',
173
+ 'where',
174
+ 'how many',
175
+ 'how much',
176
+ 'price',
177
+ 'cost',
178
+ '誰',
179
+ '何',
180
+ 'いつ',
181
+ 'どこ',
182
+ 'いくら',
183
+ ];
184
+ if (factKeywords.some((k) => lowerQuestion.includes(k))) {
185
+ types.push('attribution');
186
+ }
187
+ // デフォルトでdefinitiveを要求
188
+ if (types.length === 0) {
189
+ types.push('definitive');
190
+ }
191
+ return types;
192
+ }
193
+ /**
194
+ * 質問タイプを分析(非同期版 - 将来的にLLM使用)
195
+ */
196
+ async analyzeQuestion(question) {
197
+ // 同期版で評価タイプを取得
198
+ const evaluationTypes = this.analyzeQuestionSync(question);
199
+ // QuestionAnalysisオブジェクトを構築
200
+ return {
201
+ questionType: this.inferQuestionType(question),
202
+ requiredEvaluations: evaluationTypes,
203
+ freshnessRequired: evaluationTypes.includes('freshness'),
204
+ pluralityRequired: evaluationTypes.includes('plurality'),
205
+ minimumCount: evaluationTypes.includes('plurality') ? this.estimateRequiredCount(question) : undefined,
206
+ expectedAspects: this.extractExpectedAspects(question),
207
+ };
208
+ }
209
+ /**
210
+ * 質問タイプを推定
211
+ */
212
+ inferQuestionType(question) {
213
+ const lowerQuestion = question.toLowerCase();
214
+ if (lowerQuestion.includes('how') || lowerQuestion.includes('どうやって') || lowerQuestion.includes('方法')) {
215
+ return 'howto';
216
+ }
217
+ if (lowerQuestion.includes('why') || lowerQuestion.includes('なぜ') || lowerQuestion.includes('理由')) {
218
+ return 'why';
219
+ }
220
+ if (lowerQuestion.includes('compare') || lowerQuestion.includes('比較') || lowerQuestion.includes('違い')) {
221
+ return 'comparison';
222
+ }
223
+ if (lowerQuestion.includes('list') || lowerQuestion.includes('一覧') || lowerQuestion.includes('リスト')) {
224
+ return 'list';
225
+ }
226
+ return 'factual';
227
+ }
228
+ /**
229
+ * 期待されるアスペクトを抽出
230
+ */
231
+ extractExpectedAspects(question) {
232
+ const aspects = [];
233
+ const lowerQuestion = question.toLowerCase();
234
+ // 一般的なアスペクトキーワード
235
+ const aspectKeywords = {
236
+ 'advantage': 'advantages',
237
+ 'disadvantage': 'disadvantages',
238
+ 'pro': 'pros',
239
+ 'con': 'cons',
240
+ 'benefit': 'benefits',
241
+ 'risk': 'risks',
242
+ 'cost': 'cost',
243
+ 'feature': 'features',
244
+ 'メリット': 'advantages',
245
+ 'デメリット': 'disadvantages',
246
+ '特徴': 'features',
247
+ 'コスト': 'cost',
248
+ };
249
+ for (const [keyword, aspect] of Object.entries(aspectKeywords)) {
250
+ if (lowerQuestion.includes(keyword)) {
251
+ aspects.push(aspect);
252
+ }
253
+ }
254
+ // 「とは」「について」などの説明を求める場合
255
+ if (lowerQuestion.includes('explain') ||
256
+ lowerQuestion.includes('describe') ||
257
+ lowerQuestion.includes('説明') ||
258
+ lowerQuestion.includes('とは')) {
259
+ aspects.push('definition', 'examples', 'importance');
260
+ }
261
+ // 「メリット・デメリット」パターン
262
+ if (lowerQuestion.includes('pros and cons') ||
263
+ lowerQuestion.includes('advantages and disadvantages')) {
264
+ aspects.push('advantages', 'disadvantages');
265
+ }
266
+ // 「比較」パターン
267
+ if (lowerQuestion.includes('compare') ||
268
+ lowerQuestion.includes('difference') ||
269
+ lowerQuestion.includes('比較') ||
270
+ lowerQuestion.includes('違い')) {
271
+ aspects.push('similarities', 'differences');
272
+ }
273
+ // 「方法」パターン
274
+ if (lowerQuestion.includes('how to') ||
275
+ lowerQuestion.includes('方法') ||
276
+ lowerQuestion.includes('やり方')) {
277
+ aspects.push('steps', 'requirements', 'tips');
278
+ }
279
+ // 重複を除去してデフォルトを返す
280
+ const uniqueAspects = [...new Set(aspects)];
281
+ return uniqueAspects.length > 0 ? uniqueAspects : ['main_point'];
282
+ }
283
+ /**
284
+ * 基本的な回答品質チェック
285
+ */
286
+ evaluateBasic(answer) {
287
+ if (!answer || answer.trim().length === 0) {
288
+ return {
289
+ pass: false,
290
+ think: 'The answer is empty.',
291
+ improvementPlan: 'Provide a substantive answer to the question.',
292
+ };
293
+ }
294
+ if (answer.trim().length < 10) {
295
+ return {
296
+ pass: false,
297
+ think: 'The answer is too short to be informative.',
298
+ improvementPlan: 'Provide a more detailed and informative answer.',
299
+ };
300
+ }
301
+ // 「わかりません」系の回答を検出
302
+ const uncertainPhrases = [
303
+ "i don't know",
304
+ "i'm not sure",
305
+ 'unable to find',
306
+ 'no information',
307
+ 'わかりません',
308
+ '不明',
309
+ '情報がありません',
310
+ ];
311
+ const lowerAnswer = answer.toLowerCase();
312
+ if (uncertainPhrases.some((p) => lowerAnswer.includes(p))) {
313
+ return {
314
+ pass: false,
315
+ think: 'The answer indicates uncertainty without providing useful information.',
316
+ improvementPlan: 'Continue searching for relevant information.',
317
+ };
318
+ }
319
+ return {
320
+ pass: true,
321
+ think: 'Basic answer quality is acceptable.',
322
+ };
323
+ }
324
+ /**
325
+ * 参照チェック
326
+ */
327
+ evaluateAttribution(_answer, references) {
328
+ if (references.length === 0) {
329
+ return {
330
+ pass: false,
331
+ think: 'The answer lacks source references.',
332
+ type: 'attribution',
333
+ improvementPlan: 'Include reliable sources to support the claims in the answer.',
334
+ };
335
+ }
336
+ // 参照の品質をチェック
337
+ const validRefs = references.filter((ref) => ref.url && ref.url.startsWith('http') && ref.title);
338
+ if (validRefs.length === 0) {
339
+ return {
340
+ pass: false,
341
+ think: 'The references are not valid URLs.',
342
+ type: 'attribution',
343
+ improvementPlan: 'Provide valid URL references with proper titles.',
344
+ };
345
+ }
346
+ return {
347
+ pass: true,
348
+ think: `Answer is supported by ${validRefs.length} reference(s).`,
349
+ type: 'attribution',
350
+ };
351
+ }
352
+ /**
353
+ * 鮮度チェック
354
+ */
355
+ evaluateFreshness(question, references) {
356
+ // 要求される鮮度を推定
357
+ const maxAgeDays = this.estimateMaxAge(question);
358
+ // 参照の日付をチェック
359
+ const refsWithDates = references.filter((ref) => ref.dateTime);
360
+ if (refsWithDates.length === 0) {
361
+ return {
362
+ pass: false,
363
+ think: 'Cannot verify freshness without dated references.',
364
+ type: 'freshness',
365
+ freshnessAnalysis: {
366
+ daysAgo: -1,
367
+ maxAgeDays,
368
+ },
369
+ improvementPlan: 'Find more recent sources with clear publication dates.',
370
+ };
371
+ }
372
+ // 最新の参照の日付を取得
373
+ const now = Date.now();
374
+ let mostRecentDaysAgo = Infinity;
375
+ for (const ref of refsWithDates) {
376
+ const refDate = new Date(ref.dateTime).getTime();
377
+ const daysAgo = (now - refDate) / (1000 * 60 * 60 * 24);
378
+ if (daysAgo < mostRecentDaysAgo) {
379
+ mostRecentDaysAgo = daysAgo;
380
+ }
381
+ }
382
+ if (mostRecentDaysAgo > maxAgeDays) {
383
+ return {
384
+ pass: false,
385
+ think: `Most recent reference is ${Math.round(mostRecentDaysAgo)} days old, but freshness requires ${maxAgeDays} days or less.`,
386
+ type: 'freshness',
387
+ freshnessAnalysis: {
388
+ daysAgo: Math.round(mostRecentDaysAgo),
389
+ maxAgeDays,
390
+ },
391
+ improvementPlan: `Find sources from the last ${maxAgeDays} days.`,
392
+ };
393
+ }
394
+ return {
395
+ pass: true,
396
+ think: `References are fresh enough (${Math.round(mostRecentDaysAgo)} days old).`,
397
+ type: 'freshness',
398
+ freshnessAnalysis: {
399
+ daysAgo: Math.round(mostRecentDaysAgo),
400
+ maxAgeDays,
401
+ },
402
+ };
403
+ }
404
+ /**
405
+ * 鮮度の最大許容日数を推定
406
+ */
407
+ estimateMaxAge(question) {
408
+ const lowerQuestion = question.toLowerCase();
409
+ if (lowerQuestion.includes('today') || lowerQuestion.includes('今日')) {
410
+ return 1;
411
+ }
412
+ if (lowerQuestion.includes('this week') ||
413
+ lowerQuestion.includes('今週') ||
414
+ lowerQuestion.includes('latest')) {
415
+ return 7;
416
+ }
417
+ if (lowerQuestion.includes('this month') || lowerQuestion.includes('今月')) {
418
+ return 30;
419
+ }
420
+ if (lowerQuestion.includes('recent') || lowerQuestion.includes('最新')) {
421
+ return 90;
422
+ }
423
+ return 365; // デフォルト1年
424
+ }
425
+ /**
426
+ * 複数例チェック
427
+ */
428
+ evaluatePlurality(question, answer) {
429
+ // 要求される数を推定
430
+ const minCount = this.estimateRequiredCount(question);
431
+ // 回答内のアイテム数をカウント
432
+ const actualCount = this.countItems(answer);
433
+ if (actualCount < minCount) {
434
+ return {
435
+ pass: false,
436
+ think: `The question asks for multiple items, but only ${actualCount} were provided.`,
437
+ type: 'plurality',
438
+ pluralityAnalysis: {
439
+ minimumCountRequired: minCount,
440
+ actualCountProvided: actualCount,
441
+ },
442
+ improvementPlan: `Provide at least ${minCount} items or examples.`,
443
+ };
444
+ }
445
+ return {
446
+ pass: true,
447
+ think: `Answer provides ${actualCount} items, meeting the plurality requirement.`,
448
+ type: 'plurality',
449
+ pluralityAnalysis: {
450
+ minimumCountRequired: minCount,
451
+ actualCountProvided: actualCount,
452
+ },
453
+ };
454
+ }
455
+ /**
456
+ * 要求される数を推定
457
+ */
458
+ estimateRequiredCount(question) {
459
+ const lowerQuestion = question.toLowerCase();
460
+ if (lowerQuestion.includes('top 10') || lowerQuestion.includes('トップ10')) {
461
+ return 10;
462
+ }
463
+ if (lowerQuestion.includes('top 5') || lowerQuestion.includes('トップ5')) {
464
+ return 5;
465
+ }
466
+ if (lowerQuestion.includes('top 3') || lowerQuestion.includes('トップ3')) {
467
+ return 3;
468
+ }
469
+ if (lowerQuestion.includes('all') || lowerQuestion.includes('すべて')) {
470
+ return 5; // 「すべて」は少なくとも5つ
471
+ }
472
+ if (lowerQuestion.includes('list') ||
473
+ lowerQuestion.includes('examples') ||
474
+ lowerQuestion.includes('一覧')) {
475
+ return 3;
476
+ }
477
+ return 2; // デフォルト
478
+ }
479
+ /**
480
+ * 回答内のアイテム数をカウント
481
+ */
482
+ countItems(answer) {
483
+ // 番号付きリストをカウント
484
+ const numberedMatches = answer.match(/^\d+[.)\]]/gm);
485
+ if (numberedMatches && numberedMatches.length > 1) {
486
+ return numberedMatches.length;
487
+ }
488
+ // 箇条書きをカウント
489
+ const bulletMatches = answer.match(/^[-*•]/gm);
490
+ if (bulletMatches && bulletMatches.length > 1) {
491
+ return bulletMatches.length;
492
+ }
493
+ // カンマ区切りをカウント
494
+ const commaItems = answer.split(',').length;
495
+ if (commaItems > 2) {
496
+ return commaItems;
497
+ }
498
+ return 1;
499
+ }
500
+ /**
501
+ * 網羅性チェック
502
+ */
503
+ evaluateCompleteness(question, answer, _knowledge) {
504
+ // 質問から期待されるアスペクトを抽出
505
+ const expectedAspects = this.extractExpectedAspects(question);
506
+ // 回答から提供されたアスペクトを抽出
507
+ const providedAspects = this.extractProvidedAspects(answer);
508
+ // カバー率を計算
509
+ const coveredCount = expectedAspects.filter((aspect) => providedAspects.some((p) => this.aspectMatches(aspect, p))).length;
510
+ const coverageRatio = expectedAspects.length > 0 ? coveredCount / expectedAspects.length : 1;
511
+ if (coverageRatio < 0.7) {
512
+ return {
513
+ pass: false,
514
+ think: `The answer covers only ${Math.round(coverageRatio * 100)}% of expected aspects.`,
515
+ type: 'completeness',
516
+ completenessAnalysis: {
517
+ aspectsExpected: expectedAspects.join(', '),
518
+ aspectsProvided: providedAspects.join(', '),
519
+ },
520
+ improvementPlan: `Include information about: ${expectedAspects
521
+ .filter((a) => !providedAspects.some((p) => this.aspectMatches(a, p)))
522
+ .join(', ')}`,
523
+ };
524
+ }
525
+ return {
526
+ pass: true,
527
+ think: `Answer covers ${Math.round(coverageRatio * 100)}% of expected aspects.`,
528
+ type: 'completeness',
529
+ completenessAnalysis: {
530
+ aspectsExpected: expectedAspects.join(', '),
531
+ aspectsProvided: providedAspects.join(', '),
532
+ },
533
+ };
534
+ }
535
+ /**
536
+ * 回答から提供されたアスペクトを抽出
537
+ */
538
+ extractProvidedAspects(answer) {
539
+ const aspects = [];
540
+ const lowerAnswer = answer.toLowerCase();
541
+ // 定義系
542
+ if (lowerAnswer.includes('is a') ||
543
+ lowerAnswer.includes('is the') ||
544
+ lowerAnswer.includes('refers to') ||
545
+ lowerAnswer.includes('とは')) {
546
+ aspects.push('definition');
547
+ }
548
+ // 例
549
+ if (lowerAnswer.includes('for example') ||
550
+ lowerAnswer.includes('such as') ||
551
+ lowerAnswer.includes('例えば') ||
552
+ lowerAnswer.includes('など')) {
553
+ aspects.push('examples');
554
+ }
555
+ // 重要性
556
+ if (lowerAnswer.includes('important') ||
557
+ lowerAnswer.includes('significant') ||
558
+ lowerAnswer.includes('重要') ||
559
+ lowerAnswer.includes('大切')) {
560
+ aspects.push('importance');
561
+ }
562
+ // メリット
563
+ if (lowerAnswer.includes('advantage') ||
564
+ lowerAnswer.includes('benefit') ||
565
+ lowerAnswer.includes('メリット') ||
566
+ lowerAnswer.includes('利点')) {
567
+ aspects.push('advantages');
568
+ }
569
+ // デメリット
570
+ if (lowerAnswer.includes('disadvantage') ||
571
+ lowerAnswer.includes('drawback') ||
572
+ lowerAnswer.includes('デメリット') ||
573
+ lowerAnswer.includes('欠点')) {
574
+ aspects.push('disadvantages');
575
+ }
576
+ // 類似点
577
+ if (lowerAnswer.includes('similar') ||
578
+ lowerAnswer.includes('same') ||
579
+ lowerAnswer.includes('共通') ||
580
+ lowerAnswer.includes('類似')) {
581
+ aspects.push('similarities');
582
+ }
583
+ // 相違点
584
+ if (lowerAnswer.includes('different') ||
585
+ lowerAnswer.includes('unlike') ||
586
+ lowerAnswer.includes('違い') ||
587
+ lowerAnswer.includes('異なる')) {
588
+ aspects.push('differences');
589
+ }
590
+ // ステップ
591
+ if (lowerAnswer.includes('step') ||
592
+ lowerAnswer.includes('first') ||
593
+ lowerAnswer.includes('then') ||
594
+ lowerAnswer.includes('ステップ') ||
595
+ lowerAnswer.includes('まず')) {
596
+ aspects.push('steps');
597
+ }
598
+ // 要件
599
+ if (lowerAnswer.includes('require') ||
600
+ lowerAnswer.includes('need') ||
601
+ lowerAnswer.includes('必要') ||
602
+ lowerAnswer.includes('要件')) {
603
+ aspects.push('requirements');
604
+ }
605
+ // ヒント
606
+ if (lowerAnswer.includes('tip') ||
607
+ lowerAnswer.includes('hint') ||
608
+ lowerAnswer.includes('advice') ||
609
+ lowerAnswer.includes('ヒント') ||
610
+ lowerAnswer.includes('コツ')) {
611
+ aspects.push('tips');
612
+ }
613
+ // メインポイントは常にチェック
614
+ if (answer.length > 50) {
615
+ aspects.push('main_point');
616
+ }
617
+ return aspects;
618
+ }
619
+ /**
620
+ * アスペクトがマッチするかチェック
621
+ */
622
+ aspectMatches(expected, provided) {
623
+ return expected === provided;
624
+ }
625
+ }
626
+ //# sourceMappingURL=AnswerEvaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnswerEvaluator.js","sourceRoot":"","sources":["../../../src/research/agent/AnswerEvaluator.ts"],"names":[],"mappings":"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"}