오늘 공부한 내용:
🚀 대화형 로그 분석 RAG 시스템 통합 요약
제공해주신 코드는 Streamlit의 캐싱(st.cache_data, st.cache_resource) 기능을 활용하여 LangChain의 대화형 RAG(ConversationalRetrievalChain) 시스템을 구축하고, 여기에 실시간 로그 스트리밍 시뮬레이션을 결합하여 복합적인 AI 보안 대시보드를 완성한 것입니다.
1. ⚡ Streamlit 캐싱을 활용한 효율성 극대화
Streamlit의 캐싱 기능을 사용하여 불필요한 재계산을 방지하고 애플리케이션의 성능을 최적화했습니다.
@st.cache_data:
목적: 변경되지 않는 대규모 데이터(Pandas DataFrame)를 로드할 때 사용합니다. 데이터를 메모리에 캐시하여 앱이 재실행될 때마다 파일을 다시 읽는 것을 방지합니다.
적용: load_data() 함수에 적용되어 원본 로그 파일(attack_logs_ko.csv 또는 attack_stream_logs.csv)을 효율적으로 관리합니다.
@st.cache_resource:
목적: 리소스가 많이 소모되는 객체(LLM, VectorDB, LangChain 체인)를 생성할 때 사용합니다. 객체의 인스턴스를 메모리에 유지하여 앱 재실행 시 모델을 다시 빌드하거나 임베딩을 다시 계산하는 시간을 절약합니다.
적용: create_vector_store() (FAISS DB 생성) 및 model() (LangChain 체인 생성) 함수에 적용되었습니다.
2. 🗣️ LangChain 대화형 RAG 구현 (Memory)
일반적인 RetrievalQA 체인과 달리, 이 프로젝트에서는 **대화의 맥락(Context)**을 기억하는 기능이 추가되었습니다.
핵심 체인: ConversationalRetrievalChain.from_llm()
이 체인은 내부적으로 사용자의 새로운 질문과 기존의 **채팅 이력(chat_history)**을 결합하여 LLM에게 전달합니다. 이 덕분에 "방금 그 공격의 IP가 뭐야?"와 같은 후속 질문에도 이전 대화를 기억하고 응답할 수 있습니다.
Streamlit 세션 관리:
st.session_state["messages"]: 화면에 출력할 채팅 메시지(사용자/어시스턴트) 리스트를 저장하여 대화창의 상태를 유지합니다.
st.session_state["chat_history"]: LangChain의 ConversationalRetrievalChain에 직접 전달될 (질문, 답변) 튜플 리스트를 저장하여 모델의 대화 메모리 역할을 수행합니다.
3. 🚨 실시간 스트리밍 모니터링 통합
Streamlit의 레이아웃 (st.columns(2))을 사용하여 대화형 챗봇과 실시간 로그 모니터링을 병렬로 배치했습니다.
스트리밍 구현: time.sleep(5)를 사용하여 데이터프레임(frm)의 각 행을 5초마다 순차적으로 처리하며 로그가 실시간으로 들어오는 것을 시뮬레이션했습니다.
세션 기반 로그 누적:
st.session_state['logs']: 새로 들어온 로그를 누적하는 DataFrame을 세션 상태에 저장합니다.
pd.concat([pd.DataFrame([newLog]), st.session_state['logs']]): 새로운 로그를 기존 로그 위에 쌓아(누적) 최신 로그가 가장 위에 표시되도록 구현했습니다.
위험도 감지: if newLog['risk_score'] >= 85:와 같은 조건문을 통해 로그의 위험도 점수를 확인하고, **warningPrt.warning()**을 사용하여 사용자에게 즉각적인 경고를 표시합니다.