61일차 LangChain의 Memory, Document Loader

차지예·2025년 8월 13일

생성AI

목록 보기
55/56
post-thumbnail

LangChain의 Memory와 Document Loader 정리

🔹 1. Memory (대화 메모리)

✅ 정의

Memory는 LangChain에서 이전 대화 내용을 저장하고 불러오는 기능이다. 대화의 흐름을 기억하여 자연스럽고 일관된 응답을 생성할 수 있게 도와준다.

✅ 목적

  • 사용자와의 대화를 문맥에 맞게 이어나가기
  • 이전 발화를 기억해 "그 사람이 뭐라고 했지?" 같은 질문에 응답 가능

✅ 주요 타입

메모리 타입설명
ConversationBufferMemory전체 대화를 순차적으로 저장
ConversationSummaryMemory요약된 형태로 대화를 저장
ConversationBufferWindowMemory최근 N개의 발화만 저장 (슬라이딩 윈도우 방식)
ConversationKGMemory대화 내용을 지식 그래프 형태로 구조화
CombinedMemory여러 메모리를 조합해 사용

✅ 예시 코드

from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory()
memory.save_context({"input": "안녕"}, {"output": "안녕하세요!"})
print(memory.load_memory_variables({}))

🔹 2. Document Loader (문서 로더)

✅ 정의

Document Loader다양한 데이터 소스에서 문서를 불러오는 기능이다. RAG 파이프라인에서 주로 검색 전에 문서를 불러와 전처리할 때 사용한다.

✅ 지원 소스 예시

  • 로컬 파일 (TextLoader, PDFLoader, CSVLoader 등)
  • 웹 페이지 (WebBaseLoader, SitemapLoader)
  • Google Drive, Notion, Github 등 외부 API
  • 데이터베이스 (SQLDatabaseLoader, MongoDBLoader 등)

✅ 문서 구조

from langchain.document_loaders import TextLoader

loader = TextLoader("example.txt")
documents = loader.load()

print(documents[0].page_content)  # 문서 본문
print(documents[0].metadata)      # 메타데이터 (경로, 페이지 등)

🔸 TextSplitter로 문서 분할 (Chunking)

대부분의 Document Loader는 문서를 통으로 불러오므로, 검색을 위해 청크 단위 분할이 필요하다.

from langchain.text_splitter import CharacterTextSplitter

text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs = text_splitter.split_documents(documents)

🔹 3. RAG 파이프라인에서의 활용 예시

from langchain.chains import ConversationalRetrievalChain
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.memory import ConversationBufferMemory
from langchain.chat_models import ChatOpenAI
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter

# 문서 로드 및 청크 분할
loader = TextLoader("example.txt")
docs = loader.load()
splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
split_docs = splitter.split_documents(docs)

# 벡터 저장소 생성
db = FAISS.from_documents(split_docs, OpenAIEmbeddings())

# 메모리 설정
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)

# RAG 체인 구성
qa_chain = ConversationalRetrievalChain.from_llm(
    llm=ChatOpenAI(),
    retriever=db.as_retriever(),
    memory=memory
)

# 질의
qa_chain({"question": "문서 내용이 뭐였지?"})

📌 요약

항목설명
Memory대화형 응용에서 문맥을 유지하도록 도와주는 메모리 시스템
Document Loader다양한 소스로부터 문서를 로드해 검색/분석에 활용

0개의 댓글