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에서 특히 ChatPromptTemplateMessagesPlaceholder, 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 위 구성 요소들을 조합하는 상위 템플릿