LangChain 핵심 컴포넌트 이해하기 🤖 - LangChain으로 나만의 AI 비서 만들기 #1
들어가며 👋
요즘 많은 분들이 ChatGPT, Claude 같은 AI 모델이나 서비스를 이용하고 있습니다. 저 역시 이런 도구들을 구독해서 사용하고 있었습니다. 하지만, 이러한 서비스를 이용하다 보니 몇 가지 아쉽거나 불편한 점들이 있었습니다.
- 반복적인 작업을 할 때마다 새롭게 프롬프트를 작성하거나, 따로 프롬프트를 관리해야 하는 부담이 있었습니다. 보통 귀찮아서 대충 프롬프트를 작성했는데 그만큼 제가 원하는 퀄리티가 나오지 않는 경우가 많았습니다.
- ChatGPT, Gemini, Claude 등 너무나도 많은 모델들이 빠르게 출시되고 있으나, 모두 구독하기에는 금전적인 부담을 느꼈습니다.
- 노션, 디스코드 같은 외부 툴과 연동해서 사용하면 생산성이 더 높아질 것 같은데 이런 부분의 지원이 제한적이었습니다.
그러다 문득 '잠깐만, 난 개발자인데? 🤔 코드를 통해서 AI툴을 이용하면 이런 문제들을 많이 해결할 수 있겠다'라는 생각이 들었습니다.
이런 고민을 하던 중에 AI 개발을 위한 다양한 도구들을 찾아보게 됐습니다. 여러 프레임워크나 노코드 툴 등을 살펴봤는데, 결국 가장 성숙한 생태계와 큰 개발자 커뮤니티를 보유하고 있는 LangChain을 선택하게 됐습니다.
처음에는 단순히 반복적인 작업을 자동화하는 수준으로 시작했지만, LangChain을 활용해서 하나둘씩 제가 필요한 기능들을 개발하다 보니 어느새 제 생산성을 크게 높여주는 도구가 되어있었고, 위에서 언급한 불편함을 많이 개선해 주었습니다.
오늘은 제가 저만의 AI 비서를 만들면서 활용했던 라이브러리인 LangChain 라이브러리에 대해 소개해보려고 합니다.
LangChain이란? 🔍
LangChain은 AI 애플리케이션을 쉽게 만들 수 있게 도와주는 파이썬 라이브러리입니다. (JavaScript 버전도 있답니다) LLM을 활용해서 다양한 앱을 만들 수 있는데, 단순히 API를 연결해 주는 것을 넘어서 다양한 기능을 제공합니다. 예를 들어:
- Model: OpenAI, Anthropic, Google 등 다양한 AI 모델을 동일한 방식으로 사용할 수 있습니다.
- Chain: 여러 단계의 AI 작업을 연결해서 복잡한 작업을 수행할 수 있습니다.
- Parser: AI의 응답을 원하는 형식(JSON, 마크다운, Pydantic Model 등)으로 자동 변환해 줍니다.
- Memory: 대화 이력을 저장하고 관리할 수 있습니다.
- Tools: 외부 API나 도구들과 쉽게 연동할 수 있습니다.
- Agents: AI가 주어진 도구들을 자율적으로 활용해서 복잡한 작업을 수행할 수 있습니다.
- Retrieval: 문서나 데이터베이스에서 관련 정보를 검색하고 활용할 수 있습니다.
LangChain 설치 ⚙️
랭체인을 사용하기 위해서는 라이브러리 설치가 필요합니다.
pip install langchain # LangChain 코어
OpenAI나 Anthropic 모델 등을 사용하기 위해서는 아래 라이브러리를 추가 설치해야 합니다.
pip install langchain-openai # OpenAI 모델 사용
pip install langchain-anthropic # Anthropic(Claude) 모델 사용
pip install langchain-google-genai # Google AI 모델을 사용
LangChain의 핵심 컴포넌트 🧩
Model: LLM과 Chat Models
여러 AI 서비스 제공자의 모델을 동일한 인터페이스로 사용할 수 있어서 쉽게 모델을 전환하여 사용할 수 있습니다:
from langchain_anthropic import ChatAnthropic
from langchain_openai import ChatOpenAI
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain.schema import HumanMessage, SystemMessage
# 💡 API KEY는 각 서비스에서 발급받아서 안전하게 환경변수를 통해서 관리해주세요
OPEN_AI_API_KEY = "xxxxxx"
ANTHROPIC_API_KEY = "xxxxxx"
GOOGLE_API_KEY = "xxxxxx"
models = {
"gpt-4o-mini": ChatOpenAI(model_name="gpt-4o-mini", api_key=OPEN_AI_API_KEY),
"claude": ChatAnthropic(model_name="claude-3-sonnet", api_key=ANTHROPIC_API_KEY),
"gemini": ChatGoogleGenerativeAI(model="gemini-pro", api_key=GOOGLE_API_KEY),
}
# 모델 사용 예시
messages = [
SystemMessage(content="당신은 소프트웨어 개발을 전문으로 하는 어시스턴트입니다."),
HumanMessage(content="의존성 주입(Dependency Injection)의 개념에 대해 설명해주세요.")
]
response = models["gpt-4o-mini"].invoke(messages)
print(response)
실행결과
Prompts: 템플릿과 관리
프롬프트를 구조화하면, 다양한 상황에서 일관된 방식으로 AI에 요청할 수 있게 되어 효율적인 코드 작성이 가능합니다.:
from langchain.prompts import ChatPromptTemplate
from langchain.prompts.chat import SystemMessagePromptTemplate, HumanMessagePromptTemplate
# 고급 프롬프트 템플릿 예시
code_review_template = ChatPromptTemplate.from_messages([
SystemMessagePromptTemplate.from_template(
"""당신은 {language} 언어와 소프트웨어 개발 베스트 프랙티스에 대한 전문 지식을 가진 코드 리뷰어입니다.
다음 사항들에 중점을 두고 검토해주세요:
- 코드 품질
- 성능 최적화
- 보안 고려사항
- 디자인 패턴
"""
),
HumanMessagePromptTemplate.from_template(
"""다음 {language} 코드를 리뷰해주세요:
{code}
자세한 피드백과 개선 제안을 제공해주세요.
"""
)
])
# 프롬프트 재사용
messages = code_review_template.format_messages(
language="Python",
code="def process_data(data): return [x*2 for x in data]"
)
실행결과
💡 만약 누락된 변수가 있으면 KeyError가 발생합니다.
OutputParser: 응답 구조화
LLM의 응답을 구조화된 형식으로 변환합니다:
OutputParser는 LLM의 자연어 응답을 파이썬 객체나 특정 형식으로 변환하는 컴포넌트입니다. 주요 기능은 다음과 같습니다:
- 자연어 응답을 JSON, 딕셔너리, Pydantic Model 등 구조화된 형식으로 변환
- 응답 포맷 검증 및 에러 처리
from langchain.output_parsers import StructuredOutputParser
from langchain.prompts import PromptTemplate
# 응답 스키마 정의
response_schemas = [
{"name": "name", "type": "string", "description": "사용자의 이름"},
{"name": "age", "type": "integer", "description": "사용자의 나이"},
{"name": "hobbies", "type": "list", "description": "사용자의 취미 목록"},
]
# OutputParser 생성
parser = StructuredOutputParser.from_response_schemas(response_schemas)
# 프롬프트에 파서 포맷 지침 추가
prompt = PromptTemplate(
template="사용자 정보를 다음 형식으로 제공해주세요:\n{format_instructions}\n\n사용자: {user}",
input_variables=["user"],
partial_variables={"format_instructions": parser.get_format_instructions()},
)
print(prompt.format(user="John Doe"))
실행결과
이를 통해 LLM의 응답을 일관된 형식으로 처리하고 후속 작업에 활용할 수 있습니다.
Chains: 복잡한 작업 흐름 구성
Chain은 여러 단계의 작업을 연결해서 실행할 수 있게 해주는 기능입니다.
가장 간단하게는 Prompt, Model, Parser를 파이프라인(|
) 연산자로 연결하여 작업 흐름을 구성할 수 있습니다. 예를 들어:
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
prompt = ChatPromptTemplate.from_template("다음 한국어 문장을 영어로 번역해주세요: {text}")
model = ChatOpenAI()
# 간단한 번역 체인
chain = prompt | model
result = chain.invoke({"text": "안녕하세요, 반갑습니다!"})
print(result)
간단한 체인 이외에도 LangChain은 다양한 체인을 제공하고 있습니다.
예를 들어, 문서를 분석하고 구조화된 결과를 얻고 싶다면 다음과 같이 구성할 수 있습니다:
from pydantic import BaseModel, Field
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.documents import Document
from typing import List
# 분석 결과를 위한 모델
class DocumentAnalysis(BaseModel):
main_topic: str = Field(description="문서의 주요 주제")
key_points: List[str] = Field(description="핵심 포인트들")
difficulty: str = Field(description="난이도 (쉬움/보통/어려움)")
# 분석 프롬프트
analysis_prompt = ChatPromptTemplate.from_messages([
("system", "주어진 문서를 분석하고 구조화된 결과를 제공해주세요."),
("human", """
다음 문서를 분석해주세요:
{context}
{format_instructions}
""")
])
# 샘플 문서들
documents = [
Document(page_content="파이썬은 간단하고 읽기 쉬운 프로그래밍 언어입니다."),
Document(page_content="파이썬은 데이터 분석, 웹 개발, AI 등 다양한 분야에서 사용됩니다."),
Document(page_content="많은 기업들이 파이썬을 주력 언어로 채택하고 있습니다.")
]
# 파서 설정
parser = JsonOutputParser(pydantic_object=DocumentAnalysis)
# 체인 구성
analysis_chain = create_stuff_documents_chain(
ChatOpenAI(temperature=0),
analysis_prompt,
output_parser=parser
)
# 체인 실행
result = analysis_chain.invoke({
"context": documents,
"format_instructions": parser.get_format_instructions()
})
result.pretty_print()
마치며... 📢
이번 포스트에서는 LangChain의 기본 개념과 Models, Prompts, OutputParser, Chains와 같은 핵심 컴포넌트들을 살펴보았습니다.
처음에는 "이걸 굳이 만들어야 하나?" 고민하기도 했지만, 지금은 매일 사용하는 필수 도구가 됐습니다. 특히 개발자로서 제가 원하는 대로 커스터마이징 할 수 있다는 점에서 큰 매력을 느끼고 있습니다.
다음 포스트에서는 Memory, Tools, Agents 그리고 LangGraph를 자세히 다뤄볼 예정입니다.
긴 글 읽어주셔서 감사합니다.