LangChain을 활용한 LLM 애플리케이션 개발

November 06, 2025

LangChain을 활용한 LLM 애플리케이션 개발

LLM을 활용한 애플리케이션을 만들 때는 프롬프트 관리, 메모리 처리, 외부 도구 연결 등 복잡한 작업이 필요하다. LangChain은 이런 작업을 쉽게 만들어주는 프레임워크다. 이 글은 LangChain의 핵심 개념과 실무 활용 방법을 설명한다.

LangChain이란 무엇인가?

LangChain은 LLM을 활용한 애플리케이션을 쉽게 개발할 수 있게 해주는 오픈소스 프레임워크다. 프롬프트 체이닝, 메모리 관리, 외부 도구 연결, RAG 구현 등을 간단하게 처리할 수 있다.

LangChain의 필요성

단순히 LLM API를 호출하는 것만으로는 복잡한 애플리케이션을 만들기 어렵다.

문제점

  • 프롬프트 관리가 복잡함
  • 대화 기록(컨텍스트) 유지 어려움
  • 외부 데이터 소스 연결 어려움
  • 여러 LLM 호출을 순차적으로 처리하기 복잡

LangChain의 해결책

  • 체계적인 프롬프트 템플릿 관리
  • 자동 메모리 관리
  • 쉬운 외부 도구 통합
  • Chain으로 복잡한 워크플로우 구성

LangChain의 핵심 구성 요소

LangChain은 크게 6가지 모듈로 구성된다.

  1. Models: LLM과 임베딩 모델 관리
  2. Prompts: 프롬프트 템플릿과 관리
  3. Chains: 여러 작업을 순차적으로 연결
  4. Agents: 외부 도구를 사용하는 자율 에이전트
  5. Memory: 대화 기록과 컨텍스트 관리
  6. Indexes: RAG를 위한 벡터 스토어와 검색

핵심 개념

1. Chain: 작업을 순차적으로 연결

Chain은 여러 LLM 호출이나 작업을 순차적으로 연결하는 구조다.

간단한 Chain 예시

from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

# LLM 초기화
llm = OpenAI(temperature=0.7)

# 프롬프트 템플릿
prompt = PromptTemplate(
    input_variables=["product"],
    template="다음 제품에 대한 마케팅 문구를 작성해줘: {product}"
)

# Chain 생성
chain = LLMChain(llm=llm, prompt=prompt)

# 실행
result = chain.run("스마트워치")

Sequential Chain: 여러 Chain 연결

from langchain.chains import SimpleSequentialChain

# 첫 번째 Chain: 제품 분석
analysis_chain = LLMChain(
    llm=llm,
    prompt=PromptTemplate(
        input_variables=["product"],
        template="제품 {product}의 특징을 분석해줘"
    )
)

# 두 번째 Chain: 마케팅 문구 생성
marketing_chain = LLMChain(
    llm=llm,
    prompt=PromptTemplate(
        input_variables=["analysis"],
        template="다음 분석을 바탕으로 마케팅 문구를 작성해줘:\n{analysis}"
    )
)

# Chain 연결
full_chain = SimpleSequentialChain(
    chains=[analysis_chain, marketing_chain],
    verbose=True
)

result = full_chain.run("스마트워치")

2. Agent: 외부 도구를 사용하는 자율 에이전트

Agent는 외부 도구(검색, 계산기, API 등)를 사용해 목표를 달성하는 자율적인 시스템이다.

ReAct Agent 예시

from langchain.agents import initialize_agent, Tool
from langchain.utilities import WikipediaAPIWrapper, PythonREPL

# 도구 정의
wikipedia = WikipediaAPIWrapper()
python_repl = PythonREPL()

tools = [
    Tool(
        name="Wikipedia",
        func=wikipedia.run,
        description="최신 정보 검색에 사용"
    ),
    Tool(
        name="Python",
        func=python_repl.run,
        description="수학 계산이나 코드 실행에 사용"
    )
]

# Agent 초기화
agent = initialize_agent(
    tools,
    llm,
    agent="react-docstore",
    verbose=True
)

# 실행
result = agent.run("2024년 노벨 물리학상 수상자의 나이를 계산해줘")

Agent는 다음과 같이 작동한다:

  1. 질문을 분석해 필요한 도구 결정
  2. 도구를 사용해 정보 수집
  3. 수집한 정보를 종합해 답변 생성

3. Memory: 대화 기록 관리

Memory는 대화 기록을 저장하고 관리해 맥락을 유지한다.

ConversationBufferMemory

from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain

# Memory 생성
memory = ConversationBufferMemory()

# Chain에 Memory 추가
chain = ConversationChain(
    llm=llm,
    memory=memory,
    verbose=True
)

# 대화
chain.run("내 이름은 홍길동이야")
chain.run("내 이름이 뭐야?")  # "홍길동"을 기억함

ConversationBufferWindowMemory: 최근 N개만 기억

from langchain.memory import ConversationBufferWindowMemory

# 최근 3개 대화만 기억
memory = ConversationBufferWindowMemory(k=3)

ConversationSummaryMemory: 요약하여 기억

from langchain.memory import ConversationSummaryMemory

# 대화를 요약해 저장 (메모리 효율적)
memory = ConversationSummaryMemory(llm=llm)

4. RAG 구현: 외부 데이터와 연결

LangChain은 RAG(Retrieval-Augmented Generation) 구현을 쉽게 만들어준다.

간단한 RAG 예시

from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA

# 문서 로드
loader = TextLoader("document.txt")
documents = loader.load()

# 문서 분할
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)

# 임베딩 및 벡터 스토어 생성
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(texts, embeddings)

# RAG Chain 생성
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vectorstore.as_retriever()
)

# 질문
result = qa_chain.run("문서에서 주요 내용을 요약해줘")

실무 활용 사례

1. 고객 상담 챗봇

요구사항

  • 회사 정책 문서 기반 답변
  • 대화 기록 유지
  • 필요시 외부 API 호출

구현

from langchain.chains import ConversationalRetrievalChain
from langchain.memory import ConversationBufferMemory

# 문서 로드 및 벡터화
loader = DirectoryLoader("./company_policies/", glob="*.pdf")
documents = loader.load()
texts = text_splitter.split_documents(documents)
vectorstore = Chroma.from_documents(texts, embeddings)

# Memory 생성
memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True
)

# RAG Chain 생성
qa_chain = ConversationalRetrievalChain.from_llm(
    llm=llm,
    retriever=vectorstore.as_retriever(),
    memory=memory
)

# 대화
result = qa_chain({"question": "연차 신청 방법이 뭐야?"})

2. 코드 리뷰 자동화

요구사항

  • 코드를 분석해 리뷰 생성
  • 여러 파일을 동시에 처리

구현

from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate

# 코드 리뷰 프롬프트
review_prompt = PromptTemplate(
    input_variables=["code", "language"],
    template="""
    다음 {language} 코드를 리뷰해줘:
    
    {code}
    
    다음 항목을 포함해줘:
    1. 잠재적 버그
    2. 성능 개선 사항
    3. 코드 스타일 제안
    """
)

review_chain = LLMChain(llm=llm, prompt=review_prompt)

# 코드 리뷰
result = review_chain.run(
    code="""
    function getUser(id) {
        return users.find(u => u.id === id);
    }
    """,
    language="JavaScript"
)

3. 문서 분석 및 요약

요구사항

  • 긴 문서를 요약
  • 핵심 정보 추출

구현

from langchain.chains.summarize import load_summarize_chain
from langchain.document_loaders import PyPDFLoader

# PDF 로드
loader = PyPDFLoader("report.pdf")
documents = loader.load()

# 문서 분할
texts = text_splitter.split_documents(documents)

# 요약 Chain
summary_chain = load_summarize_chain(
    llm=llm,
    chain_type="map_reduce",
    verbose=True
)

# 요약 실행
summary = summary_chain.run(texts)

4. 데이터 분석 Agent

요구사항

  • 자연어로 데이터 분석 요청
  • Python 코드 자동 생성 및 실행

구현

from langchain.agents import create_pandas_dataframe_agent
import pandas as pd

# 데이터 로드
df = pd.read_csv("sales.csv")

# Agent 생성
agent = create_pandas_dataframe_agent(
    llm=llm,
    df=df,
    verbose=True
)

# 자연어 질문
result = agent.run("2024년 매출이 가장 높은 월은?")

LangChain vs 직접 구현

구분 LangChain 사용 직접 구현
개발 속도 빠름 느림
유지보수 쉬움 어려움
확장성 높음 낮음
커스터마이징 제한적 자유로움
학습 곡선 중간 낮음
의존성 많음 적음

언제 LangChain을 사용할까?

LangChain 사용 권장

  • 빠른 프로토타이핑 필요
  • RAG, Agent 같은 복잡한 기능 필요
  • 여러 LLM을 교체하며 테스트 필요
  • 표준화된 구조가 필요한 경우

직접 구현 권장

  • 매우 단순한 LLM 호출만 필요
  • 특수한 요구사항이 많은 경우
  • 의존성을 최소화하고 싶은 경우

활용 가이드

LangChain 설치 및 설정

설치

pip install langchain openai

환경 변수 설정

export OPENAI_API_KEY="your-api-key"

Python 코드에서 설정

import os
os.environ["OPENAI_API_KEY"] = "your-api-key"

모델 선택

LangChain은 다양한 LLM을 지원한다.

OpenAI

from langchain.llms import OpenAI
llm = OpenAI(temperature=0.7)

Anthropic (Claude)

from langchain.llms import Anthropic
llm = Anthropic(temperature=0.7)

로컬 모델 (Llama)

from langchain.llms import LlamaCpp
llm = LlamaCpp(model_path="./llama-model.bin")

모범 사례

  1. 프롬프트 템플릿 활용

    • 하드코딩된 프롬프트 대신 템플릿 사용
    • 변수 관리 용이
  2. 적절한 Memory 선택

    • 짧은 대화: ConversationBufferMemory
    • 긴 대화: ConversationSummaryMemory
    • 최근만 중요: ConversationBufferWindowMemory
  3. 에러 처리

    • LLM 호출 실패 대비
    • 타임아웃 설정
    • 재시도 로직 추가
  4. 비용 관리

    • 토큰 사용량 모니터링
    • 캐싱 활용
    • 적절한 모델 선택

주의사항과 한계

1. 의존성 관리

LangChain은 많은 의존성을 가지고 있어 충돌 문제가 발생할 수 있다.

해결

  • 가상 환경 사용
  • requirements.txt로 버전 고정
  • 정기적 업데이트 확인

2. 성능 오버헤드

LangChain은 추가 레이어로 인해 약간의 성능 오버헤드가 있다.

해결

  • 단순한 경우 직접 구현 고려
  • 비동기 처리 활용
  • 배치 처리 활용

3. 학습 곡선

LangChain의 개념을 이해하는 데 시간이 필요하다.

해결

  • 공식 문서 읽기
  • 간단한 예제부터 시작
  • 점진적으로 복잡한 기능 학습

4. 버전 호환성

LangChain은 빠르게 발전해 버전 간 호환성 문제가 발생할 수 있다.

해결

  • 안정 버전 사용
  • 변경 로그 확인
  • 마이그레이션 가이드 참고

FAQ

Q: LangChain은 왜 필요한가요?
A: LangChain은 복잡한 LLM 애플리케이션 개발을 쉽게 만들어줍니다. 프롬프트 관리, 메모리 처리, 외부 도구 연결, RAG 구현 등을 간단한 API로 처리할 수 있어 개발 속도가 크게 향상됩니다.

Q: LangChain 없이도 LLM 애플리케이션을 만들 수 있나요?
A: 네, 가능합니다. 하지만 RAG, Agent, 복잡한 Chain 같은 기능을 직접 구현하려면 많은 시간과 노력이 필요합니다. LangChain은 이런 기능을 즉시 사용할 수 있게 해줍니다.

Q: LangChain은 어떤 LLM을 지원하나요?
A: OpenAI, Anthropic, Google, Cohere 등 주요 LLM 제공업체의 모델을 지원합니다. 또한 Llama 같은 오픈소스 모델도 지원합니다. LLM을 교체해도 코드 변경이 최소화됩니다.

Q: LangChain의 Memory는 어떻게 작동하나요?
A: Memory는 대화 기록을 저장하고 관리합니다. ConversationBufferMemory는 모든 대화를 저장하고, ConversationSummaryMemory는 요약해서 저장합니다. 이를 통해 LLM이 이전 대화를 기억하고 맥락을 유지할 수 있습니다.

Q: LangChain으로 RAG를 구현하려면 어떻게 하나요?
A: 문서를 로드하고 분할한 후, 임베딩으로 변환해 벡터 스토어에 저장합니다. RetrievalQA Chain을 사용하면 자동으로 관련 문서를 검색하고 LLM에 전달해 답변을 생성합니다.

Q: LangChain의 비용은 어떻게 되나요?
A: LangChain 자체는 무료 오픈소스입니다. 비용은 사용하는 LLM API 비용만 발생합니다. LangChain은 오버헤드가 적어 직접 구현과 비슷한 비용이 듭니다.


Written by Jeon Byung Hun 개발을 즐기는 bottlehs - Engineer, MS, AI, FE, BE, OS, IOT, Blockchain, 설계, 테스트