OpenSearch 벡터 검색
OpenSearch 벡터 검색
OpenSearch의 벡터 검색은 기계 학습 모델이 만든 텍스트·이미지 임베딩으로 유사도 검색을 하는 기능이에요. 대표적인 흐름은 (1) 임베딩 모델을 등록·배포하고, (2) 텍스트를 벡터로 바꿔 주는 인제스트 파이프라인을 만들고, (3) 벡터 인덱스를 만든 뒤, (4) 데이터를 넣고 (5) 검색하는 순서예요. 여기서는 OpenSearch가 제공하는 ML 모델을 쓰는 신경 검색(neural search) 흐름을 따라가 볼게요.
1단계: 모델 등록·배포
OpenSearch가 제공하는 ML 모델을 등록하고 배포해요.
POST /_plugins/_ml/models/_register?deploy=true
{
"name": "huggingface/sentence-transformers/all-distilroberta-v1",
"version": "1.0.2",
"model_format": "TORCH_SCRIPT"
}
모델 등록은 비동기 작업이라 OpenSearch가 태스크 ID를 돌려줘요. Get ML Task API로 태스크 상태를 확인할 수 있어요.
GET /_plugins/_ml/tasks/{task_id}
태스크가 완료되면 상태가 COMPLETED로 바뀌고, 응답에 등록된 모델의 model ID가 담겨요. 다음 단계에서 이 모델 ID를 사용하니 잘 적어 두세요.
2단계: 인제스트 파이프라인 생성
텍스트에서 벡터 임베딩을 만드는 인제스트 파이프라인을 생성해요.
PUT _ingest/pipeline/nlp-index-pipeline
{
"processors" : [
{
"text_embedding": {
"model_id": "<model_id>",
"field_map": {
"question_text": "question_vector"
}
}
}
]
}
파이프라인을 테스트해 볼 수도 있어요.
POST /_plugins/_ml/_predict/text_embedding/{model_id}
{
"text_docs":[ "what does the package contain?"],
"return_number": true,
"target_response": ["sentence_embedding"]
}
3단계: 벡터 인덱스 생성
벡터 인덱스를 만들고 기본 인제스트 파이프라인을 이전 단계에서 만든 파이프라인으로 설정해요.
PUT /neural_search_pqa
{
"settings": {
"index.knn": true,
"default_pipeline": "nlp-index-pipeline"
},
"mappings": {
"properties": {
"question_vector": {
"type": "knn_vector",
"dimension": 768
}
}
}
}
4단계: 데이터 인제스트
준비한 데이터를 _bulk API로 밀어 넣어요. Security 플러그인을 쓴다면 인증 정보를 포함해요.
curl -XPOST -u "<username>:<password>" -k https://localhost:9200/_bulk --data-binary @neural_search_amazon_pqa_headsets.json -H 'Content-Type: application/json'
Security 플러그인을 쓰지 않는다면 인증 정보를 빼면 돼요.
curl -XPOST http://localhost:9200/_bulk --data-binary @neural_search_amazon_pqa_headsets.json -H 'Content-Type: application/json'
데이터가 들어가면서 default_pipeline이 question_text를 question_vector로 자동 변환해요.
5단계: 검색하기
벡터 검색에는 크게 두 가지 방식이 있어요. 임베딩 모델을 그대로 사용해서 질문 텍스트를 벡터로 바꾸는 **시맨틱 검색(semantic search)**을 할 수도 있고, 클라이언트 쪽에서 이미 벡터를 만들어 둔 **원시 벡터 검색(raw vector search)**을 할 수도 있어요. 후자는 쿼리 시점에 필요한 벡터를 직접 전달하는 방식이에요.
**렉시컬 검색(lexical search)**은 전통적인 키워드 매칭이고, **하이브리드 검색(hybrid search)**은 벡터 검색과 렉시컬 검색을 결합해 각각의 장점을 함께 얻는 방식이에요.