1. ํ๋กฌํํธ ์์ง๋์ด๋ง
• ํ๋กฌํํธ : ์์ฑํ AI์ ์ ๋ ฅํ๋ ์ ๋ณด(์์ฐ์ด, ์ด๋ฏธ์ง, ์์ฑ ๋ฑ)
• ํ๋กฌํํธ ์์ง๋์ด๋ง : LLM์ด ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ผ๊ด๋๊ฒ ์์ฑํ๋๋ก ์ง์๋ฌธ, ์ ๋ ฅ ์ ๋ณด, ์ถ๋ ฅ ํ์, ์์, ์ ์ฝ ์กฐ๊ฑด ์ค๊ณํ๋ ์์ (์์ ๋ช ์ธ์)
• 8๊ฐ์ง ์์น
โ ๋ช ํ์ฑ·๊ตฌ์ฒด์ฑ : ๋ฌด์์, ๋๊ตฌ๋ฅผ ์ํด, ์ด๋ค ์์ค์ผ๋ก, ์ด๋ค ํ์์ผ๋ก ์์ฒญํ ์ง ๋ช ์
โก ์ญํ (Persona) ์ง์ : ์ญํ ๋ถ์ฌ๋ก ๋ต๋ณ ๊ด์ ·๊น์ด·์ฉ์ด ์ ํ·ํ๋จ ๊ธฐ์ค ๋ฌ๋ผ์ง
โข ์ถ๋ ฅ ํ์ ์ง์ : JSON, ํ ๋ฑ ์ํ๋ ํ์ ๋ช ์(API·์๋ํ ์์คํ ์์ ์ค์)
โฃ ๋ฐฐ๊ฒฝ ์ ๋ณด(Context) ์ ๊ณต : ํ์ํ ๋งฅ๋ฝ(์ฌ๋ด ๋ฌธ์, ๊ฒ์ ๊ฒฐ๊ณผ ๋ฑ) ํฌํจํด ํ ๋ฃจ์๋ค์ด์ ๋ฐฉ์ง
โค ์์ ์ ๊ณต : ์์ ๋ ๊ฒฐ๊ณผ(์์ ๊ฐ์์ ๋ฐ๋ผ Zero-shot / One-shot / Few-shot Learning)
โฅ ๊ตฌ์กฐํ : ๊ธด ํ๋กฌํํธ๋ <instructions>, <context>, <output_format> ๋ฑ ํ๊ทธ or Markdown์ผ๋ก ๊ตฌํ ๋ถ๋ฆฌ
โฆ ์ ์ฝ ์กฐ๊ฑด ๋ช ์ : 'ํ์ง ๋ง์์ผ ํ ๊ฒ' ๋ช ์(์ ํ์ฑ ์ค์ํ ๋ฒ๋ฅ , ์๋ฃ ๋ฑ ์์ญ - ์ถ์ฒ·๊ธฐ์ค ์์ ·๋ถํ์ค์ฑ ํฌํจ)
โง ์ ์ง์ ๊ฐ์ : ํ ๋ฒ ์ฐ๊ณ ๋๋ด๋ ๊ฒ์ด ์๋, ๋ชจ๋ธ ๋ฒ์ ๊ณ ์ ํ ํ๊ฐ ๊ธฐ์ค(์ ํ๋, ํ์ ์ค์, ํ๊ฐ ์ฌ๋ถ ๋ฑ)์ผ๋ก ๋ฐ๋ณต ํ๋
2. ํ๋กฌํํธ ํ ํ๋ฆฟ(LangChain)
• ๋ชฉ์ : ์ฌ์ฌ์ฉ์ฑ, ์ ์ง๋ณด์์ฑ, ์๋ํ ์ง์, ์ผ๊ด์ฑ ํ๋ณด
• ๋ฐฉ๋ฒ : ๋ณ์๋ฅผ {๋ณ์๋ช }์ผ๋ก ์ง์ , ์คํ ์ ์ค์ ๊ฐ์ผ๋ก ๋์ฒด๋จ
• ์ฃผ์ ํด๋์ค
โ PromptTemplate : ๋จ์ผ ํ ์คํธ(string) ํํ ํ๋กฌํํธ ์์ฑ
- ๋ณ์ ํ์ : {} (์ค๊ดํธ ๋ฌธ์ ์์ฒด ์ฌ์ฉ ์ {{, }}๋ก ์ด์ค์ผ์ดํ)
- ์ฃผ์ ๋ฉ์๋ : from_template(), format(), invoke(dict)
# PromptTemplate ๊ธฐ๋ณธ ํ๋ฆ
prompt = PromptTemplate.from_template("{country}์ ์๋๋ ์ด๋์ธ๊ฐ์?")
chain = prompt | model # LCEL ํ์ดํ๋ผ์ธ
res = chain.invoke({"country": "ํ๋์ค"})
โก ChatPromptTemplate : ๋ํํ ๋ชจ๋ธ์ฉ์ผ๋ก, system / user / ai ์ญํ ๊ธฐ๋ฐ ๋ฉ์์ง ์กฐํฉ
- ์ฃผ์ ๋ฉ์๋ : from_messages(), format_messages(), invoke(dict)
- GPT, Claude, Gemini ๋ฑ ๋ชจ๋ Chat ์ธํฐํ์ด์ค ๊ธฐ๋ฐ → ์ค๋ฌด์์ ๋ ๋ง์ด ์ฌ์ฉ
# ChatPromptTemplate ๊ธฐ๋ณธ ํ๋ฆ
messages = [
("system", "๋น์ ์ {domain} ์ ๋ฌธ Assistant์
๋๋ค. {word_length} ๋จ์ด ์ดํ๋ก ๋ตํด์ฃผ์ธ์."),
("user", "{query}")
]
prompt = ChatPromptTemplate.from_messages(messages)
query = prompt.invoke({"domain":"AI", "word_length":30, "query":"Agent๋?"})
res = model.invoke(query)
โข MessagesPlaceholde : ChatPromptTemplate ์์์ ๋ฉ์์ง ๋ชฉ๋ก(๋ํ ์ด๋ ฅ, Few-shot ์์ ๋ฑ)์ ๋์ ์ผ๋ก ์ฝ์
- ์ฌ๋ฌ Message ๊ฐ์ฒด๋ฅผ ํ ๋ฒ์ ์ฝ์
- ์ฃผ์ ํ๋ผ๋ฏธํฐ : variable_name, optional(๋ฉ์์ง ์์ด๋ ์ค๋ฅ ์์), n_messages(์ต๊ทผ N๊ฐ๋ง ํฌํจ)
chat_history = [
("human", "5 + 2๋?"),
("ai", "7์
๋๋ค."),
("human", "10 * 5๋?"),
("ai", "50์
๋๋ค.")
]
messages = [
("system", "๋น์ ์ ์ํ ์ ๋ฌธ Assistant์
๋๋ค."),
("placeholder", "{history}"), # ๋ํ ์ด๋ ฅ ์ฝ์
์์น
("user", "{query}")
]
prompt.invoke({"history": chat_history, "query":"์ ๊ฒฐ๊ณผ์ 3์ ๊ณฑ์?"})
3. ๋ฉํฐ๋ชจ๋ฌ ํ๋กฌํฌํธ
• ๋ชจ๋ฌ๋ฆฌํฐ : ์ ๋ณด ํํํ๋ ๋ฐฉ์(ํ ์คํธ, ์ด๋ฏธ์ง, ์ค๋์ค, ๋น๋์ค ๋ฑ)
• ๋ฉํฐ๋ชจ๋ฌ AI : ์ฌ๋ฌ ๋ชจ๋ฌ๋ฆฌํฐ ๋์ ์ฒ๋ฆฌํ๋ AI ์์คํ
• ๋ฉํฐ๋ชจ๋ฌ ํ๋กฌํํธ : ํ
์คํธ ์ธ ์ด๋ฏธ์ง·์ค๋์ค ๋ฑ ๋ค์ํ ๋ฐ์ดํฐ ํจ๊ป ์
๋ ฅํ๋ ๋ฐฉ์
• LangChain์์์ ๊ตฌํ
- ์ด๋ฏธ์ง or ํ์ผ : URL or Base64 ์ธ์ฝ๋ฉ
โ Base64 ์ธ์ฝ๋ฉ
binary ๋ฐ์ดํฐ๋ฅผ ํ ์คํธ ๊ธฐ๋ฐ ์์คํ (JSON, HTML ๋ฑ)์์ ์์ ํ๊ฒ ์ ์กํ๊ธฐ ์ํด ASCII ๋ฌธ์๋ก ๋ณํํ๋ ์ธ์ฝ๋ฉ ๋ฐฉ์
# ์ด๋ฏธ์ง Base64 ์ธ์ฝ๋ฉ ์ ํธ ํจ์
def encode_to_base64(path: str) -> str:
with open(path, "rb") as f:
return base64.b64encode(f.read()).decode("utf-8")
- ์ด๋ฏธ์ง ์ฌ๋ฌ ์ฅ : content ๋ฆฌ์คํธ์ ์ด๋ฏธ์ง ๋ธ๋ก ์ถ๊ฐ
- ChatPromptTemplate์ผ๋ก ๋ฉํฐ๋ชจ๋ฌ ํ ํ๋ฆฟํ ๊ฐ๋ฅ({img_data}, {mime_type} ๋ฑ ๋ณ์ํ)
# ์ด๋ฏธ์ง ์ ์ก - Base64
content = [
{"type":"text", "text":"์ด๋ฏธ์ง๋ฅผ ์ค๋ช
ํด์ค."},
{"type":"image", "source_type":"base64", "data":img_b64, "":"image/jpeg"}
]
# ์ด๋ฏธ์ง ์ ์ก - URL
content = [
{"type":"text", "text":"๊ทธ๋ํ๋ฅผ ๋ถ์ํด์ค."},
{"type":"image", "source_type":"url", "url":"https://..."}
]
# PDF ์ ์ก
content = [
{"type":"text", "text":"PDF๋ฅผ ์์ฝํด์ค."},
{"type":"file", "source_type":"base64", "data":pdf_b64,
"mime_type":"application/pdf", "filename":"document.pdf"}
]
'STUDY > LLM' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [LLM] RAG (1) | 2026.06.30 |
|---|---|
| [LLM] Chain - LCEL (0) | 2026.06.27 |
| [LLM] Output Parser (0) | 2026.06.26 |
| [LLM] Model (0) | 2026.06.24 |
| [LLM] LLM๊ณผ LangChain (0) | 2026.06.24 |