728x90

LangChain์„ ํ™œ์šฉํ•œ LLM(Large Language Model) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์—์„œ ๊ธฐ๋ณธ LLM ์ฒด์ธ์€ ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ์ด ์ฒด์ธ์€ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ(ํ”„๋กฌํ”„ํŠธ)์„ ๋ฐ›์•„ LLM์„ ํ†ตํ•ด ์›ํ•˜๋Š” ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋Š” ๊ฐ„๋‹จํ•˜๋ฉด์„œ๋„ ๊ฐ•๋ ฅํ•œ ๊ตฌ์กฐ๋ฅผ ๋งํ•ด์š”. ๋Œ€ํ™”ํ˜• AI๋ถ€ํ„ฐ ์ž๋™ ๋ฌธ์„œ ์š”์•ฝ๊นŒ์ง€ ๋‹ค์–‘ํ•œ LLM ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋ฐ˜์ด ๋ฉ๋‹ˆ๋‹ค.


1. ๊ธฐ๋ณธ LLM ์ฒด์ธ์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ

๊ธฐ๋ณธ LLM ์ฒด์ธ์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ์š”์†Œ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ”„๋กฌํ”„ํŠธ(Prompt): LLM์—๊ฒŒ ์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ• ์ง€ ์•Œ๋ ค์ฃผ๋Š” ์ง€์‹œ๋ฌธ์ด์—์š”. ์งˆ๋ฌธ, ๋ช…๋ น, ํŠน์ • ๋งฅ๋ฝ์„ ์ œ๊ณตํ•˜๋Š” ๋ฌธ์žฅ ๋“ฑ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, LLM์˜ ์‘๋‹ต ํ’ˆ์งˆ์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ํšจ๊ณผ์ ์ธ ํ”„๋กฌํ”„ํŠธ๋Š” LLM์ด ์˜๋„ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ์ •ํ™•ํžˆ ์‘๋‹ตํ•˜๋„๋ก ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค.
  • LLM(Large Language Model): GPT-3.5, GPT-4, Gemini ๋“ฑ ๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉ๋Œ€ํ•œ ์–‘์˜ ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ ํ•™์Šต๋˜์–ด ์–ธ์–ด๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ƒˆ๋กœ์šด ํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋Šฅ๋ ฅ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋ถ„์„ํ•˜๊ณ , ํ•™์Šต๋œ ์ง€์‹์„ ๋ฐ”ํƒ•์œผ๋กœ ์š”์ฒญ๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ์ ์ ˆํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

2. ์ž‘๋™ ๋ฐฉ์‹

๊ธฐ๋ณธ LLM ์ฒด์ธ์˜ ์ž‘๋™ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ํ”„๋กฌํ”„ํŠธ ์ƒ์„ฑ: ์‚ฌ์šฉ์ž์˜ ์š”๊ตฌ์‚ฌํ•ญ์ด๋‚˜ ์ˆ˜ํ–‰ํ•  ์ž‘์—…์„ ์ •์˜ํ•˜๋Š” ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด ํ”„๋กฌํ”„ํŠธ๋Š” LLM์ด ๋” ์ •ํ™•ํ•˜๊ฒŒ ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช…ํ™•ํ•œ ์ง€์นจ๊ณผ ๋งฅ๋ฝ์„ ํฌํ•จํ•˜๋„๋ก ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  2. LLM ์ฒ˜๋ฆฌ: ์ƒ์„ฑ๋œ ํ”„๋กฌํ”„ํŠธ๋Š” LLM์—๊ฒŒ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. LLM์€ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋ถ„์„ํ•˜๊ณ , ๋‚ด๋ถ€์ ์œผ๋กœ ํ•™์Šต๋œ ์ง€์‹๊ณผ ํŒจํ„ด์„ ํ™œ์šฉํ•˜์—ฌ ์‘๋‹ต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  3. ์‘๋‹ต ๋ฐ˜ํ™˜: LLM์ด ์ƒ์„ฑํ•œ ์‘๋‹ต์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ด ์‘๋‹ต์€ ๋‹จ์ˆœํ•œ ๋‹ต๋ณ€, ์š”์•ฝ๋œ ์ •๋ณด, ํ˜น์€ ์ƒ์„ฑ๋œ ํ…์ŠคํŠธ ๋“ฑ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋ฅผ ๋จ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ์‹ค์Šต ์˜ˆ์ œ: LangChain์œผ๋กœ LLM ์ฒด์ธ ๋งŒ๋“ค๊ธฐ

์ด์ œ ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด LangChain์—์„œ ๊ธฐ๋ณธ LLM ์ฒด์ธ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ 1: ๋‹จ์ˆœ LLM ํ˜ธ์ถœ

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ, ChatOpenAI ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ OpenAI์˜ LLM ๋ชจ๋ธ์— ์ง์ ‘ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

Python
 
from langchain_openai import ChatOpenAI

# LLM ๋ชจ๋ธ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
llm = ChatOpenAI(model="gpt-4o-mini")

# ๋ชจ๋ธ์— ์ง์ ‘ ํ”„๋กฌํ”„ํŠธ ์ „๋‹ฌ ๋ฐ ์‹คํ–‰
llm.invoke("์ง€๊ตฌ์˜ ์ž์ „ ์ฃผ๊ธฐ๋Š”?")

์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, llm ๊ฐ์ฒด๊ฐ€ "์ง€๊ตฌ์˜ ์ž์ „ ์ฃผ๊ธฐ๋Š”?" ๋ผ๋Š” ์งˆ๋ฌธ์„ ๋ฐ›์•„ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜๊ณ , AIMessage ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

AIMessage(content='์ง€๊ตฌ์˜ ์ž์ „ ์ฃผ๊ธฐ๋Š” ์•ฝ 23์‹œ๊ฐ„ 56๋ถ„ 4์ดˆ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ํ•ญ์„ฑ์ผ(sidereal day)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ๋งํ•˜๋Š” ํ•˜๋ฃจ 24์‹œ๊ฐ„์€ ํƒœ์–‘์ผ(solar day)๋กœ, ์ง€๊ตฌ๊ฐ€ ์ž์ „ํ•˜๋ฉด์„œ ๊ณต์ „ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํƒœ์–‘์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋ฃจ๊ฐ€ 24์‹œ๊ฐ„์ด ๋ฉ๋‹ˆ๋‹ค.')

์˜ˆ์ œ 2: ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ ์‚ฌ์šฉ

์ด๋ฒˆ์—๋Š” ๋” ์ฒด๊ณ„์ ์ธ ์ ‘๊ทผ์„ ์œ„ํ•ด ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ์€ ํ”„๋กฌํ”„ํŠธ์˜ ํ˜•์‹์„ ๋ฏธ๋ฆฌ ์ •์˜ํ•ด๋‘๊ณ , ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋ณ€์ˆ˜๋กœ ์ฑ„์›Œ ๋„ฃ์–ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

ChatPromptTemplate.from_template() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ๋Š” LLM์—๊ฒŒ "์ฒœ๋ฌธํ•™ ์ „๋ฌธ๊ฐ€" ์—ญํ• ์„ ๋ถ€์—ฌํ•˜์—ฌ ์งˆ๋ฌธ์— ๋‹ต๋ณ€ํ•˜๋„๋ก ์ง€์‹œํ•˜๋Š” ํ…œํ”Œ๋ฆฟ์ž…๋‹ˆ๋‹ค.

Python
 
from langchain_core.prompts import ChatPromptTemplate

# ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ ์ •์˜
prompt = ChatPromptTemplate.from_template(
    "You are an expert in astronomy. Answer the question. <Question>: {input}"
)

# ํ…œํ”Œ๋ฆฟ ๊ฐ์ฒด ํ™•์ธ
prompt

๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด input_variables=['input']์„ ํ†ตํ•ด input์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋ฐ›๋Š” ํ”„๋กฌํ”„ํŠธ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ChatPromptTemplate(input_variables=['input'], messages=[HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['input'], template='You are an expert in astronomy. Answer the question. <Question>: {input}'))])

์˜ˆ์ œ 3: LCEL์„ ํ™œ์šฉํ•œ ์ฒด์ธ ๊ตฌ์„ฑ

LangChain Expression Language (LCEL)์€ ํŒŒ์ดํ”„(|) ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด ํ”„๋กฌํ”„ํŠธ, ๋ชจ๋ธ, ์ถœ๋ ฅ ํŒŒ์„œ๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ์—ฐ๊ฒฐํ•˜์—ฌ ํ•˜๋‚˜์˜ ์ฒด์ธ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ๋Š” ์•ž์„œ ์ •์˜ํ•œ prompt์™€ llm์„ ์—ฐ๊ฒฐํ•˜๊ณ , ์ตœ์ข…์ ์œผ๋กœ StrOutputParser๋ฅผ ํ†ตํ•ด LLM์˜ ์‘๋‹ต์„ ๊น”๋”ํ•œ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

# ํ”„๋กฌํ”„ํŠธ, ๋ชจ๋ธ, ์ถœ๋ ฅ ํŒŒ์„œ ์ •์˜
prompt = ChatPromptTemplate.from_template("You are an expert in astronomy. Answer the question. <Question>: {input}")
llm = ChatOpenAI(model="gpt-4o-mini")
output_parser = StrOutputParser()

# LCEL๋กœ ์ฒด์ธ ์—ฐ๊ฒฐ
chain = prompt | llm | output_parser

# ์ฒด์ธ ํ˜ธ์ถœ
chain.invoke({"input": "์ง€๊ตฌ์˜ ์ž์ „ ์ฃผ๊ธฐ๋Š”?"})

์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ์ด ๋จผ์ € ์งˆ๋ฌธ์„ ์™„์„ฑํ•˜๊ณ , LLM์ด ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜๋ฉฐ, ๋งˆ์ง€๋ง‰์œผ๋กœ StrOutputParser๊ฐ€ ๊ทธ ๋‹ต๋ณ€์„ ์ˆœ์ˆ˜ํ•œ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ง€๊ตฌ์˜ ์ž์ „ ์ฃผ๊ธฐ๋Š” ์•ฝ 24์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ•˜๋ฃจ์˜ ๊ธธ์ด๋ฅผ ๊ฒฐ์ •ํ•˜๋Š”๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
728x90

'Dev,AI > Langchain' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[LLM] Structured Output ๋Š” ์–ผ๋งˆ๋‚˜ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ์„๊นŒ ?  (3) 2025.12.02

+ Recent posts