질의 처리
사용자 질의 원문을 BM25 검색에 그대로 사용하고, Dense 검색에 사용할 질의 임베딩 벡터를 생성합니다.
입력과 출력
| 입력 | 사용자 질의 |
| 출력 | query text와 query embedding |
아래 벡터는 구조를 보여 주기 위해 앞의 세 값만 사용한 짧은 예입니다. 실제 벡터는 4,096개의 숫자로 구성됩니다.
{
"query_text": "온열 질환 의심자가 생기면 어떻게 하나요?", // 사용자가 입력한 원문 질의
"query_vector": [0.0142, -0.0317, 0.0089] // Dense 검색에 사용하는 질의 벡터의 앞 세 값
}
query_text는 BM25 검색에, query_vector는 Dense 검색에 사용합니다. 두 값은 질의를 처리하는 동안만 사용하며 별도로 저장하지 않습니다.
동작 방식
- 사용자 질의를 BM25 검색용
query text로 그대로 사용합니다. - 같은 질의를 임베딩 서버에 보내 Dense 검색용
query embedding을 생성합니다.
질의를 별도로 재작성하거나 확장하지 않습니다. 질의와 문서 사이의 표현 차이는 문서 인덱싱 단계에서 생성한 검색표현을 통해 보완합니다.
질의 임베딩을 생성하지 못하면 검색을 진행하 지 않습니다.
설정값
| profile key | 현재 production 값 | 의미 |
|---|---|---|
index.embedding_url | 서버 주소 | 질의를 벡터로 변환할 임베딩 서버 |
index.embedding_model | Qwen/Qwen3-Embedding-8B | 색인과 질의에 사용하는 임베딩 모델 |
index.dimension | 4096 | 임베딩 벡터 차원 |
질의와 색인에는 같은 임베딩 모델과 벡터 차원을 사용합니다. 임베딩 모델이나 차원을 변경하면 기존 색인과 호환되지 않으므로 코퍼스를 다시 색인해야 합니다(인덱싱).
코드 참조
| 확인할 내용 | 파일·심볼 |
|---|---|
| 질의 처리 | backend/struct4search/query/service.py · DefaultQueryService.execute |
| 임베딩 생성 | backend/struct4search/adapters/search/opensearch/embedding.py · UrllibOpenAICompatibleEmbeddingPort |
| 설정 주입 | backend/struct4search/bootstrap/composition.py |