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을 참고하세요.