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

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

async for message in chat.astream(messages):
print(message)
# 출력 예시:
# AIMessage(content="안녕하세요!", additional_kwargs={'function_call': None}, example=False)


사용 목적의 차이
에러 처리
stream()은 실시간 자막 같은 것이다.
연설자가 말하는 순간순간 자막이 나타난다.
청중들은 즉시 내용을 볼 수 있고 작은 오타나 실수가 있을 수 있지만 실시간성이 중요한 경우에 사용한다.
astream()은 미리 준비된 자막 파일 같은 것이다.
전체 내용이 검증되고 정리된 상태이고 화자 정보, 시간 정보, 문맥 정보 등이 포함되어있다.
정확성이 더 중요한 경우에 사용한다.
stream()은 GPT와 Claude 같은 AI 챗봇이다.

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

stream()

astream()




stream()

astream()


stream()
astream()



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



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


블로킹은 말 그대로 현재 작업이 완료될 때 까지 다음 작업을 막는다는 뜻이다.
은행 1번 창구에서 다른 고객이 업무를 보고 있다면 다음 고객은 기다려야 하는 상황과 같다.
1인 1창구
논블로킹은 화구가 10개인 중식집에서 여러 테이블, 여러 개의 주문을 동시에 처리하는 상황과 같다.





배치 처리:
- 대량의 데이터를 일괄적으로 처리
- 정해진 시간이나 조건에 따라 실행
- 실시간성보다는 처리량 중시
비동기 스트리밍:
- 실시간으로 데이터를 처리
- 이벤트 발생 시 즉시 처리
- 처리량보다는 응답성 중시