퓨-샷 프롬프트 템플릿
프롬프트에 상호작용 예제를 포함시키면 모델이 사용자의 의도를 더 잘 이해하고 더 나은 답변을 제공하거나 작업을 수행할 수 있도록 도와줍니다. 퓨-샷 프롬프트 템플릿은 새로운 입력을 처리하는 데 모델을 안내하기 위해 소수의 예제를 사용하는 것을 말합니다. 이러한 예제는 모델을 훈련시키는 데 사용될 수 있어서 비슷한 질문을 더 잘 이해하고 대답할 수 있게 해줍니다.
예시:
Q: 배트맨이 누구야?
A: 배트맨은 허구적인 만화 캐릭터야.
Q: 토르살플렉시티가 뭐야?
A: 알 수 없어.
Q: 언어 모델이 뭔데?
A:
모델에게 Q가 질문을, A가 답변을 나타내는 형식으로 상호작용하도록 말해주시고, 이 형식으로 상호작용해주세요.
다음은 랜체인에서 제공하는 도구 클래스에 대한 작은 상호작용 예제를 삽입할 수 있는 도구 클래스에 대한 설명입니다.
예제 집합 사용
예제 집합 생성
아래에 있는 examples
배열을 정의하세요. 이 배열은 Q&A 예제 세트를 포함합니다.
from langchain.prompts.few_shot import FewShotPromptTemplate
from langchain.prompts.prompt import PromptTemplate
examples = [
{
"question": "누구의 수명이 더 길어, 무함마드 알리 혹은 앨런 터링?",
"answer":
"""
질문에 대한 후속 조사가 필요한가: 예.
후속 질문: 무함마드 알리가 언제 죽었니?
중간 답변: 무함마드 알리는 죽을 때 74살이었어.
후속 질문: 앨런 터링이 언제 죽었니?
중간 답변: 앨런 터링은 죽을 때 41살이었어.
그러니 최종 답은: 무함마드 알리
"""
},
{
"question": "크레이그리스트의 창립자는 언제 태어났어?",
"answer":
"""
질문에 대한 후속 조사가 필요한가: 예.
후속 질문: 크레이그리스트의 창립자는 누구야?
중간 답변: 크레이그리스트는 크레이그 뉴마크에 의해 창립되었어.
후속 질문: 크레이그 뉴마크는 언제 태어났어?
중간 답변: 크레이그 뉴마크는 1952년 12월 6일에 태어났어.
그러니 최종 답은: 1952년 12월 6일
"""
},
{
"question": "조지 워싱턴의 조부모는 누구야?",
"answer":
"""
질문에 대한 후속 조사가 필요한가: 예.
후속 질문: 조지 워싱턴의 어머니는 누구야?
중간 답변: 조지 워싱턴의 어머니는 메리 볼 워싱턴이야.
후속 질문: 메리 볼 워싱턴의 아버지는 누구야?
중간 답변: 메리 볼 워싱턴의 아버지는 조셉 볼이야.
그러니 최종 답은: 조셉 볼
"""
},
{
"question": "'메가마인드'와 '007 카지노 로얄' 감독이 같은 나라에서 왔어?",
"answer":
"""
질문에 대한 후속 조사가 필요한가: 예.
후속 질문: '메가마인드'의 감독은 누구야?
중간 답변: '메가마인드'의 감독은 스티븐 스필버그야.
후속 질문: 스티븐 스필버그는 어디에서 왔어?
중간 답변: 미국.
후속 질문: '007 카지노 로얄'의 감독은 누구야?
중간 답변: '007 카지노 로얄'의 감독은 마틴 캠벨이야.
후속 질문: 마틴 캠벨은 어디에서 왔어?
중간 답변: 뉴질랜드.
그러니 최종 답은: 아니오
"""
}
]
작은 예제를 위한 포매터 생성
PromptTemplate
객체를 사용하여 예제를 간단히 프롬프트 템플릿에 삽입하세요.
example_prompt = PromptTemplate(input_variables=["question", "answer"], template="질문: {question}\\n{answer}")
print(example_prompt.format(**examples[0]))
결과:
Question: 누구의 수명이 더 길어, 무함마드 알리 혹은 앨런 터링?
질문에 대한 후속 조사가 필요한가: 예.
후속 질문: 무함마드 알리가 언제 죽었니?
중간 답변: 무함마드 알리는 죽을 때 74살이었어.
후속 질문: 앨런 터링이 언제 죽었니?
중간 답변: 앨런 터링은 죽을 때 41살이었어.
그러니 최종 답은: 무함마드 알리
### `FewShotPromptTemplate`를 사용하여 샘플 및 형식 제공
`FewShotPromptTemplate` 객체를 사용하면 샘플 콘텐츠를 대량으로 삽입할 수 있습니다.
```python
prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
suffix="질문: {input}",
input_variables=["input"]
)
print(prompt.format(input="조지 워싱턴의 아버지는 누구인가요?"))
결과:
질문: 누구의 평생이 더 길까요, 무하마드 알리 혹은 앨런 터링?
이 질문에 대한 후속 조치가 필요합니까?: 네.
후속 조치: 무하마드 알리는 언제 죽었나요?
중간 대답: 무하마드 알리는 죽을 때 74세였습니다.
후속 조치: 앨런 터링은 언제 죽었나요?
중간 대답: 앨런 터링은 죽을 때 41세였습니다.
그래서 최종 답은: 무하마드 알리
질문: 크레이그리스트의 창립자는 언제 태어났나요?
이 질문에 대한 후속 조치가 필요합니까?: 네.
후속 조치: 크레이그리스트의 창립자는 누구인가요?
중간 대답: 크레이그리스트는 크레이그 뉴마크에 의해 창립되었습니다.
후속 조치: 크레이그 뉴마크는 언제 태어났나요?
중간 대답: 크레이그 뉴마크는 1952년 12월 6일에 태어났습니다.
그래서 최종 답은: 1952년 12월 6일
질문: 조지 워싱턴의 조부모의 어머니는 누구인가요?
이 질문에 대한 후속 조치가 필요합니까?: 네.
후속 조치: 조지 워싱턴의 어머니는 누구인가요?
중간 대답: 조지 워싱턴의 어머니는 메리 볼 워싱턴입니다.
후속 조치: 메리 볼 워싱턴의 아버지는 누구인가요?
중간 대답: 메리 볼 워싱턴의 아버지는 조셉 볼입니다.
그래서 최종 답은: 조셉 볼
질문: "Jaws"와 "Casino Royale"의 감독은 같은 나라 출신인가요?
이 질문에 대한 후속 조치가 필요합니까?: 네.
후속 조치: "Jaws"의 감독은 누구인가요?
중간 대답: "Jaws"의 감독은 스티븐 스필버그입니다.
후속 조치: 스티븐 스필버그는 어디 출신인가요?
중간 대답: 미국입니다.
후속 조치: "Casino Royale"의 감독은 누구인가요?
중간 대답: "Casino Royale"의 감독은 마틴 캠벨입니다.
후속 조치: 마틴 캠벨은 어디 출신인가요?
중간 대답: 뉴질랜드입니다.
그래서 최종 답은: 아니요
질문: 조지 워싱턴의 아버지는 누구인가요?
샘플 셀렉터 사용하기
ExampleSelector
에 예시 제공
여기서는 이전 섹션의 예시 집합과 프롬프트 템플릿을 재사용합니다. 그러나 FewShotPromptTemplate
객체에 직접적으로 예시를 제공하여 모든 예시를 프롬프트에 삽입하는 대신, ExampleSelector
객체에 제공하고 일부 예시를 삽입합니다.
여기서는 SemanticSimilarityExampleSelector
클래스를 사용합니다. 이 클래스는 입력과 유사성에 기반하여 작은 샘플 예시를 선택합니다. 입력과 작은 샘플 예시 사이의 유사성을 계산하기 위해 임베딩 모델을 사용하고, 그러고 나서 벡터 데이터베이스를 사용하여 유사한 입력을 검색하고 가져옵니다.
- 참고: 이는 주로 데이터 유사성 검색을 위해 인공지능 분야에서 사용되는 벡터 연산 및 벡터 데이터베이스를 포함합니다. 유사한 기사 콘텐츠, 유사한 이미지, 비디오 등을 질의하는 데 사용됩니다. 여기서는 단순히 간단하게 이해하는 것으로 충분합니다.
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
example_selector = SemanticSimilarityExampleSelector.from_examples(
examples,
OpenAIEmbeddings(),
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}")
여기서 질문과 유사한 예시들이 매칭되고, 다음과 같이 반환됩니다:
Chroma을 직접적으로 로컬 API를 사용하여 실행 중입니다.
DuckDB 메모리에 있는 데이터를 직접 사용합니다. 데이터는 순간적입니다.
가장 유사한 예시: 조지 워싱턴의 조부모의 어머니는 누구인가요?
question: 조지 워싱턴의 어머니는 누구인가요?
answer:
이 질문에 대한 후속 조치가 필요합니까?: 네.
후속 조치: 조지 워싱턴의 어머니는 누구인가요?
중간 대답: 조지 워싱턴의 어머니는 메리 볼 워싱턴입니다.
후속 조치: 메리 볼 워싱턴의 아버지는 누구인가요?
중간 대답: 메리 볼 워싱턴의 아버지는 조셉 볼입니다.
그래서 최종 답은: 조셉 볼
FewShotPromptTemplate
에 대한 예시 선택기 제공
마지막으로, FewShotPromptTemplate
객체를 만듭니다. 이전 예시 선택기에서 가져온 예시를 기반으로, 질문과 유사한 예시를 선택합니다.
prompt = FewShotPromptTemplate(
example_selector=example_selector,
example_prompt=example_prompt,
suffix="질문: {input}",
input_variables=["input"]
)
print(prompt.format(input="조지 워싱턴의 아버지는 누구입니까?"))
결과:
질문: 조지 워싱턴의 조부모는 누구입니까?
이 질문에 대해 추가 질문이 필요한가요: 네.
추가 질문: 조지 워싱턴의 어머니는 누구입니까?
중간 답변: 조지 워싱턴의 어머니는 메리 볼 워싱턴입니다.
추가 질문: 메리 볼 워싱턴의 아버지는 누구입니까?
중간 답변: 메리 볼 워싱턴의 아버지는 조셉 볼입니다.
그러므로 최종 답변은: 조셉 볼
질문: 조지 워싱턴의 아버지는 누구입니까?