📚 Agentic AI - 기업용 자율 에이전트 개발 5장 · 에이전트 ③ CSV 데이터분석 Agentic AI란

LangChain 설치와 모델 가져오기

한 줄 요약

common.pyget_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를 이어 주는 다리입니다.

패키지가 왜 이렇게 여러 개인가 — 층으로 그려 보면 이해가 빠릅니다.

langgraph상태 · 기억 · 그래프7 · 8장langchain에이전트 · 도구text-splitters텍스트 분할6장communityPDF · FAISS6장langchain-core공통 뼈대 — 도구 · 메시지 · invoke← 모델 연결 패키지를 붙이는 곳langchain-google-genaiGemini ← 이 과정에서 사용(다른 회사용 연결 패키지)모델을 바꾸려면 맨 아래 연결 패키지를 교체합니다. 상위 코드는 그대로 사용합니다.
패키지는 층으로 나뉜다 — 모델을 바꿀 때 갈아 끼우는 것은 맨 아래 다리 하나뿐이다

맨 아래 langchain-core 가 공통 뼈대이고, 그 위의 것들은 전부 그 뼈대 위에 올라갑니다. 모델 회사마다 연결 패키지를 따로 두기 때문에, 다른 회사 모델을 쓰려면 다리만 갈아 끼우면 됩니다.

본체는 그대로 두고 다리만 바꿔 끼우는 구조라 모델을 갈아타기 쉽습니다. 이 과정은 Gemini 하나만 씁니다. 6장에서 langchain-text-splitterslangchain-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(...)
도구 configtools=[...] 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", ...} (목록 안에)

modelassistant 로 이름이 바뀐 것을 눈여겨보세요. 회사마다 부르는 이름이 다른데, 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 입니다. 구글의 modelassistant 로 바뀝니다.
  • 대부분은 모델을 직접 부르지 않고 create_agent 에 넘깁니다.
  • 라이브러리 안내성 경고는 숨겨 두었습니다. 빨간 Traceback 은 진짜 오류입니다.
← 이전 절01. 루프를 매번 손으로 짤 필요가 없다다음 절 →03. tool 데코레이터 함수를 도구로 등록하기