diff --git a/backend/src/test/java/com/opensource/docgrid/e2e/LocalDocumentIndexingE2ETest.java b/backend/src/test/java/com/opensource/docgrid/e2e/LocalDocumentIndexingE2ETest.java index 11513c5d..41bbf934 100644 --- a/backend/src/test/java/com/opensource/docgrid/e2e/LocalDocumentIndexingE2ETest.java +++ b/backend/src/test/java/com/opensource/docgrid/e2e/LocalDocumentIndexingE2ETest.java @@ -141,8 +141,8 @@ void upload_indexesDocumentsAndSearchesRelatedContent() throws Exception { assertIndexedInvariants(pdfUpload, true); assertIndexedInvariants(docxUpload, false); - // 5. 실제 단건 Query Embedding과 pgvector 코사인 검색에서 관련 PDF가 먼저 반환된다. - assertSemanticSearchRanksPdfFirst(pdfUpload, docxUpload); + // 5. 실제 단건 Query Embedding과 pgvector 코사인 검색이 질의별로 관련 문서만 반환한다. + assertSemanticSearchAppliesRelevanceGuardrail(pdfUpload, docxUpload); // 6. 같은 ADMIN JWT로 실제 관리자 조회와 OpenAPI 노출·민감정보 제거 계약을 검증한다. assertAdminHttpContracts(accessToken, pdfUpload); @@ -240,37 +240,49 @@ private void assertEventOrder(Long jobId) { ); } - private void assertSemanticSearchRanksPdfFirst( + /** + * 질의와 관련된 문서만 검색되고, 관련 없는 문서는 최소 유사도에서 제외되는지 확인한다. + * + *
두 질의를 함께 검증한다. 한 질의만 보면 문서가 빠진 이유가 관련성 판정 때문인지
+ * 인덱싱 누락 때문인지 구분할 수 없기 때문이다.
+ */
+ private void assertSemanticSearchAppliesRelevanceGuardrail(
UploadedDocument pdfUpload,
UploadedDocument docxUpload
) {
- float[] queryVector = embeddingClient.embed(
- "How does pgvector HNSW improve cosine similarity search for embeddings?"
- );
- assertThat(queryVector).hasSize(1024);
- for (float value : queryVector) {
- assertThat(Float.isFinite(value)).isTrue();
- }
Long modelId = queryLong(
"SELECT id FROM embedding_models WHERE is_active = TRUE AND is_searchable = TRUE"
);
+ List