OpenAI 호환 모델

원본 보기

Inference API로 OpenAI 호환 모델 사용하기

Elasticsearch는 Amazon Bedrock, Cohere, Google AI, HuggingFace, OpenAI 등의 제공업체를 서비스 형태로 지원하여 inference API를 통해 LLM을 사용할 수 있게 해줍니다. 또한 OpenAI 호환 API를 갖춘, 로컬 환경에 배포된 모델도 사용할 수 있습니다.

이 페이지에서는 Ollama를 사용해 로컬 모델을 Elasticsearch에 연결하는 방법을 설명합니다.

Ollama를 사용하면 자체 인프라에서 LLM 모델을 다운로드하고 실행할 수 있습니다. Ollama와 호환되는 모델 목록은 이 페이지를 참조하세요.

모델이 자체 인프라에서 실행되므로 Ollama를 사용하면 상호작용 내용이 외부로 노출되지 않습니다.

이 튜토리얼에서는 다음 내용을 다룹니다:

  • Ollama 다운로드 및 실행
  • ngrok을 사용해 Ollama를 호스팅하는 로컬 웹 서버를 인터넷에 노출
  • 로컬 LLM을 Playground에 연결

  1. Ollama를 다운로드합니다.
  2. 다운로드한 파일로 Ollama를 설치합니다. 설치 중에 Ollama 명령줄 도구를 활성화하세요.
  3. 지원되는 LLM 목록에서 모델을 선택합니다. 이 튜토리얼에서는 llama 3.2를 사용합니다.
  4. 다음 명령을 실행합니다:
    ollama pull llama3.2
    		

설치가 끝나면 모델을 테스트합니다.

  1. ollama run llama3.2를 실행하고 "Are you working?"과 같은 질문을 해보세요. 모델이 정상적으로 설치되었다면 올바른 응답을 받게 됩니다.

  2. 모델이 실행되면 기본적으로 11434 포트에서 API 엔드포인트가 활성화됩니다. 테스트하려면 다음 명령으로 API에 요청을 보내세요:

     curl http://localhost:11434/api/generate -d '{
    "model": "llama3.2",
    "prompt": "What is the capital of France?"
    }'
    		

    자세한 내용은 API 문서를 참조하세요. API는 다음과 유사한 응답을 반환합니다:

    {"model":"llama3.2","created_at":"2025-03-26T10:07:05.500614Z","response":"The","done":false}
    {"model":"llama3.2","created_at":"2025-03-26T10:07:05.519131Z","response":" capital","done":false}
    {"model":"llama3.2","created_at":"2025-03-26T10:07:05.537432Z","response":" of","done":false}
    {"model":"llama3.2","created_at":"2025-03-26T10:07:05.556016Z","response":" France","done":false}
    {"model":"llama3.2","created_at":"2025-03-26T10:07:05.574815Z","response":" is","done":false}
    {"model":"llama3.2","created_at":"2025-03-26T10:07:05.592967Z","response":" Paris","done":false}
    {"model":"llama3.2","created_at":"2025-03-26T10:07:05.611558Z","response":".","done":false}
    {"model":"llama3.2","created_at":"2025-03-26T10:07:05.630715Z","response":"","done":true,"done_reason":"stop","context":[128006,9125,128007,271,38766,1303,33025,2696,25,6790,220,2366,18,271,128009,128006,882,128007,271,3923,374,279,6864,315,9822,30,128009,128006,78191,128007,271,791,6864,315,9822,374,12366,13],"total_duration":2232589542,"load_duration":1052276792,"prompt_eval_count":32,"prompt_eval_duration":1048833625,"eval_count":8,"eval_duration":130808916}
    		

생성된 엔드포인트는 로컬에서만 동작하므로 외부 서비스(예: Elastic Cloud 인스턴스)에서는 접근할 수 없습니다. ngrok을 사용하면 로컬 포트를 공개 URL로 노출할 수 있습니다.

경고

로컬 엔드포인트를 인터넷에 노출하면 보안 위험이 발생할 수 있습니다. 공개 URL을 아는 사람은 누구나 해당 서비스로 요청을 보낼 수 있습니다. 민감한 데이터나 기능을 노출하지 말고, 엔드포인트와 상호작용할 수 있는 대상을 제한하기 위해 인증이나 접근 제한을 사용하는 것을 고려하세요.

  1. ngrok 계정을 만들고 공식 설정 가이드를 따르세요.

  2. ngrok 에이전트를 설치하고 구성한 후, 다음을 실행해 Ollama 포트를 노출합니다:

    ngrok http 11434 --host-header="localhost:11434"
    		

    이 명령은 ngrok과 Ollama 서버가 로컬에서 실행되는 동안 유효한 공개 링크를 반환합니다:

    Session Status                online
    Account                       xxxx@yourEmailProvider.com (Plan: Free)
    Version                       3.18.4
    Region                        United States (us)
    Latency                       561ms
    Web Interface                 http://127.0.0.1:4040
    Forwarding                    https://your-ngrok-endpoint.ngrok-free.app -> http://localhost:11434
    
    Connections                   ttl     opn     rt1     rt5     p50     p90
                                  0       0       0.00    0.00    0.00    0.00
    		
  3. Forwarding 줄에서 ngrok이 생성한 URL을 복사합니다.

  4. 새 URL로 엔드포인트를 다시 테스트합니다:

     curl https://your-ngrok-endpoint.ngrok-free.app/api/generate -d '{
    "model": "llama3.2",
    "prompt": "What is the capital of France?"
    }'
    		

    응답은 이전과 유사해야 합니다.

참고

Playground는 9.4 버전부터 더 이상 사용되지 않지만, 여기에 설명된 커넥터 설정 절차는 Agent Builder 및 Elastic의 다른 LLM 사용 사례에도 적용됩니다.

ngrok의 공개 URL을 사용해 커넥터를 만듭니다.

  1. Kibana의 왼쪽 내비게이션 메뉴에서 Playground로 이동한 다음, Large Language Model (LLM) 타일에서 버튼을 선택해 LLM을 연결합니다.
  2. 플라이아웃에서 OpenAI를 선택합니다.
  3. 커넥터 이름을 입력합니다.
  4. Connector settings에서 OpenAI 제공업체로 Other (OpenAI Compatible Service)를 선택합니다.
  5. ngrok이 생성한 URL을 URL 필드에 붙여넣고 v1/chat/completions 엔드포인트를 추가합니다. 예: <your-ngrok-endpoint>/v1/chat/completions.
  6. 기본 모델을 지정합니다. 예: llama3.2.
  7. API 키에는 임의의 문자열을 입력합니다(요청에 사용되지 않습니다).
  8. 저장합니다. Configuring an LLM connector in Playground
  9. Add data sources를 클릭하고 인덱스를 연결합니다.

이제 로컬에서 실행되는 LLM으로 Playground를 사용할 수 있습니다.

로컬에 설치한 LLM을 inference API와 함께 사용할 수 있습니다.

다음 요청으로 openai 서비스를 사용하는 chat_completion 작업 유형의 inference 엔드포인트를 생성합니다:

				PUT _inference/chat_completion/llama-completion
					{
    "service": "openai",
    "service_settings": {
        "api_key": "ignored",
        "model_id": "llama3.2",
        "url": "https://your-ngrok-endpoint.ngrok-free.app/v1/chat/completions"
    }
}
		
  1. api_key 매개변수는 openai 서비스에 필수이므로 반드시 설정해야 하지만, 로컬 AI 서비스에서는 그 값 자체는 중요하지 않습니다.
  2. 모델 이름입니다.
  3. chat completion 엔드포인트(v1/chat/completions)가 포함된, ngrok이 생성한 URL입니다.

inference 엔드포인트가 정상적으로 동작하는지 확인합니다:

				POST _inference/chat_completion/llama-completion/_stream
					{
    "model": "llama3.2",
    "messages": [
        {
            "role": "user",
            "content": "What is the capital of France?"
        }
    ],
    "temperature": 0.7,
    "max_completion_tokens": 300
}
		

이 요청은 다음과 유사한 응답을 반환합니다:

event: message
data: {
  "id" : "chatcmpl-416",
  "choices" : [
    {
      "delta" : {
        "content" : "The",
        "role" : "assistant"
      },
      "index" : 0
    }
  ],
  "model" : "llama3.2",
  "object" : "chat.completion.chunk"
}
(...)