| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- // Chunk configuration service - Used to fetch and validate chunk configuration limits
- export interface ChunkConfigLimits {
- maxChunkSize: number; // Max chunk size (tokens)
- maxOverlapSize: number; // Max overlap size (tokens)
- minOverlapSize: number; // Min overlap size (tokens)
- defaultChunkSize: number; // Default chunk size
- defaultOverlapSize: number; // Default overlap size
- modelInfo: EmbeddingModelLimit; // Model info
- }
- export interface EmbeddingModelLimit {
- name: string; // Model name
- maxInputTokens: number; // Model input limit
- maxBatchSize: number; // Model batch limit
- expectedDimensions: number; // Expected vector dimensions
- }
- export const chunkConfigService = {
- /**
- * Fetch chunk configuration limits
- * @param embeddingModelId Embedding model ID
- * @param authToken Auth token
- * @returns Configuration limit info
- */
- async getLimits(
- embeddingModelId: string,
- authToken: string
- ): Promise<ChunkConfigLimits> {
- const params = new URLSearchParams({
- embeddingModelId,
- });
- const response = await fetch(
- `/api/knowledge-bases/chunk-config/limits?${params.toString()}`,
- {
- method: 'GET',
- headers: {
- 'Authorization': `Bearer ${authToken}`,
- 'Content-Type': 'application/json',
- },
- }
- );
- if (!response.ok) {
- const errorData = await response.json();
- throw new Error(errorData.message || 'loadLimitsFailed');
- }
- return response.json();
- },
- /**
- * Validate if chunk configuration is valid
- * @param chunkSize Chunk size
- * @param chunkOverlap Overlap size
- * @param limits Config limits
- * @returns Validation results and error info
- */
- validateConfig(
- chunkSize: number,
- chunkOverlap: number,
- limits: ChunkConfigLimits
- ): {
- isValid: boolean;
- errors: string[];
- adjustedChunkSize: number;
- adjustedOverlapSize: number;
- } {
- const errors: string[] = [];
- let adjustedChunkSize = chunkSize;
- let adjustedOverlapSize = chunkOverlap;
- // Chunk sizeの検証
- if (chunkSize > limits.maxChunkSize) {
- errors.push(`Chunk size ${chunkSize} exceeds limit ${limits.maxChunkSize} `);
- adjustedChunkSize = limits.maxChunkSize;
- }
- if (chunkSize < 50) {
- errors.push(`Chunk size ${chunkSize} is below minimum 50 `);
- adjustedChunkSize = 50;
- }
- // Overlap sizeの検証
- const maxOverlapByRatio = Math.floor(adjustedChunkSize * 0.5);
- if (chunkOverlap > limits.maxOverlapSize) {
- errors.push(`Overlap size ${chunkOverlap} exceeds limit ${limits.maxOverlapSize} `);
- adjustedOverlapSize = limits.maxOverlapSize;
- }
- if (chunkOverlap > maxOverlapByRatio) {
- errors.push(`Overlap size ${chunkOverlap} がChunk sizeの50% (${maxOverlapByRatio}) `);
- adjustedOverlapSize = maxOverlapByRatio;
- }
- if (chunkOverlap < limits.minOverlapSize) {
- adjustedOverlapSize = limits.minOverlapSize;
- }
- return {
- isValid: errors.length === 0,
- errors,
- adjustedChunkSize,
- adjustedOverlapSize,
- };
- },
- /**
- * Format limit info for display
- */
- formatLimits(limits: ChunkConfigLimits): string {
- return [
- `Model: ${limits.modelInfo.name}`,
- `Max Chunk: ${limits.maxChunkSize} tokens`,
- `Max Overlap: ${limits.maxOverlapSize} tokens`,
- `Batch Limit: ${limits.modelInfo.maxBatchSize}`,
- `Vector Dimensions: ${limits.modelInfo.expectedDimensions}`,
- ].join(' | ');
- },
- };
|