상세 컨텐츠

본문 제목

Langchain 과 Few-Shot 프롬프트 엔지니어링 (feat. OpenAI)

R&D

by devTak 2024. 7. 29. 14:50

본문

반응형

FewShow(퓨샷) 프롬프트 엔지니어링이란?

  • LLM 모델에 원하는 예제를 제공하는 프롬프트 엔지니어링 방식

종류

  • 제로 샷(0 Shot) : LLM 모델에게 예제를 제공하지 않는 방식
  • 원 샷(1 Shot) : LLM 모델에게 한개의 예제를 제공하는 방식
  • 퓨 샷(Few Shot) : LLM 모델에게 2개 이상의 예제를 제공하는 방식

RAG(Retrieval-Augmented Generation) 와의 차이점

  • RAG 는 LLM 모델에게 질의할 일종의 템플릿(가이드북)을 제공하는 형태로, RAG 데이터를 우선시하여, 질의에 대한 답변을 진행하는 방식
  • RAG 데이터와 달리, FewShot 은, 응답 데이터에 대한 Example 을 제공함으로써, 데이터 규격 형태의 대한 처리에 도움을 주는 방식

단점

  • Fewshot 은 다양한 예시를 전달하는 방법이지만, 그 한계가 있기 때문에 정확한 예시가 아니라면 만족할만한 응답값을 기대하기 어렵다.

예제코드

Example 데이터 준비

from langchain.prompts.few_shot import FewShotPromptTemplate
from langchain.prompts.prompt import PromptTemplate
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain_community.vectorstores import  Chroma
from langchain_openai import OpenAIEmbeddings
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import OpenAI

import sys
sys.path.append('/Users/jinwook/Documents/langchain/quick_start/')
from langchain_const import *

# 유저 인풋 값
user_input_text = "재료: 닭, 토마토, 우유, 밀가루, 팔각"

# 예제
examples = [
  {
    "input": "재료: 닭고기, 소금, 후추, 마늘",
    "output": "진욱 AI가 알려주는 레시피!!: 닭고기를 작은 조각으로 자릅니다. 소금과 후추로 간을 하고, 팬에 기름을 둘러 마늘을 볶습니다.마늘이 노릇해 지면 닭고기를 넣고 익을 때까지 볶습니다. 완성된 닭고기를 접시에 담아 냅니다."
  },
  {
    "input": "재료: 쌀, 당근",
    "output":"진욱 AI가 알려주는 레시피!!: 쌀을 불려서, 당근이랑 같이 볶아요"
  },
  {
    "input": "재료: 소고기, 토마토, 당근, 소금, 후추, 고추가루",
    "output":"진욱 AI가 알려주는 레시피!!: 소고기를 망치로 두드린다음, 얇게 펴서 후추를 뿌리고, 당근과 토마토를 다져서 고추가루와 함께 볶아요"
  },
  {
    "input": "재료: 레몬, 바닐라, 밀가루",
    "output":"진욱 AI가 알려주는 레시피!!: 밀가루를 반죽해서 빵으로 만든 다음, 레몬과 바닐라를 넣고 오븐에 구우면 완벽"
  },
  {
    "input": "재료: 닭고기, 파, 양파, 대추, 감자, 한약재",
    "output":"진욱 AI가 알려주는 레시피!!: 닭고기를 한번 물에 데친다음, 파, 양파를 반으로 잘라서 준비하고, 대추랑 감자를 넣고 푹 삶아주세요"
  },
]

 

예제 임베딩 : 좀 더 연관성이 있는 예제를 추출하기 위한 임베딩

from langchain.prompts.few_shot import FewShotPromptTemplate
from langchain.prompts.prompt import PromptTemplate
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain_community.vectorstores import  Chroma
from langchain_openai import OpenAIEmbeddings
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import OpenAI

import sys
sys.path.append('/Users/jinwook/Documents/langchain/quick_start/')
from langchain_const import *

# 예제 임베딩
example_selector = SemanticSimilarityExampleSelector.from_examples(
    # 선택한 example들 설정
    examples,
    # 유사한 임베딩값을 찾기 위한 임베딩 모델 설정
    OpenAIEmbeddings(openai_api_key=OPENAI_KEY),
    # vector store 설정
    Chroma,
    # 몇개의 가장 유사한 embedding을 찾을 것인지를 설정
    k=2
)

# 예제 연관성 조회
selected_examples = example_selector.select_examples({"input": user_input_text})

# 프롬프트 생성
example_prompt = PromptTemplate(
    input_variables=["input", "output"], 
    template="Input: {input}\nOutput: {output}"
)

 

임베딩된 예제 fewshot Template 생성

from langchain.prompts.few_shot import FewShotPromptTemplate
from langchain.prompts.prompt import PromptTemplate
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain_community.vectorstores import  Chroma
from langchain_openai import OpenAIEmbeddings
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import OpenAI

import sys
sys.path.append('/Users/jinwook/Documents/langchain/quick_start/')
from langchain_const import *

# Few Shot 프롬프트 구성
prompt = FewShotPromptTemplate(
    examples=selected_examples, 
    example_prompt=example_prompt,
    suffix="Input : {input}",
    input_variables=["input"],
)

LLM 질의

from langchain.prompts.few_shot import FewShotPromptTemplate
from langchain.prompts.prompt import PromptTemplate
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain_community.vectorstores import  Chroma
from langchain_openai import OpenAIEmbeddings
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import OpenAI

import sys
sys.path.append('/Users/jinwook/Documents/langchain/quick_start/')
from langchain_const import *

llm = OpenAI(api_key=OPENAI_KEY)

# Output Parser
parser = StrOutputParser()

# Chaining
chain = prompt | llm | parser

print(chain.invoke({"input": user_input_text}))
반응형

관련글 더보기