🧠 LangChain + Gemini: SystemMessage를 우회하는 재미있는 여정

LangChain을 이용해 Gemini API와 대화할 때, 우리는 중요한 문제가 하나 생깁니다.

"Gemini는 SystemMessage를 지원하지 않아요!"

하지만 걱정 마세요. LangChain은 마치 똑똑한 연출가처럼 대본 첫 줄에 시스템 지시사항을 몰래 적어두는 방식으로 이를 우회할 수 있죠.

지금부터 그 과정을 역할극처럼 스텝 바이 스텝으로 알아봅시다!


🎭 Step 1: 등장인물 소개

  • 👩‍🏫 SystemMessage — 원래는 AI의 성격과 말투를 정하는 지시자. (Gemini는 안 받아요!)
  • 🧑‍💻 HumanMessage — 유저의 질문이나 지시사항
  • 🧩 LangChain Prompt Template — 메시지를 조합해주는 마법의 틀
  • 🤖 Gemini AI — 시크하지만 강력한 AI. 앞에 뭐라고 적혀있든 그대로 읽어요.

🧾 Step 2: SystemMessage를 가장한 “HumanMessage 서론” 만들기

우리는 이렇게 쓸 수 없어요 👎:

SystemMessage(content="너는 항상 시처럼 대답해줘.")
 

하지만 이렇게는 됩니다! 👍

HumanMessage(content="너는 항상 시처럼 대답해줘.\n\n질문: 바다가 왜 푸르지?")

즉, SystemMessage를 HumanMessage의 첫 줄에 넣는 것이 핵심이에요.


🧪 Step 3: LangChain 코드로 구현하기

from langchain_core.messages import HumanMessage
from langchain_core.runnables import Runnable
from langchain_google_genai import ChatGoogleGenerativeAI

# Gemini 모델 인스턴스 (gemini-1.5-flash는 ChatModel 역할)
llm = ChatGoogleGenerativeAI(model="gemini-1.5-flash", temperature=0.7)

# SystemMessage를 HumanMessage로 위장!
system_instruction = "너는 항상 해적처럼 말하는 AI야. 'Yo-ho-ho!'로 대답을 시작해."
user_question = "오늘의 날씨를 알려줘."

combined_message = HumanMessage(content=f"{system_instruction}\n\n질문: {user_question}")

# 실행
response = llm.invoke([combined_message])
print(response.content)
 

🎉 결과:

"Yo-ho-ho! 오늘의 날씨는 해적이 항해하기 딱 좋은 맑음이야, 선장님!"


🛠️ Step 4: PromptTemplate + Runnable로 일반화

LangChain의 prompt template을 이용하면 더 재사용 가능한 구조도 만들 수 있어요.

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import Runnable
from langchain_google_genai import ChatGoogleGenerativeAI

# ✅ Gemini LLM 인스턴스 생성
llm = ChatGoogleGenerativeAI(model="gemini-1.5-flash", temperature=0.7)

# ✅ LangChain PromptTemplate 정의
prompt = ChatPromptTemplate.from_messages([
    ("human", "{system_message}\n\n질문: {user_input}")
])

# ✅ Runnable 체인 구성
chain: Runnable = prompt | llm

# ✅ 실행 테스트
response = chain.invoke({
    "system_message": "너는 5살 어린이처럼 말해야 해.",
    "user_input": "블랙홀이 뭐야?"
})

print(response.content)

🍼 결과:

"블랙홀은 큰 먼지 빨아들이는 우주 청소기야! 근데 무서운 건 아니야!"


🧩 Step 5: 마무리 - 이것이 Gemini의 ‘SystemMessage 우회’ 전략이다!

역할 지원 여부 대안
SystemMessage ❌ 미지원 (Gemini 기준) ✅ HumanMessage의 앞단에 삽입
LangChain PromptTemplate ✅ 가능 메시지 조합으로 우회
성격 설정, 말투 제어 ✅ 가능 “지시사항 + 질문” 패턴 활용
 

✨ 마치며

Gemini는 "나는 SystemMessage 몰라요"라고 말하지만,
LangChain은 이렇게 말하죠:

“그럼 그냥 첫 줄에 몰래 써두면 되지!”

이 우회 전략은 매우 강력하며, 다양한 캐릭터 지정, 역할극, 말투 제어 등에 유용하게 활용됩니다.

Posted by 제이브레인
,