1장. 과정 소개와 LLM 의 이해
LangChain 생태계와 쓰임새
멀티탭을 떠올려 보세요. 콘센트 구멍의 규격이 정해져 있어서, 어느 회사의 전기 제품이든 같은 멀티탭에 꽂을 수 있습니다. LangChain 이 하는 일이 이것입니다. 프롬프트, 모델, 문서 검색 같은 부품의 "꽂는 모양"을 같게 맞춰 두어서, 부품을 바꿔 끼워도 나머지 코드는 그대로 둘 수 있습니다.
네 상자가 LangChain 을 이루는 묶음입니다. 맨 왼쪽 langchain-core 가 콘센트 규격에 해당하는 공통 부품이고, langchain 은 그 위에 자주 쓰는 기능을 모은 본체입니다. 연결 꾸러미는 OpenAI 같은 회사의 모델을 규격에 맞게 꽂아 주는 어댑터이고, 곁 도구는 여러 단계의 일을 그래프로 짜는 LangGraph 와 실행 기록을 살펴보는 LangSmith 입니다. 비유와 다른 점은, 멀티탭은 한 번 사면 그대로지만 LangChain 은 판(버전)이 자주 바뀌어 예전 글의 코드가 그대로 돌지 않을 때가 있다는 것입니다.
묶음과 패키지
| 묶음 | 설치하는 이름 | 하는 일 | 이 과정에서 |
|---|---|---|---|
| 공통 부품 | langchain-core | 메시지, 프롬프트, | 로 잇는 규격 | 모든 장 |
| 본체 | langchain | 체인, 에이전트 같은 자주 쓰는 기능 | 3장부터 |
| 연결 꾸러미 | langchain-openai | OpenAI 모델과 임베딩을 꽂아 쓰기 | 2장부터 |
| 커뮤니티 | langchain-community | 여러 문서 로더, 벡터DB 연결 | 6장 |
| 곁 도구 | langgraph, langsmith | 여러 단계의 흐름, 실행 기록 보기 | 필요할 때 소개 |
LangChain 으로 만드는 것들
아래는 LLM 챗봇이 흔히 쓰이는 갈래입니다. 특정 회사의 사례가 아니라 이 과정의 기술로 만들 수 있는 일의 종류를 모은 것입니다.
| 갈래 | 하는 일 | 이 과정의 기술 |
|---|---|---|
| 고객 상담 | 자주 묻는 질문에 답하고 어려운 것은 사람에게 넘긴다 | 프롬프트, 메모리 |
| 사내 문서 질의응답 | 규정이나 매뉴얼에서 근거를 찾아 답한다 | RAG |
| 여행·예약 비서 | 대화를 기억하며 일정을 짜 준다 | 메모리, 구조화된 출력 |
| 학습 도우미 | 교재 내용으로 문제를 내고 풀이를 설명한다 | RAG, 프롬프트 |
| 업무 자동화 | 파일을 읽고 계산해 보고서를 만든다 | 도구 호출, MCP |
짧은 예시
API 키 없이 LangChain 의 모양을 미리 봅니다. FakeListChatModel 은 정해 둔 답을 차례로 돌려주는 가짜 모델입니다. 진짜 모델로 바꿔 끼워도 아래 코드의 모양은 그대로입니다.
from langchain_core.language_models.fake_chat_models import FakeListChatModel
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
# 프롬프트 틀: {place} 자리에 나중에 값을 넣는다
prompt = ChatPromptTemplate.from_messages([("system", "너는 여행 비서다."), ("human", "{place} 여행지를 하나 추천해 줘.")])
# 가짜 모델: 질문과 상관없이 정해 둔 답을 돌려준다
model = FakeListChatModel(responses=["성산일출봉을 추천합니다."])
# StrOutputParser: 모델의 답(AIMessage)에서 글만 꺼낸다. Str 은 string(글자열)의 줄임말
chain = prompt | model | StrOutputParser()
print(chain.invoke({"place": "제주도"}))성산일출봉을 추천합니다.prompt | model | StrOutputParser() 는 "프롬프트를 채우고, 모델에 보내고, 답에서 글만 꺼낸다"를 한 줄로 이은 것입니다. | 는 앞 부품의 결과를 뒤 부품에 넘기는 파이프입니다. 이렇게 잇는 방식이 LCEL 이고, 3장에서 진짜 모델로 다시 만듭니다. 가짜 모델이라 "제주도" 대신 "부산"을 넣어도 같은 답이 나옵니다.
코드가 의미하는 것
이 코드는 멀티탭에 부품 세 개를 차례로 꽂은 것입니다. 주문서 틀(프롬프트), 요리사(모델), 접시에 담기(파서)를 | 로 이어 하나의 줄(체인)로 만들고, 빈칸에 "제주도"를 넣어 한 번 돌립니다.
| 코드 | 하는 일 | 챗봇에서 뜻하는 것 |
|---|---|---|
ChatPromptTemplate.from_messages([...]) | 시스템 메시지와 {place} 빈칸이 있는 질문 틀을 만든다 | 앞 절의 메시지 목록을 틀로 만든 것입니다. 빈칸만 바꿔 같은 틀을 여러 번 씁니다 |
FakeListChatModel(responses=[...]) | 정해 둔 답을 돌려주는 가짜 모델을 만든다 | 진짜 모델 자리를 잠시 채운 것입니다. 키 없이 체인의 모양을 시험할 수 있습니다 |
StrOutputParser() | 모델의 답에서 글만 꺼낸다 | 모델은 답을 AIMessage 객체로 돌려줍니다. 화면에 보여 줄 글만 필요하므로 꺼냅니다 |
prompt | model | StrOutputParser() | 세 부품을 차례로 잇는다 | 앞 부품의 결과가 뒤 부품의 입력이 됩니다. 이 한 줄이 챗봇 로직의 뼈대입니다 |
chain.invoke({"place": "제주도"}) | 빈칸에 값을 넣어 체인을 한 번 돌린다 | invoke 는 "불러서 실행한다"는 뜻입니다. 손님 질문 하나를 처리하는 것과 같습니다 |
결과에서 읽을 것은 두 가지입니다.
- 부품을 바꿔 끼워도 줄은 그대로입니다. 2장부터
FakeListChatModel자리에 진짜 모델(ChatOpenAI)을 넣어도prompt | model | parser와invoke는 바뀌지 않습니다. 멀티탭의 구멍 모양이 같기 때문입니다. - 가짜 모델은 질문을 읽지 않습니다. 출력 "성산일출봉을 추천합니다."는 미리 적어 둔 답입니다. 이 출력으로 확인한 것은 답의 내용이 아니라 "체인이 끝까지 이어져 글 하나가 나온다"는 것입니다.
주의할 점
- 인터넷의 LangChain 예제는 옛 판의 코드가 많습니다.
from langchain.chat_models import ChatOpenAI처럼 옛 경로로 부르는 코드는 지금 판에서 오류가 납니다. 이 교안은 langchain 1.4, langchain-core 1.7 판으로 확인했습니다. - 가짜 모델은 연습과 시험용입니다. 질문을 읽지 않으므로 답이 질문과 맞지 않아도 이상한 것이 아닙니다.