chunkConfigService.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // チャンク設定サービス - チャンク設定の制限の取得と検証に使用
  2. export interface ChunkConfigLimits {
  3. maxChunkSize: number; // 最大チャンクサイズ (tokens)
  4. maxOverlapSize: number; // 最大重複サイズ (tokens)
  5. minOverlapSize: number; // 最小重複サイズ (tokens)
  6. defaultChunkSize: number; // デフォルトチャンクサイズ
  7. defaultOverlapSize: number; // デフォルト重複サイズ
  8. modelInfo: EmbeddingModelLimit; // モデル情報
  9. }
  10. export interface EmbeddingModelLimit {
  11. name: string; // モデル名
  12. maxInputTokens: number; // モデル入力制限
  13. maxBatchSize: number; // モデルバッチ制限
  14. expectedDimensions: number; // 期待されるベクトル次元数
  15. }
  16. export const chunkConfigService = {
  17. /**
  18. * チャンク設定の制限を取得
  19. * @param embeddingModelId 埋め込みモデルID
  20. * @param authToken 認証トークン
  21. * @returns 設定制限情報
  22. */
  23. async getLimits(
  24. embeddingModelId: string,
  25. authToken: string
  26. ): Promise<ChunkConfigLimits> {
  27. const params = new URLSearchParams({
  28. embeddingModelId,
  29. });
  30. const response = await fetch(
  31. `/api/knowledge-bases/chunk-config/limits?${params.toString()}`,
  32. {
  33. method: 'GET',
  34. headers: {
  35. 'Authorization': `Bearer ${authToken}`,
  36. 'Content-Type': 'application/json',
  37. },
  38. }
  39. );
  40. if (!response.ok) {
  41. const errorData = await response.json();
  42. throw new Error(errorData.message || 'loadLimitsFailed');
  43. }
  44. return response.json();
  45. },
  46. /**
  47. * チャンク設定が有効かどうかを検証
  48. * @param chunkSize チャンクサイズ
  49. * @param chunkOverlap 重複サイズ
  50. * @param limits 設定制限
  51. * @returns 検証結果とエラー情報
  52. */
  53. validateConfig(
  54. chunkSize: number,
  55. chunkOverlap: number,
  56. limits: ChunkConfigLimits
  57. ): {
  58. isValid: boolean;
  59. errors: string[];
  60. adjustedChunkSize: number;
  61. adjustedOverlapSize: number;
  62. } {
  63. const errors: string[] = [];
  64. let adjustedChunkSize = chunkSize;
  65. let adjustedOverlapSize = chunkOverlap;
  66. // チャンクサイズの検証
  67. if (chunkSize > limits.maxChunkSize) {
  68. errors.push(`チャンクサイズ ${chunkSize} が上限 ${limits.maxChunkSize} を超えています`);
  69. adjustedChunkSize = limits.maxChunkSize;
  70. }
  71. if (chunkSize < 50) {
  72. errors.push(`チャンクサイズ ${chunkSize} が最小値 50 未満です`);
  73. adjustedChunkSize = 50;
  74. }
  75. // 重複サイズの検証
  76. const maxOverlapByRatio = Math.floor(adjustedChunkSize * 0.5);
  77. if (chunkOverlap > limits.maxOverlapSize) {
  78. errors.push(`重複サイズ ${chunkOverlap} が上限 ${limits.maxOverlapSize} を超えています`);
  79. adjustedOverlapSize = limits.maxOverlapSize;
  80. }
  81. if (chunkOverlap > maxOverlapByRatio) {
  82. errors.push(`重複サイズ ${chunkOverlap} がチャンクサイズの50% (${maxOverlapByRatio}) を超えています`);
  83. adjustedOverlapSize = maxOverlapByRatio;
  84. }
  85. if (chunkOverlap < limits.minOverlapSize) {
  86. adjustedOverlapSize = limits.minOverlapSize;
  87. }
  88. return {
  89. isValid: errors.length === 0,
  90. errors,
  91. adjustedChunkSize,
  92. adjustedOverlapSize,
  93. };
  94. },
  95. /**
  96. * 表示用に制限情報をフォーマット
  97. */
  98. formatLimits(limits: ChunkConfigLimits): string {
  99. return [
  100. `モデル: ${limits.modelInfo.name}`,
  101. `チャンク上限: ${limits.maxChunkSize} tokens`,
  102. `重複上限: ${limits.maxOverlapSize} tokens`,
  103. `バッチ制限: ${limits.modelInfo.maxBatchSize}`,
  104. `ベクトル次元: ${limits.modelInfo.expectedDimensions}`,
  105. ].join(' | ');
  106. },
  107. };