LangChain & LangGraph 공부 시작하기: 버전 확인부터 Streamlit 챗봇 UI 뼈대 만들기

LangChain & LangGraph 怨듬? ?쒖옉?섍린: 踰꾩쟾 ?뺤씤遺€??Streamlit 梨쀫큸 UI 堉덈? 留뚮뱾湲?

理쒓렐 LLM(?€???몄뼱 紐⑤뜽)??湲곕컲?쇰줈 ?ㅼ뒪濡??먮떒?섍퀬 ?숈옉?섎뒗 AI ?먯씠?꾪듃(AI Agent) 媛쒕컻???€??愿€?ъ씠 ?④쾪?듬땲?? 洹몄쨷?먯꽌??LangChain ?앺깭怨꾩쓽 LangGraph???쒗솚(Cyclic) 洹몃옒??援ъ“瑜?吏€?먰븯??媛뺣젰?섍퀬 ?뺢탳???먯씠?꾪듃 ?쒖뒪?쒖쓣 援ъ텞?????덇쾶 ?꾩?以띾땲??

?대쾲 ?ъ뒪?낆뿉?쒕뒗 LangChain怨?LangGraph 媛쒕컻 諛??ㅼ뒿??蹂멸꺽?곸쑝濡??쒖옉?섍린???욎꽌, ?꾩닔 媛쒕컻 ?섍꼍 寃€利앸???湲곗큹 ?꾨\?꾪듃 ?뚯뒪?? 洹몃━怨??€?뷀삎 ?꾨줈?좏??낆쓣 留뚮뱾湲??꾪븳 Streamlit 湲곕컲 Chat UI 堉덈? 援ъ텞源뚯? ?섎굹???댄렣蹂닿쿋?듬땲??


1. 1?④퀎: ?⑦궎吏€ ?ㅼ튂 ?뺤씤 (check_version.py)

LangChain怨?LangGraph???낅뜲?댄듃 二쇨린媛€ 留ㅼ슦 鍮좊Ⅸ ?쇱씠釉뚮윭由ъ엯?덈떎. ?꾨줈?앺듃瑜??쒖옉?섍린 ?꾩뿉 踰꾩쟾??紐낇솗???뚯븙?섍퀬 ?ㅽ뻾 ?섍꼍??寃€利앺븯??寃껋씠 醫뗭뒿?덈떎. ?뚯씠???댁옣 importlib.metadata 紐⑤뱢???댁슜?섎㈃ ?⑦궎吏€瑜?吏곸젒 import?섏? ?딄퀬??踰꾩쟾???먯돺寃?異쒕젰?????덉뒿?덈떎.

1
2
3
4
from importlib.metadata import version

print(f"LangChain version: {version('langchain')}")
print(f"LangGraph version: {version('langgraph')}")
  • **?듭떖 ?ъ씤??*: version() ?⑥닔???꾩옱 ?섍꼍???ㅼ튂???대떦 ?⑦궎吏€???뺥솗??踰꾩쟾 ?ㅽ듃留곸쓣 諛섑솚?⑸땲?? ?섏〈??異⑸룎?대굹 ?뱀젙 踰꾩쟾?먯꽌留??쒓났?섎뒗 湲곕뒫???붾쾭源낇븷 ???좎슜?섍쾶 ?곗엯?덈떎.

2. 2?④퀎: ?꾨\?꾪듃 ?쒗뵆由?湲곗큹 ?뚯뒪??(graph_101.py)

LLM???곕━???섎룄?€濡??숈옉?섍린 ?꾪빐?쒕뒗 ?섎Ⅴ?뚮굹(??븷)?€ ?낅젰 援ъ“瑜??뺥삎?뷀븯??**?꾨\?꾪듃 ?쒗뵆由?* ?ㅺ퀎媛€ 以묒슂?⑸땲?? LangChain?먯꽌 ?쒓났?섎뒗 ChatPromptTemplate???쒖슜???쒖뒪??硫붿떆吏€?€ ?ъ슜???낅젰??援ъ꽦?섎뒗 諛⑸쾿??留쏅낫寃좎뒿?덈떎.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from langchain_core.prompts import ChatPromptTemplate

# System 硫붿떆吏€?€ User 硫붿떆吏€???섏뼱 援ъ“ ?쒗뵆由??뺤쓽
prompt = ChatPromptTemplate.from_messages([
("system", "?뱀떊?€ 諛섎룄泥?defect 遺꾩꽍 ?꾨Ц媛€ ?대떎."),
("user", "{input}")
])

# ?낅젰???쒗뵆由우뿉 二쇱엯?섏뿬 ?ㅽ뻾 媛앹껜 ?앹꽦
messages = prompt.invoke({"input" : "?덈뀞?섏꽭??"})
print("?앹꽦???꾨\?꾪듃")

# ?뚯떛 寃곌낵 ?뺤씤
for msg in messages.to_messages():
print(f" [{msg.type}] {msg.text}")
  • ChatPromptTemplate.from_messages: ?쒗뵆 ?뺤떇 (role, message)??由ъ뒪?몃? ?꾨떖諛쏆븘 ?€?붿슜 ?꾨\?꾪듃瑜?援ъ꽦?⑸땲??
  • prompt.invoke(...): ?쒗뵆由?蹂€?섏씤 {input}???ㅼ젣 ?좎????낅젰媛믪쓣 ?€?낇븯???꾩꽦???꾨\?꾪듃 ?곗씠?곕? 鍮뚮뱶?⑸땲??
  • msg.type & msg.text: ?앹꽦??硫붿떆吏€媛€ system ?좏삎?몄? user ?좏삎?몄?, ?대뼡 ?띿뒪?몃? ?닿퀬 ?덈뒗吏€ 媛€?쒗솕?섏뿬 LLM?쇰줈 ?섍린湲?吏곸쟾???곹깭瑜??뺤씤?⑸땲??

3. 3?④퀎: Streamlit?쇰줈 梨쀫큸 UI 堉덈? ?↔린 (graph_102.py)

濡쒖쭅???곕??먯뿉?쒕쭔 ?뚮㈃ ?ㅼ젣 ?ъ슜?먭? ?ъ슜?대낫湲??대졄?듬땲?? ?뚯씠???섍꼍?먯꽌 媛€??鍮좊Ⅴ怨?吏곴??곸쑝濡???GUI ?꾨줈?좏??낆쓣 ?쒖옉?????덈뒗 Streamlit ?쇱씠釉뚮윭由щ? ?댁슜?섏뿬 ?€?붿갹 UI 堉덈?瑜??ㅺ퀎?대낫寃좎뒿?덈떎.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import streamlit as st

# ?섏씠吏€ 援ъ꽦 ?ㅼ젙
st.set_page_config(
page_title="ai agent",
page_icon="?삂",
layout="centered"
)

st.header("?삂 AI Agent")

# ?몄뀡 ?곹깭(Session State)???€???대젰 諛곗뿴 珥덇린??諛?蹂닿?
if "messages" not in st.session_state:
st.session_state.messages = []

# 湲곗〈 ?€???대젰???덈떎硫??쒖감?곸쑝濡??붾㈃???뚮뜑留?
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])

# ?ъ슜?먮줈遺€???ㅼ떆媛?梨꾪똿 ?낅젰 諛쏄린
if prompt := st.chat_input("硫붿떆吏€瑜??낅젰?섏꽭??"):
# 1. ?좎? 硫붿떆吏€ ?€??諛??붾㈃ 異쒕젰
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.markdown(prompt)

# 2. ?댁떆?ㅽ꽩??遊? ?묐떟 泥섎━ (?ш린?쒕뒗 ?⑥닚 ?먯퐫 ?묐떟)
response = f"?낅젰?섏떊 硫붿떆吏€: {prompt}"
st.session_state.messages.append({"role": "assistant", "content": response})
with st.chat_message("assistant"):
st.markdown(response)
  • st.session_state: ??釉뚮씪?곗????뱀꽦???섏씠吏€媛€ 由ы봽?덉떆?섍굅???덈줈???낅젰??媛€?댁?硫??뚯씠??蹂€?섍? 珥덇린?붾릺?붾뜲, ??臾몄젣瑜??닿껐?섍퀬 ?€???댁뿭(messages)??吏€?랁빐???좎??섍린 ?꾪빐 ?ъ슜?⑸땲??
  • st.chat_input: ?몃젴??怨좎젙??梨꾪똿 ?낅젰李??꾩젽???앹꽦?섍퀬 ?ъ슜?먯쓽 ?띿뒪???낅젰??媛먯??⑸땲??
  • st.chat_message: userassistant ??븷??湲곕컲?쇰줈 ??梨꾪똿 留먰뭾???덉씠?꾩썐???쒓났?섏뿬 蹂꾨룄??CSS ?ㅽ??쇰쭅 ?놁씠???꾩꽦???믪? 梨쀫큸 UI瑜??곗텧?⑸땲??

4. 留덉튂硫?

?대쾲 ?ъ뒪?낆뿉?쒕뒗 LangChain/LangGraph ?먯씠?꾪듃?€ 寃고빀????GUI 堉덈??€ **?꾨\?꾪듃 湲곕낯 ?뚯뒪??*瑜??꾨즺?덉뒿?덈떎. ?꾩옱 ?④퀎???ъ슜?먭? ?낅젰???댁슜???⑥닚???먯퐫(Echo) 諛⑹떇?쇰줈 蹂댁뿬二쇰뒗 ?꾨줈?좏??낆뿉 媛€源앹뒿?덈떎.

?ㅼ쓬 ?ъ뒪?낆뿉?쒕뒗 ??Streamlit UI 肄붾뱶 ?꾩뿉 ?ㅼ젣 LangGraph濡?援ъ텞??異붾줎 猷⑦봽(Reasoning Loop)?€ ?먯씠?꾪듃 濡쒖쭅???댁떇?섏뿬, ?ㅼ뒪濡??꾧뎄瑜??ъ슜?섍퀬 源딆씠 ?덇쾶 遺꾩꽍?섎뒗 吏꾩쭨 AI ?먯씠?꾪듃瑜??꾩꽦?대낫寃좎뒿?덈떎.

공유하기