추론 API

원본 보기

추론 API

Elasticsearch는 머신 러닝 추론 API를 제공하여, Elasticsearch(ELSERE5 같은 내장 NLP 모델용)는 물론 Amazon Bedrock, Anthropic, Azure AI Studio, Cohere, Google AI, Mistral, OpenAI, Hugging Face 등의 인기 있는 타사 서비스와 통합되는 추론 엔드포인트를 생성하고 관리할 수 있게 합니다.

배포에 포함된 기본 추론 엔드포인트를 사용하거나 추론 엔드포인트 생성 API를 사용하여 새 추론 엔드포인트를 생성할 수 있습니다. 또는 Kibana의 EIS 또는 외부 추론 앱을 사용할 수 있습니다.

Elasticsearch 배포에는 사전 구성된 추론 엔드포인트가 포함되어 있어 semantic_text 필드를 정의하거나 추론 프로세서를 사용할 때 더 쉽게 활용할 수 있습니다. 이러한 엔드포인트는 두 가지 형태로 제공됩니다.

  • Elastic Inference Service(EIS) 엔드포인트: 관리형 서비스로 추론을 제공하며 자체 노드의 리소스를 사용하지 않습니다.

  • ML 노드 기반 엔드포인트: 전용 머신 러닝 노드에서 실행됩니다.

다음 섹션에서는 inference_id로 식별되는 기본 추론 엔드포인트를 EIS 기반인지 ML 노드 기반인지에 따라 분류하여 나열합니다.

  • .elser-2-elastic: ELSER 학습 모델을 Elastic Inference Service로 사용하여 sparse_embedding 작업을 수행합니다(영어 텍스트에 권장). model_id.elser_model_2입니다.

자세한 내용은 Elastic Inference Service 지원 모델을 참조하세요.

  • .elser-2-elasticsearch: ELSER 내장 학습 모델을 사용하여 sparse_embedding 작업을 수행합니다(영어 텍스트에 권장). model_id.elser_model_2_linux-x86_64입니다.
  • .multilingual-e5-small-elasticsearch: E5 내장 학습 모델을 사용하여 text_embedding 작업을 수행합니다(영어가 아닌 텍스트에 권장). model_id.e5_model_2_linux-x86_64입니다.

엔드포인트의 inference_idsemantic_text 필드 정의에 사용하거나 추론 프로세서를 생성할 때 사용하세요. API 호출 시 모델이 자동으로 다운로드되고 배포되며, 이 작업에는 몇 분 정도 걸릴 수 있습니다. 기본 추론 엔드포인트에는 적응형 할당이 활성화되어 있습니다. 이러한 모델의 최소 할당 수는 0입니다. 엔드포인트를 사용하는 추론 활동이 없으면 15분 후 할당 수가 자동으로 0까지 축소됩니다.

semantic_text 필드와 함께 추론 엔드포인트를 사용하는 전체 과정의 튜토리얼은 semantic_text를 사용한 시맨틱 검색을 참조하세요.

적응형 할당을 사용하면 추론 서비스가 현재 부하에 따라 모델 할당 수를 동적으로 조정할 수 있습니다. 이 기능은 ELSER, E5 또는 Eland를 통해 업로드된 모델처럼 Elastic 인프라에 배포된 모델에서만 지원됩니다. Elastic Inference Service(EIS) 및 타사 서비스(예: Alibaba Cloud, Cohere 또는 OpenAI)를 통해 사용하는 모델은 Elasticsearch 클러스터 내부에 배포되지 않으므로 이 기능을 사용할 수 없습니다.

적응형 할당을 활성화하면 다음과 같이 동작합니다.

  • 부하가 증가하면 할당 수가 자동으로 늘어납니다.
  • 부하가 감소하면 할당 수가 최소 0까지 줄어들어 리소스를 절약합니다.

할당 동작은 다음과 같은 여러 요소에 따라 달라집니다.

  • 배포 유형(Elastic Cloud Hosted, Elastic Cloud Enterprise 또는 Serverless)
  • 사용량 수준(낮음, 중간 또는 높음)
  • 최적화 유형(수집 또는 검색)
중요

적응형 할당을 활성화하고 min_number_of_allocations0보다 큰 값으로 설정하면 추론 요청이 전송되지 않더라도 머신 러닝 리소스에 대한 요금이 부과됩니다.

하지만 min_number_of_allocations0보다 큰 값으로 설정하면 확장 지연 없이 모델을 항상 사용할 수 있습니다. 워크로드와 가용성 요구 사항에 가장 적합한 구성을 선택하세요.

적응형 할당과 리소스에 대한 자세한 내용은 학습된 모델 자동 확장 문서를 참조하세요.

추론 엔드포인트에는 모델의 입력 용량에 따라 한 번에 처리할 수 있는 텍스트 양에 제한이 있습니다. 청킹은 입력 텍스트를 이러한 제한 내에 들어가는 조각으로 분할하는 과정입니다. 이 과정은 문서를 semantic_text 필드로 수집할 때 발생합니다. 청킹은 사람이 이해하기 쉬운 섹션을 만드는 데도 도움이 됩니다. 검색 결과에 긴 문서를 반환하는 것보다 가장 관련성이 높은 텍스트 청크를 제공하는 편이 더 유용합니다.

각 청크에는 텍스트의 하위 구절과 여기에서 생성된 해당 임베딩이 포함됩니다.

기본적으로 문서는 문장 단위로 분할된 다음, 각 청크가 이전 청크와 한 문장을 공유하도록 문장 1개가 겹치는 최대 250단어의 섹션으로 그룹화됩니다. 겹침은 연속성을 보장하고 입력 텍스트의 중요한 문맥 정보가 갑작스러운 분할로 인해 손실되는 것을 방지합니다.

Elasticsearch는 청킹을 위한 단어 및 문장 경계를 감지하는 데 ICU4J 라이브러리를 사용합니다. 단어 경계는 공백 문자의 존재 여부를 감지하는 규칙을 포함한 일련의 규칙에 따라 식별됩니다. 중국어나 일본어처럼 공백을 사용하지 않는 문어에서는 사전 조회를 사용하여 단어 경계를 감지합니다.

청킹에는 여러 전략을 사용할 수 있습니다.

sentence 전략은 입력 텍스트를 문장 경계에서 분할합니다. 각 청크에는 하나 이상의 완전한 문장이 포함되어 문장 수준의 문맥 무결성을 유지합니다. 단, 한 문장 때문에 청크의 단어 수가 max_chunk_size를 초과하는 경우에는 해당 문장이 여러 청크로 분할됩니다. sentence_overlap 옵션은 이전 청크에서 현재 청크에 포함할 문장 수를 정의하며, 값은 0 또는 1입니다.

다음 예제에서는 ELSER 모델을 배포하는 elasticsearch 서비스로 추론 엔드포인트를 생성하고 sentence 전략으로 청킹 동작을 구성합니다.

				PUT _inference/sparse_embedding/sentence_chunks
					{
  "service": "elasticsearch",
  "service_settings": {
    "model_id": ".elser_model_2",
    "num_allocations": 1,
    "num_threads": 1
  },
  "chunking_settings": {
    "strategy": "sentence",
    "max_chunk_size": 100,
    "sentence_overlap": 0
  }
}
		

기본 청킹 전략은 sentence입니다.

word 전략은 입력 텍스트를 개별 단어를 기준으로 max_chunk_size 제한까지 분할합니다. overlap 옵션은 이전 청크에서 현재 청크에 포함할 단어 수입니다.

다음 예제에서는 ELSER 모델을 배포하는 elasticsearch 서비스로 추론 엔드포인트를 생성하고 word 전략으로 청킹 동작을 구성하여 청크당 최대 단어 수를 120개로, 청크 간 겹치는 단어 수를 40개로 설정합니다.

				PUT _inference/sparse_embedding/word_chunks
					{
  "service": "elasticsearch",
  "service_settings": {
    "model_id": ".elser_model_2",
    "num_allocations": 1,
    "num_threads": 1
  },
  "chunking_settings": {
    "strategy": "word",
    "max_chunk_size": 120,
    "overlap": 40
  }
}
		

recursive 전략은 단락 경계나 제목 및 가로줄 같은 Markdown 구조 요소 등 구성 가능한 구분자 패턴 목록을 기준으로 입력 텍스트를 분할합니다. 청커는 이러한 구분자를 순서대로 적용하여 max_chunk_size 단어 제한을 초과하는 청크를 재귀적으로 분할합니다. 충분히 작은 청크를 만드는 구분자가 없으면 이 전략은 문장 수준 분할로 대체됩니다.

recursive 전략은 다음 중 하나를 사용하여 구성할 수 있습니다.

사전 정의된 구분자 그룹은 일반적인 텍스트 형식에 최적화된 패턴을 제공합니다. plaintext는 마크업이 없는 단순한 줄 구조의 텍스트에 적합하고, markdown은 Markdown 형식의 콘텐츠에 적합합니다.

plaintext 구분자 그룹은 단락 경계에서 텍스트를 분할합니다. 먼저 이중 줄 바꿈(단락 나누기)을 기준으로 분할하고, 청크가 여전히 너무 크면 단일 줄 바꿈을 기준으로 분할합니다.

plaintext 구분자 그룹의 정규식 패턴

다음 예제에서는 recursive 전략으로 청킹을 구성하여 plaintext 구분자 그룹을 사용하고 청크당 최대 단어 수를 200개로 설정합니다.

				PUT _inference/sparse_embedding/recursive_plaintext_chunks
					{
  "service": "elasticsearch",
  "service_settings": {
    "model_id": ".elser_model_2",
    "num_allocations": 1,
    "num_threads": 1
  },
  "chunking_settings": {
    "strategy": "recursive",
    "max_chunk_size": 200,
    "separator_group": "plaintext"
  }
}
		

markdown 구분자 그룹은 Markdown 구조 요소를 기준으로 텍스트를 분할하며, H1부터 H6 제목, 그다음 가로줄 순으로 가장 높은 수준에서 가장 낮은 수준까지 구분자를 계층적으로 처리합니다.

markdown 구분자 그룹의 정규식 패턴

다음 예제에서는 recursive 전략으로 청킹을 구성하여 markdown 구분자 그룹을 사용하고 청크당 최대 단어 수를 200개로 설정합니다.

				PUT _inference/sparse_embedding/recursive_markdown_chunks
					{
  "service": "elasticsearch",
  "service_settings": {
    "model_id": ".elser_model_2",
    "num_allocations": 1,
    "num_threads": 1
  },
  "chunking_settings": {
    "strategy": "recursive",
    "max_chunk_size": 200,
    "separator_group": "markdown"
  }
}
		

사전 정의된 구분자 그룹이 요구 사항을 충족하지 못하면 정규식을 사용하여 사용자 지정 구분자를 정의할 수 있습니다. 다음 예제에서는 사용자 지정 구분자 목록을 사용하는 recursive 전략으로 청킹을 구성하여 텍스트를 최대 180단어의 청크로 분할합니다.

				PUT _inference/sparse_embedding/recursive_custom_chunks
					{
  "service": "elasticsearch",
  "service_settings": {
    "model_id": ".elser_model_2",
    "num_allocations": 1,
    "num_threads": 1
  },
  "chunking_settings": {
    "strategy": "recursive",
    "max_chunk_size": 180,
    "separators": [
      "^(#{1,6})\\s",
      "\\n\\n",
      "\\n[-*]\\s",
      "\\n\\d+\\.\\s",
      "\\n"
    ]
  }
}
		

none 전략은 청킹을 비활성화하고 분할이나 겹침 없이 전체 입력 텍스트를 하나의 블록으로 처리합니다. 이 전략을 사용할 때는 문자열 배열을 제공하여 입력을 대신 사전 청킹할 수 있습니다. 이때 각 요소는 추가 청킹 없이 추론 서비스에 직접 전송되는 별도의 청크로 동작합니다.

다음 예제에서는 ELSER 모델을 배포하는 elasticsearch 서비스로 추론 엔드포인트를 생성하고 전략을 none으로 설정하여 청킹을 비활성화합니다.

				PUT _inference/sparse_embedding/none_chunking
					{
  "service": "elasticsearch",
  "service_settings": {
    "model_id": ".elser_model_2",
    "num_allocations": 1,
    "num_threads": 1
  },
  "chunking_settings": {
    "strategy": "none"
  }
}