๐Ÿงฉ LangChain ์™„์ „ ์ดํ•ด โ‘  โ€” LangChain์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€

okorionยท2025๋…„ 10์›” 4์ผ
post-thumbnail

โ€œํ”„๋กฌํ”„ํŠธ ์ค‘์‹ฌ ์‚ฌ๊ณ ์—์„œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์ค‘์‹ฌ ์‚ฌ๊ณ ๋กœ.โ€
์ด์ œ LLM์„ ๋‹จ์ˆœํžˆ โ€˜์งˆ๋ฌธ-๋‹ต๋ณ€โ€™ ๋„๊ตฌ๊ฐ€ ์•„๋‹ˆ๋ผ ํ•˜๋‚˜์˜ ์‹œ์Šคํ…œ์œผ๋กœ ์„ค๊ณ„ํ•˜์ž.


๐Ÿ’ก 1. LangChain์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

LangChain์€ LLM ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.
GPT ๊ฐ™์€ ๋ชจ๋ธ์„ ๋‹จ์ˆœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํ”„๋กฌํ”„ํŠธยท๋ฉ”๋ชจ๋ฆฌยทํˆดยท์ฒด์ธยท์—์ด์ „ํŠธ ๋“ฑ์„ ์กฐํ•ฉํ•ด ๋ณต์žกํ•œ AI ์›Œํฌํ”Œ๋กœ์šฐ(Workflow)๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.


๐Ÿ” ํ•ต์‹ฌ ์š”์•ฝ

ํ•ญ๋ชฉ์„ค๋ช…
์ •์˜LLM ํ˜ธ์ถœ์„ ์ฒด๊ณ„์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” Python/JS ๊ธฐ๋ฐ˜ ํ”„๋ ˆ์ž„์›Œํฌ
ํ•ต์‹ฌ ์ฒ ํ•™โ€œLLM์„ ์ง์ ‘ ๋ถ€๋ฅด์ง€ ๋ง๊ณ , ์กฐ๋ฆฝ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ๋กœ ์„ค๊ณ„ํ•˜๋ผโ€
ํ•ต์‹ฌ ๊ตฌ์„ฑ์š”์†ŒPrompt, LLM, Chain, Tool, Memory, Agent
ํ™œ์šฉ ์˜ˆ์‹œ์งˆ์˜์‘๋‹ต ์‹œ์Šคํ…œ, ๋Œ€ํ™”ํ˜• ๋ด‡, ๋ฌธ์„œ ๊ฒ€์ƒ‰+์š”์•ฝ ์‹œ์Šคํ…œ
๊ณต์‹ ๋ฌธ์„œhttps://python.langchain.com

โš™๏ธ 2. LangChain์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ์š”์†Œ

LangChain์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์€ ์•„๋ž˜ ์—ฌ์„ฏ ๊ฐ€์ง€ ๊ตฌ์„ฑ์š”์†Œ๋กœ ํ™˜์›๋ฉ๋‹ˆ๋‹ค ๐Ÿ‘‡

๊ตฌ์„ฑ์š”์†Œ์„ค๋ช…์˜ˆ์‹œ
PromptTemplate๋ชจ๋ธ ์ž…๋ ฅ์„ ๋™์ ์œผ๋กœ ๊ตฌ์„ฑ"Answer the question: {question}"
LLM์‹ค์ œ ๋ชจ๋ธ ํ˜ธ์ถœ ๊ฐ์ฒดChatOpenAI(model="gpt-4o-mini")
Chain์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋ฅผ ์—ฐ๊ฒฐํ•œ ํŒŒ์ดํ”„๋ผ์ธLLMChain, SequentialChain
ToolLLM์ด ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๊ฒ€์ƒ‰ API, ๊ณ„์‚ฐ๊ธฐ ๋“ฑ
Memory๋Œ€ํ™” ๋งฅ๋ฝ ์œ ์ง€ConversationBufferMemory
AgentTool์„ ์Šค์Šค๋กœ ์„ ํƒยทํ™œ์šฉํ•˜๋Š” LLMinitialize_agent()

์ด ์—ฌ์„ฏ ๊ฐ€์ง€๋ฅผ ์กฐํ•ฉํ•˜๋ฉด, ๋‹จ์ˆœํ•œ Q&A๋ถ€ํ„ฐ ์ž์œจ์  ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ๊นŒ์ง€ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿง  3. LangChain์˜ ๊ธฐ๋ณธ ํ๋ฆ„

LangChain์˜ ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ์‹คํ–‰ ํ˜•ํƒœ๋Š” โ€œํ”„๋กฌํ”„ํŠธ โ†’ LLM โ†’ ์ถœ๋ ฅโ€์˜ ๋‹จ์ผ ์ฒด์ธ์ž…๋‹ˆ๋‹ค.

from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain_openai import ChatOpenAI

# 1๏ธโƒฃ ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ ์ •์˜
prompt = PromptTemplate.from_template("Q: {question}\nA:")

# 2๏ธโƒฃ LLMChain ์ƒ์„ฑ
chain = LLMChain(
    llm=ChatOpenAI(model="gpt-4o-mini"),
    prompt=prompt
)

# 3๏ธโƒฃ ์‹คํ–‰
result = chain.invoke({"question": "LangChain์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?"})
print(result)

๐Ÿ“˜ ์ถœ๋ ฅ ์˜ˆ์‹œ

LangChain์€ LLM์„ ์ค‘์‹ฌ์œผ๋กœ ํ”„๋กฌํ”„ํŠธ, ๋ฉ”๋ชจ๋ฆฌ, ํˆด ๋“ฑ์„ ์ฒด๊ณ„์ ์œผ๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ
AI ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์‰ฝ๊ฒŒ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.


๐Ÿ“ˆ 4. ๊ตฌ์กฐ๋ฅผ ์‹œ๊ฐํ™”ํ•ด๋ณด๊ธฐ

์ด ๊ฐ„๋‹จํ•œ ์„ ํ˜• ๊ตฌ์กฐ๊ฐ€ ์ดํ›„ LangChain์—์„œ Chain + Memory + Tool + Agent๋กœ ํ™•์žฅ๋˜๋ฉฐ ๋ณต์žกํ•œ ๋Œ€ํ™”ํ˜• ์‹œ์Šคํ…œ์˜ ๊ธฐ๋ฐ˜์ด ๋ฉ๋‹ˆ๋‹ค.


๐Ÿงฉ 5. LangChain์˜ ์ฒ ํ•™: โ€œLLM์€ ์ปดํฌ๋„ŒํŠธ๋‹คโ€

LangChain์€ ๋‹จ์ˆœํžˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ, ์‚ฌ๊ณ ๋ฐฉ์‹์„ ๋ฐ”๊พธ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

์ „ํ†ต์  ์ ‘๊ทผLangChain์  ์ ‘๊ทผ
โ€œGPT์— ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋„ฃ๋Š”๋‹ค.โ€โ€œGPT ํ˜ธ์ถœ ์ž์ฒด๋ฅผ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋กœ ์กฐํ•ฉํ•œ๋‹ค.โ€
Prompt โ†’ ResponsePrompt โ†’ LLM โ†’ Tool โ†’ Memory โ†’ Output
ํ•˜๋“œ์ฝ”๋”ฉ๋œ ํ๋ฆ„์กฐ๋ฆฝ ๊ฐ€๋Šฅํ•œ ์ฒด์ธ ๊ตฌ์กฐ
๋‹จ์ˆœ ์งˆ๋ฌธ ์‘๋‹ต์ž์œจ์  ์ถ”๋ก ยท๊ฒ€์ƒ‰ยท๊ณ„์‚ฐ ๋“ฑ ๋ณตํ•ฉ ํ–‰๋™

์ฆ‰, LangChain์€ LLM์„ ํ•˜๋‚˜์˜ โ€œ์ƒ๊ฐํ•˜๋Š” ํ•จ์ˆ˜(Thinking Function)โ€๋กœ ๋‹ค๋ฃจ๋Š” ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”ง 6. ์‹ค์ „ ์˜ˆ์‹œ โ€” ๊ฐ„๋‹จํ•œ Q&A ์•ฑ ๋งŒ๋“ค๊ธฐ

์•„๋ž˜๋Š” LangChain์„ ์ด์šฉํ•œ โ€œ์งˆ๋ฌธ โ†’ ๋‹ต๋ณ€โ€ ์ฒด์ธ์˜ ์ตœ์†Œ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.

from langchain.chains import SimpleSequentialChain
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI

# ์š”์•ฝ ์ฒด์ธ
summary_prompt = PromptTemplate.from_template("๋‹ค์Œ ๋ฌธ์žฅ์„ ํ•œ ์ค„๋กœ ์š”์•ฝํ•ด์ค˜: {text}")
summary_chain = LLMChain(llm=ChatOpenAI(model="gpt-4o-mini"), prompt=summary_prompt)

# ๋ฒˆ์—ญ ์ฒด์ธ
translate_prompt = PromptTemplate.from_template("Translate this to English: {summary}")
translate_chain = LLMChain(llm=ChatOpenAI(model="gpt-4o-mini"), prompt=translate_prompt)

# ๋‘ ์ฒด์ธ์„ ์—ฐ๊ฒฐ
overall_chain = SimpleSequentialChain(chains=[summary_chain, translate_chain])

result = overall_chain.invoke({"text": "LangChain์€ ๋Œ€ํ˜•์–ธ์–ด๋ชจ๋ธ ๊ธฐ๋ฐ˜์˜ ํŒŒ์ดํ”„๋ผ์ธ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค."})
print(result)

๐Ÿ“˜ ์ถœ๋ ฅ ์˜ˆ์‹œ

โ€œLangChain is a pipeline framework based on large language models.โ€


๐ŸŽฏ 7. LangChain์„ ๋ฐฐ์šฐ๋ฉด ์–ป๋Š” ๊ฒƒ

  • โœ… LLM ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋Šฅ๋ ฅ โ€” LLM ํ˜ธ์ถœ์„ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋‹ค๋ฃจ๊ธฐ
  • โœ… Prompt ์„ค๊ณ„ ๊ตฌ์กฐํ™” โ€” ๋‹ค์–‘ํ•œ ์ž…๋ ฅ์„ ์ฒด๊ณ„์ ์œผ๋กœ ์ฒ˜๋ฆฌ
  • โœ… Tool ๋ฐ ์™ธ๋ถ€ API ํ†ตํ•ฉ ๊ธฐ๋ฐ˜ โ€” Agent ๋‹จ๊ณ„๋กœ ๋ฐœ์ „ ๊ฐ€๋Šฅ
  • โœ… LangGraph์˜ ์‚ฌ์ „ ์ดํ•ด ๊ธฐ๋ฐ˜ ํ™•๋ณด โ€” ๊ทธ๋ž˜ํ”„ ์‚ฌ๊ณ ์˜ ๋ฐ‘๋ฐ”ํƒ• ํ˜•์„ฑ

๐ŸŽ“ 8. ๋” ๊นŠ์ด ๋ฐฐ์šฐ๊ธฐ ์œ„ํ•œ ๊ณ ๊ธ‰ ํ™•์žฅ ๊ฐ€์ด๋“œ

์ฃผ์ œํ•™์Šต ์ด์œ ํ•™์Šต ๋ฐฉํ–ฅ
LCEL (LangChain Expression Language)LangChain ๋‚ด๋ถ€ ์‹คํ–‰ ์—”์ง„ ์ดํ•ด๊ณต์‹ ๋ฌธ์„œ + LCEL ์˜ˆ์ œ ์ฝ”๋“œ ์‹ค์Šต
PromptTemplate ๊ณ ๊ธ‰ ๋ฌธ๋ฒ•๋‹ค์–‘ํ•œ ์ž…๋ ฅ ๋ณ€์ˆ˜ยท์กฐ๊ฑด ์ฒ˜๋ฆฌf-string, Jinja2 ๋ฌธ๋ฒ• ํ•™์Šต
Callback / TracingLLM ํ˜ธ์ถœ ๋กœ๊ทธ ์ถ”์  ๋ฐ ์‹œ๊ฐํ™”LangSmith ์‚ฌ์šฉ
LangChainHub์˜คํ”ˆ ์ฒด์ธ/Tool ๊ณต์œ  ํ”Œ๋žซํผ ํ™œ์šฉHub์— ์ง์ ‘ ๋“ฑ๋ก ์‹ค์Šต
LangServeChain/Agent๋ฅผ REST API๋กœ ๋ฐฐํฌLangGraph ํ•™์Šต ์ „ ์‹ค์Šต ๊ธฐ๋ฐ˜

๐Ÿ“š 9. ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ

ํ•ญ๋ชฉ์š”์•ฝ
ํ•ต์‹ฌ ๊ฐœ๋…LangChain์€ โ€œLLM ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ฒด๊ณ„ํ™”โ€ํ•˜๋Š” ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ
ํ•ต์‹ฌ ์ฝ”๋“œPromptTemplate โ†’ LLMChain โ†’ invoke()
๋น„์ „๋‹จ์ˆœ ํ˜ธ์ถœ์ด ์•„๋‹Œ โ€œLLM ์‹œ์Šคํ…œ ์„ค๊ณ„โ€๋กœ์˜ ์ „ํ™˜
๋‹ค์Œ ํŽธ ์˜ˆ๊ณ ๐Ÿ”œ LangChain โ‘ก โ€” Chain, Memory, Agent ์‹ค์ „ ๊ตฌ์กฐ

๐Ÿงญ ํ•œ ์ค„ ์š”์•ฝ

LangChain์€ โ€œLLM์„ ์ง์ ‘ ๋ถ€๋ฅด๋Š”โ€ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ,
โ€œLLM์ด ์ž‘๋™ํ•˜๋Š” ํ๋ฆ„ ์ž์ฒด๋ฅผ ์ฝ”๋“œ๋กœ ์„ค๊ณ„ํ•˜๋Š”โ€ ํ”„๋ ˆ์ž„์›Œํฌ๋‹ค.

profile
okorion's Tech Study Blog.

0๊ฐœ์˜ ๋Œ“๊ธ€