본문으로 건너뛰기

인덱싱

원문 청크와 검색표현을 각각 검색 단위로 구성하고, 텍스트와 임베딩 벡터를 함께 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 검색).

동작 방식

  1. 원문 청크와 검색표현을 각각 색인 문서로 구성합니다.
  2. 각 검색 단위의 text에 대한 임베딩 벡터를 생성합니다.
  3. 텍스트와 벡터를 함께 OpenSearch에 저장합니다.
  4. 같은 문서를 다시 인덱싱하면 해당 문서의 기존 검색 단위를 새 결과로 교체합니다.

원문 청크와 연결되지 않은 검색표현은 색인하지 않습니다.

현재 production 설정

profile key현재 production 값의미
index.opensearch_url서버 주소검색 단위를 저장할 OpenSearch
index.embedding_url서버 주소임베딩 서버
index.embedding_modelQwen/Qwen3-Embedding-8B색인과 질의에 사용하는 임베딩 모델
index.dimension4096임베딩 벡터 차원
index.name프로파일에서 지정생성할 인덱스
index.aliass4s-current검증이 끝난 인덱스를 검색 API에 연결하는 고정 이름
index.embedding_batch_size32한 번에 임베딩할 검색 단위 수

임베딩 모델이나 벡터 차원을 변경하면 기존 벡터와 호환되지 않으므로 새로운 인덱스를 만들고 다시 색인해야 합니다(실행과 재처리).

OpenSearch의 전체 매핑과 검색 설정은 OpenSearch 인덱스 구조에서 확인할 수 있습니다.

코드 참조

확인할 내용파일·심볼
인덱싱 구현backend/struct4search/ingest/stages/indexing/stage.py · OpenSearchIndexStage
OpenSearch 매핑backend/struct4search/ingest/stages/indexing/stage.py · index_mapping_template
설정configs/ingest-production.yaml · index