LangChain에서 템플릿(Template)은 프롬프트(Prompt)를 체계적으로 관리하고 재사용하기 위한 강력한 도구입니다. 특히, 애플리케이션 규모가 커질수록 프롬프트를 코드 내에 하드코딩하는 대신 외부 파일로 분리해 관리하는 것이 효율적입니다. 이 챕터에서는 파일로 저장된 템플릿을 읽어오는 방법을 배우고, 이를 LangChain에서 활용하는 과정을 단계별로 살펴보겠습니다.
템플릿 파일의 필요성:
프롬프트 템플릿을 외부 파일로 저장하면 다음과 같은 이점이 있습니다:
- 유지보수성: 코드와 템플릿을 분리해 수정이 용이해집니다.
- 재사용성: 여러 프로젝트나 모듈에서 동일한 템플릿을 공유할 수 있습니다.
- 가독성: 복잡한 프롬프트가 코드 안에 섞이지 않아 가독성이 향상됩니다.
예를 들어, 고객 지원 챗봇을 위한 프롬프트 템플릿을 별도 파일로 저장하고 필요할 때 불러오는 방식은 실무에서 매우 유용합니다.
1) 템플릿 파일 준비하기:
먼저, 템플릿을 저장할 파일을 만들어야 합니다. 텍스트 파일(.txt)이나 JSON 파일(.json) 형식을 주로 사용합니다. 여기서는 간단한 텍스트 파일을 예로 들겠습니다.
예제 템플릿 파일: prompt_template.txt
안녕하세요, {name}님!저는 {role} 역할을 맡고 있는 AI입니다. 오늘 {topic}에 대해 도움을 드릴게요. 어떤 도움을 드릴까요? |
이 템플릿에는 {name}, {role}, {topic}과 같은 변수가 포함되어 있으며, 나중에 LangChain에서 동적으로 채워질 예정입니다.
LangChain에서 파일 읽기:
LangChain에서 파일로 저장된 템플릿을 읽어오려면 Python의 파일 입출력 기능을 활용한 뒤, PromptTemplate 클래스를 사용해 템플릿을 정의합니다. 아래는 단계별 코드입니다.
– 필요한 모듈 임포트
from langchain.prompts import PromptTemplate
– 텍스트 파일 읽기
Python의 기본 파일 읽기 기능을 사용해 템플릿을 불러옵니다.
# 템플릿 파일 읽기
with open("./resources/prompt_template.txt", "r", encoding="utf-8") as file:
template_content = file.read()
여기서 encoding=”utf-8″은 한글 등 다양한 언어를 지원하기 위해 필수적입니다.
– PromptTemplate 생성
읽어온 템플릿 내용을 PromptTemplate 객체로 변환합니다.
# PromptTemplate 객체 생성
prompt = PromptTemplate(
input_variables=["name", "role", "topic"],
template=template_content
)
- input_variables: 템플릿에 포함된 변수 목록을 지정합니다.
- template: 파일에서 읽어온 템플릿 문자열을 사용합니다.
– 템플릿 사용하기
이제 템플릿에 값을 채워 프롬프트를 생성할 수 있습니다.
# 템플릿에 값 채우기
formatted_prompt = prompt.format(
name="오스틴",
role="고객 지원",
topic="제품 문의"
)
print(formatted_prompt)
안녕하세요, 오스틴님!
저는 고객 지원 역할을 맡고 있는 AI입니다.
오늘 제품 문의에 대해 도움을 드릴게요. 어떤 도움을 드릴까요?
2) 고급 활용: JSON 파일 사용
더 복잡한 템플릿을 관리하려면 JSON 형식을 사용할 수도 있습니다. JSON은 구조화된 데이터를 저장하기에 적합하며, 여러 템플릿을 한 파일에 저장할 수 있습니다.
예제 JSON 파일: prompts.json
{
"greeting": "안녕하세요, {name}님! 저는 {role} 역할을 맡고 있는 AI입니다.",
"support": "오늘 {topic}에 대해 도움을 드릴게요. 어떤 도움을 드릴까요?"
}
– JSON 파일 읽기 및 사용
import json
# JSON 파일 읽기
with open("./resources/prompts.json", "r", encoding="utf-8") as file:
prompts_data = json.load(file)
# 템플릿 선택 및 PromptTemplate 생성
greeting_template = PromptTemplate(
input_variables=["name", "role"],
template=prompts_data["greeting"]
)
support_template = PromptTemplate(
input_variables=["topic"],
template=prompts_data["support"]
)
# 템플릿 조합
full_prompt = (
greeting_template.format(name="오스틴", role="기술 지원") + "\n" +
support_template.format(topic="소프트웨어 설치")
)
print(full_prompt)
안녕하세요, 오스틴님! 저는 기술 지원 역할을 맡고 있는 AI입니다.
오늘 소프트웨어 설치에 대해 도움을 드릴게요. 어떤 도움을 드릴까요?
2) 고급 활용: yaml 파일 사용
speed_info.yaml와 capital.yaml의 내용은 각각 다음과 같습니다.
[speed_info.yaml]
_type: “prompt” template: “{object}의 속도는?” input_variables: [“object”] |
[capital.yaml]
_type: “prompt” template: | {country}의 수도에 대해서 알려주세요. 수도의 특징을 다음의 양식에 맞게 정리해 주세요. 300자 내외로 작성해 주세요. 한글로 작성해 주세요. —- [양식] 1. 면적 2. 인구 3. 역사적 장소 4. 특산품 #Answer: input_variables: [“country”] |
yaml 파일로 기작성된 프롬프트를 읽어들입니다.
from langchain_core.prompts import load_prompt
prompt = load_prompt("resources/speed_info.yaml")
print(prompt)
input_variables=[‘object’] input_types={} partial_variables={} template='{object}의 속도는?’
Window 사용자 중 이전의 코드가 오류가 나는 경우 아래의 코드로 실행하세요 (인코딩 설정)
import yaml
from langchain_core.prompts import loading
from langchain_core.prompts.base import BasePromptTemplate
def load_prompt(file_path, encoding="utf8") -> BasePromptTemplate:
with open(file_path, "r", encoding=encoding) as f:
config = yaml.safe_load(f)
return loading.load_prompt_from_config(config)
prompt = load_prompt("resources/speed_info.yaml", encoding="cp949")
print(prompt)
input_variables=[‘object’] input_types={} partial_variables={} template='{object}의 속도는?’
prompt = prompt.format(object="치타")
print(prompt)
input_variables=[‘object’] input_types={} partial_variables={} template='{object}의 속도는?’
prompt2 = load_prompt("resources/capital.yaml")
print(prompt2.format(country="대한민국"))
대한민국의 수도에 대해서 알려주세요.
수도의 특징을 다음의 양식에 맞게 정리해 주세요.
300자 내외로 작성해 주세요.
한글로 작성해 주세요.
[양식]
면적
인구
역사적 장소
특산품
Answer:
파일로 저장된 템플릿을 읽어오는 방법은 LangChain을 보다 유연하고 확장 가능하게 만드는 핵심 기술입니다. 텍스트 파일을 사용한 간단한 방식부터 JSON을 활용한 구조화된 접근까지, 프로젝트 요구사항에 맞게 선택할 수 있습니다.