블로그로 돌아가기

AI 입문가이드

AI 답변이 문장 중간에 멈추는 이유? max_tokens, 컨텍스트 윈도우, finish_reason 설명

문장 중간에 멈춘 AI 답변은 한도에 걸린 것입니다. finish_reason을 읽고 max_tokens와 가득 찬 컨텍스트 윈도우를 구분하며 각 모델의 출력 한도를 확인하세요.

작성자: CheapTokens Team 게시됨 업데이트됨읽는 시간 7분

cheaptokens 로고가 있는 어두운 커버: max_tokens, finish_reason, length라는 단어가 상자에 담겨 있고, “Answer cut off mid-sentence?”라는 헤드라인
이 페이지의 내용
  1. 답변을 자르는 세 가지 한도
  2. 먼저 finish_reason을 읽으세요
  3. 해결 1: max_tokens 높이기
  4. 해결 2: 컨텍스트 윈도우가 가득 찼을 때
  5. 해결 3: 긴 답변을 나눠서 받기
  6. finish_reason이 stop일 때
  7. 답변 길이로 모델 선택하기

문장 중간에 끊긴 응답은 거의 항상 한도에 의해 잘린 것입니다. 모델이 생각의 흐름을 잃은 것이 아니라, 요청에 공간이 부족했던 것입니다. 응답은 어떤 한도였는지 알려줍니다: finish_reason를 읽으세요. length은 한도에 도달했다는 뜻입니다. stop는 모델이 스스로 끝냈다는 뜻입니다.

답변의 길이를 결정하는 것은 세 가지입니다. 어느 것이 걸렸는지 알면 수정은 1분이면 됩니다.

답변을 자르는 세 가지 한도#

  • **max_tokens**는 요청에서 설정하는 상한입니다. 답변이 여기에 도달하면 단어 중간이라도 생성이 멈춥니다. DeepSeek의 API 레퍼런스는 이를 완성(completion)에서 생성되는 최대 토큰 수로 정의합니다.
  • 모델의 출력 한도는 해당 모델의 단일 답변에 대한 상한입니다. 모델에 속하는 값이므로 max_tokens를 이 값 이하로 유지하세요. 저희 모델의 수치는 아래 표에 있습니다.
  • 컨텍스트 윈도우는 전체 교환을 위한 공간입니다: 입력과 답변을 합친 것입니다. DeepSeek의 레퍼런스에 따르면 입력 토큰과 생성 토큰을 합친 것이 모델의 컨텍스트 길이로 제한됩니다.

토큰이 아직 모호한 개념이라면 What is a token in AI?부터 시작하세요. 이 페이지는 토큰이 무엇인지 안다고 가정합니다.

먼저 finish_reason을 읽으세요#

채팅 응답의 모든 choice에는 finish_reason가 있습니다. 그 옆의 usage는 입력과 출력에 몇 개의 토큰이 들어갔는지 알려줍니다.

다음은 잘린 답변과 완료된 답변을 나란히 보여줍니다. 요청은 "In one short sentence, what is a token?"이었고, 먼저 max_tokens을 16으로, 그다음 200으로 설정했습니다.

설명을 위한 예시이며 기록된 응답이 아닙니다: 토큰 수와 추가 필드는 다를 수 있습니다.

json
{
  "choices": [
    {
      "message": { "role": "assistant", "content": "A token is a small piece of text that a model reads and writes, usu" },
      "finish_reason": "length"
    }
  ],
  "usage": { "prompt_tokens": 21, "completion_tokens": 16, "total_tokens": 37 }
}
json
{
  "choices": [
    {
      "message": { "role": "assistant", "content": "A token is a small piece of text that a model reads and writes, usually a word or part of a word." },
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": 21, "completion_tokens": 24, "total_tokens": 45 }
}

첫 번째 응답에서 completion_tokens은 16으로 정확히 상한이며, 텍스트는 "usu"로 끝납니다. 두 번째에서는 모델이 24개 토큰에서 멈췄는데, 상한 200보다 훨씬 아래인데도 끝났기 때문입니다.

무슨 일이 있었는지 파악하려면 다음 순서로 확인하세요:

  1. finish_reason를 보세요. stop이면 답변이 완전합니다. 모델이 끝내기로 했거나 설정한 정지 시퀀스에 도달한 것입니다. length이면 한도가 답변을 잘랐으며, 다음 단계에서 어느 한도인지 알 수 있습니다. content_filter와 tool_calls 같은 다른 값도 있는데, 둘 다 길이 문제는 아닙니다.
  2. completion_tokens을 보낸 max_tokens과 비교하세요. 같거나 거의 같다면 max_tokens에 도달한 것입니다.
  3. completion_tokens이 max_tokens보다 훨씬 작고 prompt_tokens가 크다면, 컨텍스트 윈도우가 가득 찼을 가능성이 높습니다. DeepSeek의 레퍼런스는 두 경우 모두에 length을 사용하므로 필드만으로는 구분할 수 없고, 2단계의 비교로 판별합니다. Anthropic과 Z.ai의 문서는 두 번째 경우를 model_context_window_exceeded로 따로 명명합니다. 자신의 응답에서 해당 필드를 보고 어떤 이름이 나오는지 확인하세요.

세 가지 설명은 모두 개발자 문서에서 가져왔으며, 2026년 10월 20일에 확인했습니다: DeepSeek, Anthropic, Z.ai.

보이는 것 finish_reason 원인 해결 방법
잘림, completion_tokens이 max_tokens과 같음 length max_tokens 도달 max_tokens을 높이거나 답변을 나눠서 요청
잘림, completion_tokens이 max_tokens보다 훨씬 작음, 긴 입력 length (일부 API에서는 model_context_window_exceeded) 컨텍스트 윈도우 가득 참 입력이나 히스토리를 줄이거나 윈도우가 더 큰 모델 선택
완료되었지만 원한 것보다 짧음 stop 모델이 끝냈거나 정지 시퀀스가 발동 더 자세히 요청하고 stop 파라미터 확인
텍스트 없음 또는 거부 content_filter 응답이 필터링됨 요청을 다시 표현
텍스트 없이 도구 요청 tool_calls 모델이 도구 호출을 원함 도구를 실행하고 결과를 다시 전송

해결 1: max_tokens 높이기#

가장 흔한 원인이면서 가장 고치기 쉽습니다. 어떤 상한이 적용되는지 알 수 있도록 max_tokens를 직접 설정하세요. 기본값에 의존하지 마세요.

python
from openai import OpenAI

client = OpenAI(base_url="https://api.cheaptokens.dev/v1", api_key="YOUR_API_KEY")

resp = client.chat.completions.create(
    model="deepseek-ai/DeepSeek-V4-Flash-0731",
    messages=[{"role": "user", "content": "Write a detailed guide to setting up a home network."}],
    max_tokens=16000,  # example value: stay at or below the model's output limit
)

choice = resp.choices[0]
print(choice.finish_reason, resp.usage.completion_tokens)

호출의 형태를 보여줍니다. 여기서는 키가 YOUR_API_KEY로 들어갑니다: 실제 키는 공유하는 코드에 넣지 마세요.

숫자를 높이는 것은 모델 자체의 한도까지만 도움이 됩니다. 다음은 CheapTokens의 한도이며, 2026년 10월 20일에 CheapTokens 모델 목록을 기준으로 확인했습니다:

모델 모델 ID 답변당 최대 출력 컨텍스트
DeepSeek-V4-Flash (0731) deepseek-ai/DeepSeek-V4-Flash-0731 32,768 토큰 380K
GLM-5.3-Flash zai-org/GLM-5.3-Flash 8,192 토큰 390K
MiniMax-M2.7 MiniMaxAI/MiniMax-M2.7 8,192 토큰 200K

개발자들은 자신의 API에 대한 자체 한도를 공개합니다. 예를 들어 Z.ai는 GLM-5 시리즈에 대해 최대 128K 출력을 명시합니다. 이는 CheapTokens에서의 GLM-5.3-Flash 한도인 답변당 8,192 토큰과 다릅니다. CheapTokens에서 만드는 것에는 위 표를 사용하세요.

해결 2: 컨텍스트 윈도우가 가득 찼을 때#

채팅에서는 매 메시지마다 전체 히스토리가 다시 전송되므로 입력이 매 턴마다 커집니다. 컨텍스트 윈도우는 그 히스토리와 새 답변을 함께 담아야 합니다. 히스토리만으로 거의 다 차면 답변을 위한 공간이 거의 남지 않습니다.

이 윈도우들은 크기 때문에 짧은 질문 하나로는 채워지지 않습니다. 긴 채팅과 붙여넣은 문서는 채웁니다. 도움이 되는 방법:

  • 새 작업에는 이전 채팅을 이어가지 말고 새 채팅을 시작하세요.
  • 모델에게 지금까지의 대화를 요약하게 하고, 요약만 이어서 가져가세요.
  • 더 이상 필요 없는 오래된 메시지와 첨부 파일을 잘라내세요.
  • 입력 자체가 거대하다면 윈도우가 가장 큰 모델을 선택하세요. 저희 중에서는 GLM-5.3-Flash가 390K로 가장 큽니다. 출력 한도는 8,192 토큰이므로 긴 결과는 나눠서 요청하세요.

해결 3: 긴 답변을 나눠서 받기#

원하는 답변이 모델의 출력 한도보다 길면 어떤 설정으로도 한 번의 응답에 담을 수 없습니다. 조각으로 요청하세요: finish_reason이 length일 때, 부분 답변을 다시 보내고 모델에게 계속하라고 요청하세요.

python
messages = [{"role": "user", "content": "Write a detailed guide to setting up a home network."}]
parts = []

for _ in range(4):  # example limit: at most 4 rounds
    resp = client.chat.completions.create(
        model="zai-org/GLM-5.3-Flash",
        messages=messages,
        max_tokens=8000,  # example value: below this model's output limit
    )
    choice = resp.choices[0]
    parts.append(choice.message.content)
    if choice.finish_reason != "length":
        break
    messages.append({"role": "assistant", "content": choice.message.content})
    messages.append({"role": "user", "content": "Continue exactly where you stopped. Don't repeat anything."})

text = "".join(parts)

같은 주의사항: 기록된 실행이 아니라 패턴의 예시입니다. 조각 사이의 이음새를 읽어보세요. 모델이 때때로 문장을 반복하거나 이음새에서 목록을 다시 시작합니다.

각 라운드는 지금까지의 모든 것을 입력으로 다시 보내며, 모든 출력 토큰에 요금이 부과됩니다. 긴 답변은 짧은 답변보다 비쌉니다. 다음은 2,000 토큰 입력에 대한 8천 토큰 답변으로, 표의 모든 모델에 들어갑니다:

모델 비용 OpenRouter
GLM-5.3-Flash $0.00036 $0.00069
DeepSeek-V4-Flash $0.00083 $0.0013
MiniMax-M2.7 $0.0013 $0.0102

총 입력 2,000개 및 출력 8,000개 토큰입니다. 100만 토큰당 가격은 현재 기준이며 당사 요금제에 따라 함께 변경됩니다. OpenRouter 열은 동일한 작업량에 대한 참고 가격을 보여줍니다.

finish_reason이 stop일 때#

stop는 모델이 답변을 끝냈다는 뜻입니다. 원한 것보다 일찍 끝났다면 그것은 한도 문제가 아니며 max_tokens을 키워도 아무것도 바뀌지 않습니다. 원하는 것을 말하세요: 길이, 섹션, 세부 수준. 또한 요청에 stop 파라미터가 설정되어 있는지 확인하세요. 답변에 나타나는 정지 시퀀스는 즉시 답변을 끝냅니다.

답변 길이로 모델 선택하기#

필요한 답변에서 시작하세요. 8,192 토큰에 들어간다면 CheapTokens에서 MiniMax-M2.7(MiniMaxAI/MiniMax-M2.7)이 처리합니다. 출력은 OpenRouter 참조 가격보다 저렴하며, $0.15(출력 1M 토큰당)로 청구됩니다. 가격은 시간대와 관계없이 동일하고 피크 시간이 없으며, API는 OpenAI 및 Anthropic과 호환됩니다.

다음은 모든 모델의 현재 가격 목록입니다:

모델 컨텍스트 입력 $/1M 출력 $/1M OpenRouter 입력 OpenRouter 출력
GLM-5.3-Flash reasoning 390K $0.02 $0.04 $0.0413 $0.0758
DeepSeek-V4-Flash 380K $0.015 $0.10 $0.0475 $0.1568
MiniMax-M2.7 180K $0.05 $0.15 $0.30 $1.20

가격은 100만 토큰당 USD 기준입니다. OpenRouter 수치는 비교를 위해 표시되었으며 변경될 수 있습니다.

아직 요청을 보내지 않았다면 Your first API request with CheapTokens가 과정을 안내합니다. 토큰이 무엇이고 입력과 출력이 왜 따로 계산되는지는 What is a token in AI?를 참고하세요.

모든 모델의 엔드포인트, 모델 ID, 한도는 CheapTokens docs에 있습니다.