MCP (Multi-Message Prompt / Chat Prompt)
단일 문자열 프롬프트를 사용하던 과거의 방식과 달리
Chat 모델이 여러 메시지의 문맥을 이해할 수 있도록 “메시지 시퀀스”를 전달하는 방식
[System] You are a helpful assistant.
[User] Tell me a joke.
[AI] Why did the chicken cross the road?
[User] Explain it.
LangChain은 메세지 시퀀스를 코드로 구성하기 위해 ChatPromptTemplate + MessageTemplates를 도입
최근 LangChain에서 특히 ChatPromptTemplate, MessagesPlaceholder, SystemMessagePromptTemplate 등의 멀티 메시지 기반 프롬프트 설계가 중요
MCP와 관련된 프롬프트 구성 요소들
| 개념/클래스 | 설명 | 최근 흐름에서 중요도 |
|---|---|---|
ChatPromptTemplate |
여러 메시지(role 포함)를 조합하는 템플릿 | ⭐⭐⭐⭐⭐ |
SystemMessagePromptTemplate |
시스템 메시지를 템플릿으로 정의 | ⭐⭐⭐⭐ |
HumanMessagePromptTemplate |
사용자 메시지 정의 | ⭐⭐⭐⭐ |
AIMessagePromptTemplate |
AI의 이전 응답 메시지 | ⭐⭐⭐ |
MessagesPlaceholder |
이전 대화 내역을 변수로 전달 (e.g., memory) | ⭐⭐⭐⭐⭐ |
PromptTemplate |
전통적인 문자열 기반 템플릿 | 🔄 레거시 / 여전히 사용 가능 |
ChatMessage |
단일 메시지 객체 (역할 + 내용 포함) | 🔧 내부적으로 사용됨 |
최신 프롬프트 구성 방식
from langchain.prompts.chat import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
MessagesPlaceholder
)
from langchain.chat_models import ChatOpenAI
from langchain.schema.output_parser import StrOutputParser
prompt = ChatPromptTemplate.from_messages([
SystemMessagePromptTemplate.from_template("You are a helpful assistant."),
MessagesPlaceholder(variable_name="chat_history"),
HumanMessagePromptTemplate.from_template("{input}")
])
llm = ChatOpenAI()
chain = prompt | llm | StrOutputParser()
result = chain.invoke({
"input": "What is the capital of France?",
"chat_history": []
})
| 컴포넌트 | 역할 |
|---|---|
SystemMessagePromptTemplate |
초기 시스템 역할 지정 (지시어) |
MessagesPlaceholder |
이전 대화 내역을 기억 (memory 연동됨) |
HumanMessagePromptTemplate |
사용자의 실제 입력 |
AIMessagePromptTemplate |
AI의 응답을 명시적으로 전달할 수도 있음 |
ChatPromptTemplate |
위 구성 요소들을 조합하는 상위 템플릿 |