이번 글에서는 LangChain에 대한 핵심 개념을 정리하고, 직접 실습해보며 어떻게 작동하는지 살펴보겠습니다.
꼭 실습을 하면서 진행해보시는게 이해하기가 쉽습니다!
1. LangChain이란?
LangChain은 LLM(Large Language Model)을 기반으로 한 애플리케이션을 손쉽게 만들 수 있도록 도와주는 Python 프레임워크입니다. 단순한 프롬프트 호출을 넘어서 다양한 구성 요소들을 체계적으로 다룰 수 있게 해줍니다.
LangChain의 주요 기능은 다음과 같습니다:
- 프롬프트 템플릿 관리
- 체인(Chain) 구성 및 연결
- 메모리(State) 관리
- 에이전트 기반 동적 실행
- 툴(tool) 연동 및 플러그인 처리
- 멀티턴 대화 처리 및 상태 유지
LangChain은 프롬프트를 중심으로 한 일회성 호출을 넘어서, 프로그램처럼 설계된 AI 로직을 구성하고 싶을 때 매우 유용한 도구입니다.
2. LangChain 핵심 개념
🔹 PromptTemplate
LangChain의 PromptTemplate은 LLM에 전달할 프롬프트를 매개변수화하여 동적으로 구성할 수 있는 템플릿 도구입니다. 파이썬의 f-string과 유사하지만, 타입 안정성과 구조화된 관리가 가능해 보다 복잡한 애플리케이션에서도 재사용성과 확장성을 높여줍니다.
- 활용 예: 제품명을 입력 받아 요약, 설명, 비교 등 다양한 요청을 하나의 템플릿으로 대응할 수 있음.
from langchain_core.prompts import PromptTemplate
prompt = PromptTemplate.from_template("{product}가 보기 좋은 이유를 3줄 내려설명해줘")
🔹 LLMChain
LangChain에서 가장 기본적인 실행 구조는 LLMChain 또는 최신 문법 기준의 RunnableSequence입니다.
- 이 구성은 "프롬프트 → LLM → 출력"이라는 흐름을 체인처럼 연결합니다.
- LangChain 0.1 이후부터는 Runnable 인터페이스 기반으로 통합되어 prompt | llm처럼 파이프 구조로 연결됩니다.
from langchain_core.runnables import RunnableSequence
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o")
chain = prompt | llm
🔹 Runnable
Runnable은 LangChain의 모든 실행 단위의 기반이 되는 추상 개념입니다. PromptTemplate, LLM, OutputParser 등 다양한 구성 요소가 Runnable로서 정의되며, | 연산자를 통해 유연하게 연결할 수 있습니다.
- 여러 개의 Runnable을 연결하여 데이터 흐름을 구성할 수 있음
- 분기 처리, 다중 출력, 후처리 등도 모두 이 기반 위에서 실행됨
🔹 OutputParser
OutputParser는 LLM의 출력을 원하는 형태로 가공할 수 있도록 도와주는 컴포넌트입니다.
- 예: 문자열 결과를 JSON, 리스트, 숫자, 불리언 등으로 변환
- 복잡한 응답 형식을 다룰 때 매우 유용함
from langchain_core.output_parsers import StrOutputParser
parser = StrOutputParser()
parsed_output = parser.invoke("안녕하세요! 반가워요")
🔹 Memory
LangChain의 Memory는 이전 대화 내역을 저장하고, 다음 요청 시 함께 전달하여 문맥을 유지하게 해주는 기능입니다.
- ConversationBufferMemory: 전체 대화 내용을 순차 저장
- ConversationSummaryMemory: 주요 내용을 요약해서 저장
- ConversationTokenBufferMemory: 토큰 기준으로 최근 내용만 유지
사용 예:
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory()
🔹 Agent
Agent는 단순 체인을 넘어서 "행동을 결정하는 AI"입니다. 입력을 받고 판단하여 적절한 Tool을 호출하거나, 자체적인 추론을 거쳐 계획을 세우고 실행합니다.
- 내부적으로는 계획 → 실행 → 반복 구조로 동작
- 대표적으로 계산기, 웹 검색, 파일 탐색 등의 Tool과 함께 사용됨
from langchain.agents import initialize_agent, load_tools
from langchain.agents.agent_types import AgentType
tools = load_tools(["llm-math"], llm=llm)
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION)
response = agent.run("42 곱하기 3은 얼마야?")
🔹 Tool (도구)
LangChain에서 Tool은 외부 기능(예: 계산기, 웹 검색, 데이터베이스 조회 등)을 에이전트가 사용할 수 있도록 제공하는 기능 모듈입니다. 각 Tool은 특정 기능을 수행하는 하나의 명령 블록이며, Agent가 필요 시 호출합니다.
- 예: 수학 계산을 위한 llm-math, 웹 검색을 위한 serpapi 등
- Tool은 name, description, func을 정의해 직접 생성할 수도 있습니다.
from langchain.tools import tool
@tool
def get_uppercase(text: str) -> str:
"""주어진 문장을 대문자로 바꿔줍니다."""
return text.upper()
# tool 등록 시 리스트로 전달
tools = [get_uppercase]
이렇게 만든 Tool은 Agent에 넘겨주면, 사용자 질문에 따라 자동으로 판단해 사용할 수 있습니다.
3. LangChain 실습 예제 모음
예제 1: 기본 프롬프트 연결
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnableSequence
from langchain_openai import ChatOpenAI
prompt = PromptTemplate.from_template("{name}은 누구인가요?")
llm = ChatOpenAI(model="gpt-4o")
chain = prompt | llm
chain.invoke({"name": "가라토"})
예제 2: 출력 후처리 (OutputParser 활용)
from langchain_core.output_parsers import StrOutputParser
parser = StrOutputParser()
chain = prompt | llm | parser
response = chain.invoke({"name": "동안리"})
print(response)
예제 3: 체인에 메모리 추가
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
memory = ConversationBufferMemory()
conversation = ConversationChain(llm=llm, memory=memory, verbose=True)
conversation.predict(input="안녕하세요")
conversation.predict(input="저는 프리랜서에요")
예제 4: Agent 사용 예시
from langchain.agents import load_tools, initialize_agent
from langchain.agents.agent_types import AgentType
tools = load_tools(["llm-math"], llm=llm)
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
agent.run("32 제곱은 몇인가요?")
4. 실습 요약 및 팁
- LangChain은 단순한 프롬프트 호출을 넘어서 프로그래밍 가능한 AI 흐름을 만들 수 있게 도와준다.
- 핵심은 PromptTemplate, Runnable, Memory, Agent, Tool, OutputParser 등을 조합하는 것이다.
- LangChain 0.1 이후에는 모든 흐름이 Runnable 기반으로 재설계되었으니, | 파이프 방식 연결에 익숙해지는 것이 중요하다.
'KT에이블스쿨 7기' 카테고리의 다른 글
[KT AIVLE School 7기] 객체지향 프로그래밍 기초: 클래스와 상속 이해 (0) | 2025.05.26 |
---|---|
[KT AIVLE School 7기] 2차 미니프로젝트 후기 (0) | 2025.05.26 |
[KT AIVLE School 7기] 1차 미니프로젝트 후기 (0) | 2025.05.26 |
[KT AIVLE School 7기] 데이터 분석 및 시각화(4) (0) | 2025.04.28 |
[KT AIVLE School 7기] 데이터 분석 및 시각화(3) (0) | 2025.04.28 |