Post

LangChain 프롬프트 템플릿과 메시지 유형 활용하기

LangChain을 사용하여 프롬프트 템플릿과 다양한 메시지 유형을 활용하는 방법을 다룹니다. 이를 통해 일관된 형식의 프롬프트를 구성하고, 재사용 가능한 구조를 만들어 챗봇의 대화 품질을 향상시킬 수 있습니다.

LangChain 프롬프트 템플릿과 메시지 유형 활용하기

1. 프롬프트 템플릿이란?

프롬프트 템플릿(Prompt Template)은 LLM(Large Language Model)과 상호작용할 때, 일관된 형식으로 프롬프트를 구성하는 기능을 제공합니다. 이를 활용하면 재사용 가능한 프롬프트 구조를 만들고, 동적인 입력을 손쉽게 적용할 수 있습니다.

LangChain에서는 ChatPromptTemplate을 사용하여 다양한 메시지 유형을 포함하는 템플릿을 생성할 수 있습니다.

2. LangChain의 메시지 유형

LangChain에서는 프롬프트를 구성할 때 세 가지 주요 메시지 유형을 사용할 수 있습니다.

1. SystemMessage

  • LLM에게 특정한 역할을 부여하는 메시지
  • 예: 너는 코딩 전문가야. 사용자의 요청을 Python 코드로 변환해야 해.

2. HumanMessage

  • 사용자의 실제 입력을 전달하는 메시지
  • 예: A 함수를 작성해줘.

3. AIMessage

  • LLM이 출력하는 응답 메시지
  • 예: def A(x): ...

이러한 메시지 유형을 활용하면, 대화 이력을 유지하면서 더욱 자연스러운 대화를 생성할 수 있습니다.

3. ChatPromptTemplate을 활용한 프롬프트 구성

ChatPromptTemplate을 사용하면 SystemMessage, HumanMessage, AIMessage를 조합하여 더 구조화된 프롬프트를 만들 수 있습니다.

기본 예제

1
2
3
4
5
6
7
8
9
10
11
from langchain_core.prompts import ChatPromptTemplate

chat_template = ChatPromptTemplate.from_messages([
    ("system", "너의 이름은 {name}이고, 아주 귀여운 햄스터야. 모든 말을 햄으로 끝내."),
    ("human", "{name}아 잘 지냈어?"),
    ("ai", "잘 지냈햄. 너도 잘 지냈햄?"),
    ("human", "{user_input}"),
])

messages = chat_template.format_messages(name="햄식이", user_input="잘 지냈지.. 너 줄라고 해바라기씨 사왔어.")
print(messages)

설명:

  • system: 챗봇의 역할(햄스터 캐릭터 부여)
  • human: 사용자의 질문
  • ai: AI의 응답 패턴
  • {name}, {user_input}: 동적인 값이 적용될 자리

이렇게 프롬프트 템플릿을 만들면, 사용자 입력이 바뀌더라도 일관된 형식으로 메시지를 전달할 수 있습니다.

4. 다른 방식으로 프롬프트 템플릿 작성하기

LangChain에서는 프롬프트를 다양한 방식으로 작성할 수 있습니다. 아래는 SystemMessage, HumanMessagePromptTemplate을 활용한 예제입니다.

1
2
3
4
5
6
7
8
9
10
11
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.messages import SystemMessage
from langchain.prompts import HumanMessagePromptTemplate

chat_template = ChatPromptTemplate.from_messages([
    SystemMessage(content=("너의 이름은 {name}이고, 아주 귀여운 햄스터야. 모든 말을 햄으로 끝내.")),
    HumanMessagePromptTemplate.from_template("{user_input}"),
])

messages = chat_template.format_messages(name="햄식이", user_input="잘 지냈지.. 너 줄라고 해바라기씨 사왔어.")
print(messages)

이 방식의 장점:

  • SystemMessageHumanMessagePromptTemplate을 활용하면 보다 명확하게 메시지를 정의할 수 있음.
  • 다른 프롬프트 요소와 쉽게 결합 가능.

5. 프롬프트 템플릿 활용의 이점

일관성 유지

  • 동일한 역할을 부여하고, 정해진 형식으로 프롬프트를 구성할 수 있습니다.
  • 예를 들어, 특정 문체나 형식을 강제해야 하는 경우 유용합니다.

재사용성 증가

  • 다양한 사용자 입력을 처리할 수 있도록 템플릿을 구성하면, 여러 시나리오에서 쉽게 적용할 수 있습니다.

구조적 대화 설계 가능

  • SystemMessage를 통해 명확한 역할을 정의하고, 사용자 메시지를 효율적으로 처리할 수 있습니다.

6. 프롬프트 템플릿을 활용한 챗봇 구축

프롬프트 템플릿을 사용하여 챗봇을 만들면 더 효율적이고 정교한 대화를 구현할 수 있습니다. 아래는 ChatOpenAI 모델과 함께 프롬프트 템플릿을 활용하는 예제입니다.

1
2
3
4
5
6
7
8
9
10
11
from langchain_openai import ChatOpenAI

chat = ChatOpenAI(model_name="gpt-4o-mini")
chat_template = ChatPromptTemplate.from_messages([
    ("system", "너의 이름은 햄식이이고, 아주 귀여운 햄스터야. 모든 말을 햄으로 끝내."),
    ("human", "{user_input}"),
])

messages = chat_template.format_messages(user_input="햄식아 안녕!")
response = chat.invoke(messages)
print(response)

이 코드의 특징:

  • ChatPromptTemplate을 사용하여 시스템 메시지와 사용자 입력을 동적으로 구성
  • format_messages()를 활용하여 사용자 입력이 변경될 때마다 템플릿을 자동 적용

7. 마무리 및 요약

메시지 유형역할
SystemMessageLLM의 역할 및 기본 컨텍스트 설정
HumanMessage사용자의 입력을 전달
AIMessageLLM의 응답을 저장

프롬프트 템플릿 활용의 핵심 정리

  1. 일관된 구조 유지: 역할과 맥락을 고정하여 응답의 일관성을 높일 수 있음
  2. 재사용 가능: 다양한 대화 시나리오에서 활용 가능
  3. 구조적인 대화 구현 가능: 시스템 메시지를 활용하여 명확한 역할 부여

LangChain에서 프롬프트 템플릿을 적극 활용하면 더 정교하고 자연스러운 챗봇을 구축할 수 있습니다.

This post is licensed under CC BY 4.0 by the author.