From 3143dd7263ce1119b4a9ae6252b4862a3eb2baf0 Mon Sep 17 00:00:00 2001 From: admin Date: Tue, 21 Apr 2026 16:28:23 +0700 Subject: [PATCH] 690421:1628 Update RAG Module #01 --- backend/src/common/file-storage/file-storage.module.ts | 2 +- backend/src/common/file-storage/file-storage.service.ts | 4 ++-- backend/src/modules/rag/__tests__/ingestion.service.spec.ts | 4 ++-- backend/src/modules/rag/ingestion.service.ts | 6 +++--- backend/src/modules/rag/processors/embedding.processor.ts | 2 +- backend/src/modules/rag/processors/ocr.processor.ts | 6 +++--- .../src/modules/rag/processors/thai-preprocess.processor.ts | 4 ++-- backend/src/modules/rag/rag.module.ts | 6 +++--- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/backend/src/common/file-storage/file-storage.module.ts b/backend/src/common/file-storage/file-storage.module.ts index a892b2f..09330f2 100644 --- a/backend/src/common/file-storage/file-storage.module.ts +++ b/backend/src/common/file-storage/file-storage.module.ts @@ -13,7 +13,7 @@ import { UserModule } from '../../modules/user/user.module'; TypeOrmModule.forFeature([Attachment]), ScheduleModule.forRoot(), // ✅ เปิดใช้งาน Cron Job], UserModule, - BullModule.registerQueue({ name: 'rag:ocr' }), + BullModule.registerQueue({ name: 'rag-ocr' }), ], controllers: [FileStorageController], providers: [ diff --git a/backend/src/common/file-storage/file-storage.service.ts b/backend/src/common/file-storage/file-storage.service.ts index 649e6d0..9be1d07 100644 --- a/backend/src/common/file-storage/file-storage.service.ts +++ b/backend/src/common/file-storage/file-storage.service.ts @@ -28,7 +28,7 @@ export class FileStorageService { @InjectRepository(Attachment) private attachmentRepository: Repository, private configService: ConfigService, - @Optional() @InjectQueue('rag:ocr') private readonly ragOcrQueue?: Queue + @Optional() @InjectQueue('rag-ocr') private readonly ragOcrQueue?: Queue ) { // ใช้ env vars จาก docker-compose สำหรับ Production // ถ้าไม่ได้กำหนดจะ fallback เป็น ./uploads/temp และ ./uploads/permanent @@ -180,7 +180,7 @@ export class FileStorageService { ) .catch((err: unknown) => { this.logger.error( - `Failed to enqueue rag:ocr for ${saved.publicId}`, + `Failed to enqueue rag-ocr for ${saved.publicId}`, err instanceof Error ? err.stack : String(err) ); }); diff --git a/backend/src/modules/rag/__tests__/ingestion.service.spec.ts b/backend/src/modules/rag/__tests__/ingestion.service.spec.ts index a5ff79d..a453576 100644 --- a/backend/src/modules/rag/__tests__/ingestion.service.spec.ts +++ b/backend/src/modules/rag/__tests__/ingestion.service.spec.ts @@ -2,7 +2,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { IngestionService } from '../ingestion.service'; -const QUEUE_TOKEN = 'BullQueue_rag:ocr'; +const QUEUE_TOKEN = 'BullQueue_rag-ocr'; const mockOcrQueue = { getJob: jest.fn(), @@ -35,7 +35,7 @@ describe('IngestionService', () => { jest.clearAllMocks(); }); - it('should enqueue rag:ocr job with attachmentPublicId as jobId', async () => { + it('should enqueue rag-ocr job with attachmentPublicId as jobId', async () => { mockOcrQueue.getJob.mockResolvedValue(null); mockOcrQueue.add.mockResolvedValue({ id: baseJobData.attachmentPublicId }); diff --git a/backend/src/modules/rag/ingestion.service.ts b/backend/src/modules/rag/ingestion.service.ts index 74aa0ca..4c4519b 100644 --- a/backend/src/modules/rag/ingestion.service.ts +++ b/backend/src/modules/rag/ingestion.service.ts @@ -8,7 +8,7 @@ import { OcrJobData } from './processors/ocr.processor'; export class IngestionService { private readonly logger = new Logger(IngestionService.name); - constructor(@InjectQueue('rag:ocr') private readonly ocrQueue: Queue) {} + constructor(@InjectQueue('rag-ocr') private readonly ocrQueue: Queue) {} async enqueue(data: OcrJobData): Promise { const jobId = data.attachmentPublicId; @@ -18,13 +18,13 @@ export class IngestionService { const state = await existing.getState(); if (state === 'active' || state === 'waiting' || state === 'delayed') { this.logger.log( - `rag:ocr job already queued for ${jobId} (state: ${state})` + `rag-ocr job already queued for ${jobId} (state: ${state})` ); return; } } await this.ocrQueue.add('ocr', data, { jobId }); - this.logger.log(`Enqueued rag:ocr for attachment ${jobId}`); + this.logger.log(`Enqueued rag-ocr for attachment ${jobId}`); } } diff --git a/backend/src/modules/rag/processors/embedding.processor.ts b/backend/src/modules/rag/processors/embedding.processor.ts index 76f5ee2..77cb86d 100644 --- a/backend/src/modules/rag/processors/embedding.processor.ts +++ b/backend/src/modules/rag/processors/embedding.processor.ts @@ -13,7 +13,7 @@ import { EmbeddingJobData } from './thai-preprocess.processor'; const CHUNK_SIZE = 512; const CHUNK_OVERLAP = 50; -@Processor('rag:embedding') +@Processor('rag-embedding') export class EmbeddingProcessor extends WorkerHost { private readonly logger = new Logger(EmbeddingProcessor.name); diff --git a/backend/src/modules/rag/processors/ocr.processor.ts b/backend/src/modules/rag/processors/ocr.processor.ts index 4c0ec53..a5bbe5e 100644 --- a/backend/src/modules/rag/processors/ocr.processor.ts +++ b/backend/src/modules/rag/processors/ocr.processor.ts @@ -20,12 +20,12 @@ export interface OcrJobData { classification: 'PUBLIC' | 'INTERNAL' | 'CONFIDENTIAL'; } -@Processor('rag:ocr') +@Processor('rag-ocr') export class OcrProcessor extends WorkerHost { private readonly logger = new Logger(OcrProcessor.name); constructor( - @InjectQueue('rag:thai-preprocess') private readonly thaiQueue: Queue, + @InjectQueue('rag-thai-preprocess') private readonly thaiQueue: Queue, @InjectRepository(DocumentChunk) private readonly chunkRepo: Repository ) { @@ -40,7 +40,7 @@ export class OcrProcessor extends WorkerHost { }); if (existing > 0) { this.logger.log( - `rag:ocr job already indexed for ${attachmentPublicId}, skipping` + `rag-ocr job already indexed for ${attachmentPublicId}, skipping` ); return; } diff --git a/backend/src/modules/rag/processors/thai-preprocess.processor.ts b/backend/src/modules/rag/processors/thai-preprocess.processor.ts index fb711c1..dc2ca29 100644 --- a/backend/src/modules/rag/processors/thai-preprocess.processor.ts +++ b/backend/src/modules/rag/processors/thai-preprocess.processor.ts @@ -14,14 +14,14 @@ export interface EmbeddingJobData extends ThaiPreprocessJobData { normalizedText: string; } -@Processor('rag:thai-preprocess') +@Processor('rag-thai-preprocess') export class ThaiPreprocessProcessor extends WorkerHost { private readonly logger = new Logger(ThaiPreprocessProcessor.name); private readonly thaiUrl: string; constructor( private readonly configService: ConfigService, - @InjectQueue('rag:embedding') private readonly embeddingQueue: Queue + @InjectQueue('rag-embedding') private readonly embeddingQueue: Queue ) { super(); this.thaiUrl = this.configService.get( diff --git a/backend/src/modules/rag/rag.module.ts b/backend/src/modules/rag/rag.module.ts index 6eff16e..07f6710 100644 --- a/backend/src/modules/rag/rag.module.ts +++ b/backend/src/modules/rag/rag.module.ts @@ -28,9 +28,9 @@ const DLQ_DEFAULTS = { UserModule, TypeOrmModule.forFeature([DocumentChunk]), BullModule.registerQueue( - { name: 'rag:ocr', defaultJobOptions: DLQ_DEFAULTS }, - { name: 'rag:thai-preprocess', defaultJobOptions: DLQ_DEFAULTS }, - { name: 'rag:embedding', defaultJobOptions: DLQ_DEFAULTS } + { name: 'rag-ocr', defaultJobOptions: DLQ_DEFAULTS }, + { name: 'rag-thai-preprocess', defaultJobOptions: DLQ_DEFAULTS }, + { name: 'rag-embedding', defaultJobOptions: DLQ_DEFAULTS } ), ], controllers: [RagController],