인덱싱
원문 청크와 검색표현을 각각 검색 단위로 구성하고, 텍스트와 임베딩 벡터를 함께 OpenSearch에 저장합니다.
입력과 출력
| 입력 | 원문 청킹의 원문 청크와 검색표현 생성의 검색표현 |
| 출력 | OpenSearch에 저장된 검색 단위 |
색인 문서는 unit_kind에 따라 원문 청크와 검색표현으로 구분됩니다.
원문 청크
{
"unit_id": "ruf_11175e926dbb1e25f165a932", // 검색 단위의 고유 ID
"document_id": "d002343_6b6d39ebe6", // 검색 단위가 나온 문서의 ID
"unit_kind": "source", // 원문 청크임을 나타내는 종류
"presentation": "fixed_400_overlap40", // 원문 청크를 만든 방식
"text": "개구부 덮개 상부에서 작업 중 떨어짐", // 검색 대상이 되는 원문
"source_f400_unit_ids": ["ruf_11175e926dbb1e25f165a932"], // 연결된 원문 검색 단위 ID
"page_indices": [2, 3], // 원문이 포함된 페이지 순서. 0부터 시작
"triple_ids": [] // 원문 청크에는 연결하지 않는 Triple ID 목록
}
검색표현
{
"unit_id": "rte_2a300459506675e3d86b0dc8", // 검색표현의 고유 ID
"document_id": "d002343_6b6d39ebe6", // 검색표현이 속한 문서의 ID
"unit_kind": "retrieval_expression", // 검색표현임을 나타내는 종류
"presentation": "g2_salience_pagerank800_multitriple", // 검색 표현을 만든 방식
"text": "곡성 공장의 열분해유 제조 공정에서 열분해로 내부 온도가 급격히 상승하였다.", // 검색 대상이 되는 생성 문장
"source_f400_unit_ids": ["ruf_11175e926dbb1e25f165a932"], // 검색표현과 연결된 원문 검색 단위 ID
"page_indices": [2], // 연결된 원문이 포함된 페이지 순서. 0부터 시작
"triple_ids": ["kgtr_4404df7b9e441dae2f5f92ef"] // 검색표현의 사실 근거가 된 Triple ID 목록
}
두 검색 단위 모두 text와 임베딩 벡터를 가집니다. 원문 청크는 자기 자신을, 검색표현은 자신과 연결된 원문 청크를 source_f400_unit_ids에 기록합니다. 이 연결은 이후 검색 결과 점수 통합에서 검색표현을 원문 청크로 연결할 때 사용됩니다.
OpenSearch 저장 구조
원문 청크와 검색표현은 하나의 OpenSearch 인덱스에 함께 저장됩니다.
OpenSearch 인덱스
├─ 문서 A의 원문 청크 1
├─ 문서 A의 원문 청크 2
├─ 문서 A의 검색표현 1
├─ 문서 A의 검색표현 2
├─ 문서 B의 원문 청크 1
└─ 문서 B의 검색표현 1
검색할 때도 두 종류의 검색 단위를 함께 대상으로 사용하며, 결과의 unit_kind로 원문 청크와 검색표현을 구분합니다(Hybrid 검색).
동작 방식
- 원문 청크와 검색표현을 각각 색인 문서로 구성합니다.
- 각 검색 단위의
text에 대한 임베딩 벡터를 생성합니다. - 텍스트와 벡터를 함께 OpenSearch에 저장합니다.
- 같은 문서를 다시 인덱싱하면 해당 문서의 기존 검색 단위를 새 결과로 교체합니다.
원문 청크와 연결되지 않은 검색표현은 색인하지 않습니다.
현재 production 설정
| profile key | 현재 production 값 | 의미 |
|---|---|---|
index.opensearch_url | 서버 주소 | 검색 단위를 저장할 OpenSearch |
index.embedding_url | 서버 주소 | 임베딩 서버 |
index.embedding_model | Qwen/Qwen3-Embedding-8B | 색인과 질의에 사용하는 임베딩 모델 |
index.dimension | 4096 | 임베딩 벡터 차원 |
index.name | 프로파일에서 지정 | 생성할 인덱스 |
index.alias | s4s-current | 검증이 끝난 인덱스를 검색 API에 연결하는 고정 이름 |
index.embedding_batch_size | 32 | 한 번에 임베딩할 검색 단위 수 |
임베딩 모델이나 벡터 차원을 변경하면 기존 벡터와 호환되지 않으므로 새로운 인덱스를 만들고 다시 색인해야 합니다(실행과 재처리).
OpenSearch의 전체 매핑과 검색 설정은 OpenSearch 인덱스 구조에서 확인할 수 있습니다.