Live API에서 생각하기

Live API에서 생각하기 (Thinking in the Live API)

Gemini Live API는 Gemini 모델과 실시간 양방향 음성 대화를 가능하게 해요.

표준 음성 모델은 즉각적인 주고받기 대화에 잘 맞아요. 사용자가 말하면 모델이 바로 음성 답변을 생성하죠. 하지만 계획, 복잡한 분석, 또는 외부 도구가 필요한 요청에서는 직접 응답이 한계에 부딪혀요. 모델은 추론 없이 답하거나, 도구가 끝나기를 기다리며 조용히 멈춰 있어야 하거든요.

Live API에서 생각하기(gemini-3.8-live-extended-thinking)는 실시간 음성 세션에 백그라운드 추론을 추가해요. 모델은 대화를 활발하게 유지하기 위해 자연스러운 대화용 필러(filler)를 말하면서 백그라운드에서 계획을 세우고 비동기 도구를 호출해요.

이 아키텍처는 대화 수명 주기를 두 가지 핵심 방식으로 바꿔요.

  • 대화용 필러: 모델이 백그라운드에서 도구를 실행하면서 중간 업데이트(예: "지금 항공편 옵션을 확인하고 있어요")를 말해요.
  • 상호작용 상태 추적: 모델이 단일 요청 중에 여러 번 말할 수 있으므로, 서버는 백그라운드 처리 중에 interaction_status: "IN_PROGRESS"를, 전체 작업이 완료되면 interaction_status: "IDLE"을 내보내요.

다음 다이어그램은 표준 Live 음성 세션과 백그라운드 추론을 사용하는 Thinking의 상호작용 수명 주기를 비교해요.

출처: 원문

본문

올바른 모델 선택하기 (Choosing the right model)

gemini-3.8-live와 gemini-3.8-live-extended-thinking 사이에서 결정할 때 응답 지연 시간, 작업 복잡도, 클라이언트 상태 처리라는 세 가지 주요 고려 사항을 따져 보세요.

Gemini 3.8 Live를 사용하는 경우

즉각적인 턴테이킹이 필수이고 작업이 직접적인 저지연 대화형 음성 에이전트에는 gemini-3.8-live를 사용하세요.

  • 대화형 음성 어시스턴트: 고객 서비스 분류, 언어 연습, 음성 검색, 인터랙티브 스토리텔링.
  • 빠른 도구 실행: 외부 도구가 밀리초 내에 응답하는 워크플로우(예: 센서 값 읽기 또는 스마트 기기 제어).
  • 간단한 클라이언트 로직: 각 사용자 턴에 단일 모델 응답이 오고, turnComplete: true가 세션이 유휴 상태임을 안정적으로 알리는 애플리케이션.

Gemini 3.8 Live Extended Thinking을 사용하는 경우

에이전트가 복잡한 데이터를 평가하거나, 여러 단계를 계획하거나, 실행에 몇 초 걸리는 도구를 처리해야 할 때 gemini-3.8-live-extended-thinking을 사용하세요.

  • 다단계 진단 및 지원: 여러 로그, 오류 코드, 구성 확인을 통해 시스템 문제를 진단하는 기술 지원 에이전트.
  • 조정된 데이터 검색: 병렬 API 호출로 항공편을 검색하고 호텔을 조회하며 가격을 비교하는 여행·예약 에이전트.
  • STEM 및 코드 튜터링: 설명을 말하기 전에 공식을 검증하고 코드를 디버깅하거나 다단계 논리를 풀어내는 교육용 에이전트.
  • 도구 지연 시간 가리기: 오래 실행되는 함수가 그렇지 않으면 청취자에게 어색한 침묵을 만들 음성 경험.

주요 차이점 요약

다음 표는 두 모델 간의 기술적 차이를 요약해요.

기능 Gemini 3.8 Live Gemini 3.8 Live Extended Thinking
주요 사용 사례 저지연 음성 에이전트, 직접 명령, 빠른 도구 다단계 문제 해결, 복잡한 계획, 다중 도구 워크플로우
모델 엔드포인트 gemini-3.8-live gemini-3.8-live-extended-thinking
추론 아키텍처 고정 지연 프로필의 인터리브 추론(thinking_level 미지원) 구성 가능한 백그라운드 추론(thinking_level: low, medium, high; MINIMAL 미지원)
턴 경계 turnComplete: true가 턴을 닫고 유휴 상태로 복귀 turnComplete: true가 발화를 마치고; interaction_status가 세션 수명 주기를 제어
대화용 필러 모델이 말하기 전에 도구 실행을 기다림 모델이 처리하는 동안 중간 대화용 필러를 스트리밍
도구 실행 동기(BLOCKING) 및 비동기(NON_BLOCKING) 도구 지원 비동기(NON_BLOCKING) 도구 선언 필요

마이그레이션 및 통합 경로 (Migration and integration paths)

기존 음성 애플리케이션을 업그레이드하거나 Live API 세션에 Thinking을 통합하려면 다음 단계를 따르세요.

Gemini 3.1 Flash Live에서 업그레이드하기

gemini-3.1-flash-live-preview를 사용하는 기존 음성 애플리케이션을 gemini-3.8-live로 업그레이드하려면 모델 문자열을 업데이트하고 설정 구성에서 thinking_level(또는 thinking_config)을 생략해야 해요. gemini-3.8-live에서는 thinking_level을 지원하지 않기 때문이에요.

{
  "setup": {
    "model": "models/gemini-3.8-live"
  }
}

턴 수명 주기와 turnComplete 신호는 동일하게 유지돼요.

Thinking 채택하기

gemini-3.8-live-extended-thinking을 채택하려면 세 가지 통합 지점을 업데이트해 주세요.

  1. turnComplete 대신 interaction_status 추적: Thinking 세션에서 모델은 추론하는 동안 중간 대화용 필러를 내보낼 수 있어요. 수신 서버 메시지의 interaction_status 필드를 검사해 UI 상태를 관리하세요. interaction_status가 IDLE일 때만 유휴 상태로 복귀해요.
status = getattr(message, "interaction_status", None)
if status == "IDLE":
    # 사용자 입력 준비됨
    set_ui_state("listening")
elif status == "IN_PROGRESS":
    # 추론 중 또는 도구 실행 중
    set_ui_state("thinking")
if (message.interactionStatus === 'IDLE') {
  // 사용자 입력 준비됨
  setUiState('listening');
} else if (message.interactionStatus === 'IN_PROGRESS') {
  // 추론 중 또는 도구 실행 중
  setUiState('thinking');
}
  1. 비차단 함수 선언: 모든 함수 선언에 "behavior": "NON_BLOCKING"을 설정해 주세요. Thinking 모델은 음성 업데이트를 스트리밍하면서 백그라운드에서 비동기적으로 도구를 실행해요. 동기 차단 도구는 오류를 반환해요.
search_flights = types.FunctionDeclaration(
    name="search_flights",
    description="Searches for available flights.",
    behavior="NON_BLOCKING",
    parameters={
        "type": "OBJECT",
        "properties": {
            "destination": {"type": "STRING"},
        },
        "required": ["destination"],
    },
)
const searchFlights = {
  name: 'search_flights',
  description: 'Searches for available flights.',
  behavior: 'NON_BLOCKING',
  parameters: {
    type: 'OBJECT',
    properties: {
      destination: { type: 'STRING' },
    },
    required: ['destination'],
  },
};
  1. 추론 깊이 구성: 세션 구성에서 thinking_config를 설정해 추론 수준(low, medium, high; MINIMAL은 미지원)을 조정해요.
config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    thinking_config=types.ThinkingConfig(
        thinking_level="low",
    ),
    tools=[types.Tool(function_declarations=[search_flights])],
)
const config = {
  responseModalities: [Modality.AUDIO],
  thinkingConfig: {
    thinkingLevel: 'low',
  },
  tools: [{ functionDeclarations: [searchFlights] }],
};

프로토콜 병렬 비교 (Protocol side-by-side comparison)

이 섹션은 Live API 세션의 각 단계에서 교환되는 WebSocket 메시지를 비교해요.

1단계: 세션 설정

두 모델 모두 동일한 WebSocket 엔드포인트에 연결해요.

wss://generativelanguage.googleapis.com/ws/google.ai.generativelanguage.v1alpha.GenerativeService.BidiGenerateContent?key=$API_KEY
  • 동일: WebSocket URL 및 API 키 인증.
  • 모델 문자열: gemini-3.8-live 대 gemini-3.8-live-extended-thinking.
  • Thinking 구성: Thinking은 추론 깊이를 조정하는 thinkingConfig를 추가해요.
  • 도구 동작: Thinking은 함수 선언에 "behavior": "NON_BLOCKING"을 요구해요.

두 모델 모두 연결 시 동일한 서버 확인을 받아요.

{
  "setupComplete": {}
}

2단계: 사용자 오디오 입력

오디오 스트리밍은 두 모델 모두 동일해요. 실시간 16kHz 원시 PCM 오디오 청크가 realtimeInput을 사용해 스트리밍돼요.

{
  "realtimeInput": {
    "audio": {
      "data": "UklGRiQAAABXQVZF...",
      "mimeType": "audio/pcm;rate=16000"
    }
  }
}

3단계: 모델 응답 및 상태 수명 주기

두 모델 모두 serverContent.modelTurn에서 24kHz PCM 오디오 청크를 스트리밍해요. 하지만 수명 주기 관리는 다르게 동작해요.

Gemini 3.8 Live 응답 흐름
  1. 서버가 해당 턴의 오디오 청크를 스트리밍해요.
  2. 서버가 turnComplete: true를 보내 모델이 말하기를 마치고 세션이 유휴 상태임을 알려요.
// 1. 오디오 스트림 청크
{
  "serverContent": {
    "modelTurn": {
      "parts": [
        {
          "inlineData": {
            "mimeType": "audio/pcm;rate=24000",
            "data": "..."
          }
        }
      ]
    }
  }
}

// 2. 턴 완료 -> 클라이언트에 UI를 Idle/Listening으로 전환하라고 신호
{
  "serverContent": {
    "turnComplete": true
  }
}
Gemini 3.8 Live Extended Thinking 응답 흐름
  1. 음성 필러: 모델이 turnComplete: true 및 interactionStatus: "IN_PROGRESS"와 함께 중간 음성(예: "시애틀행 항공편을 확인 중이에요...")을 내보내요.
  2. 비동기 도구 호출: interactionStatus가 "IN_PROGRESS"로 유지되는 동안 서버가 도구 호출을 내보내요. 이는 서버가 다단계 턴을 적극적으로 처리하고 도구 응답을 기다리고 있음을 의미해요.
  3. 도구 응답: 클라이언트가 함수를 실행하고 출력을 반환해요.
  4. 최종 응답: 서버가 turnComplete: true 및 interactionStatus: "IDLE"과 함께 완전한 답변을 전달해요.
// 1. 백그라운드 추론 중 음성 필러
{
  "serverContent": {
    "modelTurn": {
      "parts": [
        {
          "inlineData": {
            "mimeType": "audio/pcm;rate=24000",
            "data": "..."
          }
        }
      ]
    },
    "turnComplete": true,
    "interactionStatus": "IN_PROGRESS"
  }
}

// 2. IN_PROGRESS 상태로 비동기 도구 호출
{
  "toolCall": {
    "functionCalls": [
      {
        "id": "call_123",
        "name": "searchFlights",
        "args": {
          "destination": "Seattle"
        }
      }
    ]
  },
  "interactionStatus": "IN_PROGRESS"
}

// 3. 클라이언트가 함수를 실행하고 결과 반환
{
  "toolResponse": {
    "functionResponses": [
      {
        "response": {
          "output": {
            "flight": "DL 145",
            "price": "$145"
          }
        },
        "id": "call_123"
      }
    ]
  }
}

// 4. 최종 음성 답변 전달 -> 완료 시 세션이 IDLE로 전환
{
  "serverContent": {
    "modelTurn": {
      "parts": [
        {
          "inlineData": {
            "mimeType": "audio/pcm;rate=24000",
            "data": "..."
          }
        }
      ]
    },
    "interactionStatus": "IDLE",
    "turnComplete": true
  }
}

SDK 구현 예시 (SDK implementation examples)

다음 예시는 Google GenAI SDK를 사용해 Thinking을 구성하고 interaction_status를 처리하는 방법을 보여줘요.

다음 단계 (What's next)

더 알아보기 (Learn more)