Skip to main content

Command Palette

Search for a command to run...

LLM 스트리밍 응답의 HTTP Raw 구조 이해하기

Updated
3 min read

대부분의 대형 언어 모델(LLM: Large Language Model) API는 실시간 응답 속도를 높이기 위해 스트리밍 응답(Streaming Response) 방식을 사용합니다. 대표적인 예로 Ollama, OpenAI, Claude 등의 API는 청크 전송 인코딩(Chunked Transfer Encoding)을 통해 응답을 전달합니다. 이 글에서는 스트리밍 응답이 HTTP 레벨에서 어떻게 전달되는지, 그 장단점은 무엇인지, 그리고 curl로 확인하는 방법을 설명합니다.


스트리밍 응답 vs 일반 응답

구분일반 응답스트리밍 응답
응답 방식결과를 완성한 후 한 번에 전송결과를 조각(chunk)으로 나눠 실시간 전송
헤더Content-Length 포함Transfer-Encoding: chunked
클라이언트 반응응답 완료까지 대기순차적으로 실시간 처리 가능
사용 사례검색, 간단한 API채팅, 실시간 생성 AI

스트리밍의 장단점

장점

  1. 빠른 사용자 반응성

    • 전체 결과를 기다리지 않고, 생성되는 즉시 전송 가능

    • 사용자에게 실시간 타이핑 효과 등의 자연스러운 경험 제공

  1. 낮은 메모리 사용량

    • 서버나 클라이언트 모두 결과 전체를 메모리에 저장할 필요 없이 처리 가능
  1. 대용량 데이터 전송에 적합

    • 수십 MB 이상의 응답을 쪼개서 안정적으로 전송 가능
  1. 실시간 처리 가능

    • 로그 스트림, AI 생성, 뉴스 피드 등 실시간 처리에 매우 유리

단점

  1. 후처리 어려움

    • 전체 결과를 한 번에 받지 않으므로, 요약이나 정렬 등 후처리가 어려움
  1. 구현 복잡도

    • 클라이언트는 스트리밍 조각을 실시간으로 조합하거나 출력해야 하므로 복잡성 증가
  1. 중간 끊김에 민감

    • 연결 중단 시 복구가 어려울 수 있고, 전체 요청을 다시 보내야 할 수도 있음
  1. 디버깅 어려움

    • 응답이 점진적으로 오기 때문에 중간 상태를 디버깅하거나 테스트하는 것이 번거로움

Transfer-Encoding: chunked 구조

HTTP/1.1에서 스트리밍 응답을 구현하기 위해 사용하는 표준 방식은 chunked transfer encoding입니다.

구조:

[청크 길이 (16진수)]\r\n
[청크 데이터]\r\n

각 청크는 이렇게 반복되고, 마지막에 0\r\n\r\n을 보내며 스트림 종료를 알립니다.

예시:

HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked

1c
{"response":"Black ","done":false}

1a
{"response":"holes are ","done":false}

1b
{"response":"very dense.","done":true}

0

curl로 확인하는 방법

curl을 사용하면 스트리밍 응답을 쉽게 관찰할 수 있습니다.

curl -vN http://localhost:11434/api/generate \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama3",
    "prompt": "Explain black holes.",
    "stream": true
  }'
  • -v: HTTP 요청/응답 로그 출력

  • -N: 출력 버퍼링 비활성화 (stream 대응)

출력은 다음과 같이 한 줄씩 출력됩니다:

{"response":"Black ","done":false}
{"response":"holes are ","done":false}
{"response":"very dense.","done":true}

한번에 받으려면?

스트리밍이 아닌 일반 응답으로 전환하려면 stream 옵션을 false로 설정하면 됩니다.

curl http://localhost:11434/api/generate \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama3",
    "prompt": "Explain black holes.",
    "stream": false
  }'

이 경우에는 전체 결과가 완성된 후 한 번에 출력됩니다.


마무리

LLM API의 응답을 스트리밍 방식으로 처리할 수 있다는 것은 빠른 사용자 경험과 메모리 효율을 제공하는 강력한 기능입니다. 하지만 이를 제대로 활용하기 위해서는 HTTP 수준의 작동 방식과 스트리밍의 특성을 이해하는 것이 중요합니다. 이 글이 Chunked Transfer Encoding의 구조, 장단점, 활용법에 대한 이해를 높이는 데 도움이 되었기를 바랍니다.

More from this blog

Tech Lead의 기술 로드맵 작성법: 실전 예시와 함께

"우리 팀 기술 방향이 뭐예요?" Tech Lead가 되면 반드시 듣게 되는 질문입니다. 팀원들은 자신이 어디로 가고 있는지 알고 싶어합니다. 내년에도 이 기술을 쓸 건지, 새로운 걸 배워야 하는지, 이 프로젝트가 끝나면 뭘 하게 되는지. 기술 로드맵은 이 질문에 대한 답입니다. 단순히 "이런 기술 쓸 거예요"가 아니라, 왜 그 방향으로 가는지, 언제쯤 도달할 수 있는지, 각자 무엇을 준비해야 하는지를 보여주는 지도입니다. 이 글에서는 실제로 ...

Jan 10, 20266 min read

Tech Lead의 비용 관점: 돈을 아는 개발자가 되어야 하는 이유

Tech Lead는 단순히 "코드를 잘 짜는 시니어 개발자"가 아닙니다. 기술적 의사결정이 비즈니스에 미치는 영향을 이해하고, 비용 효율적인 선택을 할 수 있어야 합니다. 저는 직장을 다니면서 6년간 친구들과 창업을 준비했습니다. 자본이 넉넉하지 않았기에 모든 기술적 선택에서 "이게 정말 필요한가?", "더 저렴한 방법은 없는가?"를 고민할 수밖에 없었습니다. 그 경험이 지금의 비용 관점을 형성하는 데 큰 영향을 주었습니다. 이 글에서는 Tec...

Jan 10, 20265 min read

HTTP Toolkit으로 Spring Boot 애플리케이션 HTTP 요청 캡처하기

IntelliJ IDEA에서 HTTP Toolkit 프록시 설정하기 Spring Boot 애플리케이션을 개발할 때 외부 API 요청을 모니터링하고 디버깅하기 위해 HTTP Toolkit을 사용하는 경우가 많습니다. 이 글에서는 IntelliJ IDEA에서 HTTP Toolkit으로 프록시 설정하는 방법을 단계별로 설명하겠습니다. 1. HTTP Toolkit 설정 먼저 HTTP Toolkit을 실행하고 프록시 서버를 시작합니다. HTTP Too...

Jul 4, 20253 min read

인공지능 역사 인물 정리: 시대별 발전과 핵심 기여자

인공지능(Artificial Intelligence, AI)은 철학적 질문에서 시작해 알고리즘, 컴퓨팅 기술, 데이터의 발전을 거쳐 오늘날 생성형 AI로 진화했습니다. 이 글은 AI 역사 속 주요 인물을 시대별로 정리하고, 각 인물이 만들어낸 기술적 성과와 개념을 중심으로 소개합니다. 1950년대: 기계 지능 개념의 출발점 앨런 튜링 (Alan Turing, 1912–1954, 영국) 인공지능 개념의 철학적 기초 제시자 주요 이력 (19...

May 22, 20254 min read

📚 퀵소트 (QuickSort) : 원리, 방식 비교, 자바 구현까지

✨ 퀵소트란? 퀵소트(QuickSort)는 분할정복(Divide and Conquer) 전략을 활용한 정렬 알고리즘입니다. 피벗(Pivot)을 기준으로 배열을 분할하고, 각 부분 배열에 대해 재귀적으로 정렬을 수행하여 전체 정렬을 완성합니다. ⚙️ 작동 원리: 분할정복 퀵소트는 다음 세 단계로 구성됩니다. 단계설명 분할피벗을 기준으로 작은 값과 큰 값으로 배열을 나눈다 정복좌우 하위 배열에 대해 재귀적으로 퀵소트를 적용한다 결...

May 20, 20253 min read

Labaratory

19 posts