Today, I will

[OpenAI API] LLM 스트리밍 API (stream=True) 본문

Computer Science/인공지능,딥러닝

[OpenAI API] LLM 스트리밍 API (stream=True)

Lv.Forest 2025. 3. 17. 18:02

Chat GPT 등의 text 생성형 AI 서비스를 사용하다보면, 사용자는 전체 text resonse가 완성된 이후 응답을 받는 대신에 실시간으로 생성되는 답변의 조각들을 받아볼 수 있다. open ai api에서는 이런 스트리밍 기법을 사용할 수 있도록 스트리밍 api를 제공해주고 있다. 

 

가령 아래와 같은 예시 코드를 LLM 스트리밍 API를 통해 실시간 출력으로 바꾸어보도록 한다.

 

 

🔹 기존 코드 (stream=False, 응답을 한 번에 받음)

import openai
import os

res = openai.chat.completions.create(
    model=os.getenv("OPENAI_DEFAULT_MODEL"),
    messages=[{"role": "user", "content": "다음을 일본어로 번역하세요: 안녕하세요? 오늘 날씨가 참 좋군요!"}]
)
print(res.choices[0].message.content)

📌 문제점:
✅ 응답이 한 번에 출력됨 → 즉, 응답이 길어질 경우 출력이 느려질 수 있음
 실시간으로 텍스트가 출력되지 않음 (전체 문장을 다 받아야 표시)

 

LLM 스트리밍 API 사용법

📌 1. LLM 스트리밍 API (stream=True) 적용

import openai
import os

# 스트리밍 방식으로 응답 받기
gen = openai.chat.completions.create(
    model=os.getenv("OPENAI_DEFAULT_MODEL"),
    messages=[{"role": "user", "content": "다음을 일본어로 번역하세요: 안녕하세요? 오늘 날씨가 참 좋군요!"}],
    stream=True  # ✅ 스트리밍 활성화
)

# 실시간으로 응답 출력
for response in gen:
    delta = response.choices[0].delta
    if delta.content is not None:
        print(delta.content, end='', flush=True)  # ✅ 실시간 출력

구조

gen = openai.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "질문"}],
    stream=True
)

while True:
    response = next(gen)
    delta = response.choices[0].delta
    if delta.content is not None:
        print(delta.content, end='')
    else:
        break

📌 설명:

  • OpenAI의 stream=True 옵션을 사용하여 스트리밍 방식으로 응답을 받음
  • 기존 방식 (stream=False) → 전체 응답을 한 번에 반환
  • 스트리밍 방식 (stream=True) → 응답을 부분적으로 받아 실시간 출력 가능 (유튜브 댓글 실시간 반응처럼)
  • next(gen)을 이용해 한 번에 한 덩어리씩 출력하여 빠른 피드백 제공.

📌 사용자 경험 향상

  • 대화형 AI 개발에서 응답을 기다리지 않고 바로 제공할 수 있어 사용자 경험 개선! 🚀
  • 긴 문장 출력 시 속도 향상 → 전체 문장을 다 받고 출력하는 것보다 빠름
  • 📌 stream=True를 사용하는 이유
    응답 방식 전체 응답을 한 번에 출력 부분적으로 실시간 출력
    응답 속도 느림 (전체 문장 완성 후 출력) 빠름 (한 글자씩 바로 출력)
    대화형 AI 불편함 (사용자가 기다려야 함) ✅ 실시간으로 대화 가능
    Jupyter Notebook에서 출력 한 번에만 표시됨 ✅ 한 글자씩 점진적으로 표시

LLM 스트리밍(stream=True)을 사용하면 응답 속도가 빨라지고 실시간 출력이 가능해진다.

 

📌 Jupyter Notebook에서도 실시간 출력 가능

📌 추가 개선 (응답을 더 보기 좋게 출력)

Jupyter Notebook에서 줄 바꿈(\n)이 적용되지 않는 경우, 아래처럼 개선 가능:

import openai
import os
import sys  # ✅ Jupyter Notebook에서 실시간 출력을 위한 모듈

gen = openai.chat.completions.create(
    model=os.getenv("OPENAI_DEFAULT_MODEL"),
    messages=[{"role": "user", "content": "다음을 일본어로 번역하세요: 안녕하세요? 오늘 날씨가 참 좋군요!"}],
    stream=True
)

# 실시간으로 응답 출력
for response in gen:
    delta = response.choices[0].delta
    if delta.content is not None:
        sys.stdout.write(delta.content)  # ✅ 즉시 출력
        sys.stdout.flush()  # ✅ 버퍼를 비워 즉시 표시

이렇게 하면 Jupyter Notebook에서도 자연스럽게 실시간으로 텍스트가 표시됨

📌 결론

✅ stream=True를 사용하면 Jupyter Notebook에서도 실시간 응답 출력 가능!
✅ print(..., flush=True) 또는 sys.stdout.write()를 사용하면 더 부드럽게 출력 가능
✅ 긴 문장일수록 기다릴 필요 없이 바로 확인 가능 → 챗봇 개발에 매우 유용