chunkConfigService.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // Chunk configuration service - Used to fetch and validate chunk configuration limits
  2. export interface ChunkConfigLimits {
  3. maxChunkSize: number; // Max chunk size (tokens)
  4. maxOverlapSize: number; // Max overlap size (tokens)
  5. minOverlapSize: number; // Min overlap size (tokens)
  6. defaultChunkSize: number; // Default chunk size
  7. defaultOverlapSize: number; // Default overlap size
  8. modelInfo: EmbeddingModelLimit; // Model info
  9. }
  10. export interface EmbeddingModelLimit {
  11. name: string; // Model name
  12. maxInputTokens: number; // Model input limit
  13. maxBatchSize: number; // Model batch limit
  14. expectedDimensions: number; // Expected vector dimensions
  15. }
  16. export const chunkConfigService = {
  17. /**
  18. * Fetch chunk configuration limits
  19. * @param embeddingModelId Embedding model ID
  20. * @param authToken Auth token
  21. * @returns Configuration limit info
  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. * Validate if chunk configuration is valid
  48. * @param chunkSize Chunk size
  49. * @param chunkOverlap Overlap size
  50. * @param limits Config limits
  51. * @returns Validation results and error info
  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. // Chunk sizeの検証
  67. if (chunkSize > limits.maxChunkSize) {
  68. errors.push(`Chunk size ${chunkSize} exceeds limit ${limits.maxChunkSize} `);
  69. adjustedChunkSize = limits.maxChunkSize;
  70. }
  71. if (chunkSize < 50) {
  72. errors.push(`Chunk size ${chunkSize} is below minimum 50 `);
  73. adjustedChunkSize = 50;
  74. }
  75. // Overlap sizeの検証
  76. const maxOverlapByRatio = Math.floor(adjustedChunkSize * 0.5);
  77. if (chunkOverlap > limits.maxOverlapSize) {
  78. errors.push(`Overlap size ${chunkOverlap} exceeds limit ${limits.maxOverlapSize} `);
  79. adjustedOverlapSize = limits.maxOverlapSize;
  80. }
  81. if (chunkOverlap > maxOverlapByRatio) {
  82. errors.push(`Overlap size ${chunkOverlap} がChunk sizeの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. * Format limit info for display
  97. */
  98. formatLimits(limits: ChunkConfigLimits): string {
  99. return [
  100. `Model: ${limits.modelInfo.name}`,
  101. `Max Chunk: ${limits.maxChunkSize} tokens`,
  102. `Max Overlap: ${limits.maxOverlapSize} tokens`,
  103. `Batch Limit: ${limits.modelInfo.maxBatchSize}`,
  104. `Vector Dimensions: ${limits.modelInfo.expectedDimensions}`,
  105. ].join(' | ');
  106. },
  107. };