한줄요약:
보안데이터 기반 LLM 서비스 프레임워크의 이해(RAG) - LangChain은 LLM(예: OpenAI)과 RAG(검색 증강 생성) 기술을 결합하는 핵심 프레임워크로, 질문을 임베딩하여 FAISS 벡터 데이터베이스에서 관련 문서를 검색한 뒤, 이 정보를 LLM에 전달해 답변의 정확성과 최신성을 높이는 시스템을 구축하며, 이를 Streamlit으로 웹 애플리케이션화할 수 있습니다.
오늘 공부한 내용:
1. 🛠️ LLM 가상 환경 구축 (feat. VSCode & Conda/Pip)
LLM 및 RAG 개발은 복잡한 라이브러리 의존성을 가지므로, 특정 버전 관리가 필수적입니다.
가상 환경 사용 목적: 프로젝트별로 독립적인 환경을 구축하여 라이브러리 간 버전 충돌을 방지합니다.
Conda를 사용한 환경 구축 절차:
가상 환경 생성: conda create -n langchain_llm_env python=3.10
가상 환경 활성화: conda activate langchain_llm_env
주요 라이브러리 설치: 안정적인 RAG 시스템 구축을 위해 특정 버전을 지정하여 설치합니다.
LLM 연동: pip install openai==1.52.0
LangChain 프레임워크: pip install langchain==0.2.16 langchain-core==0.2.38 langchain-community==0.2.16
벡터 데이터베이스 (Vector DB): pip install faiss-cpu==1.8.0 chromadb==0.5.5
문서 처리: pip install tiktoken==0.7.0 pypdf==4.3.1 unstructured==0.14.10
환경 변수 관리: pip install python-dotenv==1.0.0
VSCode 연동: VSCode에서 생성된 가상 환경을 인터프리터로 선택하여 해당 환경 내에서 코드를 실행합니다.
2. 🔑 Gen AI (OpenAI) 활용 기초
API Key 관리: python-dotenv를 사용하여 .env 파일에 저장된 OPENAI_API_KEY 환경 변수를 로드하고 코드가 API 키에 직접 노출되는 것을 방지합니다.
클라이언트 초기화: client = OpenAI(api_key=api_key)를 통해 OpenAI API와 통신할 객체를 생성합니다.
주요 API 엔드포인트:
client.chat.completions: 대화형 LLM 응답 생성.
client.embeddings: 텍스트를 임베딩 벡터로 변환.
client.models.list(): 사용 가능한 모델 목록 확인.
3. 🔢 임베딩 (Embedding)의 역할
정의: 텍스트(단어, 문장, 문서)를 **숫자 배열 (벡터)**로 변환하는 과정입니다.
LLM에서의 역할: 사용자의 입력 텍스트를 임베딩 벡터로 변환하여 모델이 이해하고 처리할 수 있도록 합니다.
RAG에서의 역할: 사용자의 질문을 임베딩하여 벡터 데이터베이스에서 의미적으로 유사한 외부 문서를 검색하는 데 사용됩니다.
코드 예시: client.embeddings.create(model='text-embedding-3-small', input=texts)
4. 🧠 RAG (검색 증강 생성) 활용 방법
**RAG (Retrieval-Augmented Generation)**는 LLM의 약점(최신 정보 부족, 환각 현상)을 보완하기 위한 핵심 기술입니다.
RAG의 장점: LLM의 답변 생성 능력에 외부 지식(문서, DB 등) 검색 능력을 결합하여 정확성과 최신성을 높입니다.
전체 흐름:
사용자 질문 입력.
질문 임베딩.
**벡터 DB (FAISS)**에서 임베딩된 질문과 가장 유사한 관련 문서 검색 (Retrieval).
검색된 문서를 프롬프트에 추가하여 LLM에게 전달.
LLM이 이 문서를 참조하여 답변 생성 (Generation).
5. 🔗 LangChain을 활용한 RAG 구현 (LangChain + RAG)
LangChain은 LLM 기반 애플리케이션을 쉽게 개발하기 위한 프레임워크입니다.
핵심 컴포넌트:
임베딩 (OpenAIEmbeddings): 텍스트 데이터를 벡터로 변환.
벡터 DB (FAISS): 임베딩된 문서를 저장하고 빠르게 검색하는 역할을 수행. (FAISS.from_texts()로 문서와 임베딩을 결합하여 생성).
검색기 (.as_retriever()): 벡터 DB를 LLM이 사용할 수 있는 검색 인터페이스로 변환. (search_kwargs={'k': 1}은 가장 유사한 문서 1개를 반환하도록 설정).
체인 (RetrievalQA.from_chain_type): LLM 모델과 검색기를 연결하여 RAG 프로세스를 완성하는 핵심 구조.
작동 방식: **qa.run(query)**를 실행하면, LangChain이 내부적으로 질문을 임베딩하고, FAISS에서 관련 문서를 검색한 후, 그 문서를 llm (예: gpt-4o-mini)에게 전달하여 최종 답변을 생성하게 됩니다.
6. 🌐 Streamlit + LangChain + RAG
목표: LangChain으로 구축한 RAG 시스템을 Streamlit을 이용하여 사용자 친화적인 웹 인터페이스로 구현합니다.
통합 방식:
Streamlit의 입력 위젯(st.text_input 등)으로 사용자 질문을 받습니다.
받은 질문을 LangChain의 RAG 체인 (qa.run(query))에 전달하여 답변을 얻습니다.
Streamlit의 출력 위젯(st.write)으로 LLM이 생성한 답변을 웹 화면에 표시합니다.