LangChain | 비동기 스트림 [async], [astream] | 입출력 처리

박성문·2025년 1월 10일

비동기 스트리밍이란

비동기 스트리밍은 여러 요청을 동시에 처리할 수 있는 비차단(non-blocking) 방식의 데이터 처리 기법. 
LangChain에서는 LLM의 응답을 실시간으로 처리하면서도 다른 작업을 차단하지 않아 
시스템 자원을 효율적으로 사용할 수 있다

종류

stream과 astream이 있다. (async)

stream()은 비동기식으로 응답을 청크 단위로 보내는 것이지만
astream()은 비동기식으로 응답을 처리하는 것은 같으나 메시지 객체 전체를 받는다.
GPT나 클루드처럼 실시간으로 채팅을 치는 것 처럼 다다다닥 오는 것이 아닌
모든 응답이 준비되면 한 번에 도착한다는 것이다.

특징

stream()

  • 토큰 단위로 실시간 응답을 받음
  • UI에서 타이핑되는 것 같은 효과 구현 가능
  • 각 청크는 단순 텍스트 내용만 포함
  • 토큰 단위의 세밀한 제어 가능
  • 메모리 사용이 상대적으로 적음
  • 주로 실시간 채팅 UI 구현에 적합

astream()

async for message in chat.astream(messages):
    print(message)
    # 출력 예시:
    # AIMessage(content="안녕하세요!", additional_kwargs={'function_call': None}, example=False)
  • 완성된 메시지 객체 단위로 응답을 받음
  • 메시지 타입, 함수 호출 정보 등 메타데이터 포함
  • 구조화된 데이터 처리 가능
  • 메시지 레벨의 검증과 에러 처리가 용이
  • function calling이나 tool 사용 정보 처리에 적합
  • 완성된 응답에 대한 후처리가 필요한 경우 유용

차이점


사용 목적의 차이

  • stream() : 실시간 토큰 스트리밍이 필요할 때 (GPT, 클루드 등)
  • astream() : 메시지 단위의 처리가 필요하거나, 함수 호출 결과를 처리할 때

에러 처리

  • stream() : 토큰 레벨의 세밀한 제어가 가능
  • astream() : 메세지 레벨에서의 검증과 에러 처리가 더 용이

왜 필요한가

stream()은 실시간 자막 같은 것이다.
연설자가 말하는 순간순간 자막이 나타난다.
청중들은 즉시 내용을 볼 수 있고 작은 오타나 실수가 있을 수 있지만 실시간성이 중요한 경우에 사용한다.

astream()은 미리 준비된 자막 파일 같은 것이다.
전체 내용이 검증되고 정리된 상태이고 화자 정보, 시간 정보, 문맥 정보 등이 포함되어있다.
정확성이 더 중요한 경우에 사용한다.

실생활 비유

stream()은 GPT와 Claude 같은 AI 챗봇이다.

  • 실시간으로 생각하고 대화하는 것 같은 자연스러운 흐름
  • 즉각적인 응답이 중요한 상황에 적합
  • 중간에 응답을 끊거나 수정할 수 있음
  • 단순 텍스트만 필요한 경우

astream()은 쿠팡과 같은 주문 시스템이다.

  • 완전한 데이터가 한 번에 필요
  • 정확성이 매우 중요한 처리
  • 다양한 메타데이터를 포함
  • 여러 시스템과 연동이 필요한 경우

비교분석

기본 구조

stream()

astream()

임포트와 초기 설정

메시지 처리 방식

에러 처리 구조

필수 문법

stream()

astream()

공통 필수 요소

주의점

stream()

  • chunk 단위 처리
  • content 속성만 주로 사용
  • end="" 파라미터로 출력 제어

astream()

  • 메시지 객체 전체 처리
  • additional_kwargs 필수 체크
  • 함수 호출 처리시 딕셔너리 구조 확인 필수

동기 스트리밍과의 차이

for chunk in llm.stream (동기 스트리밍)



마치 스무고개 처럼 앞의 질문이 끝나야 다음 질문을 시작할 수 있다.

  • 블로킹 방식으로 동작
  • 한 번에 하나의 요청만 처리 가능
  • 다른 작업이 동시에 실행될 수 없음
  • 간단한 구현에 적합

async for chunk in llm.stream (비동기 스트리밍)



비동기 스트리밍은 다른 topic의 질문을 동시에 할 수 있다.
ChatGPT, Claude 같은 생성형 AI 채팅 사이트에서 동시간에 여러 사용자가 접속해
topic에 접근해도 아무 문제 없는 것처럼.

  • 한 사용자가 여러 질문을 동시에 하든, 여러 사용자가 각각 동시에 질문을 하든.
  • 논블로킹 방식으로 동작
  • 여러 요청을 동시에 처리 가능
  • 다른 비동기 작업과 함께 실행 가능
  • FastAPI나 웹소켓 같은 비동기 웹 서버에서 활용하기 적합

블로킹과 논블로킹

블로킹은 말 그대로 현재 작업이 완료될 때 까지 다음 작업을 막는다는 뜻이다.
은행 1번 창구에서 다른 고객이 업무를 보고 있다면 다음 고객은 기다려야 하는 상황과 같다.
1인 1창구

논블로킹은 화구가 10개인 중식집에서 여러 테이블, 여러 개의 주문을 동시에 처리하는 상황과 같다.

batch 처리와는 다르다

batch 처리

  • 배치 처리는 깊이 있는 프롬프트 엔지니어링을 위한 메서드

비동기 스트리밍

  • 비동기 스트리밍은 여러명의 사용자가 한 서버에서 동시 작업을 할 때 필요한 메서드
배치 처리:
- 대량의 데이터를 일괄적으로 처리
- 정해진 시간이나 조건에 따라 실행
- 실시간성보다는 처리량 중시

비동기 스트리밍:
- 실시간으로 데이터를 처리
- 이벤트 발생 시 즉시 처리
- 처리량보다는 응답성 중시
profile
성문이

0개의 댓글