from langchain.chat_models import ChatOpenAI
from langchain.prompts.few_shot import FewShotPromptTemplate
from langchain.callbacks import StreamingStdOutCallbackHandler
from langchain.prompts.prompt import PromptTemplate
chat = ChatOpenAI(
temperature=0.1,
streaming=True,
callbacks=[
StreamingStdOutCallbackHandler(),
],
)
examples = [
{
"question": "What do you know about France?",
"answer": """
Here is what I know:
Capital: Paris
Language: French
Food: Wine and Cheese
Currency: Euro
""",
},
{
"question": "What do you know about Italy?",
"answer": """
I know this:
Capital: Rome
Language: Italian
Food: Pizza and Pasta
Currency: Euro
""",
},
{
"question": "What do you know about Greece?",
"answer": """
I know this:
Capital: Athens
Language: Greek
Food: Souvlaki and Feta Cheese
Currency: Euro
""",
},
]
example_prompt = PromptTemplate.from_template("Human: {question}\nAI:{answer}")
prompt = FewShotPromptTemplate(
example_prompt=example_prompt,
examples=examples,
suffix="Human: What do you know about {country}?",
input_variables=["country"],
)
chain = prompt | chat
chain.invoke({"country": "Turkey"})
Step-by-Step Pseudocode:
1. prompt.format(country=“Germany”) 실행 시:
• FewShotPromptTemplate의 내부 로직이 동작하여, 예시들과 suffix(“Human: What do you know about {country}?”)를 포함한 최종 프롬프트 문자열을 생성.
• 변수 country에 “Germany”가 대입되어 프롬프트 내의 해당 부분이 “Germany”로 채워짐.
• 결과적으로 모델 호출 없이 완성된 텍스트 프롬프트 문자열만 반환.
2. chain.invoke({“country”: “Turkey”}) 실행 시:
• 동일한 방식으로 프롬프트를 생성하지만, 생성된 프롬프트가 ChatOpenAI 모델로 전송됨.
• 모델은 해당 프롬프트를 바탕으로 응답(답변)을 생성함.
• 결과적으로 모델이 생성한 응답을 반환.
최종 차이점:
• prompt.format(country="Germany"):
단순히 완성된 프롬프트 문자열을 출력하며, 모델 호출 없이 텍스트 포맷만 수행합니다.
• chain.invoke({"country": "Turkey"}):
프롬프트를 생성한 후, 이를 ChatOpenAI 모델에 보내어 실제 답변을 생성하고 그 응답을 반환합니다.