You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
현재 Worker가 소유한 PROCESSING Embedding Job과 STARTED Attempt를 실행 Context로 검증한 뒤,
Job이 직접 참조하는 CHUNKED Document Version의 Chunk를 순서대로 실제 BAAI/bge-m3 임베딩 서버에 전달하고
1024차원 Vector를 embeddings에 원자적으로 저장합니다.
임베딩 서버 호출 동안 DB Transaction과 행 잠금을 유지하지 않습니다. 준비·완료 단계에서 Job과 Version을
같은 순서로 잠그고 Worker, Claim Token, Lease와 Attempt를 다시 검증하여 과거 Worker의 늦은 결과 저장을
차단합니다. 응답 유실과 동시 재호출은 중복 Vector를 만들지 않고 같은 Embedding Set으로 수렴해야 합니다.
선행 문서의 Mock Embedding 표현과 달리 현재 기준선에는 실제 BAAI/bge-m3 FastAPI 서버와 vector(1024) Schema가 있으므로 가짜 Vector가 아니라 기존 /embed 계약을 사용합니다.
✅ To-do
외부 Embedding 호출 계약
모델 선택과 HTTP 전송을 분리하는 EmbeddingClient 추가
기존 QueryEmbeddingService가 공통 Client를 사용하도록 위임
Document Embedding은 현재 Active 모델을 다시 고르지 않고 Job의 embedding_model_id를 사용
📌 Description
현재 Worker가 소유한
PROCESSINGEmbedding Job과STARTEDAttempt를 실행 Context로 검증한 뒤,Job이 직접 참조하는
CHUNKEDDocument Version의 Chunk를 순서대로 실제BAAI/bge-m3임베딩 서버에 전달하고1024차원 Vector를
embeddings에 원자적으로 저장합니다.임베딩 서버 호출 동안 DB Transaction과 행 잠금을 유지하지 않습니다. 준비·완료 단계에서 Job과 Version을
같은 순서로 잠그고 Worker, Claim Token, Lease와 Attempt를 다시 검증하여 과거 Worker의 늦은 결과 저장을
차단합니다. 응답 유실과 동시 재호출은 중복 Vector를 만들지 않고 같은 Embedding Set으로 수렴해야 합니다.
선행 문서의
Mock Embedding표현과 달리 현재 기준선에는 실제BAAI/bge-m3FastAPI 서버와vector(1024)Schema가 있으므로 가짜 Vector가 아니라 기존/embed계약을 사용합니다.✅ To-do
외부 Embedding 호출 계약
EmbeddingClient추가QueryEmbeddingService가 공통 Client를 사용하도록 위임embedding_model_id를 사용/embed응답의 null Vector, 차원 불일치와 비유한 값(NaN/Infinity) 거부EMBEDDING_SERVER_UNAVAILABLE계약으로 변환준비 Transaction
EmbeddingJobOwnershipValidator로 PROCESSING 상태, Worker, Claim Token과 Lease 검증STARTEDAttempt 및 Worker와 일치하는지 검증CHUNKED이거나 재개 가능한EMBEDDING상태인지 검증chunk_index ASC로 조회하고 0부터 연속이며 한 건 이상인지 검증CHUNKED → EMBEDDING전환과EMBEDDING_STARTED이벤트 저장외부 작업과 Draft
/embedEndpoint 호출dimension과 같은지 매 Chunk 검증완료 Transaction과 저장
document_id,document_version_id,embedding_model_id역정규화 값 검증ACTIVE로saveAllAndFlush(chunk_id, embedding_model_id)Unique Constraint를 최종 중복 방어선으로 유지EMBEDDING으로 유지하고 Attempt·Job·Document 완료 처리는 후속 기능에 위임Repository·API
DocumentChunkRepository에 Version별chunk_index ASC조회 추가EmbeddingRepository에 Version·Model별 존재·개수 조회와 전체 저장 계약 추가POST /admin/indexing-jobs/{jobId}/attempts/{attemptId}/embeddings추가201 Created, 기존 완성 결과 재생은200 OK/admin/**ADMIN 정책 재사용 및 Swagger 성공·오류 계약 문서화검증
./gradlew clean test및git diff --check통과docs/design/에 실제 구현과 일치하는 상세 설계 문서 작성🔒 핵심 불변식
🚫 제외 범위
SUCCESS전환INDEXED완료documents.current_version_id교체와 Document 완료 상태 전환✅ 완료 기준
CHUNKEDVersion의 모든 Chunk를 Job 모델로 Vector화할 수 있습니다.EMBEDDING상태로 남아 후속 인덱싱 완료 기능이 이어서 처리할 수 있습니다.📒 기타
BAAI/bge-m3, 1024차원, COSINE/embed가 단건 요청만 지원하므로 정확성 기준선은 Chunk 순차 호출로 구현하고,처리량 개선을 위한 Batch API와 Lease 연장은 별도 범위로 분리합니다.