LangChain 설치와 모델 가져오기
한 줄 요약
common.py 의 get_chat() 한 줄로 LangChain용 모델 객체를 만듭니다. 지금까지 쓰던 구글 SDK 클라이언트와는 다른 객체이므로, 무엇이 어떻게 다른지 정리하고 갑니다.
1. 설치는 이미 끝났습니다
1장에서 pip install -r requirements.txt 를 했다면 다 깔려 있습니다.
langchain 1.3.15 에이전트·도구
langchain-core 1.6.0 공통 뼈대
langchain-google-genai 4.3.4 Gemini 연결
langgraph 1.2.11 상태·기억 (7장)
langchain-google-genai 가 이번 장의 핵심입니다. LangChain과 Gemini를 이어 주는 다리입니다.
패키지가 왜 이렇게 여러 개인가 — 층으로 그려 보면 이해가 빠릅니다.
맨 아래 langchain-core 가 공통 뼈대이고, 그 위의 것들은 전부 그 뼈대 위에 올라갑니다. 모델 회사마다 연결 패키지를 따로 두기 때문에, 다른 회사 모델을 쓰려면 다리만 갈아 끼우면 됩니다.
본체는 그대로 두고 다리만 바꿔 끼우는 구조라 모델을 갈아타기 쉽습니다. 이 과정은 Gemini 하나만 씁니다. 6장에서
langchain-text-splitters와langchain-community가 추가로 등장하는데, 위 그림의 같은 층에 있는 패키지들입니다.
2. 모델 객체 만들기
common.py 에 이미 들어 있습니다.
아래는 제공된 code/common.py 의 일부입니다 — 고치지 않아도 됩니다.
def get_chat(temperature: float = 0.0):
"""LangChain 채팅 모델. 5장부터 씁니다."""
require_key()
from langchain_google_genai import ChatGoogleGenerativeAI
return ChatGoogleGenerativeAI(model=MODEL, temperature=temperature)
쓸 때는 이렇게 합니다.
아래는 개념 설명용 코드입니다 — 실습 파일에 넣지 않습니다.
from common import get_chat
llm = get_chat(temperature=0)
temperature=0 입니다. 2장 3절에서 정리한 그대로 — 에이전트의 판단은 흔들리면 안 됩니다.
3. 지금까지 쓰던 것과 무엇이 다른가
| 1~4장 | 5장~ | |
|---|---|---|
| 만드는 법 | get_genai_client() |
get_chat() |
| 정체 | 구글 SDK 클라이언트 | LangChain 모델 객체 |
| 호출 | client.models.generate_content(...) |
llm.invoke(...) |
| 도구 | config 의 tools=[...] |
create_agent(llm, tools=[...]) |
| 모델 바꾸기 | 코드를 고쳐야 함 | 연결 패키지만 교체 |
둘 다 결국 같은 Gemini를 부릅니다. 호출을 처리하는 방식이 다를 뿐입니다.
왜 5장부터 바꾸나 — LangChain의 에이전트·RAG·LangGraph 기능이 전부 LangChain 모델 객체를 전제로 하기 때문입니다. 여기서 한 번 갈아타면 8장까지 계속 씁니다.
4. 직접 한번 불러 보기
에이전트 없이 모델만 써 보면 이렇습니다. 이번 장의 실습 파일은 6절에서 만듭니다. 여기서는 확인용으로 짧은 파일 하나를 따로 만들어 봅니다.
새 파일을 만드세요 —
agentic_ai/code/try_chat_model.py
from common import get_chat
llm = get_chat(temperature=0)
answer = llm.invoke("스마트워치를 한 문장으로 설명해 주세요.")
print(answer.text)
터미널에서 실행 —
python code/try_chat_model.py
스마트워치는 손목에 착용하여 시간 확인은 물론 알림 수신, 건강 관리,
운동 기록 등 다양한 기능을 수행하는 스마트 기기입니다.
invoke 와 .text
invoke(...)— LangChain에서 "실행해라"를 뜻하는 공통 이름입니다. 모델이든 도구든 에이전트든 전부invoke로 부릅니다..text— 답변 문자열입니다. 구글 SDK의resp.text와 같은 자리입니다.
돌아오는 것은 문자열이 아니라 메시지 객체입니다. 안에 답변 말고도 여러 정보가 들어 있습니다.
아래는 개념 설명용 코드입니다 — 실습 파일에 넣지 않습니다.
answer = llm.invoke("안녕하세요")
print(type(answer)) # <class '...AIMessage'>
print(answer.text) # 답변 문자열
print(answer.usage_metadata) # 토큰 사용량
AIMessage — "AI가 만든 메시지"라는 뜻입니다. 2장에서 role="user" / role="model" 로 구분하던 것이 여기서는 클래스 이름으로 나뉩니다.
| 클래스 | 무엇 | 2장에서는 |
|---|---|---|
HumanMessage |
사람이 보낸 말 | role="user" |
AIMessage |
모델이 만든 말 | role="model" |
SystemMessage |
시스템 지시 | system_instruction |
ToolMessage |
도구 실행 결과 전용 | 4장에서 role="user" 로 밀어 넣던 자리 |
ToolMessage가 넷째로 있습니다. 4장에서 도구 결과를role="user"로 되돌려 보내며 "이게 좀 이상한데" 싶었다면, LangChain은 그 자리에 별도 클래스를 둡니다. 4절에서 실제 모습을 봅니다.
5. 메시지를 넘기는 방법
LangChain에서는 대화를 이렇게 넘깁니다.
아래는 개념 설명용 코드입니다 — 실습 파일에 넣지 않습니다.
llm.invoke([
{"role": "system", "content": "너는 승승장구몰의 CS 상담원이다."},
{"role": "user", "content": "환불은 며칠 걸리나요?"},
])
딕셔너리 목록입니다. 2장에서 types.Content(role=..., parts=[types.Part(text=...)]) 로 만들던 것보다 훨씬 짧습니다.
| 2장 (구글 SDK) | 5장 (LangChain) |
|---|---|
types.Content(role="user", parts=[types.Part(text="안녕")]) |
{"role": "user", "content": "안녕"} |
role="model" |
role="assistant" |
system_instruction= (별도 자리) |
{"role": "system", ...} (목록 안에) |
model 이 assistant 로 이름이 바뀐 것을 눈여겨보세요. 회사마다 부르는 이름이 다른데, LangChain은 assistant 로 통일합니다.
6. 이 과정에서 실제로 쓰는 방식
대부분은 모델을 직접 부르지 않습니다. create_agent 에 넘겨 주고, 에이전트를 부릅니다.
아래는 개념 설명용 코드입니다 — 실습 파일에 넣지 않습니다.
llm = get_chat(temperature=0)
agent = create_agent(llm, tools=[run_pandas], system_prompt=SYSTEM)
out = agent.invoke({"messages": [{"role": "user", "content": "카테고리별 매출 상위 3개는?"}]})
print(out["messages"][-1].text)
모델을 직접 부르는 곳은 6장(RAG 답변 생성) 과 8장(종합) 정도입니다.
7. 경고 메시지가 보인다면
LangChain은 버전이 자주 바뀌면서 "앞으로 이렇게 바뀝니다" 류의 안내를 띄웁니다.
DeprecationWarning: `langchain-community` is being sunset ...
실습에는 영향이 없습니다. common.py 에서 이런 안내성 경고를 숨겨 두었습니다.
아래는 제공된 code/common.py 의 일부입니다 — 고치지 않아도 됩니다.
warnings.filterwarnings("ignore", message=".*langchain-community.*")
진짜 오류는 숨기지 않습니다. 숨긴 것은 라이브러리의 공지뿐입니다. 빨간
Traceback이 뜨면 그건 진짜 오류이니 읽어야 합니다.
핵심 정리
get_chat(temperature=0)로 LangChain용 모델 객체를 만듭니다.- 1~4장의
get_genai_client()와는 다른 객체입니다. 둘 다 결국 같은 Gemini를 부릅니다. - 호출은
llm.invoke(...), 답변은.text로 꺼냅니다.invoke는 LangChain 공통 이름입니다. - 대화는
{"role": ..., "content": ...}딕셔너리 목록으로 넘깁니다. 구글 SDK보다 훨씬 짧습니다. - 역할 이름은
system/user/assistant입니다. 구글의model이assistant로 바뀝니다. - 대부분은 모델을 직접 부르지 않고
create_agent에 넘깁니다. - 라이브러리 안내성 경고는 숨겨 두었습니다. 빨간
Traceback은 진짜 오류입니다.