테디노트님의 LangChain 한국어 튜토리얼을 참고해 공부한 내용입니다.
이번 글에서는 LangChain의 개념, 구성요소, 환경 설정, 주요 사용법을 학습한 내용을 정리했습니다.
LLM 애플리케이션을 직접 구성하기 위한 기초 개념을 중심으로 다룹니다.
LangChain은 LLM 기반 애플리케이션을 구축하기 위한 프레임워크입니다.
상호운영 가능한 구성요소와 서드파티 간 연결(Chain)을 통해 AI 애플리케이션 개발을 간소화합니다.
💡 LangChain을 활용하면 LLM이 다양한 소스의 context를 인식 및 유지하여 일관된 응답 성능을 확보할 수 있습니다.
Inference: 주어진 context를 바탕으로 어떤 응답이나 액션을 취할지 스스로 결정하며, 종합적 상황 판단을 통해 적절한 해결책을 제시합니다.
Python, JS 기반 라이브러리로, 컴포넌트의 인터페이스 통합 및 체인·에이전트 구성 런타임을 제공합니다.
👉 공식 문서
참조 아키텍처 모음. 빠른 개발용 예제 템플릿.
👉 LangChain Templates
LangChain 체인을 REST API로 배포할 수 있는 라이브러리.
👉 LangServe GitHub
LangChain 기반 체인을 디버그, 테스트, 평가, 모니터링할 수 있는 통합 개발자 플랫폼.
👉 LangSmith
LangChain 위에서 상태유지 가능한 다중 액터 애플리케이션을 구축하기 위한 라이브러리.
👉 LangGraph Docs
| 모듈 | 설명 |
|---|---|
| 모델 I/O | 프롬프트 관리 및 LLM 인터페이스 유틸리티 |
| 검색(Search) | 외부 데이터 소스에서 필요한 데이터를 조달 |
| 에이전트(Agent) | LLM의 행동 결정 및 실행, 관찰, 반복 |
기본적으로 anaconda3 기반의 Python 3.13이 설치되어 있다면, 버전 충돌 방지를 위해 별도의 환경 설정이 필요합니다.
pyenv install 3.11
프로젝트 폴더 내에서 해당 버전을 사용하도록 설정합니다.
pyenv local 3.11
python --version
conda가 기본 활성화된 경우, 다음 명령으로 비활성화합니다.
conda deactivate
conda config --set auto_activate_base false
이후 poetry로 가상환경을 생성하면 다음과 같이 구분됩니다:
poetry shell (프로젝트 내부) → Python 3.11.9
poetry shell exit (프로젝트 외부) → Python 지정 안됨
conda activate → Python 3.13.5
📌 LangChain 프로젝트 폴더 전용 Python 환경(3.11.9)을 관리할 수 있습니다.
Log Probability는 모델이 특정 토큰이나 시퀀스를 생성할 확률의 로그값입니다.
문장: I love cats
→ 토큰별 확률: P(I), P(love|I), P(cats|I love)
로그를 적용하는 이유는 확률의 곱이 너무 작기 때문에 덧셈 연산으로 안정화하기 위함입니다.
활용:
# 스트리밍 요청
answer = chain.stream({"question": "미국에서 피자 주문"})
stream_response(answer)
❓ Python은 인터프리터 언어인데 어떻게 실시간 출력이 가능할까?
chain.stream()은 제너레이터 또는 비동기 스트리밍으로 구현되어 chunk 단위로 데이터를 반환합니다.
따라서 전체 데이터를 메모리에 모두 올리지 않고 실시간 처리가 가능합니다.
| 구분 | 역할 |
|---|---|
| System | 모델의 성격, 말투, 규칙 설정. 대화 전체의 일관성 유지. |
| User | 사용자의 질문, 명령, 요청 전달. |
System Prompt는 대화의 ‘기본 성격’을 정의하고, User Prompt는 구체적 요청을 수행합니다.
from langchain import PromptTemplate
prompt_template = PromptTemplate.from_template("What is {var}?")
prompt = prompt_template.format(var="LangChain")
prompt = PromptTemplate.from_template(template)
model = ChatOpenAI(model_name="gpt-4.1-nano")
output_parser = StrOutputParser()
chain = prompt | model | output_parser
input = {"var": "LangChain"}
chain.invoke(input)
answer = chain.stream(input)
모델의 출력 데이터를 특정 형식(JSON, dict, text 등)으로 변환하는 역할.
둘 다 입력을 딕셔너리 형태로 전달하지만, stream()은 실시간 출력.
LangChain의 체인 실행 인터페이스입니다.
호출, 일괄처리, 스트리밍 등을 수행할 수 있는 작업 단위입니다.
chain.invoke({"var": "LangChain"})
answer = await chain.ainvoke({"var": "LangChain"})
chain.batch([
{"var": "LangChain"},
{"var": "LangSmith"},
{"var": "LangServe"},
])
접두사
a는 비동기(async) 메서드를 의미합니다.
여러 체인을 동시에 실행할 수 있습니다.
chain1 = prompt | model | parser
chain2 = prompt | model | parser
combined = RunnableParallel(one=chain1, two=chain2)
combined.invoke({"var": "LangChain"})
입력을 그대로 전달하거나, 새로운 키를 추가할 때 사용합니다.
runnable_chain = {"num": RunnablePassThrough()} | model | parser
runnable_chain.invoke(10)
(RunnablePassThrough.assign(new_num=lambda x: x["num"] * 3)).invoke({"num": 1})
# {'num': 1, 'new_num': 3}
사용자 정의 함수를 체인에 연결할 수 있습니다.
from datetime import datetime
def get_today(a):
return datetime.today().strftime("%b-%d")
prompt = PromptTemplate.from_template(
"{today} 가 생일인 유명인 {n}명을 나열하세요."
)
llm = ChatOpenAI(temperature=0, model_name="gpt-4.1-mini")
chain = ({
"today": RunnableLambda(get_today),
"n": RunnablePassThrough()
} | prompt | llm | StrOutputParser())
print(chain.invoke(3))
이번 스터디를 통해 LangChain의 핵심 구조(Chain, Prompt, Runnable, Stream)를 이해했습니다.
다음 단계에서는 RAG(Retrieval-Augmented Generation) 및 에이전트 구성 실습을 진행할 예정입니다.