LLM Day10

Soyee Sungยท2025๋…„ 2์›” 12์ผ
0

LLM

๋ชฉ๋ก ๋ณด๊ธฐ
9/34

๐Ÿ” 1. ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง ๊ฐœ์š”
ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง์ด๋ž€?
๐Ÿ‘‰ AI๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋Œ€๋กœ ๋‹ต๋ณ€ํ•˜๋„๋ก ์งˆ๋ฌธ์„ ํšจ๊ณผ์ ์œผ๋กœ ์„ค๊ณ„ํ•˜๋Š” ๊ธฐ์ˆ 

3๊ฐ€์ง€ ํ”„๋กฌํ”„ํŒ… ๊ธฐ๋ฒ•:

1๏ธโƒฃ Zero-shot ํ”„๋กฌํ”„ํŒ… โ†’ ์˜ˆ์‹œ ์—†์ด AI์—๊ฒŒ ๋ฐ”๋กœ ์งˆ๋ฌธ
2๏ธโƒฃ One-shot ํ”„๋กฌํ”„ํŒ… โ†’ ์˜ˆ์‹œ๋ฅผ ํ•˜๋‚˜๋งŒ ์ฃผ๊ณ  AI์—๊ฒŒ ํ•™์Šต
3๏ธโƒฃ Few-shot ํ”„๋กฌํ”„ํŒ… โ†’ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์˜ˆ์‹œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ AI์˜ ์ •ํ™•๋„๋ฅผ ๋†’์ž„

๐Ÿ”ต 2. Zero-shot ํ”„๋กฌํ”„ํŒ…
๐Ÿ“Œ Zero-shot (์ œ๋กœ์ƒท) ํ”„๋กฌํ”„ํŒ…์ด๋ž€?

AI๊ฐ€ ์˜ˆ์‹œ ์—†์ด ์ฆ‰์‹œ ๋‹ต์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹
๊ฐ„๋‹จํ•œ ์งˆ๋ฌธ์ด๋‚˜ ์ง๊ด€์ ์ธ ์ž‘์—…์— ์ ํ•ฉ
โœ… Zero-shot ์ฝ”๋“œ ์˜ˆ์ œ

๐Ÿ“Œ ์„ค๋ช…

PromptTemplate โ†’ AI์—๊ฒŒ ์ž…๋ ฅํ•  ์งˆ๋ฌธ ํ…œํ”Œ๋ฆฟ์„ ๋งŒ๋“ ๋‹ค.
LangChain์˜ LLM(ChatOpenAI) โ†’ GPT ๋ชจ๋ธ์„ ํ˜ธ์ถœํ•œ๋‹ค.
์ฒด์ธ(chain) โ†’ ํ”„๋กฌํ”„ํŠธ โ†’ AI ๋ชจ๋ธ โ†’ ์ถœ๋ ฅ ํŒŒ์„œ๋ฅผ ์—ฐ๊ฒฐํ•ด์„œ ์‹คํ–‰.
Zero-shot ์‹คํ–‰ โ†’ "์ธ๊ณต์ง€๋Šฅ ๋ฐ˜๋„์ฒด"๋ผ๋Š” ์ฃผ์ œ์— ๋Œ€ํ•œ ์‚ผ์„ฑ์ „์ž์˜ ๊ฒฝ์Ÿ์—…์ฒด๋ฅผ ์ฐพ๋„๋ก ์š”์ฒญ.

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

llm = ChatOpenAI(model='gpt-4o-mini', temperature=0.3, top_p=0.9)

# Zero-shot ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ ์ƒ์„ฑ
zero_shot_prompt = PromptTemplate(
    input_variables=["topic"],
    template="๋‹ค์Œ ์‹œ์žฅ์—์„œ ์‚ผ์„ฑ์ „์ž์˜ ๊ฒฝ์Ÿ์—…์ฒด๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”: {topic}"
)

# ์ฒด์ธ ์ƒ์„ฑ
chain = zero_shot_prompt | llm | StrOutputParser()

# ์‹คํ–‰
topic = "์ธ๊ณต์ง€๋Šฅ ๋ฐ˜๋„์ฒด"
zero_shot_result = chain.invoke(input={"topic": topic}) 

print(zero_shot_result)

๐ŸŸก 3. One-shot ํ”„๋กฌํ”„ํŒ…

๐Ÿ“Œ One-shot (์›์ƒท) ํ”„๋กฌํ”„ํŒ…์ด๋ž€?

์˜ˆ์‹œ ํ•˜๋‚˜๋งŒ ์ œ๊ณตํ•˜์—ฌ AI๊ฐ€ ํŒจํ„ด์„ ์ดํ•ดํ•˜๋„๋ก ๋•๋Š” ๋ฐฉ์‹
Zero-shot๋ณด๋‹ค ์กฐ๊ธˆ ๋” ์ •๊ตํ•œ ๋‹ต๋ณ€ ๊ฐ€๋Šฅ

๐Ÿ“Œ ์„ค๋ช…

AI๊ฐ€ ์˜ˆ์ œ๋ฅผ ํ•˜๋‚˜ ๋ณด๊ณ  ํ•™์Šตํ•˜๋„๋ก ํ•จ.
"์Šค๋งˆํŠธํฐ ์‹œ์žฅ"์—์„œ ์‚ผ์„ฑ์ „์ž์˜ ๊ฒฝ์Ÿ์—…์ฒด ์˜ˆ์ œ๋ฅผ ๋จผ์ € ๋ณด์—ฌ์คŒ.
์ดํ›„ "๋ฐ˜๋„์ฒด ์‹œ์žฅ"์—์„œ ์‚ผ์„ฑ์ „์ž์˜ ๊ฒฝ์Ÿ์—…์ฒด๋ฅผ ๋ฌป๋Š” ์งˆ๋ฌธ์„ ๋˜์ง.
AI๊ฐ€ ์˜ˆ์ œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ๋” ์ •ํ™•ํ•œ ๋‹ต์„ ์ƒ์„ฑํ•จ.

โœ… One-shot ์ฝ”๋“œ ์˜ˆ์ œ

# One-shot ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ ์ƒ์„ฑ
one_shot_prompt = PromptTemplate(
    input_variables=["example", "question"],
    template="""
    [์˜ˆ์ œ]
    ์งˆ๋ฌธ: {example}
    ๋‹ต๋ณ€: ์‚ผ์„ฑ์ „์ž, SKํ•˜์ด๋‹‰์Šค

    [์งˆ๋ฌธ]
    ์งˆ๋ฌธ: {question}
    ๋‹ต๋ณ€:
    """
)

# ์ฒด์ธ ์ƒ์„ฑ
chain = one_shot_prompt | llm | StrOutputParser()

# ์‹คํ–‰
example = "์Šค๋งˆํŠธํฐ ์‹œ์žฅ์—์„œ ์‚ผ์„ฑ์ „์ž์˜ ๊ฒฝ์Ÿ์—…์ฒด"
question = "๋ฐ˜๋„์ฒด ์‹œ์žฅ์—์„œ ์‚ผ์„ฑ์ „์ž์˜ ๊ฒฝ์Ÿ์—…์ฒด"
one_shot_result = chain.invoke(input={"example": example, "question": question}) 

print(one_shot_result)

๐ŸŸข 4. Few-shot ํ”„๋กฌํ”„ํŒ…

๐Ÿ“Œ Few-shot (ํ“จ์ƒท) ํ”„๋กฌํ”„ํŒ…์ด๋ž€?

AI์—๊ฒŒ 2๊ฐœ ์ด์ƒ์˜ ์˜ˆ์‹œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์›ํ•˜๋Š” ๋‹ต๋ณ€ ํ˜•์‹์„ ํ•™์Šตํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹
๊ฐ€์žฅ ์ •ํ™•๋„ ๋†’์€ ๋‹ต๋ณ€์„ ์–ป์„ ์ˆ˜ ์žˆ์Œ
ํ•˜์ง€๋งŒ ํ”„๋กฌํ”„ํŠธ ๊ธธ์ด๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿ“Œ ์„ค๋ช…

AI์—๊ฒŒ 2๊ฐœ์˜ ์˜ˆ์‹œ๋ฅผ ์ œ๊ณตํ•ด์„œ ๋‹ต๋ณ€ ํŒจํ„ด์„ ํ•™์Šต์‹œํ‚ด.
์Šค๋งˆํŠธํฐ/๋ฐ˜๋„์ฒด ์‹œ์žฅ์— ๋Œ€ํ•œ ์˜ˆ์‹œ๋ฅผ ๋ณด๊ณ , ์ž๋™์ฐจ ์‹œ์žฅ์— ๋Œ€ํ•œ ๋‹ต์„ ์œ ์ถ”ํ•˜๋„๋ก ํ•จ.
AI๊ฐ€ ์˜ˆ์‹œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋”์šฑ ์ •๊ตํ•œ ๋‹ต์„ ์ œ๊ณตํ•จ.

โœ… Few-shot ์ฝ”๋“œ ์˜ˆ์ œ

from langchain_core.prompts import FewShotPromptTemplate

# Few-shot ์˜ˆ์ œ ๋ฐ์ดํ„ฐ
examples = [
    {"question": "์Šค๋งˆํŠธํฐ ์‹œ์žฅ์—์„œ ์‚ผ์„ฑ์ „์ž์˜ ๊ฒฝ์Ÿ์—…์ฒด", "answer": "์• ํ”Œ, ์ƒค์˜ค๋ฏธ, ํ™”์›จ์ด"},
    {"question": "๋ฐ˜๋„์ฒด ์‹œ์žฅ์—์„œ ์‚ผ์„ฑ์ „์ž์˜ ๊ฒฝ์Ÿ์—…์ฒด", "answer": "TSMC, ์ธํ…”, SKํ•˜์ด๋‹‰์Šค"}
]

# Few-shot ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ ์ƒ์„ฑ
few_shot_prompt = FewShotPromptTemplate(
    examples=examples,
    input_variables=["question"],
    example_prompt=PromptTemplate(
        input_variables=["question", "answer"],
        template="์งˆ๋ฌธ: {question}\n๋‹ต๋ณ€: {answer}\n"
    ),
    prefix="๋‹ค์Œ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:\n\n",
    suffix="์งˆ๋ฌธ: {question}\n๋‹ต๋ณ€: ",
)

# ์ฒด์ธ ์ƒ์„ฑ
chain = few_shot_prompt | llm | StrOutputParser()

# ์‹คํ–‰
question = "์ž๋™์ฐจ ์‹œ์žฅ์—์„œ ์‚ผ์„ฑ์ „์ž์˜ ๊ฒฝ์Ÿ์—…์ฒด"
few_shot_result = chain.invoke(input={"question": question}) 

print(few_shot_result)

๐Ÿ“Š 5. Zero-shot vs One-shot vs Few-shot ๋น„๊ต

๐ŸŽฏ 6. ์ •๋ฆฌ
โœ… Zero-shot โ†’ ์˜ˆ์ œ ์—†์ด ๋ฐ”๋กœ ์งˆ๋ฌธ! (๋น ๋ฅด์ง€๋งŒ ์ •ํ™•๋„ ๋‚ฎ์Œ)
โœ… One-shot โ†’ ์˜ˆ์ œ ํ•˜๋‚˜ ์ œ๊ณต! (์ •ํ™•๋„ ๊ฐœ์„ , ํ•˜์ง€๋งŒ ๊ณผ์˜์กด ๊ฐ€๋Šฅ)
โœ… Few-shot โ†’ ์—ฌ๋Ÿฌ ์˜ˆ์ œ ์ œ๊ณต! (๊ฐ€์žฅ ์ •ํ™•ํ•˜์ง€๋งŒ, ํ”„๋กฌํ”„ํŠธ ๊ธธ์–ด์ง)

โœ”๏ธ Zero-shot์€ ๊ฐ„๋‹จํ•œ ์งˆ๋ฌธ์— ์ ํ•ฉ
โœ”๏ธ Few-shot์€ ๋ณต์žกํ•œ ์งˆ๋ฌธ์— ์ ํ•ฉ
โœ”๏ธ One-shot์€ ์ค‘๊ฐ„ ๋‚œ์ด๋„์˜ ์งˆ๋ฌธ์— ์ ํ•ฉ

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