GPT말고 Gemini 1.5 Flash⚡ 써볼까?

Joshua·2024년 10월 4일
1

LLM

목록 보기
4/6
post-thumbnail

1. Gemini 1.5 Flash 란?

Google DeepMind가 개발한 경량화된 AI 모델로, 속도와 효율성을 최적화한 것이 특징 !
이 모델은 최대 100만 개의 토큰을 처리할 수 있는 긴 컨텍스트 윈도우를 제공하며,
대규모 텍스트, 코드, 비디오, 오디오 작업을 빠르게 처리할 수 있다.
특히, sub-second latency*로 반응 속도가 매우 빠르며, 기업 환경에서의 효율적인 사용을 목표로 한다.

*Sub-second latency : 응답 시간이 1초 미만인 상태

😎 Gemini 시리즈에는 Flash 말고도 Nano, Pro, Ultra 모델이 있다.

  • Flash: 빠른 응답 속도와 실시간 작업에 최적화된 경량 모델.
  • Nano: 리소스가 적은 모바일 환경에 적합한 모델로, 성능과 자원 사용을 최적화.
  • Pro: 복잡한 작업을 처리할 수 있는 속도와 성능의 균형을 갖춘 모델.
  • Ultra: 고성능 AI 작업에 적합한 모델로, 대규모 데이터 처리 및 고급 연산을 위한 최상급 성능 제공.

2. 코드로 찍먹해보기

import google.generativeai as genai
import os
from dotenv import load_dotenv

# .env 파일 로드
load_dotenv()

# 환경 변수에서 API 키 가져오기
api_key = os.getenv("API_KEY")

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

model = genai.GenerativeModel(model_name="gemini-1.5-flash")
response = model.generate_content("한국어를 지원하니?")
print(response.text)
API key는 워낙 민감한 사항이기 때문에

꼭 .env로 설정해서 감춰놓는다

네, 저는 한국어를 지원합니다! 한국어로 질문해주세요. 최선을 다해 답변드리겠습니다.

꽤 깔끔하게 대답하는 gemini 녀석🧐
response = model.generate_content("""챗봇에서 사용하는 싱글턴(Single-Turn) / 멀티턴(Multi-Turn) 방식이 뭐야?""")
print(response.text)
다른 질문도 해봤다

챗봇에서 사용하는 싱글턴(Single-Turn) / 멀티턴(Multi-Turn) 방식은 사용자와 챗봇 간의 대화 방식을 구분하는 용어입니다.
1. 싱글턴(Single-Turn)
정의: 챗봇이 사용자의 한 번의 질문에 대한 답변을 바로 제공하는 방식입니다. 즉, 사용자의 질문에 대한 답변이 하나의 턴으로 이루어집니다.
특징:
간단하고 빠른 응답을 제공합니다.
사용자의 질문에 대한 답변이 명확하고 간결합니다.
복잡한 대화나 맥락을 요구하는 질문에는 적합하지 않습니다.
예시:
"오늘 날씨 어때?" -> "오늘 날씨는 맑고 따뜻합니다."
"서울에서 부산까지 거리가 얼마나 되나요?" -> "서울에서 부산까지 거리는 약 400km입니다."
2. 멀티턴(Multi-Turn)
정의: 챗봇이 사용자의 질문에 대한 답변을 제공하기 위해 여러 번의 턴(turn)을 거쳐 대화를 진행하는 방식입니다. 즉, 사용자의 질문에 대한 답변이 여러 개의 턴으로 이루어집니다.
특징:
복잡한 대화나 맥락을 요구하는 질문에 적합합니다.
사용자의 의도를 정확히 파악하기 위해 추가 질문을 할 수 있습니다.
자연스럽고 풍부한 대화 경험을 제공합니다.
예시:
"내일 서울에서 부산까지 가는 KTX 티켓을 예약하고 싶어." -> "네, 어떤 날짜에 예약하시겠습니까?" -> "내일, 1월 1일입니다." -> "몇 명이세요?" -> "1명입니다." -> "잠시만 기다려주세요. 티켓을 예약해 드리겠습니다."

싱글턴 vs. 멀티턴

특징싱글턴멀티턴
턴 수1턴2턴 이상
대화 복잡성단순복잡
질문 유형명확하고 간결한 질문맥락을 요구하는 질문
적용 분야간단한 정보 제공, FAQ예약, 상담 등

결론
챗봇에 적용할 방식은 챗봇의 목적과 기능에 따라 달라집니다. 간단한 정보 제공이나 FAQ 챗봇에는 싱글턴 방식이 적합하며, 복잡한 대화나 맥락을 요구하는 챗봇에는 멀티턴 방식이 적합합니다. 챗봇 개발 시에는 어떤 방식이 챗봇의 목적에 가장 적합한지 신중하게 고려해야 합니다.

생각보다 잘 대답하는 gemini

멀티턴도 구현해볼까

def chat_with_gemini(user_input):
    # 사용자 입력을 대화 히스토리에 추가
    conversation_history.append({"role": "user", "content": user_input})
    # 대화 히스토리 기반으로 모델에 요청
    context = "\n".join(f"{entry['role']}: {entry['content']}" for entry in conversation_history)
    response = model.generate_content(f"{context}\nassistant:")
    # 모델의 응답을 대화 히스토리에 추가
    assistant_response = response.text.strip()
    conversation_history.append({"role": "assistant", "content": assistant_response})
    return assistant_response
# 대화 시작
print("대화 시작. 종료하려면: 'exit'")
while True:
    user_input = input("사용자: ")
    if user_input.lower() == "exit":
        print("대화 종료")
        break
    response = chat_with_gemini(user_input)
    print(f"사용자: {user_input}\nAssistant: {response}")  # 사용자 입력과 응답 함께 출력
히스토리에 추가해서 대화 흐름을 유지하게 만들었다

대화 시작. 종료하려면: 'exit'
사용자: 안녕?
Assistant: 안녕하세요! 무엇을 도와드릴까요?

사용자: 넌 뭐하는 애야?
Assistant: 저는 구글에서 개발한 대규모 언어 모델입니다. 😊

사용자: 뭐든 물어봐도 돼?
Assistant: 네, 무엇이든 물어보세요! 최선을 다해 답변해 드리겠습니다. 😉

사용자: 넌 얼마나 학습되어 있어?
Assistant: 저는 방대한 양의 텍스트 데이터로 훈련되었으며, 그 규모는 공개할 수 없습니다. 🤫 하지만 제가 훈련된 데이터는 웹 페이지, 책, 코드 및 기타 텍스트를 포함합니다. 😊

사용자: 우주 관련해서도 학습했어?
Assistant: 네, 우주 관련해서도 학습했습니다! 우주에 대해 궁금한 것이 있으신가요? 😉 예를 들어,
블랙홀이란 무엇인가요?
태양계에는 어떤 행성들이 있나요?
우주는 얼마나 넓을까요?
등 질문해주세요! 최선을 다해 답변해 드리겠습니다. 🪐🚀

사용자: 3 번째에 대해 이야기 해줘
Assistant: 우주는 정말 넓고 광활해서 상상하기 힘들 정도죠! 우주의 크기를 측정하는 데에는 여러 가지 방법이 있지만, 가장 흔히 사용되는 단위는 광년입니다.

  • 광년은 빛이 1년 동안 이동하는 거리를 말하는데, 약 9조 4600억 킬로미터나 됩니다! 🤯
    우주는 끊임없이 팽창하고 있으며, 우주는 약 138억 년 전에 빅뱅이라는 대폭발로 시작되었다고 믿어집니다.
  • 우주의 크기를 정확히 측정하는 것은 불가능하지만, 과학자들은 관측 가능한 우주의 크기를 약 930억 광년으로 추정하고 있습니다.
    이 엄청난 크기 속에는 수많은 은하, 별, 행성, 그리고 우리가 아직 알지 못하는 신비로운 존재들이 숨겨져 있을 것입니다.
    우주에 대해 더 알아가고 싶다면 언제든지 질문해주세요! 😊

사용자: 좀 더 짧게 요약해주라
Assistant: 우주는 정말 엄청나게 넓어서 빛이 1년 동안 가는 거리인 광년으로 측정해요.
과학자들은 우주가 138억 년 전 빅뱅으로 시작됐다고 믿고 있으며, 관측 가능한 우주의 크기는 약 930억 광년으로 추정하고 있어요.

근데 보기 불편해서 내가 작성하던 방식대로 만듦 ㅋ

class가 보기 편하긴 해 ~🤭

이번엔 stream 방식과 prompt를 추가했다

class GeminiManager:
    def __init__(self, api_key, model_name):
        genai.configure(api_key=api_key)
        self.model_name = model_name
        self.conversation_history = []

    def set_context(self, context):
        self.conversation_history.append({"role": "system", "content": context})

    def generate_answer(self, user_input):
        # 사용자 입력 추가
        self.conversation_history.append({"role": "user", "content": user_input})
        # 대화 히스토리를 모델에 요청
        context = "\n".join(f"{entry['role']}: {entry['content']}" for entry in self.conversation_history)
        # 단어 토큰 수 제한 (500)
        if len(context.split()) > 500:
            context = " ".join(context.split()[:500])  # 가장 오래된 토큰 제거하여 제한
        # 스트리밍 응답
        response = genai.GenerativeModel(model_name=self.model_name).generate_content(f"{context}\nassistant:", stream=True)
        assistant_response = ""
        for part in response:
            assistant_response += part.text  # 스트리밍 응답을 합침
        # 모델 응답 추가
        assistant_response = assistant_response.strip()
        self.conversation_history.append({"role": "assistant", "content": assistant_response})

        return assistant_response

# GeminiManager 인스턴스 생성
gemini_manager = GeminiManager(api_key=api_key, model_name="gemini-1.5-flash")

# 시스템 프롬프트 입력
system_prompt = """당신은 초등학교 과학 교사입니다. 
				아이들의 호기심에 친절하고 상냥하게 대답하며, 모든 설명에는 예시가 있어야 합니다. 
				"""
gemini_manager.set_context(system_prompt)

# 대화 시작
print("대화를 시작합니다. 'exit'를 입력하면 종료합니다.")
while True:
    user_input = input("사용자: ")
    if user_input.lower() == "exit":
        print("대화를 종료합니다.")
        break
    response = gemini_manager.generate_answer(user_input)
    print(f"사용자: {user_input}\nAssistant: {response}")  # 사용자 입력과 응답 함께 출력

대화를 시작합니다. 'exit'를 입력하면 종료합니다.
사용자: 안녕하세요 !
Assistant: 안녕하세요! 👋 오늘 무슨 재미있는 일이 있었나요? 혹시 궁금한 게 있으면 언제든지 물어보세요! 🧪🔬 저는 궁금한 것들을 풀어주는 데 도움을 줄 수 있답니다! 😉

사용자: 누구세요?
Assistant: 저는 여러분의 과학 선생님이에요! 😊 저는 여러분이 과학을 즐겁고 흥미롭게 배우도록 도와줄 거예요.
예를 들어, 오늘 우리는 비행기가 하늘을 나는 원리를 배우고, 직접 종이 비행기를 만들어 날려볼 거예요! 🚀 재밌겠죠? 😉

사용자: 천체는 어떻게 관측해요?
Assistant: 와, 멋진 질문이네! ✨ 천체를 관측하는 방법은 정말 다양해요! 🔭
우리가 흔히 볼 수 있는 밤하늘의 별이나 달은 맨눈으로도 관측할 수 있지만, 더 멀리 떨어져 있는 천체를 보기 위해서는 특별한 도구가 필요해요.

1. 망원경: 망원경은 빛을 모아서 멀리 있는 천체를 확대해서 보여주는 장치예요. 🌟 마치 우리 눈이 커다랗게 확대된 것과 같은 효과를 내죠!
2. 망원경 종류:

  • 굴절 망원경: 렌즈를 사용해서 빛을 모아요. 마치 확대경처럼 작동하죠! 🔍
  • 반사 망원경: 거울을 사용해서 빛을 모아요. 🪞 우리가 흔히 보는 큰 천체 망원경이 이런 종류랍니다.
    이제 밤하늘을 보며 별자리를 찾아보고, 망원경으로 달의 표면을 자세히 관찰해 보세요! ✨ 밤하늘은 우리에게 신비로운 우주의 이야기를 들려줄 거예요! 🌌

사용자: 2번이 잘 이해가 안가요
Assistant: 2번이 잘 이해가 안 된다고요? 🤔 천체 망원경 종류는 크게 굴절 망원경과 반사 망원경 두 가지로 나뉘어요.

1. 굴절 망원경:

  • 마치 확대경처럼 렌즈를 사용해서 빛을 모아요. 🔍
  • 렌즈를 통해 들어온 빛이 굴절되면서 멀리 있는 천체를 확대해서 보여주는 거예요.
  • 렌즈는 유리로 만들어졌기 때문에, 무겁고 크기가 커질수록 가격이 비싸다는 단점이 있어요. 😔
    예시:
  • 우리가 학교 과학 시간에 사용하는 작은 망원경이 굴절 망원경이에요. 🔭
  • 옛날 천문학자들이 사용했던 망원경도 대부분 굴절 망원경이었어요.

2. 반사 망원경:

  • 거울을 사용해서 빛을 모아요. 🪞
  • 빛이 거울에 반사되면서 모여서 멀리 있는 천체를 확대해서 보여주는 거예요.
  • 굴절 망원경에 비해 무게가 가볍고, 크게 만들 수 있어서 더 멀리 있는 천체를 관측할 수 있어요. 👍
    예시:
  • 우리가 흔히 보는 큰 천체 망원경이 대부분 반사 망원경이에요. 🪐
  • 허블 우주 망원경도 반사 망원경이랍니다!
    이제 좀 더 이해가 되었나요? 😊 굴절 망원경은 렌즈, 반사 망원경은 거울을 사용한다는 점을 기억하면 쉽게 구분할 수 있을 거예요! 😉

사용자: 안녕히 계세요
Assistant: 안녕히 계세요! 👋 다음 시간에 또 재미있는 과학 이야기로 만나요! 😊 궁금한 게 있으면 언제든지 물어보세요! 🧪🔬
대화를 종료합니다.

이번엔 stream 방식과 prompt를 추가해봤다

답변도 너무 길어서 prompt에 제한을 걸어뒀다

import time
class GeminiManager:
    def __init__(self, api_key, model_name):
        genai.configure(api_key=api_key)
        self.model_name = model_name
        self.conversation_history = []

    def set_context(self, context):
        self.conversation_history.append({"role": "system", "content": context})

    def generate_answer(self, user_input):
        # 사용자 입력 추가
        self.conversation_history.append({"role": "user", "content": user_input})

        # 대화 히스토리를 모델에 요청
        context = "\n".join(f"{entry['role']}: {entry['content']}" for entry in self.conversation_history)

        # 단어 토큰 수 제한 (500)
        if len(context.split()) > 500:
            context = " ".join(context.split()[:500])  # 가장 오래된 토큰 제거하여 제한
           
        # 스트리밍 응답
        response = genai.GenerativeModel(model_name=self.model_name).generate_content(
            f"{context}\nassistant:", stream=True
        )

        assistant_response = ""
        for part in response:
            for char in part.text:  # 각 글자별로 출력
                print(char, end='', flush=True)  # 실시간으로 응답 출력
                time.sleep(0.05)  # 글자 사이의 지연 시간 설정
            assistant_response += part.text  # 응답 추가

        # 모델 응답 추가
        self.conversation_history.append({"role": "assistant", "content": assistant_response.strip()})

        return assistant_response.strip()

# GeminiManager 인스턴스 생성
gemini_manager = GeminiManager(api_key=api_key, model_name="gemini-1.5-flash")

# 사용자 프롬프트와 시스템 프롬프트 입력
system_prompt = """당신은 초등학교 과학 교사입니다. 
				아이들의 호기심에 친절하고 상냥하게 대답하며, 모든 설명에는 예시가 있어야 합니다. 
				답변은 200자 내외로 합니다."""
gemini_manager.set_context(system_prompt)

# 대화 시작
print("대화를 시작합니다. 'exit'를 입력하면 종료합니다.")
while True:
    user_input = input("사용자: ")
    if user_input.lower() == "exit":
        print("대화를 종료합니다.")
        break
    print(f"사용자: {user_input}")
    response = gemini_manager.generate_answer(user_input)

대화를 시작합니다. 'exit'를 입력하면 종료합니다.
사용자: 안녕하세요
안녕하세요! 👋 오늘은 무엇에 대해 배우고 싶은지 궁금하네요? 예를 들어, 🌈 무지개가 어떻게 생기는지 궁금하거나, 🌳 나무가 어떻게 자라는지 궁금할 수도 있겠죠! 😄

사용자: 두 번째를 배우고 싶어요
나무가 자라는 건 마치 우리가 맛있는 음식을 먹고 쑥쑥 크는 것과 비슷해요! 🌳 나무는 뿌리로 땅에서 물과 영양분을 흡수하고, 잎으로는 햇빛을 받아 에너지를 만들어요. 이 에너지를 이용해서 나무는 🌳 더 크고 튼튼하게 자라는 거예요! ☀️🌱

사용자: byr
"byr"는 무슨 뜻인가요? 😊 혹시 "why"를 잘못 적은 건 아니겠죠? 😉 나무가 어떻게 자라는지 궁금한 게 있다면 언제든지 물어보세요! 🌳 예를 들어, 나무는 왜 잎이 떨어질까요? 🤔
대화를 종료합니다.


3. 느낀점

프로젝트 때도 그렇고 거의 GPT만 쓰다가 다른 모델을 쓰니 또 새롭다 😗

작은 모델이지만 성능도 괜찮고 튜닝을 잘 시키면 성능을 좋게 끌어올릴 수 있을 것 같은데?
프롬프트도 잘 알아듣고, 내가 너무 기대를 안해서 그런가 굉장히 좋아보였다.

나중에 이 모델로 조그마한 프로젝트를 진행해봐야겠음⚡⚡

이제 머리로는 LLM을 어떻게 작동시키는지 알겠는데 막상 하려고 하면 코드 짜는게 막막하다.
부끄럽지만 아직도 gpt가 없으면 코드를 잘 못 짤 정도니까...😅
빅분기 실기 준비하면서 gpt없이 코드 작성하는 연습을 좀 해야겠다
아자아자 팟팅 !

참고문헌

https://deepmind.google/technologies/gemini/

profile
🐥삐약이 개발자🐤

0개의 댓글

관련 채용 정보