LangChain으로 RAG 챗봇을 만들면 무엇이 연결될까?

LangChain RAG 챗봇이 문서를 읽고 나누고 검색해 LLM 답변으로 연결하는 전체 구조와 첫 ChatOpenAI 호출을 쉽게 설명합니다.

LangChain으로 사내 문서 RAG 챗봇 만들기 1/9

문서를 준비하는 단계부터 검색, 대화 화면, 배포와 평가까지 하나씩 연결하는 학습 기록

학교 축제 전날, 학생이 AI에게 묻습니다. “음식 판매는 몇 시까지예요?” AI는 일반적인 축제 이야기는 잘하지만 우리 학교 안내문은 읽지 못했습니다. 그래서 그럴듯한 시간을 추측하거나 모른다고 답할 수 있습니다.

이 문제는 거대한 AI 하나를 더 똑똑하게 만든다고 바로 해결되지 않습니다. 문서를 읽고, 질문과 관련된 부분을 찾고, 그 근거를 질문과 함께 모델에 전달하는 여러 단계가 필요합니다. LangChain은 이 단계들을 같은 흐름으로 연결하도록 돕는 도구입니다.

이번 글에서는 완성할 RAG 챗봇의 지도를 먼저 펼쳐봅니다. 마지막에는 모델 연결이 되는지만 확인하는 가장 작은 ChatOpenAI 코드도 살펴봅니다. 아직 문서 검색까지 구현한 척하거나 실제 모델 응답을 만들어내지는 않습니다.

이 글은 시리즈 순서에 맞춰 2026년 5월 7일에 배치했습니다. 패키지와 API 설명은 2026년 8월 16일 LangChain 공식 문서를 기준으로 다시 확인했습니다.

우리가 만들 결과물부터 살펴보자

완성할 결과물은 문서에 질문할 수 있는 작은 웹 챗봇입니다. 예를 들어 학교 안내문, 상품 설명서나 공개된 프로젝트 문서를 넣어두고 다음처럼 묻습니다.

질문: 축제 음식 판매는 몇 시까지인가요?

답변: 제공된 운영 안내 3조에 따르면 오후 6시까지입니다.

학교와 안내문은 흐름을 설명하기 위한 가상 예시입니다. 실제 사내 문서를 사용한다면 접근 권한과 외부 전송 여부부터 확인해야 합니다.

시리즈가 끝날 때까지 다음 기능을 차례로 연결합니다.

  1. 문서를 읽고 검색 가능한 작은 조각으로 나눕니다.
  2. 질문과 의미가 가까운 문서 조각을 찾습니다.
  3. 검색한 근거를 모델에 전달해 답변을 만듭니다.
  4. Streamlit 화면에서 대화와 스트리밍 응답을 보여줍니다.
  5. 검색과 답변이 실제로 나아졌는지 평가합니다.

첫 편의 목표는 코드를 많이 작성하는 것이 아닙니다. 각 부품이 왜 필요한지 알고, 문제가 생겼을 때 어느 부분을 확인할지 지도를 만드는 것입니다.

모델만으로는 왜 학교 안내문을 모를까?

LLM(Large Language Model, 대규모 언어 모델)은 학습할 때 본 언어 패턴을 바탕으로 다음 Token을 생성합니다. 하지만 내 노트북의 파일이나 회사 내부 문서를 자동으로 열어보지는 못합니다.

로컬 모델도 마찬가지입니다. 모델이 내 컴퓨터에서 실행된다는 사실과 내 파일을 읽을 권한이 있다는 사실은 다릅니다. 애플리케이션이 문서를 읽고 필요한 부분을 골라 현재 요청에 넣어줘야 합니다.

RAG(Retrieval-Augmented Generation, 검색 증강 생성)는 이 연결 방식입니다. 질문과 관련된 자료를 먼저 검색하고, 그 자료를 현재 질문과 함께 모델에 전달해 답변을 생성합니다. 모델을 다시 학습시키는 방법은 아닙니다.

Spring AI 시리즈의 RAG 입문 글에서는 왜 모델이 사내 문서를 자동으로 모르는지 설명했습니다. 이번 시리즈는 같은 원리를 Python과 LangChain으로 직접 연결하는 과정에 집중합니다.

LangChain은 AI 모델일까?

LangChain은 모델 자체가 아닙니다. Python 애플리케이션에서 모델, 문서 검색, Prompt와 외부 도구를 연결하도록 돕는 라이브러리입니다.

학교 방송부를 떠올려봅시다. 방송부장은 안내문을 쓴 사람이 아니고, 스피커를 만든 사람도 아닙니다. 대신 안내문을 받아 순서를 정하고, 필요한 장비를 연결해 학생에게 전달합니다. LangChain도 여러 부품 사이의 입력과 출력을 이어주는 역할에 가깝습니다.

학교 방송 과정 RAG 애플리케이션
안내문을 가져오는 학생 Document Loader
긴 안내문을 읽기 좋게 나누기 Text Splitter
비슷한 내용을 찾기 위한 색인 Embedding과 Vector Store
질문에 맞는 부분을 찾는 담당자 Retriever
질문과 안내문을 함께 읽는 진행자 Chat Model
학생에게 들려주는 방송 최종 답변

이 비유에서 중요한 점이 있습니다. 방송부장이 틀린 안내문을 받으면 정확한 방송을 만들기 어렵습니다. LangChain을 쓴다고 문서 품질, 검색 정확도와 모델의 환각이 자동으로 해결되지는 않습니다.

RAG에는 두 개의 길이 있다

RAG 챗봇은 한 줄짜리 마법 명령이 아닙니다. 크게 문서를 미리 준비하는 길질문할 때 실행되는 길로 나뉩니다.

문서를 미리 준비하는 길

먼저 Document Loader가 PDF, 텍스트나 웹 문서 같은 원본을 읽습니다. Text Splitter는 긴 문서를 검색하기 쉬운 작은 Chunk(문서 조각)로 나눕니다.

Embedding(임베딩)은 문장의 의미를 비교할 수 있도록 숫자 배열로 표현하는 과정입니다. Vector Store는 이 숫자와 원래 문서 조각을 보관하고, 질문과 가까운 조각을 검색할 수 있게 합니다.

질문할 때 실행되는 길

사용자가 질문하면 Retriever(검색기)가 관련 문서 조각을 가져옵니다. 애플리케이션은 질문과 검색 결과를 Prompt에 함께 넣고 Chat Model에 전달합니다.

모델은 전달받은 근거를 참고해 답을 생성합니다. 검색한 문서를 데이터베이스의 정답처럼 그대로 꺼내는 것이 아니라, 여전히 다음 Token을 이어 붙여 문장을 만듭니다. 그래서 근거가 있어도 답변 검증은 필요합니다.

RAG 챗봇은 두 개의 길을 연결한다

문서를 검색할 수 있게 준비하는 길과, 질문에 맞는 문서를 찾아 답변으로 연결하는 길을 차례로 보여줍니다.

① 미리 준비하는 길

1학교 안내문FILE
2문서 읽기LOAD
3작게 나누기CHUNK
4의미를 숫자로[0.2, …]
5Vector Store검색 준비 완료
준비해 둔 문서 조각을 검색

② 질문할 때 걷는 길

6사용자 질문축제 음식 판매는 몇 시까지인가요?
7관련 조각 검색SEARCH
8질문 + 근거운영 안내 3조 · 음식 판매는 오후 6시까지
9Chat ModelGENERATE
10근거 있는 답변안내문에 따르면 오후 6시까지예요.

현재 단계: 검색에 사용할 원본 안내문을 준비합니다.

학교 축제 안내문과 답변은 구조 설명을 위한 가상 예시입니다. LangChain은 각 단계를 연결하지만, 문서의 정확성이나 답변의 사실성을 자동으로 보장하지는 않습니다.

부품 하나가 빠지면 어떻게 될까?

전체 구조를 이해하는 가장 쉬운 방법은 부품 하나씩 빼보는 것입니다.

빠진 부품 생기는 문제
Loader 원본 문서를 애플리케이션으로 가져오지 못함
Splitter 긴 문서에 여러 주제가 섞여 필요한 부분을 찾기 어려울 수 있음
Embedding 문장 표현이 달라도 의미가 비슷한 자료를 찾는 검색을 구성하기 어려움
Vector Store 변환한 문서 조각을 저장하고 유사도 검색할 장소가 없음
Retriever 현재 질문에 필요한 문서 조각을 고르지 못함
Prompt 구성 검색 결과가 있어도 모델에 근거로 전달되지 않음
Chat Model 검색한 자료를 사용해 자연어 답변을 생성하지 못함

이 표는 제품 이름보다 역할을 먼저 보여줍니다. Chroma를 Pinecone으로 바꾸거나 OpenAI 모델을 다른 제공자로 바꾸더라도, 이 역할들이 어디에 있는지는 확인해야 합니다.

첫 실행에서는 무엇을 확인할까?

RAG 전체를 한 번에 만들면 오류가 어디에서 생겼는지 찾기 어렵습니다. 먼저 Python에서 Chat Model 호출이 되는지만 확인합니다. 문서, Embedding과 Vector Store는 다음 단계에서 붙입니다.

2026년 8월 16일 기준 LangChain 공식 설치 문서는 Python 3.10 이상에서 핵심 패키지를 다음처럼 설치하도록 안내합니다. OpenAI 연동은 별도 제공자 패키지에 들어 있습니다.

python -m pip install -U langchain langchain-openai

패키지를 나눈 이유는 모델 제공자마다 API와 기능이 다르기 때문입니다. langchain을 설치했다고 모든 모델 연동이 자동으로 포함되는 것은 아닙니다.

API Key는 소스코드에 직접 적지 않습니다. 다음 예제는 입력한 값을 화면에 노출하지 않는 getpass를 사용합니다.

import getpass
import os

if not os.environ.get("OPENAI_API_KEY"):
    os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API key: ")

이제 ChatOpenAI를 만들고 한 번 호출합니다.

from langchain_openai import ChatOpenAI

model = ChatOpenAI(model="<사용 가능한 모델 이름>")
response = model.invoke("RAG를 한 문장으로 설명해줘.")

print(response.content)

모델 이름은 계정과 사용하려는 OpenAI 모델에 맞게 선택해야 합니다. ChatOpenAI는 OpenAI의 Chat Model API를 LangChain의 공통 호출 방식으로 연결하는 클래스이지, 모델 파일 자체가 아닙니다.

이 코드는 현재 LangChain 공식 문서를 바탕으로 연결 위치만 단순화한 학습 예제입니다. 이 Astro 블로그 저장소에는 Python 실행 환경이나 API Key를 추가하지 않았고, 실제 모델 응답도 측정하지 않았습니다.

아직 RAG가 완성된 것은 아니다

방금 코드는 질문을 모델에 바로 보냈습니다. 문서를 읽지도 않았고 관련 근거를 검색하지도 않았습니다. 따라서 성공하더라도 확인한 것은 다음 세 가지뿐입니다.

  • Python이 필요한 패키지를 불러올 수 있는가?
  • API Key와 모델 이름이 올바른가?
  • 애플리케이션에서 Chat Model까지 요청과 응답이 오가는가?

이것을 RAG 성공이라고 부르면 안 됩니다. 다음에는 Chroma를 이용해 문서를 저장하고, Retriever가 실제로 관련 조각을 돌려주는지 별도로 확인해야 합니다.

LangChain이 줄여주는 것과 남겨두는 것

LangChain은 서로 다른 부품이 비슷한 방식으로 연결되도록 인터페이스를 제공합니다. Loader나 모델 제공자를 바꿀 때 애플리케이션 전체를 처음부터 작성하지 않도록 도와줍니다.

하지만 모든 구현 차이를 없애지는 않습니다. 모델마다 지원 기능과 입력 제한이 다르고, Vector Store마다 검색 설정과 운영 방식이 다릅니다. 제공자를 바꾸면 패키지, 인증, 모델 이름, 비용, 데이터 전송 범위와 응답 형식을 다시 확인해야 합니다.

LangChain이 대신 해결하지 않는 문제도 분명합니다.

  • 잘못되거나 오래된 문서
  • 사용자가 볼 수 없는 문서의 접근 권한
  • 적절하지 않은 Chunk 크기
  • 검색되지 않은 정답 근거
  • 모델이 근거를 무시하고 추측하는 문제
  • 외부 API의 비용, 지연과 장애
  • Prompt와 문서가 로그에 남는 보안 위험

도구를 쓰는 목적은 판단을 없애는 것이 아닙니다. 반복 연결 코드를 줄이고, 각 단계의 입력과 출력을 더 분명하게 관찰하는 데 있습니다.

처음 만들 폴더는 단순해도 된다

앞으로 작성할 예제를 하나의 작은 프로젝트로 모은다면 다음 정도로 시작할 수 있습니다.

langchain-rag-chatbot/
├─ data/          # 학습 예제에 사용할 공개 또는 가상 문서
├─ ingest.py      # 문서를 읽고 나누어 저장
├─ rag.py         # 검색 결과를 질문과 함께 모델에 전달
└─ app.py         # Streamlit 채팅 화면

실제 서비스에서는 설정, 테스트와 권한 처리가 더 필요합니다. 지금은 “문서 준비”, “질문 처리”, “화면”의 책임을 섞지 않는 것만으로 충분합니다.

자주 생기는 오해

LangChain을 설치하면 AI 모델도 설치되나요?

아닙니다. LangChain은 모델을 호출하고 다른 구성 요소와 연결하는 라이브러리입니다. 클라우드 모델을 사용하면 해당 API가 필요하고, 로컬 모델을 사용하면 별도의 실행 환경과 모델 파일이 필요합니다.

Vector Store에 문서를 넣으면 답변이 자동으로 나오나요?

아닙니다. Vector Store는 관련 문서를 찾는 역할을 합니다. 검색 결과를 Prompt에 넣고 Chat Model에 전달하는 생성 단계가 따로 필요합니다.

RAG는 회사 문서를 모델이 새로 학습하는 과정인가요?

아닙니다. 질문할 때 관련 문서 조각을 찾아 현재 Context로 전달합니다. 모델 가중치를 바꾸는 학습이나 Fine-tuning과는 목적과 동작이 다릅니다.

LangChain을 쓰면 모델 제공자를 설정 하나로 완벽히 교체할 수 있나요?

공통 인터페이스가 교체 비용을 줄일 수는 있습니다. 하지만 제공자별 모델 기능, 인증, 메시지 형식, 비용과 제한까지 같아지는 것은 아닙니다.

세 줄 요약

  • RAG 챗봇은 문서 준비, 검색, Prompt 구성과 답변 생성을 연결한 애플리케이션입니다.
  • LangChain은 이 부품들을 연결하는 라이브러리이며 AI 모델이나 Vector Database 자체가 아닙니다.
  • 첫 실행에서는 Chat Model 연결만 확인하고 문서 검색 성공과 답변 품질은 다음 단계에서 따로 검증해야 합니다.

다음 편 예고

같은 LangChain 코드라도 외부 모델 API, 국내 제공자와 로컬 모델은 비용과 보안 경계가 다릅니다.

다음 편 — AI 모델 API는 무엇을 기준으로 골라야 할까?에서는 OpenAI, Upstage와 Ollama를 비교합니다.

공식 문서