LLM 시작하기 (Large Language Models)

LLM 시작하기 (Large Language Models)

Novita AI가 어떤 식으로 LLM을 API로 제공하는지부터 볼게요. 여기서 다루는 채팅 완성(ChatCompletion)과 완성(Completion) 두 API가 사실상 모든 LLM 기능의 출발점이 돼요. 이미 OpenAI의 같은 이름의 API를 써 본 적이 있다면 거의 그대로 옮겨 오는 느낌이라 부담이 없어요.

출처: Novita AI - Large Language Models

모델이 할 수 있는 일

LLM은 대규모 텍스트로 학습한 딥러닝·자연어 처리 모델이라, 상황에 맞춰 유창한 문장을 만들어 내는 데 강해요. 대표적으로 이런 일을 처리할 수 있어요.

  • 텍스트 생성: 문맥에 맞는 논리적인 내용을 만들고, 필요한 만큼 출력 스타일을 조절해요.
  • 언어 이해: 입력 텍스트의 의미를 정확히 파악하고 문맥을 의식한 대화를 지원해요.
  • 번역: 서로 다른 언어 사이의 이해와 생성을 바탕으로 번역을 해요.
  • 지식 기반 Q&A: 문화·과학·역사 등 여러 분야의 질문에 폭넓게 답해요.
  • 코드 이해·생성: Python, Java, C++ 같은 코드를 이해하고 만들며 오류를 찾아 제안해 주기도 해요.
  • 분류·요약: 복잡한 문장을 이해해 정보를 분류하고 핵심을 요약해요.

API 통합 방식

Novita AI는 오픈소스 모델에 빠르고 안정적인 API를 붙여서, 상위권 LLM API의 편의성과 오픈소스 모델의 유연성·비용 효율을 함께 챙겨요. 지원하는 인터페이스는 두 가지예요.

  • ChatCompletion — 스트리밍/비스트리밍 모두 지원
  • Completion — 역시 스트리밍/비스트리밍 모두 지원

이미 OpenAI의 ChatCompletion이나 Completion API를 쓰고 있다면, base URL을 api.novita.ai/openai로 바꾸고 API 키를 설정한 뒤 모델 이름만 갈아 끼우면 LLM 서비스를 바로 쓸 수 있어요. API 키의 생성·저장·사용 방법은 API 키 문서를 참고하면 돼요.

코드 예제

Python — ChatCompletion

from openai import OpenAI

client = OpenAI(
    base_url="https://api.novita.ai/openai",
    api_key="<Your API Key>",
)

model = "deepseek/deepseek-r1"
stream = True  # or False
max_tokens = 512

chat_completion_res = client.chat.completions.create(
    model=model,
    messages=[
        {"role": "system", "content": "you are a professional AI helper."},
        {"role": "user", "content": "Where can the example of GPU provided by novita ai be adapted?"}
    ],
    stream=stream,
    max_tokens=max_tokens,
)

if stream:
    for chunk in chat_completion_res:
        print(chunk.choices[0].delta.content or "", end="")
else:
    print(chat_completion_res.choices[0].message.content)

Python — Completion

from openai import OpenAI

client = OpenAI(
    base_url="https://api.novita.ai/openai",
    api_key="<Your API Key>",
)

model = "deepseek/deepseek-r1"
stream = True  # or False
max_tokens = 512

completion_res = client.completions.create(
    model=model,
    prompt="Where can the example of GPU provided by novita ai be adapted?",
    stream=stream,
    max_tokens=max_tokens,
)

if stream:
    for chunk in completion_res:
        print(chunk.choices[0].text or "", end="")
else:
    print(completion_res.choices[0].text)

Curl — ChatCompletion

export API_KEY="<Your API Key>"

curl "https://api.novita.ai/openai/v1/chat/completions" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ${API_KEY}" \
  -d '{
    "model": "deepseek/deepseek-r1",
    "messages": [
        {
            "role": "system",
            "content": "you are a professional AI helper."
        },
        {
            "role": "user",
            "content": "Where can the example of GPU provided by novita ai be adapted?"
        }
    ],
    "max_tokens": 512
}'

Curl — Completion

export API_KEY="<Your API Key>"

curl "https://api.novita.ai/openai/v1/completions" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ${API_KEY}" \
  -d '{
    "model": "deepseek/deepseek-r1",
    "prompt": "Where can the example of GPU provided by novita ai be adapted?",
    "max_tokens": 512
}'

주요 파라미터

기본 파라미터

  • model — 호출할 LLM의 모델명이에요. 전체 목록은 LLM 서비스 페이지에서 확인할 수 있어요.

Messages

ChatCompletion 전용

messages는 LLM과 주고받는 입력·출력이에요. 각 메시지는 한 역할(화자)에 속하고, 구성에 따라 더 좋은 출력을 얻을 수 있어요.

  • content — 메시지 내용
  • role — 화자를 정의해요.
    • system: AI의 역할이나 행동 방식을 정해 주는 시스템 프롬프트
    • user: 사용자의 입력
    • assistant: AI의 응답. 원하는 답 형태를 미리 예시로 넣어 줄 수도 있어요.

Prompt

ChatCompletion 전용

prompt는 사용자가 LLM에게 명확히 전달하는 작업 지시 텍스트예요.

출력 조절

temperaturetop_p는 생성 텍스트의 다양성을 조절하는 값이라 하나만 설정하는 걸 권장해요. 값이 클수록 텍스트가 다양해지고, 작을수록 정확해져요.

  • temperature — 무작위성을 조절해요. 클수록 창의적.
  • top_p — 누클리어스 샘플링. 누적 확률을 기준으로 후보를 제한해요.
  • top_k — 후보 토큰 개수를 제한해요.

반복 패널티

  • presence_penalty — 텍스트에 이미 등장한 토큰에 패널티를 줘서, 텍스트 전체에 다양한 토큰이 나오게 해요.
  • frequency_penalty — 같은 토큰이 반복될 때마다 패널티를 줘서, 이후 반복을 줄여요.
  • repetition_penalty — 반복을 억제하거나 장려해요.

출력 제한

  • max_tokens — 한 번의 응답에서 생성할 최대 토큰 수예요. 이 값을 넘기는 내용은 잘려요.
  • stream — 스트리밍 사용 여부예요. 출력이 길어질 땐 타임아웃을 피하려고 스트리밍을 권장해요.
    • true: 생성되는 대로 부분 결과를 받아요.
    • false: 처리가 끝난 뒤 전체 결과를 받아요.
  • stop — 이 문자열을 만나면 생성을 멈춰요.

더 알아보기