Prompts
LangChain: Prompts
Prompts: https://python.langchain.com/docs/modules/model_io/prompts
Chat Prompts: https://python.langchain.com/docs/modules/model_io/chat/
import os
from dotenv import load_dotenv
load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")
# 패키지 설치
#%pip install tiktoken
#%pip install faiss-gpu
1. PromptTemplete 생성
입력변수 없는 PromptTemplate
입력변수가 1개 있는 PromptTemplate
입력변수가 n개 있는 PromptTemplate
Jinja2 이용한 PromptTemplate
jinja2는 어떤 파일, 실재하는 파일에 어떤 변수들을 집어넣어서 약간 변경시켜서 html로 만들어주는 엔진
from langchain.prompts import PromptTemplate
# 입력 변수가 없는 프롬프트 템플릿 만들기
no_input_prompt = PromptTemplate(
input_variables=[],
template="멋진 동물이라고 하면?"
)
# 프롬프트 생성
print(no_input_prompt.format())
멋진 동물이라고 하면?
from langchain.prompts import PromptTemplate
# 하나의 입력 변수가 있는 프롬프트 템플릿 만들기
one_input_prompt = PromptTemplate(
input_variables=["content"],
template="멋진 {content}이라고 하면?"
)
# 프롬프트 생성
print(one_input_prompt.format(content="동물"))
멋진 동물이라고 하면?
from langchain.prompts import PromptTemplate
# 여러 개의 입력 변수가 있는 프롬프트 템플릿 만들기
multiple_input_prompt = PromptTemplate(
input_variables=["adjective", "content"],
template="{adjective} {content}이라고 하면?"
)
# 프롬프트 생성
print(multiple_input_prompt.format(adjective="멋진", content="동물"))
멋진 동물이라고 하면?
from langchain.prompts import PromptTemplate
# jinja2를 이용한 프롬프트 템플릿 준비
jinja2_prompt = PromptTemplate(
input_variables=["items"],
template_format="jinja2",
template="""
<div data-gb-custom-block data-tag="for">
Q: {{ item.question }}
A: {{ item.answer }}
</div>
"""
)
# 프롬프트 생성
items=[
{"question": "foo", "answer": "bar"},
{"question": "1", "answer": "2"}
]
print(jinja2_prompt.format(items=items))
Q: foo
A: bar
Q: 1
A: 2
2. FewShotPromptTemplate
답변의 예시(examples)를 제시하여 포함 시킴
from langchain.prompts import FewShotPromptTemplate
# 답변 예시 준비
examples = [
{"input": "明るい", "output": "暗い"},
{"input": "おもしろい", "output": "つまらない"},
]
# 프롬프트 템플릿 생성
example_prompt = PromptTemplate(
input_variables=["input", "output"],
template="入力: {input}\n出力: {output}",
)
# 답변 예시를 포함한 프롬프트 템플릿 만들기
prompt_from_string_examples = FewShotPromptTemplate(
examples=examples, # 답변 예시
example_prompt=example_prompt, # 프롬프트 템플릿
prefix="모든 입력에 대한 반의어를 입력하세요", # 접두사
suffix="입력: {adjective}\n출력:", # 접미사
input_variables=["adjective"], # 입력 변수
example_separator="\n\n" # 구분 기호
)
# 프롬프트 생성
print(prompt_from_string_examples.format(adjective="큰"))
모든 입력에 대한 반의어를 입력하세요
入力: 明るい
出力: 暗い
入力: おもしろい
出力: つまらない
입력: 큰
출력:
3. LengthBasedExampleSelector
문자열의 최대 길이를 지정
from langchain.prompts import FewShotPromptTemplate
from langchain.prompts.example_selector import LengthBasedExampleSelector
# 답변 예시 준비
examples = [
{"input": "밝은", "output": "어두운"},
{"input": "재미있는", "output": "지루한"},
{"input": "활기찬", "output": "무기력한"},
{"input": "높은", "output": "낮은"},
{"input": "빠른", "output": "느린"},
]
# 프롬프트 템플릿 생성
example_prompt = PromptTemplate(
input_variables=["input","output"],
template="입력: {input}\n출력: {output}",
)
# LengthBasedExampleSelector 생성
example_selector = LengthBasedExampleSelector(
examples=examples, # 답변 예시
example_prompt=example_prompt, # 프롬프트 템플릿
max_length=10, # 문자열의 최대 길이
)
# FewShotPromptTemplate 생성
prompt_from_string_examples = FewShotPromptTemplate(
example_selector=example_selector, # ExampleSelector
example_prompt=example_prompt,
prefix="모든 입력에 대한 반의어를 입력하세요",
suffix="입력: {adjective}\n출력:",
input_variables=["adjective"],
example_separator="\n\n"
)
# 프롬프트 생성
print(prompt_from_string_examples.format(adjective="큰"))
모든 입력에 대한 반의어를 입력하세요
입력: 밝은
출력: 어두운
입력: 재미있는
출력: 지루한
입력: 큰
출력:
4. SemanticSimilarityExampleSelector
의미적 유사성을 기반으로 예제를 선택하는 example selector
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.prompts import FewShotPromptTemplate
# 답변 예시 준비
examples = [
{"input": "밝은", "output": "어두운"},
{"input": "재미있는", "output": "지루한"},
{"input": "활기찬", "output": "무기력한"},
{"input": "높은", "output": "낮은"},
{"input": "빠른", "output": "느린"},
]
# 프롬프트 템플릿 생성
example_prompt = PromptTemplate(
input_variables=["input","output"],
template="입력: {input}\n출력: {output}",
)
# SemanticSimilarityExampleSelector 생성
example_selector = SemanticSimilarityExampleSelector.from_examples(
examples=examples, # 답변 예시
embeddings=OpenAIEmbeddings(), # 임베디드 생성 클래스
vectorstore_cls=FAISS, # 임베디드 유사 검색 클래스
k=3 # 답변 예시 개수
)
# FewShotPromptTemplate 생성
prompt_from_string_examples = FewShotPromptTemplate(
example_selector=example_selector, # ExampleSelector
example_prompt=example_prompt,
prefix="모든 입력에 대한 반의어를 입력하세요",
suffix="입력: {adjective}\n출력:",
input_variables=["adjective"],
example_separator="\n\n"
)
# 프롬프트 생성
print(prompt_from_string_examples.format(adjective="큰"))
모든 입력에 대한 반의어를 입력하세요
입력: 높은
출력: 낮은
입력: 재미있는
출력: 지루한
입력: 밝은
출력: 어두운
입력: 큰
출력:
6. MaxMarginalRelevanceExampleSelector
최대 한계 관련성을 기준으로 예제를 선택하는 example slector
from langchain.prompts.example_selector import MaxMarginalRelevanceExampleSelector
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.prompts import FewShotPromptTemplate
# 답변 예시 준비
examples = [
{"input": "밝은", "output": "어두운"},
{"input": "재미있는", "output": "지루한"},
{"input": "활기찬", "output": "무기력한"},
{"input": "높은", "output": "낮은"},
{"input": "빠른", "output": "느린"},
]
# 프롬프트 템플릿 생성
example_prompt = PromptTemplate(
input_variables=["input","output"],
template="입력: {input}\n출력: {output}",
)
# MaxMarginalRelevanceExampleSelector 생성
example_selector = MaxMarginalRelevanceExampleSelector.from_examples(
examples=examples, # 답변 예시
embeddings=OpenAIEmbeddings(), # 임베디드 생성 클래스
vectorstore_cls=FAISS, # 임베디드 유사 검색 클래스
k=3 # 답변 예시 개수
)
# FewShotPromptTemplate 준비
prompt_from_string_examples = FewShotPromptTemplate(
example_selector=example_selector,
example_prompt=example_prompt,
prefix="모든 입력에 대한 반의어를 입력하세요",
suffix="입력: {adjective}\n출력:",
input_variables=["adjective"],
example_separator="\n\n"
)
# 프롬프트 생성
print(prompt_from_string_examples.format(adjective="큰"))
모든 입력에 대한 반의어를 입력하세요
입력: 높은
출력: 낮은
입력: 재미있는
출력: 지루한
입력: 밝은
출력: 어두운
입력: 큰
출력:
Last updated