5차시. LangChain 입문
4. 첫 번째 LangChain 프로젝트
출처: 원본 PDF 05차시_LangChain입문RAG의마법도구.pdf 4~5쪽 · 쪽 그림 4쪽 5쪽
이제 실제 코드를 작성해봅시다.
4-1) 준비 단계
1. VSCode에서 RAG_Project 폴더 열기
2. 가상환경 활성화
3. data 폴더에 sample.txt 파일 생성
sample.txt 내용
우리 회사는 2024년에 설립되었습니다. AI로 사회에 기여합니다.
제품 A: 가격 100,000원, 색상 검은색/흰색, 보증 2년
서비스: 24시간 지원, support@company.com, 반환정책 30일4-2) load_and_split.py 작성
출처: 원본 PDF 5쪽
src/load_and_split.py
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
print("LangChain 테스트")
# 1단계: 문서 로드
loader = TextLoader("data/sample.txt")
documents = loader.load()
print(f"문서 개수: {len(documents)}")
# 2단계: 텍스트 분할
splitter = RecursiveCharacterTextSplitter(
chunk_size=150,
chunk_overlap=30
)
chunks = splitter.split_documents(documents)
print(f"chunk 개수: {len(chunks)}")
# 3단계: 결과 확인
for i, chunk in enumerate(chunks, 1):
print(f"Chunk {i}: {len(chunk.page_content)} 글자")실행 결과 예시 (코드를 읽고 만든 예상 화면입니다. 실제 실행 결과, 특히 모델의 답은 다를 수 있습니다)
LangChain 테스트
문서 개수: 1
chunk 개수: 2
Chunk 1: 144 글자
Chunk 2: 93 글자실습 코드 · 05/load_and_split.py
실습 코드: 실습/src/05/load_and_split.py · 위의 원본 PDF 5차시 5쪽 「4-2) load_and_split.py 작성」과 이어집니다.
# ============================================================
# 5차시 | PPT: 05차시_LangChain입문.pptx
# 역할: 안내문을 읽어 짧은 조각(chunk)으로 나누고 겹침(overlap)을 확인
# 입력: ../../data/notice.txt
# 출력: 조각 개수와 각 조각의 본문
# 흐름:
# notice.txt
# -> TextLoader.load() -> Document
# -> RecursiveCharacterTextSplitter
# -> chunk 리스트 -> print
# ============================================================
# Document: 본문(page_content)과 부가 정보(metadata)를 묶은 객체
# chunk: 긴 글을 검색하기 좋게 잘라 낸 조각. 여기서도 Document입니다.
# overlap: 앞 조각의 끝과 다음 조각의 시작이 같은 글자로 겹치는 길이
# 읽는 도구(TextLoader)와 자르는 도구(Splitter)는 서로 다른 패키지에 들어 있습니다.
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
# src/05 폴더에서 실행해야 이 상대 경로가 실습/data/notice.txt를 가리킵니다.
# 한글 파일이므로 encoding="utf-8"을 꼭 적습니다.
loader = TextLoader(
"../../data/notice.txt",
encoding="utf-8"
)
# TXT 파일 하나라서 Document 1개짜리 리스트가 돌아옵니다.
documents = loader.load()
# 문서를 청크로 나누기
# chunk_size: 한 조각의 최대 글자 수. chunk_overlap: 이웃 조각과 겹치는 글자 수.
# 문단, 줄, 문장 경계를 먼저 찾아 자르므로 조각 길이가 정확히 150자가 되지는 않습니다.
splitter = RecursiveCharacterTextSplitter(
chunk_size = 150,
chunk_overlap = 30,
)
# 변수 이름은 chuncks입니다. split_documents는 Document 리스트를 돌려줍니다.
chuncks = splitter.split_documents(documents)
print("="*50)
print(f" chunk 갯수 => {len(chuncks)}")
# enumerate(리스트, 1)은 1번부터 번호를 붙입니다.
for i, chunck in enumerate(chuncks, 1):
# 조각도 Document이므로 본문은 page_content로 꺼냅니다.
# [1]의 끝부분이 [2]의 앞에 다시 나오면 overlap이 작동한 것입니다.
print(f"[{i}] \n {chunck.page_content}")
print()실행 결과 샘플 (교안 기록. API 키가 필요한 코드는 키 없이 맞춘 예시이고, 모델의 답은 실행할 때마다 달라집니다)
===== 실행 결과 샘플 =====
실행: cd 실습/src/05
python load_and_split.py
==================================================
chunk 갯수 => 2
[1]
[고객 안내문]
1. 환불 규정
상품 수령 후 7일 이내에 환불을 신청하실 수 있습니다.
단순 변심의 경우 왕복 배송비는 고객 부담입니다.
2. 교환 규정
상품 불량의 경우 30일 이내에 교환이 가능합니다.
이 경우 배송비는 당사가 부담합니다.
3. 고객센터
[2]
이 경우 배송비는 당사가 부담합니다.
3. 고객센터
운영 시간은 평일 09:00 ~ 18:00 입니다.
전화 1588-0000 / 이메일 help@example.com코드 해설
안내문을 읽어 짧은 조각(chunk)으로 나누고 겹침(overlap)을 확인입니다. 입력은 ../../data/notice.txt이고, 출력은 조각 개수와 각 조각의 본문입니다.
주석에 적힌 흐름입니다.
notice.txt
-> TextLoader.load() -> Document
-> RecursiveCharacterTextSplitter
-> chunk 리스트 -> print코드 앞에서 고정해 두는 말입니다.
- Document: 본문(page_content)과 부가 정보(metadata)를 묶은 객체
- chunk: 긴 글을 검색하기 좋게 잘라 낸 조각. 여기서도 Document입니다.
- overlap: 앞 조각의 끝과 다음 조각의 시작이 같은 글자로 겹치는 길이
함수로 나누지 않고 위에서 아래로 실행됩니다.
splitter = RecursiveCharacterTextSplitter(— 문서를 청크로 나누기 chunk_size: 한 조각의 최대 글자 수. chunk_overlap: 이웃 조각과 겹치는 글자 수.chuncks = splitter.split_documents(documents)— 변수 이름은 chuncks입니다. split_documents는 Document 리스트를 돌려줍니다.for i, chunck in enumerate(chuncks, 1):— enumerate(리스트, 1)은 1번부터 번호를 붙입니다.
파일 맨 아래 실행 결과 샘플 주석은 실행되지 않습니다. 화면 출력은 다음 절에 다시 적어 두었습니다.
4-3) 코드 실행
출처: 원본 PDF 5쪽
cd RAG_Project
source venv/bin/activate
python src/load_and_split.py