한빛미디어의 'AI에이전트 마스터 클래스' 내용의 일부를 정리했습니다.
1. 프롬프트
프롬프트를 랭체인 문법에 맞춰 작성하는 방법
1. PromptTemplate.from_template()
langchain_core 패키지의 prompts 모듈로부터 Prompt Template 객체를 가져오는 법
from langchain_core.prompts import PromptTemplate
prompt = PromptTemplate.from_template("{topic}에 대해 {level} 수준으로 설명해 주세요.")
print(prompt)
"""
input_variables=['level', 'topic'] input_types={} partial_variables={} template='{topic}에 대해 {level} 수준으로 설명해 주세요.'
"""
2. PromptTemplate
from_template 메서드 없이 promptTemplate를 직접 사용하는 방법
- input variables: template에 작성한 입력 변수({topic}, {level})를 리스트ust 형태로 작성
- partial_variables: 특정 변수의 값을 미리 지정할 때 사용
from langchain_core.prompts import PromptTemplate
prompt = PromptTemplate(
template= "{topic}에 대해 {level} 수준으로 설명해 주세요",
input_variables=["topic", "level"],
partial_variables={
"topic": "양자역학"
}
)
"""
input_variables=['level'] input_types={} partial_variables={'topic': '양자역학'} template='{topic}에 대해 {level} 수준으로 설명해 주세요.'
"""
3. ChatPromptTemplate
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate([
("system", "당신은 강아지 안구 건강 관련 조언을 해주는 AI 첫봇입니다."),
("human", "안녕하세요! 저희 집 강아지가 눈을 자주 굵어요"),
("ai", "그렇군요. 사용자님의 강아지는 몇 살인가요?"),
("human", "(user_input]"),
])
chain = prompt | model | output_parser
chain.invoke({"user input" : "3살이에요"})
"""
답변 예시:
3살 강지가 눈을 자주 굵는다면 눈 건강에 문제가 있을 수 있습니다. 명 가지 가능한 이 유가 있을 수 있지만, 가장 흔한 이유는 다음과 같습니다: .(후략)
"""
ChatpromptTemplate에 리스트로 시스템 메시지(개발자가 사전에 정의한 LLM의 역할)와 사용자와 AI가 나눈 대화를 사용자 메시지(human message) 와 AI 메시지(AI message)로 미리 작성하여 대회 의 맥락을 주입합니다. 또한, 사용자가 입력할 질문을 전달받을 입력 변수({user_input})도 추가합니다. 이후, invoke 메서드를 호출하면 이전 대화 맥락을 참고하여 답변을 생성할 수 있습니 다. 사용법이 다소 복잡해 보일 수 있으나, LIM 모델에게 장기간 대화 맥락을 전달할 수 있는 강력한 기능을 제공합니다.
2. 모델
from langchain_openai import ChatOpenAI
# from langchain_anthropic import ChatAnthropic
model = ChatOpenAI(model-"gpt-5.4-nano")
# model = ChatAnthropic(model="claude-haiku-4-5")
model= ChatOpenAI(
model-"gpt-5.4-nano",
temperature=0.8,
max_tokens=2048,
max_retries=2
)
• model: 오픈AI에서 제공하는 여러 LLM 모델 중 특정 모델을 지정합니다.
• temperature: 생성되는 텍스트의 다양성을 조절하는 매개변수입니다. 낮은 값(예: 0.2)은 더 결정적이고 일관된 출력을 생성하는 반면. 높은 값(예: 0.8)은 더 창의적이고 다양성이 높은 출력을 생성합니다.
◦ max_tokens: 모델이 생성할 수 있는 최대 토큰 수를 지정합니다.
• max_retries: 모델 호출이| 실패할 경우 재시도 횟수를 지정합니다.
3. 출력 파서
랭체인은 Str, JSON, CSV 등 다양한 데이터 포멧 파서를 지원합니다.
StrOutputParser를 제외한 다은 파서들을 사용할 때는, 프롬프트에 모델이 해당 포멧에 맞게 답변을 생성하도록 지침을 명시해야 합니다. 이 지침은 get_format_instructions 메소드를 통해 얻을 수 있으며, 이를 프롬프트의 partial_variables에 담아 전달합니다.
output_parser = StrOutputParser()
from Langchain_core.output_parsers import JsonOutputParser
outout_parser = JsonOutputParser()
format_instructions = output_parser.get_format_instructions()
print (format_instructions)
prompt = PromptTemplate(
template=template,
partial_variables={
"format": format_instructions #"JSON 형태로 답변하시오"
},
)
from langchain_core.output_parsers import CommaSeparatedListOutputParser
#파서 초기화
output_parser = CommaSeparatedListOutputParser()
format_instructions = output_parser.get_format_instructions()
print(format_instructions)
template = """
당신은 K-POP 정보를 제공하는 AI입니다. 그룹의 멤버 이름을 말해주세요.
K-POP Group: {name}
FORMAT :
{format}
"""
prompt = PrompTemplate(
template=template,
partial_variables = {
"format" : format_instructions
},
)
model = ChatopenAI(model_name-"gpt-5.4-nano")
chain = prompt| model|output-parser
result = chain. invoke({"name" : "블랙핑크"})
prompt = PromptTemplate(
template=template,
partial_variables ={
"format": """
Return a JSON object like this:
{
"answer" : "질문에 대한 답변을 작성합니다"
"source" : "답변 생성에 활용한 출처를 작성합니다."
}
"""
},
)
chain = prompt|model|output_parser
result = chain.invoke({"name" : "블랙핑크"})
print('출력 결과 : ', result)
하지만 이조차도 완전히 안전한 해결 방법은 아닙니다. 반복적으로 코드를 실행하면 키는 포함하지만 구조는 일관되지 않는 한계가 있습니다. 이때. 모델의 답변을 제어하기 위해 pydantic 모듈을 활용할 수 있습니다.
4. 랭체인 허브
langchain에서 hub 모듈을 import한 뒤. hub.pull 미서드에 해당 프콤프트 이름(hard kothari/prompt-maker )을 입력합니다.
invoke 메서드 호출 시 해당 프롬 프트가 필요로 하는 2개의 입력 변수({task}, {lazy_prompt})를 전달하면 개선된 프롬프트가 만들어집니다.
# Create a LANGSNITH_API_KEY in Settings > API Keys
from langsmith import Client
client = Client(api_key=LANGSMITH_API_KEY)
prompt = client.pull_prompt("hardkothari/prompt-maker", include_model=True)
prompt # 객체 확인
chain = prompt | ChatOpenAI() | StrOutputParser()
task ="""
반드시 한글로 작성되어야 합니다.
사용자의 질문을 읽고, 핵심 키워드를 파악해 전문 지식이 있는 사람의 질문으로 변경해 주세요.
더 체계적이고, 단계적인 질문이 될 수 있도록 변경하세요.
사용자의 질문에서 벗어나서는 안됩니다.
"""
lazy_prompt = "강아지 눈이 좀 이상해요"
improved_prompt = chain.invoke({"task" : task, "lazy_prompt" : lazy_prompt})
print(imcroved_prompt) # 개선된 프롬프트 확인