지연 시간 줄이기

지연 시간 줄이기 (Reducing latency)

지연 시간(Latency)은 모델이 프롬프트를 처리하고 출력을 생성하는 데 걸리는 시간을 뜻해요. Claude Haiku 4.5 같은 더 빠른 모델을 선택하고, 프롬프트와 출력 토큰을 줄이며, 응답을 스트리밍하는 방식으로 응답 속도를 개선할 수 있어요. 모델의 크기, 프롬프트의 복잡성, 인프라 등 다양한 요소가 지연 시간에 영향을 주기 때문에, 최적의 조합을 찾는 과정이 중요해요.

출처: 문서

본문

지연 시간은 모델이 프롬프트를 처리하고 출력을 생성하는 데 걸리는 시간을 말해요. 지연 시간은 모델의 크기, 프롬프트의 복잡성, 모델과 상호작용 지점을 뒷받침하는 기반 인프라 같은 다양한 요인에 따라 달라질 수 있어요.

먼저 모델이나 프롬프트 제약 없이 잘 동작하는 프롬프트를 설계한 다음, 나중에 지연 시간을 줄이는 전략을 시도하는 것이 항상 더 좋아요. 지연 시간을 너무 일찍 줄이려고 하면 최고 성능이 어떤 모습인지 발견하지 못할 수도 있어요.

지연 시간 측정 방법

지연 시간을 논할 때 다음과 같은 용어와 측정값을 접할 수 있어요:

  • 기준 지연 시간 (Baseline latency): 입력·출력 토큰 초당 속도를 고려하지 않고 모델이 프롬프트를 처리하고 응답을 생성하는 데 걸리는 시간이에요. 모델 속도에 대한 일반적인 감각을 제공해요.
  • 첫 토큰까지의 시간 (TTFT): 프롬프트가 전송된 시점부터 모델이 응답의 첫 토큰을 생성하는 데 걸리는 시간을 측정하는 지표예요. 특히 스트리밍을 사용하고 사용자에게 반응이 빠른 경험을 제공하고 싶을 때 중요해요.

이 용어들에 대한 더 깊은 이해는 용어집을 확인해 보세요.


지연 시간 줄이는 방법

1. 올바른 모델 선택하기

지연 시간을 줄이는 가장 직접적인 방법 중 하나는 사용 사례에 적합한 모델을 선택하는 것이에요. Anthropic은 서로 다른 기능과 성능 특성을 가진 다양한 모델을 제공해요. 구체적인 요구사항을 고려해 속도와 출력 품질 측면에서 가장 잘 맞는 모델을 고르세요.

속도가 중요한 애플리케이션에는 Claude Haiku 4.5가 높은 지능을 유지하면서 가장 빠른 응답 시간을 제공해요:

```bash cURL # For time-sensitive applications, use Claude Haiku 4.5 curl https://api.anthropic.com/v1/messages \ -H "x-api-key: $ANTHR...KEY" \ -H "anthropic-version: 2023-06-01" \ -H "content-type: application/json" \ -d '{ "model": "claude-haiku-4-5", "max_tokens": 100, "messages": [{"role": "user", "content": "Summarize this customer feedback in 2 sentences: [feedback text]"}] }' ```
# For time-sensitive applications, use Claude Haiku 4.5
ant messages create \
  --model claude-haiku-4-5 \
  --max-tokens 100 \
  --message '{"role": "user", "content": "Summarize this customer feedback in 2 sentences: [feedback text]"}'
client = anthropic.Anthropic()

# For time-sensitive applications, use Claude Haiku 4.5
message = client.messages.create(
    model="claude-haiku-4-5",
    max_tokens=100,
    messages=[
        {
            "role": "user",
            "content": "Summarize this customer feedback in 2 sentences: [feedback text]",
        }
    ],
)
print(message.content[0].text)
const client = new Anthropic();

// For time-sensitive applications, use Claude Haiku 4.5
const message = await client.messages.create({
  model: "claude-haiku-4-5",
  max_tokens: 100,
  messages: [
    {
      role: "user",
      content: "Summarize this customer feedback in 2 sentences: [feedback text]"
    }
  ]
});
const textBlock = message.content.find((block) => block.type === "text");
console.log(textBlock?.text);
AnthropicClient client = new();

// For time-sensitive applications, use Claude Haiku 4.5
var parameters = new MessageCreateParams
{
    Model = Model.ClaudeHaiku4_5,
    MaxTokens = 100,
    Messages = [
        new()
        {
            Role = Role.User,
            Content = "Summarize this customer feedback in 2 sentences: [feedback text]"
        }
    ]
};
var message = await client.Messages.Create(parameters);
message.Content[0].TryPickText(out var textBlock);
Console.WriteLine(textBlock?.Text);
client := anthropic.NewClient()

// For time-sensitive applications, use Claude Haiku 4.5
message, err := client.Messages.New(context.TODO(), anthropic.MessageNewParams{
	Model:     anthropic.ModelClaudeHaiku4_5,
	MaxTokens: 100,
	Messages: []anthropic.MessageParam{
		anthropic.NewUserMessage(anthropic.NewTextBlock("Summarize this customer feedback in 2 sentences: [feedback text]")),
	},
})
if err != nil {
	log.Fatal(err)
}
fmt.Println(message.Content[0].Text)
AnthropicClient client = AnthropicOkHttpClient.fromEnv();

// For time-sensitive applications, use Claude Haiku 4.5
MessageCreateParams params = MessageCreateParams.builder()
    .model(Model.CLAUDE_HAIKU_4_5)
    .maxTokens(100L)
    .addUserMessage("Summarize this customer feedback in 2 sentences: [feedback text]")
    .build();
Message message = client.messages().create(params);
IO.println(message.content().get(0).text().map(TextBlock::text).orElse(""));
$client = new Client();

// For time-sensitive applications, use Claude Haiku 4.5
$message = $client->messages->create(
    maxTokens: 100,
    messages: [['role' => 'user', 'content' => 'Summarize this customer feedback in 2 sentences: [feedback text]']],
    model: 'claude-haiku-4-5',
);
echo $message->content[0]->text;
client = Anthropic::Client.new

# For time-sensitive applications, use Claude Haiku 4.5
message = client.messages.create(
  model: "claude-haiku-4-5",
  max_tokens: 100,
  messages: [{ role: "user", content: "Summarize this customer feedback in 2 sentences: [feedback text]" }]
)
puts message.content.first.text

모델 지표에 대한 더 자세한 내용은 모델 개요 페이지를 참고하세요.

2. 프롬프트와 출력 길이 최적화

높은 성능을 유지하면서 입력 프롬프트와 예상 출력의 토큰 수를 최소화하세요. 모델이 처리하고 생성해야 하는 토큰이 적을수록 응답이 빨라져요.

프롬프트와 출력을 최적화하는 데 도움이 되는 몇 가지 팁이에요:

  • 명확하지만 간결하게: 프롬프트에서 의도를 명확하고 간결하게 전달하세요. 불필요한 세부 정보나 중복 정보를 피하되, Claude는 여러분의 사용 사례에 대한 맥락이 부족해 지시가 명확하지 않으면 의도한 논리적 도약을 하지 못할 수 있다는 점을 명심하세요.
  • 더 짧은 응답 요청하기: Claude에게 직접 간결하게 하라고 요청하세요. Claude가 원치 않는 길이로 출력한다면 수다스러움을 줄이도록 요청하세요. LLM이 단어 대신 토큰으로 세기 때문에, 정확한 단어 수나 단어 수 제한을 요청하는 것은 문단이나 문장 수 제한을 요청하는 것만큼 효과적이지 않아요.
  • 적절한 출력 한도 설정하기: max_tokens 파라미터를 사용해 생성되는 응답의 최대 길이에 하드 한도를 설정하세요. 이렇게 하면 Claude가 과도하게 긴 출력을 생성하지 않아요. 응답이 max_tokens 토큰에 도달하면 문장이나 단어 중간에서 잘릴 수 있어요. 그래서 이것은 다소 거친 기법이며 후처리가 필요할 수 있어요. 주로 답변이 시작 부분에 오는 객관식이나 단답형 응답에 가장 적합해요.
  • temperature 실험하기: temperature 파라미터는 출력의 무작위성을 제어해요. 낮은 값(예: 0.2)은 더 집중되고 짧은 응답으로 이어질 수 있고, 높은 값(예: 0.8)은 더 다양하지만 잠재적으로 더 긴 출력을 만들 수 있어요.

프롬프트 명확성, 출력 품질, 토큰 수 사이의 올바른 균형을 찾으려면 약간의 실험이 필요할 수 있어요.

3. 응답 스트리밍

스트리밍은 전체 출력이 완성되기 전에 모델이 응답을 보내기 시작할 수 있게 해주는 기능이에요. 사용자가 모델의 출력을 실시간으로 볼 수 있으므로 애플리케이션의 체감 반응성을 크게 개선할 수 있어요.

스트리밍을 활성화하면 도착하는 대로 모델의 출력을 처리해 사용자 인터페이스를 업데이트하거나 다른 작업을 병렬로 수행할 수 있어요.

사용 사례에 맞게 스트리밍을 구현하는 방법은 스트리밍 메시지를 참고하세요.


다음 단계

불확실성을 허용하고, 응답을 직접 인용문으로 근거를 세우고, 인용으로 주장을 검증해 Claude 출력의 할루시네이션을 최소화하세요. 서버 전송 이벤트로 Messages API 응답을 텍스트, 도구 사용, extended thinking 델타를 포함해 점진적으로 스트리밍하세요.

더 알아보기 (Learn more)