안녕하세요! 오늘도 AI 분야의 개발자가 되기 위해 도전 중인 하킴입니다.
오늘은 LangChain 학습의 꽃이라고 할 수 있는 RAG(Retrieval-Augmented Generation) 시스템을 직접 구현해 본 과정을 정리해 보려 합니다.
단순히 LLM에게 질문하는 것을 넘어, "내가 가진 PDF 논문이나 특정 웹사이트 데이터를 바탕으로 답변하게 만들기"가 이번 실습의 핵심이었는데요.
폴더에 있는 5개의 단계별 코드를 하나씩 실행하며 깨달은 점들을 공유합니다!
RAG는 쉽게 말해 "LLM에게 전용 참고서를 쥐어주는 기술"입니다. 모델이 모르는 외부 데이터를 찾아서(Retrieval), 질문과 함께 전달해 답변을 생성(Generation)하는 방식이죠.
학습 중인 파이프라인의 흐름은 다음과 같습니다:
실습은 총 5단계로 구성된 Python 스크립트로 진행했습니다. 데이터는 제가 평소 관심 있던 Spotify 음악 인기도 예측 논문(PDF)과 Spotify Research 블로그를 활용했습니다!
처음엔 단순히 텍스트를 읽어오는 줄 알았는데, LangChain에서는 Document라는 객체(텍스트 + 메타데이터)로 다루는 게 중요하더라고요.
논문은 너무 길어서 한 번에 LLM에 넣을 수 없죠. 그래서 '청크(Chunk)' 단위로 자르는 과정이 필수입니다.
컴퓨터가 글자를 이해할 수 있게 벡터(숫자 리스트)로 바꾸는 단계입니다.
임베딩된 데이터들을 저장하고 필요할 때 꺼내 쓰는 '데이터 주머니'를 만듭니다.
드디어 앞선 조각들을 하나로 합쳤습니다.
# 내가 작성한 핵심 LCEL 체인
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt | llm | StrOutputParser()
)
실제 결과: "CNN 모델의 정확도가 뭐야?"라고 물었더니, 논문 구석에 있던 95.68%라는 숫자를 정확히 찾아내 답변했습니다! 😲
실습을 마치며 학생 입장에서 몇몇 생각이 들었습니다.
| 구분 | 기술 |
| LLM | Ollama (llama3.2:3b) |
| 임베딩 | HuggingFace all-MiniLM-L6-v2 (384차원) |
| 벡터 저장소 | ChromaDB, FAISS |
| 프레임워크 | LangChain, LCEL |
| 데이터 소스 | PDF (PyPDFLoader), Web (WebBaseLoader) |
다음 공부는 이 Retriever를 더 똑똑하게 만드는 전략을 배울 예정입니다!
RAG의 세계는 파면 팔수록 깊네요. 포기하지 않고 끝까지 달려보겠습니다!
질문이나 의견은 댓글로 언제든 환영합니다. 🙌
| LLM과 친해지기: Prompt Engineering의 모든 것 (0) | 2026.02.09 |
|---|---|
| 들어가며: 왜 RAG와 LangChain인가? (0) | 2025.11.12 |