Chat Prompt Template (250813)

from langchain_core.prompts import SystemMessagePromptTemplate, HumanMessagePromptTemplate
from langchain_core.prompts import ChatPromptTemplate
chat_prompt = ChatPromptTemplate.from_messages(
[
SystemMessagePromptTemplate.from_template("이 시스템은 천문학 질문에 답변할 수 있습니다."),
HumanMessagePromptTemplate.from_template("{user_input}"),
]
)
messages = chat_prompt.format_messages(user_input="태양계에서 가장 큰 행성은 무엇인가요?")
messages
[SystemMessage(content='이 시스템은 천문학 질문에 답변할 수 있습니다.', additional_kwargs={}, response_metadata={}),
HumanMessage(content='태양계에서 가장 큰 행성은 무엇인가요?', additional_kwargs={}, response_metadata={})]
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
from langchain_core.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
model = ChatOpenAI(
base_url="http://localhost:11434/v1",
api_key="lm-studio",
model="lmstudio-community/Meta-Llama-3.1-8B-Instruct-GGUF",
temperature=0.1,
streaming=True,
callbacks=[StreamingStdOutCallbackHandler()],
)
chain = chat_prompt | model | StrOutputParser()
answer = chain.invoke({"user_input": "태양계에서 가장 큰 행성은 무엇인가요?"})
print("Query:", messages)
print("Answer:", answer)
태양계에서 가장 큰 행성은 목성입니다. 목성의 지구 대비 반지름은 약 11.2배로, 질량도 지구의 약 318배에 달합니다. 또한 목성은 태양계에서 가장 무거운 행성으로, 태양의 약 1/1000만 분의 1 정도의 질량을 가지고 있습니다.Query: [SystemMessage(content='이 시스템은 천문학 질문에 답변할 수 있습니다.', additional_kwargs={}, response_metadata={}), HumanMessage(content='태양계에서 가장 큰 행성은 무엇인가요?', additional_kwargs={}, response_metadata={})]
Answer: 태양계에서 가장 큰 행성은 목성입니다. 목성의 지구 대비 반지름은 약 11.2배로, 질량도 지구의 약 318배에 달합니다. 또한 목성은 태양계에서 가장 무거운 행성으로, 태양의 약 1/1000만 분의 1 정도의 질량을 가지고 있습니다.
Few-shot Prompt
from langchain_core.prompts import PromptTemplate
example_prompt = PromptTemplate.from_template("질문: {question}\n{answer}")
examples = [
{
"question": "지구의 대기 중 가장 많은 비율을 차지하는 기체는 무엇인가요?",
"answer": "지구 대기의 약 78%를 차지하는 질소입니다."
},
{
"question": "광합성에 필요한 주요 요소들은 무엇인가요?",
"answer": "광합성에 필요한 주요 요소는 빛, 이산화탄소, 물입니다."
},
{
"question": "피타고라스 정리를 설명해주세요.",
"answer": "피타고라스 정리는 직각삼각형에서 빗변의 제곱이 다른 두 변의 제곱의 합과 같다는 것입니다."
},
{
"question": "지구의 자전 주기는 얼마인가요?",
"answer": "지구의 자전 주기는 약 24시간(정확히는 23시간 56분 4초)입니다."
},
{
"question": "DNA의 기본 구조를 간단히 설명해주세요.",
"answer": "DNA는 두 개의 폴리뉴클레오티드 사슬이 이중 나선 구조를 이루고 있습니다."
},
{
"question": "원주율(π)의 정의는 무엇인가요?",
"answer": "원주율(π)은 원의 지름에 대한 원의 둘레의 비율입니다."
}
]
from langchain_core.prompts import FewShotPromptTemplate
prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
suffix="질문: {input}",
input_variables=["input"],
)
print(prompt.invoke({"input": "태양계에서 가장 큰 행성은 무엇인가요?"}).to_string())
질문: 지구의 대기 중 가장 많은 비율을 차지하는 기체는 무엇인가요?
지구 대기의 약 78%를 차지하는 질소입니다.
질문: 광합성에 필요한 주요 요소들은 무엇인가요?
광합성에 필요한 주요 요소는 빛, 이산화탄소, 물입니다.
질문: 피타고라스 정리를 설명해주세요.
피타고라스 정리는 직각삼각형에서 빗변의 제곱이 다른 두 변의 제곱의 합과 같다는 것입니다.
질문: 지구의 자전 주기는 얼마인가요?
지구의 자전 주기는 약 24시간(정확히는 23시간 56분 4초)입니다.
질문: DNA의 기본 구조를 간단히 설명해주세요.
DNA는 두 개의 폴리뉴클레오티드 사슬이 이중 나선 구조를 이루고 있습니다.
질문: 원주율(π)의 정의는 무엇인가요?
원주율(π)은 원의 지름에 대한 원의 둘레의 비율입니다.
질문: 태양계에서 가장 큰 행성은 무엇인가요?
chain = prompt | model | StrOutputParser()
answer = chain.invoke({"input": "태양계에서 가장 큰 행성은 무엇인가요?"})
print("Query:", messages)
print("Answer:", answer)
1. 지구 대기의 약 78%를 차지하는 기체는 질소입니다.
2. 광합성에 필요한 주요 요소는 빛, 이산화탄소, 물입니다.
3. 피타고라스 정리는 직각삼각형에서 빗변의 제곱이 다른 두 변의 제곱의 합과 같다는 것입니다. (a² + b² = c²)
4. 지구의 자전 주기는 약 24시간(정확히는 23시간 56분 4초)입니다.
5. DNA의 기본 구조를 간단히 설명하면 두 개의 폴리뉴클레오티드 사슬이 이중 나선 구조를 이루고 있습니다.
6. 원주율(π)의 정의는 원의 지름에 대한 원의 둘레의 비율입니다.
7. 태양계에서 가장 큰 행성은 목성입니다.Query: [SystemMessage(content='이 시스템은 천문학 질문에 답변할 수 있습니다.', additional_kwargs={}, response_metadata={}), HumanMessage(content='태양계에서 가장 큰 행성은 무엇인가요?', additional_kwargs={}, response_metadata={})]
Answer: 1. 지구 대기의 약 78%를 차지하는 기체는 질소입니다.
2. 광합성에 필요한 주요 요소는 빛, 이산화탄소, 물입니다.
3. 피타고라스 정리는 직각삼각형에서 빗변의 제곱이 다른 두 변의 제곱의 합과 같다는 것입니다. (a² + b² = c²)
4. 지구의 자전 주기는 약 24시간(정확히는 23시간 56분 4초)입니다.
5. DNA의 기본 구조를 간단히 설명하면 두 개의 폴리뉴클레오티드 사슬이 이중 나선 구조를 이루고 있습니다.
6. 원주율(π)의 정의는 원의 지름에 대한 원의 둘레의 비율입니다.
7. 태양계에서 가장 큰 행성은 목성입니다.
의미적 유사성 분석으로 가장 관련성이 높은 예제를 선택하는 방법
from langchain_chroma import Chroma
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain.embeddings import HuggingFaceEmbeddings
embeddings_model = HuggingFaceEmbeddings(
model_name='sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2',
model_kwargs={'device':'cpu'},
encode_kwargs={'normalize_embeddings':True},
)
example_selector = SemanticSimilarityExampleSelector.from_examples(
examples,
embeddings_model,
Chroma,
k=1,
)
question = "태양계에서 가장 큰 행성은 무엇인가요?"
selected_examples = example_selector.select_examples({"question": question})
print(f"입력과 가장 유사한 예제: {question}")
for example in selected_examples:
print("\n")
for k, v in example.items():
print(f"{k}: {v}")
입력과 가장 유사한 예제: 태양계에서 가장 큰 행성은 무엇인가요?
question: 지구의 대기 중 가장 많은 비율을 차지하는 기체는 무엇인가요?
answer: 지구 대기의 약 78%를 차지하는 질소입니다.
prompt = FewShotPromptTemplate(
examples=selected_examples,
example_prompt=example_prompt,
suffix="질문: {input}",
input_variables=["input"],
)
print(prompt.invoke({"input": "태양계에서 가장 큰 행성은 무엇인가요?"}).to_string())
질문: 지구의 대기 중 가장 많은 비율을 차지하는 기체는 무엇인가요?
지구 대기의 약 78%를 차지하는 질소입니다.
질문: 태양계에서 가장 큰 행성은 무엇인가요?
chain = prompt | model | StrOutputParser()
answer = chain.invoke({"input": "태양계에서 가장 큰 행성은 무엇인가요?"})
print("Query:", messages)
print("Answer:", answer)
질문에 대한 답변:
1. 지구의 대기 중 가장 많은 비율을 차지하는 기체는 질소입니다. 지구 대기의 약 78%를 차지합니다.
2. 태양계에서 가장 큰 행성은 목성입니다. 목성은 태양계의 외곽에 위치한 가스 거대행성으로, 지구보다 약 12배 더 무겁고, 반경이 약 11배 더 크습니다.Query: [SystemMessage(content='이 시스템은 천문학 질문에 답변할 수 있습니다.', additional_kwargs={}, response_metadata={}), HumanMessage(content='태양계에서 가장 큰 행성은 무엇인가요?', additional_kwargs={}, response_metadata={})]
Answer: 질문에 대한 답변:
1. 지구의 대기 중 가장 많은 비율을 차지하는 기체는 질소입니다. 지구 대기의 약 78%를 차지합니다.
2. 태양계에서 가장 큰 행성은 목성입니다. 목성은 태양계의 외곽에 위치한 가스 거대행성으로, 지구보다 약 12배 더 무겁고, 반경이 약 11배 더 크습니다.