한줄요약:
보안데이터 기반 데이터 분석 - Streamlit의 캐싱 기능을 활용하여 LangChain의 ConversationalRetrievalChain (대화 기억 기능이 있는 RAG)과 FAISS 벡터 데이터베이스를 효율적으로 구축하고, 이를 실시간 로그 스트리밍 시뮬레이션과 결합하여 대화 맥락을 기억하는 AI 보안 모니터링 대시보드를 완성했습니다.
오늘 공부한 내용:
🚀 대화형 로그 분석 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()**을 사용하여 사용자에게 즉각적인 경고를 표시합니다.