본문 바로가기
Data Analysis/AI

LLM - LangChain에서 Prompt Template을 어떻게 활용하고 구성할 수 있는지

by Hagrid 2025. 1. 15.
반응형

들어가며

최근 생성형 AI 서비스의 대두로, LLM(Large Language Model)을 활용한 애플리케이션이 폭발적으로 증가하고 있습니다. 사용자는 단순히 "이 질문에 답해줘"가 아닌, 좀 더 구체적이고 세심한 "프롬프트(prompt)"를 통해 원하는 정보를 얻어내곤 합니다.

그렇다면 이런 프롬프트를 체계적으로 다루고, 상황에 맞추어 동적으로 생성하는 방법은 없을까요? 이러한 문제를 해결하기 위해, LangChain은 다양한 구성 요소와 모듈을 제공하며 특히, PromptTemplate은 LLM과의 상호작용에 핵심적인 역할을 합니다.

이번 포스팅에서는 LangChain에서 제공하는 PromptTemplate을 중점적으로 살펴보며, 어떻게 정의하고, 어떻게 사용하는지를 소개해드리려 합니다.


PromptTemplate이란 무엇인가?

PromptTemplate이란 말 그대로 “프롬프트 템플릿”입니다. LLM에게 질의할 때 사용하는 텍스트 문자열에 변수를 삽입하거나, 혹은 상황별로 다른 문장을 합쳐서 하나의 거대한 문맥(Context)을 만들어낼 때 활용됩니다.

간단히 이야기하면,

  • LLM에 전달할 기본적인 텍스트 패턴을 정해 두고
  • 함수 또는 코드에서 동적으로 변수를 받아
  • 최종적으로 하나의 완전한 문장(프롬프트)으로 만들어내는 것입니다.

예를 들어, ChatGPT에 질문을 할 때 “Write me a short story about X in the style of Y” 같은 패턴이 있다면, X와 Y만 다르게 전달하여 여러 가지 스타일의 글을 써 달라고 요청할 수 있습니다.


LangChain에서의 PromptTemplate 사용 방법

1. 설치

LangChain을 사용하기 위해서는 먼저 pip으로 패키지를 설치해야 합니다.

pip install langchain openai
  • langchain: 프롬프트 체이닝, 메모리, 에이전트 등 다양한 기능을 제공
  • openai: OpenAI API 접근에 필요한 라이브러리

2. 기본 예시

LangChain에서 가장 기본적인 PromptTemplate 사용 예시를 보겠습니다.

from langchain.prompts import PromptTemplate

template = """아래의 내용을 요약해 주세요:
{content}
"""

prompt = PromptTemplate(
    input_variables=["content"],
    template=template
)

# 템플릿 내에 content 변수를 전달하여 완성된 문자열 출력
final_prompt = prompt.format(content="LangChain은 LLM을 효과적으로 활용하기 위한 프레임워크로, ...")
print(final_prompt)

  • template: 최종 프롬프트의 뼈대. {content} 부분에는 나중에 동적으로 내용이 들어갑니다.
  • input_variables: 템플릿 안에서 사용할 변수 이름들을 리스트로 명시합니다.
  • prompt.format(): 실제로 변수를 전달하여 문자열을 완성합니다.

이렇게 하면, 마지막에 final_prompt 변수에는 아래와 같은 텍스트가 생성됩니다.

아래의 내용을 요약해 주세요: LangChain은 LLM을 효과적으로 활용하기 위한 프레임워크로, ...

3. 템플릿 내 여러 변수 사용하기

PromptTemplate에서는 여러 변수를 동시에 사용할 수도 있습니다.


from langchain.prompts import PromptTemplate

template = """다음 글을 대상으로 {action}해주세요:
---
제목: {title}
내용: {content}
---
"""
prompt = PromptTemplate(
    input_variables=["action", "title", "content"],
    template=template
)

formatted_prompt = prompt.format(
    action="문맥에 맞게 번역", 
    title="LangChain 소개", 
    content="LangChain은 다양한 Language Model을 연결하고 활용할 수 있도록..."
)

print(formatted_prompt)

이렇게 하면,


다음 글을 대상으로 문맥에 맞게 번역해주세요: \--- 제목: LangChain 소개 내용: LangChain은 다양한 Language Model을 연결하고 활용할 수 있도록... \---

와 같은 최종 프롬프트 문자열이 만들어집니다.


4. Jinja2 스타일 템플릿 지원

LangChain은 기본적으로 Python의 문자열 포매팅(str.format) 방식을 채택하고 있습니다. 하지만 Jinja2와 같은 템플릿 엔진을 좀 더 익숙하게 쓰는 분들도 있을 텐데요. LangChain은 prompt templating을 위해 Jinja2도 지원합니다.

아래 예시는 Jinja2 기반의 템플릿을 사용하는 방식입니다.


from langchain.prompts import PromptTemplate

template = """다음 글을 대상으로 {action}해주세요:
---
제목: {title}
내용: {content}
---
"""
prompt = PromptTemplate(
    input_variables=["action", "title", "content"],
    template=template
)

formatted_prompt = prompt.format(
    action="문맥에 맞게 번역", 
    title="LangChain 소개", 
    content="LangChain은 다양한 Language Model을 연결하고 활용할 수 있도록..."
)

print(formatted_prompt)

이와 같이 Jinja2 템플릿을 활용하면, 조건문, 반복문 등 좀 더 풍부한 템플릿 문법을 사용해 복잡한 프롬프트를 만들어낼 수 있습니다.


PromptTemplate 활용 사례

1. 채팅 스타일(Chat Completion) 프롬프트

ChatGPT나 다른 Chat Completion 모델을 사용할 때는 role과 content가 조합된 프롬프트를 작성해야 합니다. LangChain에서는 PromptTemplate을 이용해 메시지를 여러 개 만들어낼 수 있도록 도와주기도 합니다.



from langchain.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate

system_template = """당신은 {domain} 분야의 전문가입니다."""
human_template = """{question}"""

system_prompt = SystemMessagePromptTemplate.from_template(system_template)
human_prompt = HumanMessagePromptTemplate.from_template(human_template)

chat_prompt = ChatPromptTemplate.from_messages([system_prompt, human_prompt])

formatted_prompts = chat_prompt.format_prompt(domain="인공지능", question="LangChain의 핵심 모듈들을 알려주세요.")
print(formatted_prompts.to_messages())

이 코드를 실행하면, 아래와 같이 System 메시지와 Human 메시지가 포함된 리스트가 생성됩니다.




\[ AIMessage(role='system', content='당신은 인공지능 분야의 전문가입니다.'), AIMessage(role='user', content='LangChain의 핵심 모듈들을 알려주세요.')\]

이 메시지 리스트를 LLM에 전달하여 채팅 형태의 응답을 받을 수 있습니다.


2. 상황별 프롬프트 생성

어떠한 상황에서든 예측 가능한 구조와 흐름을 갖춘 프롬프트를 자동으로 만들어야 하는 경우가 있습니다. 이를테면 뉴스 기사를 요약할 때와, 법률 문서를 요약할 때의 요청 방식이 달라야 할 수 있습니다.
PromptTemplate을 여러 개 두고, 상황에 맞추어 서로 다른 템플릿을 선택하여 사용할 수 있습니다.

예를 들어, NewsPromptTemplate, LegalPromptTemplate 이렇게 두 가지 템플릿을 정의해 두고, 사용자가 선택한 카테고리에 맞추어 호출하도록 만들면 됩니다. 이를 통해 코드를 분리하고 재사용성을 높일 수 있습니다.


3. 확장된 프롬프트 엔지니어링

프롬프트 엔지니어링을 하다 보면, 단순히 “요약”이 아니라 다음과 같은 요구 사항이 발생할 수 있습니다.

  1. 텍스트를 한국어와 영어 두 가지 언어로 요약
  2. 표 형식으로 결과를 정리
  3. 주어진 맥락을 벗어나지 않도록 사전에 검증

이 경우, PromptTemplate에 **‘가이드라인’**이나 ‘결과 형식’ 등을 미리 템플릿에 포함해 두고, 입력된 텍스트에 따라 적절하게 변환하도록 설정할 수 있습니다. 예를 들어, “결과를 Markdown 테이블 형식으로 표시해 줘”라는 문장을 미리 포함해 두어, LLM이 이를 반영한 응답을 돌려주게 만드는 것입니다.


주의할 점

  1. LLM의 길이 제한(Token Limit): 프롬프트가 너무 길어지면 토큰 제한에 걸릴 수 있습니다. 따라서 중복된 내용을 제거하거나, 필요 없는 부분은 생략하여 최대한 간결한 템플릿을 유지하도록 해야 합니다.
  2. Templating과 보안: 프롬프트에 민감한 정보가 들어가야 한다면, 템플릿을 생성하는 과정에서 해당 정보가 안전하게 처리되는지 확인해야 합니다.
  3. PromptTemplate의 모듈성: 너무 복잡한 템플릿을 하나에 몰아서 넣기보다는, 분할 정복 방식으로 여러 템플릿을 구성하고 필요할 때만 합치는 구조가 유지보수에 좋습니다.
반응형

댓글