퓨-샷 프롬프트 템플릿

프롬프트에 상호작용 예제를 포함시키면 모델이 사용자의 의도를 더 잘 이해하고 더 나은 답변을 제공하거나 작업을 수행할 수 있도록 도와줍니다. 퓨-샷 프롬프트 템플릿은 새로운 입력을 처리하는 데 모델을 안내하기 위해 소수의 예제를 사용하는 것을 말합니다. 이러한 예제는 모델을 훈련시키는 데 사용될 수 있어서 비슷한 질문을 더 잘 이해하고 대답할 수 있게 해줍니다.

예시:

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="조지 워싱턴의 아버지는 누구입니까?"))

결과:

질문: 조지 워싱턴의 조부모는 누구입니까?

이 질문에 대해 추가 질문이 필요한가요: 네.
추가 질문: 조지 워싱턴의 어머니는 누구입니까?
중간 답변: 조지 워싱턴의 어머니는 메리 볼 워싱턴입니다.
추가 질문: 메리 볼 워싱턴의 아버지는 누구입니까?
중간 답변: 메리 볼 워싱턴의 아버지는 조셉 볼입니다.
그러므로 최종 답변은: 조셉 볼

질문: 조지 워싱턴의 아버지는 누구입니까?