Neural 쿼리

Neural 쿼리

벡터 검색에서 텍스트나 이미지로 벡터 필드를 검색할 때 neural 쿼리를 사용해요. 이 글에서는 neural 쿼리의 요청 본문 필드와 예제를 살펴봐요.

출처: 문서

본문

벡터 검색(vector search)에서 텍스트나 이미지로 벡터 필드를 검색할 때 neural 쿼리를 사용해요.

요청 본문 필드 (Request body fields)

neural 쿼리에 다음 요청 필드를 포함하세요:

"neural": {
  "": {
    "query_text": "",
    "query_image": "",
    "model_id": "",
    "k": 100
  }
}

최상위 vector_field는 검색 쿼리를 실행할 벡터 또는 시맨틱(semantic) 필드를 지정해요. 다음 표는 나머지 neural 쿼리 필드를 정리한 것이에요. Field Data type Required/Optional Description query_text | 선택 | 문자열(String) | 벡터 임베딩을 생성할 쿼리 텍스트예요. query_text 또는 query_image 중 최소 하나는 반드시 지정해야 해요. query_image | 선택 | 문자열(String) | 벡터 임베딩을 생성할 쿼리 이미지에 해당하는 Base64 인코딩 문자열이에요. query_text 또는 query_image 중 최소 하나는 반드시 지정해야 해요. model_id | 대상 필드가 semantic 필드이면 선택, 대상 필드가 knn_vector 필드이고 기본 모델 ID가 설정되어 있지 않으면 필수 | 문자열(String) | 쿼리 텍스트에서 벡터 임베딩을 생성하는 데 사용할 모델의 ID예요. 모델은 neural 검색에 사용되기 전에 OpenSearch에 배포되어 있어야 해요. 자세한 내용은 Using custom models within OpenSearch와 Neural search를 참고하세요. semantic_field_search_analyzer와 함께 제공할 수 없어요. k | 선택 | 정수(Integer) | k-NN 검색이 반환하는 결과 수예요. k, min_score, max_distance 중 하나의 변수만 지정할 수 있어요. 변수를 지정하지 않으면 기본값은 값이 10인 k예요. min_score | 선택 | 실수(Float) | 검색 결과의 최소 점수 임계값이에요. k, min_score, max_distance 중 하나의 변수만 지정할 수 있어요. 자세한 내용은 Radial search를 참고하세요. max_distance | 선택 | 실수(Float) | 검색 결과의 최대 거리 임계값이에요. k, min_score, max_distance 중 하나의 변수만 지정할 수 있어요. 자세한 내용은 Radial search를 참고하세요. filter | 선택 | 객체(Object) | 고려할 문서 수를 줄이는 데 사용할 수 있는 쿼리예요. 필터 사용에 대한 자세한 내용은 Vector search with filters를 참고하세요. method_parameters | 선택 | 객체(Object) | 검색을 세밀하게 조정하기 위한 추가 파라미터예요: - ef_search (정수, Integer): 조사할 벡터 수예요 (hnsw 메서드용). - nprobes (정수, Integer): 조사할 버킷 수예요 (ivf 메서드용). 자세한 내용은 Specifying method parameters in the query를 참고하세요. rescore | 선택 | 객체 또는 불리언(Object or Boolean) | 재점수화(rescoring) 기능을 구성하는 파라미터예요: - oversample_factor (실수, Float): 재점수화 전에 가져올 후보 벡터 수를 조절해요. 유효한 값은 [1.0, 100.0] 범위예요. in_memory 모드 필드의 기본값은 false(재점수화 없음)이고, on_disk 모드 필드에서는 동적 값으로 활성화돼요. on_disk 모드에서 기본 oversample_factor는 compression_level에 의해 결정돼요. 자세한 내용은 compression level 테이블을 참고하세요. 기본 oversample_factor 1.0으로 재점수화를 명시적으로 활성화하려면 rescore를 true로 설정하세요. 자세한 내용은 Rescoring results를 참고하세요. expand_nested_docs | 선택 | 불리언(Boolean) | true이면 각 상위 문서 안의 모든 중첩(nested) 필드 문서에 대한 점수를 가져와요. 중첩 쿼리와 함께 사용해요. 자세한 내용은 Vector search with nested fields를 참고하세요. semantic_field_search_analyzer | 선택 | 문자열(String) | 희소 인코딩 모델을 사용할 때 query_text를 토큰화할 analyzer를 지정해요. 유효한 값은 standard, bert-uncased, mbert-uncased예요. model_id와 함께 사용할 수 없어요. 자세한 내용은 Analyzers를 참고하세요. query_tokens | 선택 | 토큰(string)에서 가중치(float)로의 매핑 | 토큰과 가중치 형태의 원시 희소 벡터예요. 직접 벡터 입력을 위한 query_text의 대안으로 사용해요. query_text 또는 query_tokens 중 하나는 반드시 지정해야 해요.

예제 요청 (Example request)

다음 예제는 k 값이 100이고 range 쿼리와 term 쿼리를 포함하는 필터가 있는 검색을 보여줘요:

GET /my-nlp-index/_search
{
  "query": {
    "neural": {
      "passage_embedding": {
        "query_text": "Hi world",
        "query_image": "iVBORw0KGgoAAAAN...",
        "k": 100,
        "filter": {
          "bool": {
            "must": [
              {
                "range": {
                  "rating": {
                    "gte": 8,
                    "lte": 10
                  }
                }
              },
              {
                "term": {
                  "parking": "true"
                }
              }
            ]
          }
        }
      }
    }
  }
}

다음 검색 쿼리는 min_score가 0.95인 k-NN 방사형 검색과 range 쿼리, term 쿼리를 포함하는 필터가 있어요:

GET /my-nlp-index/_search
{
  "query": {
    "neural": {
      "passage_embedding": {
        "query_text": "Hi world",
        "query_image": "iVBORw0KGgoAAAAN...",
        "min_score": 0.95,
        "filter": {
          "bool": {
            "must": [
              {
                "range": {
                  "rating": {
                    "gte": 8,
                    "lte": 10
                  }
                }
              },
              {
                "term": {
                  "parking": "true"
                }
              }
            ]
          }
        }
      }
    }
  }
}

다음 검색 쿼리는 max_distance가 10인 k-NN 방사형 검색과 range 쿼리, term 쿼리를 포함하는 필터가 있어요:

GET /my-nlp-index/_search
{
  "query": {
    "neural": {
      "passage_embedding": {
        "query_text": "Hi world",
        "query_image": "iVBORw0KGgoAAAAN...",
        "max_distance": 10,
        "filter": {
          "bool": {
            "must": [
              {
                "range": {
                  "rating": {
                    "gte": 8,
                    "lte": 10
                  }
                }
              },
              {
                "term": {
                  "parking": "true"
                }
              }
            ]
          }
        }
      }
    }
  }
}

다음 예제는 밀집(dense) 모델을 사용해 semantic 필드를 대상으로 하는 검색을 보여줘요. semantic 필드는 구성(configuration)에 모델 정보를 저장해요. neural 쿼리는 인덱스 매핑의 semantic 필드 구성에서 model_id를 자동으로 가져와 해당 임베딩 필드를 대상으로 쿼리를 다시 작성해요:

GET /my-nlp-index/_search
{
  "query": {
    "neural": {
      "passage": {
        "query_text": "Hi world"
        "k": 100
      }
    }
  }
}

다음 예제는 희소 인코딩 모델을 사용해 semantic 필드를 대상으로 하는 검색을 보여줘요. 이 검색은 희소 임베딩을 사용해요:

GET /my-nlp-index/_search
{
  "query": {
    "neural": {
      "passage": {
        "query_tokens": {
          "worlds": 0.57605183
        }
      }
    }
  }
}

자세한 내용은 Semantic field type을 참고하세요.

더 알아보기 (Learn more)