본문 바로가기
AI 언어 모델

✨Gemini 2.0 Flash Thinking: OpenAI o1과 경쟁할 추론 모델의 등장!

by James AI Explorer 2024. 12. 20.
    728x90

    안녕하세요! 오늘은 구글의 최신 AI 모델인 Gemini 2.0 Flash Thinking 모델에 대해 알아보겠습니다. Gemini 2.0 Flash Thinking은 모델이 응답을 생성하는 과정에서 사고 과정을 명시적으로 보여주는 실험적인 모델로, 기존 Gemini 2.0 Flash 모델보다 더욱 향상된 추론 능력을 자랑합니다. 이 모델은 복잡한 문제 해결, 텍스트 생성, 아이디어 구상 등 다양한 분야에서 뛰어난 성과를 보여주며, AI의 사고방식을 보다 투명하게 이해할 수 있는 기회를 제공합니다. 이번 블로그에서는 Gemini 2.0 Flash Thinking 모델의 주요 특징, 사용 방법, 성능 테스트 결과를 살펴보고, 이 모델이 제공하는 혁신적인 기능들을 탐구해 보겠습니다.

    ✨Gemini 2.0 Flash Thinking: OpenAI o1과 경쟁할 추론 모델의 등장!

    "이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

    1. Gemini 2.0 Flash Thinking 개요

    Gemini 2.0 Flash Thinking은 Google에서 개발한 실험적인 모델로, 복잡한 문제를 해결하는 과정에서 자신의 사고 과정을 명시적으로 보여주는 기능을 갖추고 있습니다. 이 모델은 단순히 결과를 제시하는 것이 아니라, 문제를 어떻게 이해하고 해결해 나가는지에 대한 과정을 단계별로 설명합니다. 이러한 특징은 사용자가 모델의 추론 방식을 이해하고, 결과에 대한 신뢰도를 높이는 데 도움을 줍니다.

    위 화면에서 모델의 사고과정을 보면 각 단서와 정보를 하나씩 적용하며, 가능한 경우를 시각적으로 관리하는 표를 사용해 문제를 풀어나가는 방식이 특징입니다. 특히, 확실한 정보를 먼저 활용하고, 이를 통해 나머지 정보를 추론하는 전략이 뛰어나며, 각 단계를 체계적으로 이어가는 방식이 매우 효율적입니다. 이러한 접근은 복잡한 문제를 명확하고 논리적으로 풀 수 있도록 돕습니다.

     

    Gemini 2.0 Flash Thinking 모델은 "2.0 Flash의 속도와 성능"을 기반으로 구축되었으며, 기존 모델이 결과를 도출하는 데 그쳤던 것과는 달리, 문제 해결 과정 자체를 보여줌으로써 사용자가 모델의 사고방식을 이해하고 학습하는 데 큰 도움을 줍니다.

    728x90

    2. Gemini 2.0 Flash Thinking 특징 및 주요 기능

    Gemini 2.0 Flash Thinking은 다음과 같은 특징과 주요 기능을 제공합니다:

    a. 향상된 추론 능력: 모델이 응답을 생성하는 과정에서 사고 과정을 명시적으로 보여줌으로써 추론 능력을 강화합니다. 이는 복잡한 문제 해결 능력을 향상시키고, 사용자가 결과에 대한 신뢰도를 높이는 데 기여합니다.

    b. 실시간 사고 과정 출력: 모델의 사고 과정은 Gemini API 또는 Google AI Studio를 통해 실시간으로 확인할 수 있습니다. 이는 모델이 문제를 어떻게 해결하는지 단계별로 이해하는 데 도움을 줍니다.

    • Gemini API: 모델의 사고 과정은 content.parts 목록의 첫 번째 요소로 반환됩니다.
    • Google AI Studio: 모델의 사고 과정은 응답 창의 "Thoughts" 패널에서 확인할 수 있습니다.

    Google AI Studio에서의 Gemini 2.0 Flash Thinking 모델 사용

    c. 다양한 활용 가능성: 복잡한 문제 해결, 텍스트 생성, 아이디어 구상 등 다양한 분야에 활용할 수 있습니다.

    • 물리학 및 확률 문제 해결, 시각적 및 텍스트 단서가 포함된 퍼즐 해결, 창의적인 글쓰기 및 수학 문제 해결 등

    d. 간단한 사용법: Google AI Studio 또는 Gemini API를 통해 쉽게 접근하고 사용할 수 있습니다.

    • Google AI Studio: 모델 드롭다운 메뉴에서 선택
    • Gemini API: 모델 코드를 지정하여 호출

    e. 실험적인 모델의 제한 사항:

    • 32k 토큰 입력 제한: 입력할 수 있는 토큰 수에 제한이 있습니다.
    • 텍스트 및 이미지 입력만 지원: 텍스트와 이미지 입력만 가능하며, 다른 유형의 입력은 지원하지 않습니다.
    • 8k 토큰 출력 제한: 출력할 수 있는 토큰 수에 제한이 있습니다.
    • 텍스트 출력만 지원: 텍스트 형태의 출력만 가능합니다.
    • 도구 사용 불가: 검색, 코드 실행 등의 도구는 사용할 수 없습니다.

    3. Gemini 2.0 Flash Thinking 사용 방법

    Gemini 2.0 Flash Thinking은 Gemini API 또는 Google AI Studio를 통해 사용할 수 있습니다.

    Gemini API

    a. 모델 코드 지정: Gemini API를 호출할 때 모델 코드를 지정해야 합니다. gemini-2.0-flash-thinking-exp 또는 gemini-2.0-flash-thinking-exp-1219를 사용할 수 있습니다.

    response = client.models.generate_content(
        model='gemini-2.0-flash-thinking-exp',
        contents='피타고라스 정리를 10살 아이에게 설명해줘.'
    )
    

    b. 사고 과정 확인: 모델의 사고 과정은 모델이 응답을 생성할 때 생성되는 content.parts 목록의 첫 번째 요소 response.candidates[0].content.parts[0].text 에 저장됩니다. 다음 코드를 사용하여 사고 과정을 출력할 수 있습니다. 

    response = client.models.generate_content(
        model='gemini-2.0-flash-thinking-exp', contents='Solve 3*x^3-5*x=1'
    )
    
    Markdown(response.candidates[0].content.parts[0].text)

    다음 코드는 Gemini 2.0 Flash Thinking 모델의 사고 과정을 펼치거나 접어서 출력할 수 있는 Streamlit 웹 채팅 애플리케이션입니다. GEMINI_API_KEY를 .env 파일에 입력하고 코드를 실행하면 모델의 사고 과정을 확인하실 수 있습니다. 

    import os  
    import streamlit as st 
    import google.generativeai as genai
    
    # API 키 설정
    GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
    if not GEMINI_API_KEY:
        st.error("GEMINI_API_KEY가 설정되지 않았습니다.")
        st.stop()
    
    # Gemini 설정
    genai.configure(api_key=GEMINI_API_KEY)
    
    # 모델 설정
    model = genai.GenerativeModel('gemini-2.0-flash-thinking-exp')
    
    # 예제 문제 정의
    example_problems = {
        "수학경시대회 문제": """전국 초등학생 수학경시대회가 열렸는데 영희,철수,진호 세사람이 참가했습니다. 그들은 서울,부산,인천에서 온 학생이고 각각 1등,2등,3등 상을 받았습니다. 다음과 같은 사항을 알고 있을때 진호는 어디에서 온 학생이고 몇등을 했습니까? 1) 영희는 서울의 선수가 아닙니다. 2) 철수는 부산의 선수가 아닙니다. 3)서울의 선수는 1등이 아닙니다. 4) 부산의 선수는 2등을 했습니다. 5)철수는 3등이 아닙니다.""",
        
        "살인자 문제": """방 안에는 살인자가 세 명 있습니다. 어떤 사람이 방에 들어와 그중 한 명을 죽입니다. 아무도 방을 나가지 않습니다. 방에 남아 있는 살인자는 몇 명입니까? 단계별로 추론 과정을 설명하세요.""",
        
        "Marble Problem": """A marble is put in a glass. The glass is then turned upside down and put on a table. Then the glass is picked up and put in a microwave. Where's the marble? Explain your reasoning step by step.""",
        
        "버스 목적지 문제": """도로에 5대의 큰 버스가 차례로 세워져 있는데 각 차의 뒤에 모두 차의 목적지가 적혀져 있습니다. 기사들은 이 5대 차 중 2대는 A시로 가고, 나머지 3대는 B시로 간다는 사실을 알고 있지만 앞의 차의 목적지만 볼 수 있습니다. 안내원은 이 몇 분의 기사들이 모두 총명할 것으로 생각하고 그들의 차가 어느 도시로 가야 하는지 목적지를 알려 주지 않고 그들에게 맞혀 보라고 하였습니다. 먼저 세번째 기사에게 자신의 목적지를 맞혀 보라고 하였더니 그는 앞의 두 차에 붙여 놓은 표시를 보고 말하기를 "모르겠습니다." 라고 말하였습니다. 이것을 들은 두번째 기사도 곰곰히 생각해 보더니 "모르겠습니다." 라고 말하였습니다. 두명의 기사의 이야기를 들은 첫번째 기사는 곰곰히 생각하더니 자신의 목적지를 정확하게 말하였습니다. 첫번째 기사가 말한 목적지는 어디입니까?"""
    }
    
    st.title("Gemini-2.0-Flash-Thinking-Exp")
    
    # 예제 문제 버튼 표시
    st.subheader("예제 문제")
    cols = st.columns(2)
    for i, (title, problem) in enumerate(example_problems.items()):
        with cols[i % 2]:
            if st.button(title, key=f"example_{i}"):
                # 채팅 메시지에 문제 추가
                st.session_state.messages = []
                
                # 사용자 메시지 표시
                with st.chat_message("user"):
                    st.write(problem)
                
                # 시스템 프롬프트 추가
                system_prompt = "Display thought process in Korean."
                complete_prompt = system_prompt + "\n" + problem
                
                # 응답 생성
                response = model.generate_content(complete_prompt)
                
                # 응답과 사고 과정 분리
                thinking = ""
                response_text = ""
                
                if hasattr(response, 'candidates') and response.candidates:
                    try:
                        thinking = response.candidates[0].content.parts[0].text
                        response_text = ' '.join([part.text for part in response.candidates[0].content.parts[1:]])
                    except (AttributeError, IndexError):
                        response_text = response.candidates[0].text
                else:
                    response_text = response.text
                
                # 메시지 저장
                st.session_state.messages.extend([
                    {"role": "user", "content": problem},
                    {"role": "assistant", "content": response_text, "thinking": thinking or "사고 과정 정보가 없습니다."}
                ])
                
                st.rerun()
    
    # 채팅 초기화
    if "messages" not in st.session_state:
        st.session_state.messages = []
    
    # 메시지 표시
    for message in st.session_state.messages:
        with st.chat_message(message["role"]):
            st.write(message["content"])
            if "thinking" in message and message["thinking"]:
                with st.expander("사고 과정 보기", expanded=False):
                    st.markdown(message["thinking"])
    
    # 사용자 입력
    prompt = st.chat_input("메시지를 입력하세요")
    
    if prompt:
        # 사용자 메시지 표시
        with st.chat_message("user"):
            st.write(prompt)
    
        try:
            # 이전 대화 맥락을 하나의 문자열로 결합
            conversation_context = "\n".join(
                f"{msg['role']}: {msg['content']}" for msg in st.session_state.messages
            )
            conversation_context += f"\nuser: {prompt}"
    
            # 시스템 프롬프트 추가: 사고 과정은 한국어로 응답해주세요
            system_prompt = "Display thought process in Korean."
    
            # 시스템 프롬프트와 이전 대화 맥락을 결합하여 모델에 전달
            complete_prompt = system_prompt + "\n" + conversation_context
            
            # 응답 생성
            response = model.generate_content(complete_prompt)
            
            # 응답과 사고 과정 분리
            thinking = ""
            response_text = ""
            
            if hasattr(response, 'candidates') and response.candidates:
                try:
                    thinking = response.candidates[0].content.parts[0].text
                    response_text = ' '.join([part.text for part in response.candidates[0].content.parts[1:]])
                except (AttributeError, IndexError):
                    response_text = response.candidates[0].text
            else:
                response_text = response.text
            
            # 사고 과정 표시
            with st.chat_message("assistant"):
                if thinking:
                    with st.expander("사고 과정 보기", expanded=False):
                        st.markdown(thinking)
            
            # 어시스턴트 응답 표시
            with st.chat_message("assistant"):
                st.write(response_text)
            
            # 메시지 저장
            st.session_state.messages.append({
                "role": "user", 
                "content": prompt
            })
            st.session_state.messages.append({
                "role": "assistant", 
                "content": response_text,
                "thinking": thinking or "사고 과정 정보가 없습니다."
            })
    
        except Exception as e: 
            st.error(f"오류 발생: {str(e)}")

    Gemini 2.0 Flash Thinking의 사고 과정을 표시하는 웹 애플리케이션

    Google AI Studio

    a. 모델 선택: 설정 창의 "Model" 드롭다운 메뉴에서 "Gemini 2.0 Flash Thinking Experimental" 모델을 선택합니다.

    b. 사고 과정 확인: 모델의 사고 과정은 응답 창의 "Thoughts" 패널에서 확인할 수 있습니다.

    • 기본적으로 "Thoughts" 패널은 축소되어 있으며, "Thoughts" 헤더를 클릭하여 확장할 수 있습니다.
    • "Thoughts" 패널의 내용은 Google AI Studio에서 편집할 수 없습니다.

    4. Gemini 2.0 Flash Thinking 성능 테스트

    다음은 Gemini 2.0 Flash Thinking의 코딩, 수학, 추론 성능을 테스트해 보겠습니다. 코딩 성능은 코딩 교육 사이트 edabit.com의 Python, JavaScript, C++ 문제를 통해 테스트하고, 수학 문제는 기하학, 확률, 수열, 최적화, 복합 문제 등으로 구성된 6개의 문제를 사용했습니다. 모든 평가 항목은 재시도 없이 첫 번째 시도의 채점 결과를 그대로 반영하였습니다.

     

    a. 코딩성능 테스트:

    Gemini 2.0 Flash Thinking Medium Hard Very Hard Expert
    Python Pass Pass Pass Pass
    JavaScript Pass Pass Pass Pass
    C++ Pass Pass Pass Pass

    Gemini 2.0 Flash Thinking 모델은 Python, JavaScript, C++ 언어의 모든 난이도 문제를 성공하였습니다. 

    Python Expert 난이도: 성공
    JavaScript Expert 난이도: 성공
    C++ Expert 난이도: 성공

    b. 수학 성능 테스트:

    수학 문제 6: 성공

    No. 문제 구분 문제 Gemini 2.0 Flash
    Thinking
    1 기초 대수 문제 두 숫자 𝑥 x와 𝑦 y가 있습니다. 이들이 만족하는 식은 3 𝑥 + 4 𝑦 = 12 3x+4y=12이며, 𝑥 − 2 𝑦 = 1 x−2y=1입니다. 𝑥 x와 𝑦 y의 값을 구하세요 Pass
    2 기하학 문제 반지름이 7cm인 원의 넓이를 구하세요. 𝜋 = 3.14159 π=3.14159로 계산하세요. Pass
    3 확률 문제 주사위를 두 번 던졌을 때, 두 숫자의 합이 7이 될 확률을 구하세요. Pass
    4 수열 문제 첫 번째 항이 3이고, 공차가 5인 등차수열의 10번째 항을 구하세요. Pass
    5 최적화 문제 어떤 직사각형의 둘레가 36cm입니다. 이 직사각형의 넓이를 최대화하려면 가로와 세로의 길이는 각각 얼마여야 하나요? Pass
    6 복합 문제 복소평면에서 다음 극한값을 구하시오. lim[n→∞] (1 + i/n)^(n^2) 여기서 i는 허수단위 (i^2 = -1)입니다. Pass

    Gemini 2.0 Flash Thinking은 기하학, 확률, 수열, 최적화, 복합 문제를 모두 성공하였습니다. 

    c. 추론 성능 테스트

    추론문제 3: 성공(좌), 추론문제 6: 실패(우)

    No. 문제 Gemini 2.0 Flash
    Thinking
    1 5학년과 6학년 학생 160명이 나무 심기에 참가하였습니다.
    6학년 학생들이 각각 평균5그루,5학년 학생들이 각각 평균 3그루씩 심은 결과 모두 560그루를 심었습니다. 나무심기에 참가한 5,6학년 학생은 각각 몇명일까요?
    Pass
    2 베티는 새 지갑을 위해 돈을 모으고 있습니다. 새 지갑의 가격은 $100입니다. 베티는 필요한 돈의 절반만 가지고 있습니다. 그녀의 부모는 그 목적을 위해 $15를 주기로 결정했고, 할아버지와 할머니는 그녀의 부모들의 두 배를 줍니다. 베티가 지갑을 사기 위해 더 얼마나 많은 돈이 필요한가요? Pass
    3 전국 초등학생 수학경시대회가 열렸는데 영희,철수,진호 세사람이 참가했습니다. 그들은 서울,부산,인천에서 온 학생이고 각각 1등,2등,3등 상을 받았습니다. 다음과 같은 사항을 알고 있을때 진호는 어디에서 온 학생이고 몇등을 했습니까? 1) 영희는 서울의 선수가 아닙니다. 2) 철수는 부산의 선수가 아닙니다. 3)서울의 선수는 1등이 아닙니다. 4) 부산의 선수는 2등을 했습니다. 5)철수는 3등이 아닙니다. Pass
    4 방 안에는 살인자가 세 명 있습니다. 어떤 사람이 방에 들어와 그중 한 명을 죽입니다. 아무도 방을 나가지 않습니다. 방에 남아 있는 살인자는 몇 명입니까? 단계별로 추론 과정을 설명하세요. Pass
    5 A marble is put in a glass. The glass is then turned upside down and put on a table. Then the glass is picked up and put in a microwave. Where's the marble? Explain your reasoning step by step. Pass
    6 도로에 5대의 큰 버스가 차례로 세워져 있는데 각 차의 뒤에 모두 차의 목적지가 적혀져 있습니다. 기사들은 이 5대 차 중 2대는 A시로 가고, 나머지 3대는 B시로 간다는 사실을 알고 있지만 앞의 차의 목적지만 볼 수 있습니다. 안내원은 이 몇 분의 기사들이 모두 총명할 것으로 생각하고 그들의 차가 어느 도시로 가야 하는지 목적지를 알려 주지 않고 그들에게 맞혀 보라고 하였습니다. 먼저 세번째 기사에게 자신의 목적지를 맞혀 보라고 하였더니 그는 앞의 두 차에 붙여 놓은 표시를 보고 말하기를 "모르겠습니다." 라고 말하였습니다. 이것을 들은 두번째 기사도 곰곰히 생각해 보더니 "모르겠습니다." 라고 말하였습니다. 두명의 기사의 이야기를 들은 첫번째 기사는 곰곰히 생각하더니 자신의 목적지를 정확하게 말하였습니다. 첫번째 기사가 말한 목적지는 어디입니까? Fail

    Gemini 2.0 Flash Thinking은 추론 6번 문제를 제외하고 모든 문제를 성공하였습니다. 

     

     

    5. 맺음말

    Gemini 2.0 Flash Thinking은 모델의 사고 과정을 투명하게 공개함으로써 더욱 강력한 추론 능력과 높은 신뢰성을 제공하는 혁신적인 모델입니다. 이 모델은 복잡한 문제 해결, 창의적인 글쓰기, 아이디어 구상 등 다양한 분야에서 유용하게 활용될 수 있으며, 사용자가 모델의 사고방식을 이해하고 학습하는 데 도움을 줍니다.

     

    여러분도 직접 사용해 보시고, 이 모델의 가능성을 경험해 보시면 좋을 것 같습니다. 이 블로그 게시글이 Gemini 2.0 Flash Thinking 모델을 이해하는 데 도움이 되었기를 바라면서 저는 다음 시간에 더 유익한 정보를 가지고 다시 찾아뵙겠습니다. 감사합니다. 

     

    https://fornewchallenge.tistory.com/

     

     

    2024.12.14 - [AI 언어 모델] - 👀🔊🤖 Gemini 2.0 출시: 보고 듣고 말하는 멀티모달 라이브 챗봇을 지금 만나보세요.

     

    👀🔊🤖 Gemini 2.0 출시: 보고 듣고 말하는 멀티모달 라이브 챗봇을 지금 만나보세요.

    안녕하세요! 오늘은 구글이 최근에 발표한 멀티모달 AI 모델 Gemini 2.0에 대해 알아보겠습니다. Gemini 2.0은 2023년에 발표된 Gemini 1.0을 기반으로 한 후속 모델로, 더욱 향상된 성능과 다양한 기능을

    fornewchallenge.tistory.com

     

     

    728x90