[Developer] #569 plain text vector Top-K probe

This commit is contained in:
devmrko
2026-06-30 13:23:49 +09:00
parent 084c5e59cf
commit cde5266a77
9 changed files with 266 additions and 20 deletions

View File

@@ -0,0 +1,55 @@
package com.cloudhandson.vpdbackoffice.service;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.Mockito.mock;
import com.cloudhandson.vpdbackoffice.domain.vector.VectorQueryEmbedding;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.springframework.jdbc.core.JdbcTemplate;
class VectorKnowledgeServiceTest {
@Test
void vectorizesPlainTextWithTheLocalEmbeddingAndBuildsOrdsBody() {
OpenAiCompatibleClient embeddingClient = mock(OpenAiCompatibleClient.class);
VectorKnowledgeService service = service(embeddingClient);
VectorQueryEmbedding result = service.vectorizeQuery(" Oracle VPD에서 ORDS 권한 확인 ", "demo");
assertThat(result.query()).isEqualTo("Oracle VPD에서 ORDS 권한 확인");
assertThat(result.embeddingMode()).isEqualTo("DEMO");
assertThat(result.embeddingModel()).isEqualTo("로컬 임베딩(개발용)");
assertThat(result.requestBody()).startsWith("{\"embedding\":[").contains("]}");
}
@Test
void rejectsAiModeWhenEmbeddingConfigurationIsMissing() {
OpenAiCompatibleClient embeddingClient = mock(OpenAiCompatibleClient.class);
VectorKnowledgeService service = service(embeddingClient);
assertThatThrownBy(() -> service.vectorizeQuery("검색어", "AI"))
.isInstanceOf(AppException.class)
.hasMessageContaining("AI 임베딩이 설정되지 않았습니다");
}
@Test
void rejectsBlankPlainTextBeforeCallingOrds() {
VectorKnowledgeService service = service(mock(OpenAiCompatibleClient.class));
assertThatThrownBy(() -> service.vectorizeQuery(" ", "DEMO"))
.isInstanceOf(AppException.class)
.hasMessageContaining("검색 질문");
}
private VectorKnowledgeService service(OpenAiCompatibleClient embeddingClient) {
return new VectorKnowledgeService(
mock(JdbcTemplate.class),
new ObjectMapper(),
embeddingClient,
mock(ProtectedObjectService.class),
mock(BearerTokenService.class),
mock(OrdsProbeService.class));
}
}

View File

@@ -28,10 +28,15 @@ class GuidedFlowTemplateTest {
assertThat(probe)
.contains("name=\"bearerToken\"")
.contains("검증 세션 사용자")
.contains("벡터 검색어 (평문)")
.contains("임베딩 방식")
.doesNotContain("벡터 검색 요청 본문 (JSON)")
.doesNotContain("name=\"tokenKeyId\"");
assertThat(result)
.contains("적용된 사용자와 권한")
.contains("토큰 적용 후 SQL")
.contains("벡터 검색 Top-K")
.contains("벡터 거리 (SCORE)")
.contains("vpd_predicate")
.contains("다음에 할 일")
.contains("<details")