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()를 사용하면 더 부드럽게 출력 가능
✅ 긴 문장일수록 기다릴 필요 없이 바로 확인 가능 → 챗봇 개발에 매우 유용