'2025/06/28'에 해당되는 글 2건

  1. 2025.06.28 Gemini 에 사전 지식을 알려주자 5
  2. 2025.06.28 Colab에서 LangChain + Gemini 실행하기 4

🧠 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 제이브레인
,

🎈 Colab vs Conda, 두 가지 방식으로 Gemini에게 물어보기


🧁 1. [Colab] 써보면 디저트 같은 즐거움

“클릭 두 번이면 AI랑 대화할 수 있다니!”

💻 실행 단계

  1. https://colab.research.google.com 접속
  2. 새 노트북 열기
  3. 다음 코드 셀 실행:
!pip install -q langchain-google-genai google-generativeai

API 키 설정:

import os
os.environ["GOOGLE_API_KEY"] = "여기에_당신의_API_키를_입력하세요"

사용 가능한 모델 확인

import google.generativeai as genai

from _settings.config import GEMINI_KEY

# API 키 설정
genai.configure(api_key=GEMINI_KEY)

# 모델 목록 확인 (이걸로 어떤 모델이 가능한지 확인 가능)
for model in genai.list_models():
    print(model.name)

위 코드 실행 시 다음과 같은 결과를 얻었습니다.

이는 사용자 마다 요금제에 따라 다를 수 있습니다.

models/embedding-gecko-001
models/gemini-1.0-pro-vision-latest
models/gemini-pro-vision
models/gemini-1.5-pro-latest
models/gemini-1.5-pro-002
models/gemini-1.5-pro
models/gemini-1.5-flash-latest
models/gemini-1.5-flash
models/gemini-1.5-flash-002
models/gemini-1.5-flash-8b
models/gemini-1.5-flash-8b-001
models/gemini-1.5-flash-8b-latest
models/gemini-2.5-pro-preview-03-25
models/gemini-2.5-flash-preview-04-17
models/gemini-2.5-flash-preview-05-20
models/gemini-2.5-flash
models/gemini-2.5-flash-preview-04-17-thinking
models/gemini-2.5-flash-lite-preview-06-17
models/gemini-2.5-pro-preview-05-06
models/gemini-2.5-pro-preview-06-05
models/gemini-2.5-pro
models/gemini-2.0-flash-exp
models/gemini-2.0-flash
models/gemini-2.0-flash-001
models/gemini-2.0-flash-exp-image-generation
models/gemini-2.0-flash-lite-001
models/gemini-2.0-flash-lite
models/gemini-2.0-flash-preview-image-generation
models/gemini-2.0-flash-lite-preview-02-05
models/gemini-2.0-flash-lite-preview
models/gemini-2.0-pro-exp
models/gemini-2.0-pro-exp-02-05
models/gemini-exp-1206
models/gemini-2.0-flash-thinking-exp-01-21
models/gemini-2.0-flash-thinking-exp
models/gemini-2.0-flash-thinking-exp-1219
models/gemini-2.5-flash-preview-tts
models/gemini-2.5-pro-preview-tts
models/learnlm-2.0-flash-experimental
models/gemma-3-1b-it
models/gemma-3-4b-it
models/gemma-3-12b-it
models/gemma-3-27b-it
models/gemma-3n-e4b-it
models/gemma-3n-e2b-it
models/embedding-001
models/text-embedding-004
models/gemini-embedding-exp-03-07
models/gemini-embedding-exp
models/aqa
models/imagen-3.0-generate-002
models/imagen-4.0-generate-preview-06-06
models/imagen-4.0-ultra-generate-preview-06-06
models/veo-2.0-generate-001
models/gemini-2.5-flash-preview-native-audio-dialog
models/gemini-2.5-flash-exp-native-audio-thinking-dialog
models/gemini-2.0-flash-live-001
models/gemini-live-2.5-flash-preview

질문하기:

from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_core.messages import HumanMessage

chat = ChatGoogleGenerativeAI(model="models/gemini-2.5-pro", google_api_key=os.environ["GOOGLE_API_KEY"])
response = chat.invoke([HumanMessage(content="대한민국의 수도는 어디인가요?")])
print(response.content)
 

저는 실행해보니 다음과 같은 에러가 발생하네요.

ResourceExhausted: 429 You exceeded your current quota, please check your plan and billing details.

즉, 무료 요금제에서 할당된 API 호출량(쿼터)를 다 써버려서 발생한 에러입니다.


왜 이런 일이 생길까요?

  • Gemini API 무료 티어는 하루, 분 단위로 호출량과 토큰 사용량 제한이 있습니다.
  • 이 제한을 초과하면 429 에러가 나오며, 일정 시간 후 다시 시도해야 합니다.
  • 구글 클라우드 콘솔에서 할당량(Quota)을 확인하거나, 요금제 업그레이드가 필요합니다.

해결 방법

1️⃣ 쿼터 초기화까지 기다리기

  • 일반적으로 하루 기준이므로, 하루가 지나면 다시 사용 가능해집니다.

2️⃣ 쿼터 확인 및 업그레이드

3️⃣ 호출량 줄이기

  • 테스트용 짧은 문장으로 API 호출 횟수 줄이기
  • 불필요한 반복 호출 자제

4️⃣ 경량화된 flash 모델 사용하기

  • gemini-2.5-flash 같은 경량 모델은 쿼터 부담이 적고, 무료 티어 할당량이 더 넉넉할 수 있습니다.
  • 동일한 API 키로도 pro 모델 대신 flash 모델을 사용하면 쿼터 초과 문제를 완화할 수 있습니다.

다음은 flash 모델을 사용한 예입니다.

from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_core.messages import HumanMessage

chat = ChatGoogleGenerativeAI(model="models/gemini-2.5-flash", google_api_key=os.environ["GOOGLE_API_KEY"])
response = chat.invoke([HumanMessage(content="대한민국의 수도는 어디인가요?")])
print(response.content)

 

결과는 다음과 같습니다.

대한민국의 수도는 **서울**입니다.

참고 링크


요약

에러 코드 의미 대처법
429 할당량(쿼터) 초과 기다리거나 업그레이드 필요
 

 


🧱 2. [PC + Conda] 본격 연구소 느낌!

“이건 내 실험실이다!”

🧪 Conda 기반 환경 구축 및 실행


✅ Step 1. Conda 가상환경 만들기

conda create -n gemini_env python=3.10 -y conda activate gemini_env
 

✅ Step 2. 필요한 패키지 설치

pip install langchain-google-genai google-generativeai
 

✅ Step 3. API 키 설정 및 실행 코드 작성

from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_core.messages import HumanMessage

chat = ChatGoogleGenerativeAI(model="models/gemini-2.5-flash", google_api_key=os.environ["GOOGLE_API_KEY"])
response = chat.invoke([HumanMessage(content="대한민국의 수도는 어디인가요?")])
print(response.content)

위 코드를 gemini_test.py로 저장한 후, 터미널에서 실행하면 됩니다:

python gemini_test.py
 

🎭 Colab vs Conda 재미 비교

항목 🍰 Google Colab 🔬 Conda 가상환경 (PC)
설치 없음 (브라우저만 필요) Anaconda 설치 필수
가상환경 자동 관리 수동 생성 (conda create)
시작 속도 매우 빠름 다소 설정 시간 필요
리소스 제한 Google 제한 (시간, 메모리) 있음 내 PC 성능만큼 무제한
사용 장소 인터넷 연결된 어디서나 가능 해당 PC에서만 가능
유지보수 코드 유지 및 파일 관리 어려움 장기 프로젝트에 유리 (버전 고정 등)
감성 한 줄 평 “앗 귀여워! 바로 실행되네?” “으음… 깔끔하게 환경 관리하자”
 

✅ 결론

  • 처음 써보거나 빠르게 테스트하고 싶을 때 👉 Colab
  • 꾸준히 개발하고 버전 관리하며 프로젝트화하고 싶을 때 👉 Conda
Posted by 제이브레인
,