카테고리 없음

랭체인 프롬프트, 모델, 출력파서, 랭체인 허브

AI강선생 2026. 4. 2. 00:54

한빛미디어의 '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) # 개선된 프롬프트 확인