STUDY/LLM

[LLM] Prompt

seoyn 2026. 6. 25. 08:58

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