🧠 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은 이렇게 말하죠:
“그럼 그냥 첫 줄에 몰래 써두면 되지!”
이 우회 전략은 매우 강력하며, 다양한 캐릭터 지정, 역할극, 말투 제어 등에 유용하게 활용됩니다.
'인공지능 > 랭체인' 카테고리의 다른 글
LangChain + Gemini로 시스템 트레이딩 전략 만들기 (feat. Few-shot) (11) | 2025.07.01 |
---|---|
Gemini에게 주식 매수 맡겨봤습니다 (3) | 2025.07.01 |
Colab에서 LangChain + Gemini 실행하기 (4) | 2025.06.28 |
무료 Gemini API 사용법 (7) | 2025.06.25 |
인공지능 API 중에 무료로 써볼 수 있는것은? (9) | 2025.06.23 |