오늘의 실습
저번글에서 기본적인 template사용법을 알아봤다면 이번에는 FewShotPrompt를 알아볼 것이다. 내가 원하는 형식의 답변을 끌어내고자 내가 먼저 특정 형식의 질문과 답안을 제시해 주고 최종 질문을 하는 방식이다.
FewShotPrompt
from langchain_core.prompts.few_shot import FewShotPromptTemplate
examples = [
{
"question": "메시와 호날두 중 누가 더 잘하는 축구선수인가요?",
"answer": """이 질문에 추가 질문이 필요한가요: 예.
추가 질문: 메시와 호날두 중 누가 더 많은 골을 넣었나요?
중간 답변: 메시는 2021년 10월 기준으로 672골을 넣었습니다.
추가 질문: 호날두는 몇 골을 넣었나요?
중간 답변: 호날두는 2021년 10월 기준으로 785골을 넣었습니다.
최종 답변은: 호날두"""
},
{
"question": "gpu와 cpu 중 누가 더 빠른가요?",
"answer": """이 질문에 추가 질문이 필요한가요: 예.
추가 질문: gpu와 cpu 중 누가 더 병렬처리에 유리한가요?
중간 답변: gpu는 병렬처리에 유리합니다.
추가 질문: cpu는 무엇에 유리한가요?
중간 답변: cpu는 단일 스레드 처리에 유리합니다.
최종 답변은: gpu"""
}
]
example_prompt = PromptTemplate.from_template(
"Question:\n{question}\nAnswer:\n{answer}"
)
prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
suffix="Question:\n{question}\nAnswer:",
input_variables=["question"],
)
# chain 생성
chain = prompt | llama | StrOutputParser()
# 결과 출력
answer = chain.stream(
{"question": "rtx3060ti와 rtx4090중 무엇이 떠 빠른가요?"}
)
stream_response(answer)
>> 이 질문에 추가 질문이 필요한가요: 예.
**추가 질문:**
- **성능 비교 기준은 무엇인가요?** (예: 게임 성능, 특정 벤치마크 점수 등)
**추가 질문에 따른 답변 예시:**
* **만약 게임 성능을 기준으로 한다면:**
- 중간 답변: RTX 4090이 일반적으로 더 높은 프레임 레이트와 더 뛰어난 그래픽 성능을 제공합니다.
- 최종 답변: **RTX 4090**이 더 빠릅니다.
* **특정 벤치마크 점수를 기준으로 한다면:**
- 중간 답변: 벤치마크 테스트 (예: 3DMark)에서 RTX 4090이 훨씬 높은 점수를 기록합니다.
- 최종 답변: **RTX 4090**이 더 빠릅니다.
더 구체적인 기준을 알려주시면 더욱 정확한 답변을 드릴 수 있습니다.
Example Selector
이때 만약 예제가 많다면, 이중 특정 예제를 선택해야 한다. 이를 `Example Selector`이라는 클래스가 담당한다.
여러 개의 예시에서 임베딩을 사용하여 사용자의 질문과 유사한 예시를 찾아 사용하는 방식이다.
여기서도 나는 OpenAI api가 없기 때문에 Ollama에서 embedding model을 따로 받아서 사용했다.
from langchain_ollama import OllamaEmbeddings
embeddings = OllamaEmbeddings(
model="nomic-embed-text",
base_url="http://localhost:7869",
)
from langchain_chroma import Chroma
# Vector DB 생성 (저장소 이름, 임베딩 클래스)
chroma = Chroma("example_selector", embeddings)
example_selector = SemanticSimilarityExampleSelector.from_examples(
examples,
embeddings,
Chroma,
k=1,
)
selected_examples = example_selector.select_examples({"question": question})
question = "Google과 Apple 중 더 큰 기업은?"
print(f"입력에 가장 유사한 예시:\n{question}\n")
for example in selected_examples:
print(f'question:\n{example["question"]}')
print(f'answer:\n{example["answer"]}')
좋은 임베딩 모델을 사용하면 유사한 예시를 참고하여 답변을 해주게 될 것이다. (영어에 특화된 임베딩 모델밖에 사용해보지 않아서 답변이 너무 이상하게 나왔음 ㅠ)
Prompt 다운로드
이러한 prompt를 자신이 직접 생성해도 되지만, 좋은 프롬프트들을 다운로드하여서 적용시킬 수도 있다. Langchain Hub에 다양한 프롬프트가 올라가 있고, repo아이디값과 commit id를 이용하여 특정 프롬프트의 버전을 다운로드할 수도 있다.
from langchain import hub
prompt = hub.pull("rlm/rag-prompt")
후기
오늘도 무작정 실습을 따라 했는데, 아직 VectorDB가 뭔지도 모르겠고, FewShotPrompt도 헷갈리긴 하는데 나중에 실습할 목차에 벡터디비와 임베딩 관련 챕터가 따로 있길래 우선 순서에 맞게 진행해보려고 한다.
그때 글을 작성한 후에 여기다가 링크를 걸어놔야겠다.
저작자: 테디노트 / <랭체인 LangChain 노트> - LangChain 한국어 튜토리얼 / (CC BY-NC-ND 2.0 KR)
728x90
반응형
'ML & DL > NLP' 카테고리의 다른 글
한 권으로 끝내는 랭체인 노트 따라하기 Day 3 - prompt (0) | 2024.12.23 |
---|---|
한 권으로 끝내는 랭체인 노트 따라하기 Day 2 - LCEL (0) | 2024.12.23 |
한 권으로 끝내는 랭체인 노트 따라하기 Day 1 (0) | 2024.12.23 |
한 권으로 끝내는 랭체인 노트 따라하기 Day 0 (0) | 2024.12.20 |
[패캠/NLP] BERT (0) | 2023.12.28 |