랭체인의 주요 구성 요소
• Document Loader (문서 로더): 다양한 형식의 데이터(텍스트, PDF, HTML 등)를 로드합니다.
• Text Splitter (텍스트 분할기): 긴 문서를 LLM의 입력 제약에 맞춰 작은 청크로 나눕니다.
• Embedding Model (임베딩 모델): 텍스트를 벡터 형태로 변환하여 의미적 유사성을 계산할 수 있게 합니다.
• Vectorstore (벡터 저장소): 임베딩된 문서를 저장하고 효율적으로 검색할 수 있는 데이터베이스입니다.
• Retriever (검색기): 사용자 쿼리에 가장 관련성이 높은 문서를 벡터 저장소에서 찾아냅니다.
• LLM (거대 언어 모델): 실제 응답을 생성하는 핵심 모델입니다.
• Chain (체인): 여러 LLM 호출과 다른 유틸리티를 연결하여 복잡한 작업을 수행하는 시퀀스입니다.
• Agent (에이전트): LLM이 특정 작업을 위해 어떤 도구를 사용할지 스스로 결정하게 하는 모듈입니다.
• Tool (도구): 에이전트가 외부 데이터 소스나 API와 상호작용할 수 있게 해주는 기능입니다.
• Memory (메모리): 대화 기록을 유지하여 LLM이 이전 대화 내용을 참고할 수 있게 합니다.
• LMGraph: 랭체인의 향상된 버전으로, 복잡하고 상태 저장(stateful)이 필요한 LLM 애플리케이션을 위한 그래프 기반 프레임워크입니다.
2.1. 데이터 준비 및 전처리 (Indexing)
1. Document Loading:
◦ 텍스트 파일(TextLoader), PDF 파일(PyPDFLoader), 특정 디렉토리(DirectoryLoader) 등 다양한 형식의 문서를 불러올 수 있습니다.
2. Chunking (Text Splitting):
◦ LLM은 입력 토큰 수에 제한이 있으므로, 긴 문서를 작은 단위로 쪼개는 과정이 필수적입니다.
◦ CharacterTextSplitter: 특정 구분자(separator)를 기준으로 텍스트를 분할합니다.
◦ RecursiveCharacterTextSplitter: 여러 구분자를 계층적으로 사용하여 더 의미 있는 청크를 생성합니다. 첫 번째 구분자로 분할하고, 여전히 긴 청크는 다음 구분자로 다시 분할하는 식입니다.
◦ SemanticChunker: 임베딩 모델을 사용하여 문장 간의 의미적 유사성(embedding distance)이 임계값 이하일 때 청크를 결합하고, 그렇지 않을 때 분리합니다.
◦ CharacterTokenSplitter: 토큰 기반 분할기로, LLM의 컨텍스트 제한이 보통 토큰 단위로 정해지므로 효율적입니다.
2.2. 지식 벡터화 및 저장 (Embedding & Vectorstore)
1. Embedding Model:
◦ OpenAIEmbeddings: OpenAI의 text-embedding-3-small 같은 모델을 사용하여 텍스트를 고정된 길이의 벡터로 변환합니다.
◦ HuggingFaceEmbeddings / HuggingFaceBgeEmbeddings: Hugging Face 모델(예: BAAI/bge-small-en-v1.5)을 사용하여 로컬에서 임베딩을 생성할 수 있으며, HuggingFaceBgeEmbeddings는 쿼리 인스트럭션이 추가되어 검색에 최적화된 임베딩을 생성합니다.
2.5. 워크플로우 연결 (Chain)
랭체인의 핵심은 이 모든 모듈을 체인(Chain)으로 연결하여 복잡한 작업을 자동화하는 것입니다.
• 기본 체인: prompt | llm과 같이 프롬프트와 LLM을 직접 연결할 수 있습니다.
• Output Parser: LLM의 응답을 원하는 형식(예: 문자열)으로 파싱할 수 있습니다 (StrOutputParser).
• RAG 체인: 검색기, 프롬프트, LLM, 파서 등을 조합하여 RAG 파이프라인을 완성합니다.
• RunnableParallel & RunnablePassthrough: 복잡한 데이터 흐름을 병렬로 처리하거나 입력 값을 그대로 다음 단계로 전달하는 데 사용됩니다.