본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
커리어 성장을 위한 최고의 실무교육 아카데미 | 패스트캠퍼스
성인 교육 서비스 기업, 패스트캠퍼스는 개인과 조직의 실질적인 '업(業)'의 성장을 돕고자 모든 종류의 교육 콘텐츠 서비스를 제공하는 대한민국 No. 1 교육 서비스 회사입니다.
fastcampus.co.kr
55회 강의 - LangChain 가상 대화 상대 만들기 #2 - 복습




LangChain 가상 대화 상대 만들기 #2 - 복습
실제 사용자를 대상으로 대화형 인터페이스를 설계할 때 가장 중요한 요소 중 하나는 빠르고 자연스러운 반응이다. LangChain과 Streamlit을 결합하여, 가상 대화 상대를 보다 현실감 있게 구현하는 방법에 초점을 맞추었다. 초반에는 ChatPromptTemplate을 이용해 시스템 메시지와 사용자 입력을 구분하여 명확하게 구성하는 작업을 진행했다. 시스템 메시지를 별도로 선언하여 대화의 기본 성격을 설정하고, 사용자 입력은 매 세션마다 동적으로 받아 처리하는 방식은 직관적이면서도 유연했다. 특히 눈에 띄었던 부분은 ConversationBufferMemory를 세션 단위로 관리하면서, Streamlit의 session_state 기능을 적극적으로 활용한 점이다. 모델 인스턴스, 메모리, 체인 구조를 모두 session_state에 저장하고, 사용자 입력이 있을 때마다 이 상태를 기준으로 이어서 대화가 진행되도록 설계했다. 이 방식은 새로고침이나 페이지 이동 시에도 대화 이력이 유지되는 안정성을 확보하는 데 필수적이었다. 가장 핵심적이었던 부분은 Streaming 응답 처리였다. 단일 응답을 기다리지 않고, 모델이 생성하는 텍스트를 chunk 단위로 받아서 바로바로 화면에 출력하는 흐름을 구현했다. 사용자는 입력 후 곧바로 답변이 점진적으로 생성되는 것을 볼 수 있어, 정적인 대화와는 비교할 수 없는 몰입감을 느낄 수 있었다. 이 과정에서는 stream 매개변수를 활용해, 모델의 출력 스트림을 실시간으로 받아오는 코드를 직접 다루었다. 또한, 사용자 메시지와 어시스턴트 메시지를 각각 st.chat_message()를 이용해 구분 출력하고, 각 발화가 끝날 때마다 메모리에 저장하는 세밀한 구현까지 진행되었다.
이 구조 덕분에 대화 내역을 화면에 자연스럽게 누적 표시할 수 있었고, 스트림 처리 중에도 세션 동기화를 깨뜨리지 않는 안정성이 보장되었다.