[Langchain] 프롬프트 엔지니어링 (1) Few-Shot

Hunie_07·2025년 4월 9일
0

Langchain

목록 보기
21/35

📌 Prompt Engineering

1️⃣ Zero-Shot 프롬프팅

  • Zero-shot 프롬프팅은 예시 없이 AI가 즉시 작업을 수행하는 기법

  • 명확한 지시사항만으로 원하는 결과를 얻을 수 있어 사용이 간단

  • 단순하고 직관적인 작업에 적합한 프롬프팅 방식이지만, 작업의 복잡도에 따라 선택적 사용이 필요


LLM 모델 설정

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model='gpt-4o-mini',
    temperature=0.3,
    top_p=0.9
)

Zero-Shot 프롬프트

from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser

# Zero-shot 프롬프트 템플릿 생성
zero_shot_prompt = PromptTemplate(
    input_variables=["topic"],
    template="다음 시장에서 삼성전자의 경쟁업체를 설명해주세요: {topic}"
)

# 체인 생성
chain = zero_shot_prompt | llm | StrOutputParser()

# Zero-shot 실행
topic = "인공지능 반도체"
zero_shot_result = chain.invoke(input={"topic": topic}) 

print(zero_shot_result)

- 출력

삼성전자의 인공지능 반도체 시장에서의 경쟁업체는 여러 기업이 있으며, 이들은 각기 다른 기술과 제품을 통해 경쟁하고 있습니다. 주요 경쟁업체는 다음과 같습니다:

1. **NVIDIA**: NVIDIA는 그래픽 처리 장치(GPU) 분야에서 강력한 입지를 가지고 있으며, 인공지능 및 머신러닝 작업에 최적화된 GPU를 제공합니다. 특히, 데이터 센터와 클라우드 컴퓨팅 환경에서의 AI 연산에 강점을 가지고 있습니다.

2. **AMD**: AMD는 CPU와 GPU를 모두 제조하며, 인공지능 연산을 위한 고성능 프로세서를 개발하고 있습니다. 특히, AI 연산을 지원하는 Radeon GPU와 EPYC 서버 프로세서가 주목받고 있습니다.

3. **Google**: Google은 자체적으로 개발한 텐서 처리 장치(TPU)를 통해 인공지능 연산을 최적화하고 있습니다. TPU는 머신러닝 모델의 학습과 추론을 위한 전용 하드웨어로, Google Cloud Platform에서 제공됩니다.

4. **Intel**: Intel은 AI 연산을 위한 다양한 제품군을 보유하고 있으며, 특히 Xeon 프로세서와 Nervana Neural Network Processor를 통해 AI 시장에 진출하고 있습니다.

5. **Qualcomm**: Qualcomm은 모바일 기기에서의 AI 연산을 지원하는 Snapdragon 프로세서를 개발하고 있으며, IoT 및 엣지 컴퓨팅 분야에서도 AI 솔루션을 제공하고 있습니다.

6. **Amazon (AWS)**: Amazon은 자사의 클라우드 서비스인 AWS에서 AI 연산을 위한 다양한 서비스와 하드웨어를 제공하고 있으며, 이를 통해 인공지능 솔루션을 지원하고 있습니다.

이 외에도 여러 스타트업과 중소기업들이 인공지능 반도체 시장에 진입하고 있으며, 기술 발전과 시장 수요에 따라 경쟁이 치열해지고 있습니다. 삼성전자는 이러한 경쟁업체들과의 차별화를 위해 고성능, 저전력 소비, 그리고 다양한 응용 분야에 적합한 반도체 솔루션을 개발하는 데 집중하고 있습니다.

Zero-Shot 프롬프트 - 컨텍스트 제공

# Zero-shot 프롬프팅 - 컨텍스트(Context) 제공 
zero_shot_prompt = PromptTemplate(
    input_variables=["context", "topic"],
    template="""{topic} 시장에서 삼성전자의 경쟁업체를 설명해주세요. 
    반드시 다음 제시된 뉴스에 근거해서 답변하세요:

    [뉴스]
    {context}
    
    [답변]
    """
)

# 체인 생성
chain = zero_shot_prompt | llm | StrOutputParser()

# Zero-shot 실행
context = """삼성전자가 내년 초에 자체적으로 개발한 인공지능(AI) 가속기를 처음으로 출시할 예정이다. 
이는 AI 반도체 시장에서 지배적인 위치를 차지하고 있는 엔비디아의 독점을 도전하고, 
세계 최고의 반도체 제조업체로서의 지위를 다시 확립하려는 삼성전자의 노력으로 해석된다.
"""

topic = "인공지능 반도체"
zero_shot_result = chain.invoke(input={"context": context, "topic": topic})

print(zero_shot_result)

- 출력

삼성전자의 인공지능 반도체 시장에서의 주요 경쟁업체는 엔비디아입니다. 엔비디아는 AI 반도체 시장에서 지배적인 위치를 차지하고 있으며, 삼성전자가 자체적으로 개발한 AI 가속기를 출시함으로써 이들의 독점에 도전하고자 하는 의도를 가지고 있습니다. 삼성전자의 이러한 움직임은 세계 최고의 반도체 제조업체로서의 지위를 다시 확립하려는 노력의 일환으로 볼 수 있습니다. 따라서, 엔비디아는 삼성전자가 AI 가속기 시장에 진입함에 따라 가장 큰 경쟁자로 자리잡고 있습니다.

2️⃣ One-Shot 프롬프팅

  • One-shot 프롬프팅은 하나의 예시를 통해 AI가 작업 패턴을 학습하는 기법

  • Zero-shot 방식보다 더 나은 성능을 제공하며, 형식화된 작업에 특히 효과적

  • 단일 예시로 품질 향상이 가능하나, 해당 예시에 과의존할 수 있는 한계


One-Shot 프롬프트

### One-shot 프롬프트 템플릿 생성
# 1. Zero-shot 프롬프트 템플릿에 예시(example)를 포함하도록 수정
# 2. input_variables에 example_topic과 example_response 추가

from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser

one_shot_prompt = PromptTemplate(
    input_variables=["example_topic", "example_response", "topic"],
    template="""다음은 특정 시장에서 삼성전자의 경쟁업체를 설명하는 예시이다:

시장: {example_topic}
경쟁업체: {example_response}

이제 다음 시장에서 삼성전자의 경쟁업체를 설명해주세요:
시장: {topic}"""
)

# Example 데이터 설정
example_topic = "스마트폰"
example_response = """애플: 프리미엄 시장에서 주요 경쟁사로, iPhone 시리즈로 경쟁
샤오미: 중저가 시장에서 강세를 보이며 글로벌 시장 점유율 확대
구글: Pixel 시리즈로 프리미엄 시장 진출, AI 기능 강조"""

1. PromptTemplate 그대로 사용

# one_shot_prompt 적용한 체인 생성
chain = one_shot_prompt | llm | StrOutputParser()

# One-shot 실행
topic = "인공지능 반도체"
one_shot_result = chain.invoke(
    input={
        "example_topic": example_topic,
        "example_response": example_response,
        "topic": topic
    }
)

print(f"one_shot_result:")
print(one_shot_result)

- 출력

one_shot_result:
시장: 인공지능 반도체  
경쟁업체:  
1. **NVIDIA**: AI 연산에 최적화된 GPU를 제공하며, 자율주행차 및 데이터 센터 등 다양한 분야에서 강력한 입지를 보유하고 있음. 특히, 딥러닝 및 머신러닝 모델 학습에 필수적인 하드웨어를 공급함.  
2. **AMD**: 고성능 CPU와 GPU를 통해 AI 연산에 필요한 처리 능력을 제공하며, 특히 데이터 센터와 게임 분야에서 경쟁력을 갖추고 있음. AI 전용 아키텍처인 MI 시리즈를 통해 시장에 진입하고 있음.  
3. **Google**: TPU(Tensor Processing Unit)를 개발하여 AI 모델의 학습과 추론을 가속화하는 데 주력하고 있으며, 클라우드 기반 AI 서비스와 함께 자사 데이터 센터에서 활용하고 있음.  
4. **Intel**: Xeon 프로세서와 AI 전용 하드웨어인 Nervana를 통해 AI 반도체 시장에 진출하고 있으며, 데이터 분석 및 머신러닝을 위한 솔루션을 제공하고 있음.  
5. **Graphcore**: AI 전용 프로세서인 IPU(Intelligence Processing Unit)를 개발하여 머신러닝과 AI 연구에 특화된 성능을 제공하며, 스타트업으로서 빠르게 성장하고 있음.

2. Partial 메소드 사용

# Example 데이터를 반영한 부분 프롬프트 출력 
partial_prompt = one_shot_prompt.partial(
    example_topic=example_topic,
    example_response=example_response,
)

print(f"partial_prompt:")
print(partial_prompt)
print('-'*100)
# 체인 생성
chain = partial_prompt | llm | StrOutputParser()

# One-shot 실행
topic = "인공지능 반도체"
one_shot_result = chain.invoke(input={"topic": topic})

print(f"one_shot_result:")
print(one_shot_result)

- 출력

partial_prompt:
input_variables=['topic'] input_types={} partial_variables={'example_topic': '스마트폰', 'example_response': '애플: 프리미엄 시장에서 주요 경쟁사로, iPhone 시리즈로 경쟁\n샤오미: 중저가 시장에서 강세를 보이며 글로벌 시장 점유율 확대\n구글: Pixel 시리즈로 프리미엄 시장 진출, AI 기능 강조'} template='다음은 특정 시장에서 삼성전자의 경쟁업체를 설명하는 예시이다:\n\n시장: {example_topic}\n경쟁업체: {example_response}\n\n이제 다음 시장에서 삼성전자의 경쟁업체를 설명해주세요:\n시장: {topic}'
----------------------------------------------------------------------------------------------------
one_shot_result:
시장: 인공지능 반도체  
경쟁업체: 

1. **NVIDIA**: GPU 기반의 인공지능 연산에 강점을 가진 기업으로, 데이터 센터 및 자율주행차와 같은 다양한 분야에서 AI 솔루션을 제공. 최근에는 AI 전용 칩인 Hopper 아키텍처를 통해 더욱 전문화된 제품 라인을 강화하고 있음.

2. **AMD**: CPU와 GPU를 모두 제공하는 기업으로, AI 연산을 위한 고성능 프로세서를 개발하고 있으며, 특히 머신러닝과 딥러닝 작업에 적합한 제품을 출시하고 있음. AI 연산에 최적화된 Radeon Instinct 시리즈로 시장에서 입지를 다지고 있음.

3. **Google**: Tensor Processing Unit (TPU)라는 AI 전용 반도체를 개발하여 클라우드 기반의 머신러닝 작업을 최적화하고 있음. Google Cloud Platform을 통해 TPU를 제공하며, AI 연구 및 개발에 큰 영향을 미치고 있음.

4. **Intel**: AI와 머신러닝을 위한 다양한 반도체 솔루션을 제공하고 있으며, Nervana 및 Movidius와 같은 AI 전용 칩을 통해 시장에서 경쟁력을 유지하고 있음. 데이터 센터와 엣지 컴퓨팅을 아우르는 포괄적인 AI 전략을 추진하고 있음. 

이와 같은 경쟁업체들은 각각의 강점을 바탕으로 인공지능 반도체 시장에서 삼성전자와 경쟁하고 있습니다.

3️⃣ Few-Shot 프롬프팅

  • Few-shot 프롬프팅은 AI 모델에게 2-5개의 예시를 제공하여 학습시키는 방법

  • 이 방식은 Zero-shot이나 One-shot 프롬프팅보다 더 우수한 성능을 보여주며, 복잡한 작업에서 특히 효과적

  • Few-shot 프롬프팅은 높은 성능을 제공하지만, 긴 프롬프트로 인한 비용 증가를 고려해야 함


1. PromptTemplate 사용

from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser

# Few-shot 프롬프트 템플릿 생성 
few_shot_prompt = PromptTemplate(
   input_variables=["examples", "topic"],
   template="""다음은 여러 시장에서 삼성전자의 경쟁업체를 설명하는 예시들이다:

{examples}

이제 다음 시장에서 삼성전자의 경쟁업체를 설명해주세요:
시장: {topic}"""
)

# Example 데이터 준비
examples = """
시장: 스마트폰
경쟁업체: 
- 애플(미국): 프리미엄 시장 주도, iPhone으로 경쟁
- 샤오미(중국): 중저가 시장 강세, 글로벌 확장중
- 구글(미국): Pixel로 AI 기능 강조

시장: TV
경쟁업체:
- LG전자(한국): OLED 기술 경쟁
- Sony(일본): 프리미엄 시장 경쟁
- TCL(중국): 중저가 시장 공략
"""

# 체인 생성 및 실행
chain = few_shot_prompt | llm | StrOutputParser()
result = chain.invoke({
   "examples": examples,
   "topic": "인공지능 반도체"
})

print(result)

- 출력

시장: 인공지능 반도체  
경쟁업체:  
- NVIDIA(미국): GPU 기반의 AI 연산에 강점을 가지며, 데이터 센터 및 자율주행차 시장에서 주요 공급업체로 자리잡음.  
- AMD(미국): CPU와 GPU를 통합한 제품으로 AI 연산에 최적화된 솔루션을 제공하며, 경쟁력 있는 가격으로 시장 점유율 확대 중.  
- 구글(미국): TPU(Tensor Processing Unit)를 개발하여 클라우드 AI 서비스에 최적화된 반도체 솔루션을 제공하며, 자사 AI 생태계에서 큰 역할을 하고 있음.  
- 인텔(미국): Xeon 프로세서와 AI 전용 칩을 통해 데이터 센터 및 엣지 컴퓨팅 시장에서 AI 연산을 지원하고 있음.  
- 하이실리콘(중국): AI 칩을 포함한 다양한 반도체 솔루션을 개발하여 중국 내 AI 시장에서 경쟁력을 강화하고 있음.

2. Partial 메소드 사용

# partial 메서드를 사용하여 Few-shot 프롬프트 템플릿 생성
partial_prompt = few_shot_prompt.partial(
    examples=examples
)

print(f"partial_prompt:")
print(partial_prompt)

- 출력

partial_prompt:
input_variables=['topic'] input_types={} partial_variables={'examples': '\n시장: 스마트폰\n경쟁업체: \n- 애플(미국): 프리미엄 시장 주도, iPhone으로 경쟁\n- 샤오미(중국): 중저가 시장 강세, 글로벌 확장중\n- 구글(미국): Pixel로 AI 기능 강조\n\n시장: TV\n경쟁업체:\n- LG전자(한국): OLED 기술 경쟁\n- Sony(일본): 프리미엄 시장 경쟁\n- TCL(중국): 중저가 시장 공략\n'} template='다음은 여러 시장에서 삼성전자의 경쟁업체를 설명하는 예시들이다:\n\n{examples}\n\n이제 다음 시장에서 삼성전자의 경쟁업체를 설명해주세요:\n시장: {topic}'
# 체인 생성
chain = partial_prompt | llm | StrOutputParser()

# Few-shot 실행
topic = "인공지능 반도체"
few_shot_result = chain.invoke(input={"topic": topic})

print(f"few_shot_result:")
print(few_shot_result)

- 출력

few_shot_result:
시장: 인공지능 반도체  
경쟁업체:  
- NVIDIA(미국): GPU 기반의 AI 처리 성능 강세, 데이터 센터와 자율주행차 시장에서 주요 플레이어  
- 인텔(미국): AI 전용 칩인 Nervana와 Habana Labs 인수로 AI 시장 진출, 데이터 센터 및 엣지 컴퓨팅에 집중  
- AMD(미국): 고성능 GPU와 CPU를 통해 AI 연산 성능 강화, 머신러닝 및 데이터 분석 시장에서 경쟁  
- 구글(미국): TPU(Tensor Processing Unit)를 통해 클라우드 AI 서비스 및 머신러닝 최적화에 주력  
- 바이두(중국): AI 칩인 Kunlun을 개발하여 자율주행 및 클라우드 AI 서비스에 활용

3. FewShotChatMessagePromptTemplate 사용

  • FewShotChatMessagePromptTemplate는 LangChain에서 제공하는 템플릿으로, 미리 정의된 고정된 예제들(Fixed Examples) 을 프롬프트에 포함시켜 모델이 일관된 형식과 품질의 응답을 생성하도록 도움

  • 이 방식은 특히 특정 형식이나 구조를 가진 출력이 필요한 경우(예: JSON 형식, 특정 분석 리포트 형식 등) 매우 유용하며, 예제들이 고정되어 있어 결과의 일관성을 보장

  • 단, 고정된 예제를 사용하기 때문에 상황에 따라 유연하게 대응하기 어려울 수 있으며, 모든 케이스를 커버하기 위해서는 신중한 예제 선택이 필요

from langchain_core.prompts import ChatPromptTemplate, FewShotChatMessagePromptTemplate
from textwrap import dedent # text의 모든 줄에서 같은 선행 공백을 제거하는 함수

# 예시 데이터 정의 : 뉴스 텍스트(input) + 키워드 추출 결과 (output)
examples = [
    {
        "input": dedent("""
                        정부는 의과대학 입학 정원을 2000명 증가시킬 계획의 세부사항을 이달 20일에 공개할 예정이다. 
                        지역별 의료 서비스 향상과 소규모 의과대학의 발전을 목표로, 지역 중심의 국립대학 및 소형 의과대학의 
                        입학 정원이 최소한 두 배 가량 확대될 것으로 보인다.
                        """),
        "output": "의대 | 정원 | 확대"
    },
    {
        "input": dedent("""
                        세계보건기구(WHO)는 최근 새로운 건강 위기에 대응하기 위해 국제 협력의 중요성을 강조했다. 
                        전염병 대응 역량의 강화와 글로벌 보건 시스템의 개선이 필요하다고 발표했다.
                        """),
        "output": "세계보건기구 | 건강위기 | 국제"
    }
]

# 각 예시를 포맷팅할 프롬프트 템플릿
example_prompt = ChatPromptTemplate.from_messages([
    ("human", "{input}"),
    ("assistant", "{output}")
])

# Few-shot 프롬프트 템플릿 생성
few_shot_prompt = FewShotChatMessagePromptTemplate(
    example_prompt=example_prompt,      # 예시 포맷팅 템플릿
    examples=examples                   # 예시 데이터 리스트 -> 예시 포맷팅 템플릿에 적용
)

pprint(few_shot_prompt.invoke({}).to_messages())

- 출력

[HumanMessage(content='\n정부는 의과대학 입학 정원을 2000명 증가시킬 계획의 세부사항을 이달 20일에 공개할 예정이다. \n지역별 의료 서비스 향상과 소규모 의과대학의 발전을 목표로, 지역 중심의 국립대학 및 소형 의과대학의 \n입학 정원이 최소한 두 배 가량 확대될 것으로 보인다.\n', additional_kwargs={}, response_metadata={}),
 AIMessage(content='의대 | 정원 | 확대', additional_kwargs={}, response_metadata={}),
 HumanMessage(content='\n세계보건기구(WHO)는 최근 새로운 건강 위기에 대응하기 위해 국제 협력의 중요성을 강조했다. \n전염병 대응 역량의 강화와 글로벌 보건 시스템의 개선이 필요하다고 발표했다.\n', additional_kwargs={}, response_metadata={}),
 AIMessage(content='세계보건기구 | 건강위기 | 국제', additional_kwargs={}, response_metadata={})]

최종 프롬프트 템플릿 생성

# 최종 프롬프트 템플릿 생성
final_prompt = ChatPromptTemplate.from_messages([
   ("system", "당신은 뉴스 텍스트에서 핵심 키워드 3개를 추출하는 전문가입니다."),
   few_shot_prompt,
   ("human", "{input}")
])

# 프롬프트 템플릿 출력
pprint(final_prompt.invoke({"input": "뉴스 기사입니다"}).to_messages())

- 출력

[SystemMessage(content='당신은 뉴스 텍스트에서 핵심 키워드 3개를 추출하는 전문가입니다.', additional_kwargs={}, response_metadata={}),
 HumanMessage(content='\n정부는 의과대학 입학 정원을 2000명 증가시킬 계획의 세부사항을 이달 20일에 공개할 예정이다. \n지역별 의료 서비스 향상과 소규모 의과대학의 발전을 목표로, 지역 중심의 국립대학 및 소형 의과대학의 \n입학 정원이 최소한 두 배 가량 확대될 것으로 보인다.\n', additional_kwargs={}, response_metadata={}),
 AIMessage(content='의대 | 정원 | 확대', additional_kwargs={}, response_metadata={}),
 HumanMessage(content='\n세계보건기구(WHO)는 최근 새로운 건강 위기에 대응하기 위해 국제 협력의 중요성을 강조했다. \n전염병 대응 역량의 강화와 글로벌 보건 시스템의 개선이 필요하다고 발표했다.\n', additional_kwargs={}, response_metadata={}),
 AIMessage(content='세계보건기구 | 건강위기 | 국제', additional_kwargs={}, response_metadata={}),
 HumanMessage(content='뉴스 기사입니다', additional_kwargs={}, response_metadata={})]

키워드 추출 체인 생성 및 실행

# 키워드 추출 체인 생성
chain = final_prompt | llm | StrOutputParser()

# 키워드 추출 체인 실행
result = chain.invoke({
   "input": dedent("""삼성전자가 내년 초에 자체적으로 개발한 인공지능(AI) 가속기를 처음으로 출시할 예정이다. 
                   이는 AI 반도체 시장에서 지배적인 위치를 차지하고 있는 엔비디아의 독점을 도전하고, 
                   세계 최고의 반도체 제조업체로서의 지위를 다시 확립하려는 삼성전자의 노력으로 해석된다.""")
})

print(result)

- 출력

삼성전자 | 인공지능 | 반도체

4. Dynamic Few-Shot Prompting

  • Dynamic Few-Shot Prompting은 상황에 따라 적절한 예시를 동적으로 선택하여 사용하는 고급 프롬프팅 기법으로, BaseExampleSelector를 통해 입력값과 가장 연관성이 높은 예시들을 자동으로 선별합니다.

  • 대표적으로 SemanticSimilarityExampleSelector는 의미적 유사도를 기반으로 예시를 선택하며, 이를 통해 주어진 입력 상황에 가장 적합한 예시들만을 효율적으로 활용할 수 있습니다.

  • example_prompt를 통해 선택된 예시들을 AI 시스템이 이해하기 쉬운 형태(예: human-AI 대화 , human-function call)로 변환하여 더 효과적인 학습과 응답 생성이 가능하게 합니다.

  • 장점

    • 상황에 맞는 가장 연관성 높은 예시만을 선택적으로 활용할 수 있다
    • 프롬프트의 길이를 효율적으로 관리할 수 있다
    • 응답의 일관성과 품질을 향상시킬 수 있다

from langchain_openai import OpenAIEmbeddings
from langchain_core.vectorstores import InMemoryVectorStore # type: ignore

# 고객 문의 유형별 응대 예시를 준비
examples = [
    {
        "input": "환불 절차가 어떻게 되나요?",
        "output": "환불 절차는 다음과 같습니다:\n1. 구매내역에서 환불을 신청해주세요\n2. 반품 상품을 발송해주세요\n3. 상품 검수 후 3-5일 내 환불이 완료됩니다"
    },
    {
        "input": "배송이 늦어지고 있어요", 
        "output": "불편을 드려 죄송합니다. 주문번호를 알려주시면 배송 상태를 즉시 확인해드리겠습니다."
    },
    {
        "input": "옷 사이즈가 안 맞아요",
        "output": "사이즈 교환은 무료로 진행됩니다. 교환 신청 후 동일 상품의 다른 사이즈로 발송해드리겠습니다."
    },
    {
        "input": "제품이 불량이에요",
        "output": "불편을 드려 대단히 죄송합니다. 불량 부분 사진과 함께 1:1 문의에 접수해주시면 빠르게 처리해드리겠습니다."
    }
]

# 예시 데이터를 벡터화할 텍스트로 변환
to_vectorize = [" ".join(example.values()) for example in examples]

# Ollama 임베딩 모델 생성
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

# 벡터 스토어 생성
vector_store = InMemoryVectorStore.from_texts(
    to_vectorize,    # 벡터화할 텍스트 리스트
    embeddings,      # 임베딩 모델
    metadatas=examples    # 메타데이터: 예시 데이터
    )

# VectorStore에 저장된 Document 개수 확인
print(f"VectorStore에 저장된 Document 개수: {len(vector_store.store.keys())}")

- 출력

VectorStore에 저장된 Document 개수: 4

의미적 유사도 기반 예제 셀렉터 생성

from langchain_core.example_selectors import SemanticSimilarityExampleSelector

# 유사한 2개의 예시를 선택하는 selector 생성
example_selector = SemanticSimilarityExampleSelector(
    vectorstore=vector_store,
    k=2
)

# 선택된 예시 확인
selected_examples = example_selector.select_examples({"input":"상품이 파손되어 왔어요"})
pprint(selected_examples)

- 출력

[{'input': '제품이 불량이에요',
  'output': '불편을 드려 대단히 죄송합니다. 불량 부분 사진과 함께 1:1 문의에 접수해주시면 빠르게 처리해드리겠습니다.'},
 {'input': '환불 절차가 어떻게 되나요?',
  'output': '환불 절차는 다음과 같습니다:\n'
            '1. 구매내역에서 환불을 신청해주세요\n'
            '2. 반품 상품을 발송해주세요\n'
            '3. 상품 검수 후 3-5일 내 환불이 완료됩니다'}]

프롬프트 템플릿 생성

# 챗봇 프롬프트 템플릿 생성
few_shot_prompt = FewShotChatMessagePromptTemplate(
   input_variables=["input"],
   example_selector=example_selector,
   example_prompt=ChatPromptTemplate.from_messages([
       ("human", "{input}"),
       ("assistant", "{output}")
   ])
)

pprint(few_shot_prompt.invoke({"input": "상품이 파손되어 왔어요"}).to_messages())

- 출력

[HumanMessage(content='제품이 불량이에요', additional_kwargs={}, response_metadata={}),
 AIMessage(content='불편을 드려 대단히 죄송합니다. 불량 부분 사진과 함께 1:1 문의에 접수해주시면 빠르게 처리해드리겠습니다.', additional_kwargs={}, response_metadata={}),
 HumanMessage(content='환불 절차가 어떻게 되나요?', additional_kwargs={}, response_metadata={}),
 AIMessage(content='환불 절차는 다음과 같습니다:\n1. 구매내역에서 환불을 신청해주세요\n2. 반품 상품을 발송해주세요\n3. 상품 검수 후 3-5일 내 환불이 완료됩니다', additional_kwargs={}, response_metadata={})]

최종 프롬프트 생성

# 최종 프롬프트 생성 
final_prompt = ChatPromptTemplate.from_messages([
    ("system", "당신은 친절하고 전문적인 고객 서비스 담당자입니다."),
    few_shot_prompt,
    ("human", "{input}")
])

pprint(final_prompt.invoke({"input": "상품이 파손되어 왔어요"}).to_messages())

- 출력

[SystemMessage(content='당신은 친절하고 전문적인 고객 서비스 담당자입니다.', additional_kwargs={}, response_metadata={}),
 HumanMessage(content='제품이 불량이에요', additional_kwargs={}, response_metadata={}),
 AIMessage(content='불편을 드려 대단히 죄송합니다. 불량 부분 사진과 함께 1:1 문의에 접수해주시면 빠르게 처리해드리겠습니다.', additional_kwargs={}, response_metadata={}),
 HumanMessage(content='환불 절차가 어떻게 되나요?', additional_kwargs={}, response_metadata={}),
 AIMessage(content='환불 절차는 다음과 같습니다:\n1. 구매내역에서 환불을 신청해주세요\n2. 반품 상품을 발송해주세요\n3. 상품 검수 후 3-5일 내 환불이 완료됩니다', additional_kwargs={}, response_metadata={}),
 HumanMessage(content='상품이 파손되어 왔어요', additional_kwargs={}, response_metadata={})]

챗봇 체인 생성 및 실행

# 챗봇 체인 생성
chain = final_prompt | llm | StrOutputParser()

# 체인 실행
response = chain.invoke({
    "input": "상품이 파손되어 왔어요"
})

pprint(response)

- 출력

('상품이 파손되어 도착했다니 정말 죄송합니다. 불편을 드려서 안타깝습니다. \n'
 '\n'
 '1. 파손된 부분의 사진을 찍어주세요.\n'
 '2. 고객센터에 문의하시거나 1:1 문의를 통해 사진과 함께 상황을 설명해주시면, 신속하게 교환이나 환불 절차를 안내해드리겠습니다.\n'
 '\n'
 '빠른 해결을 위해 최선을 다하겠습니다. 감사합니다.')

0개의 댓글