Gemini 3.5 Flash, 1백만 토큰 컨텍스트 윈도우 제공… 실제로 만들 수 있는 것들

발행: (2026년 5월 23일 PM 08:45 GMT+9)
10 분 소요
원문: Dev.to

출처: Dev.to

Google I/O Writing Challenge에 제출한 글입니다.
“1백만 토큰 컨텍스트 윈도우”는 모든 I/O 요약에 등장합니다. 그리고 사람들은 넘어갑니다.
추상적인 사양 수치처럼 들리죠—마치 700마력 자동차와 같은 인상적인 수치. 물론 그렇습니다. 하지만 실제로 어떤 도로를 달리고 있나요?

구체적인 예를 들어 보겠습니다. Gemini 3.5 Flash는 2026년 Google I/O에서 GA(일반 제공) 형태로 출시되었습니다. 아래는 1M 컨텍스트가 실제로 열어주는 가능성을 작업 코드와 제가 직접 실행한 실험을 통해 보여드립니다.

Gemini 3.5 Flash는 3.5 시리즈 중 최초로 일반 제공되는 모델입니다. 첫 날부터 GA—프리뷰 접미사 없이, 안정적이며 프로덕션에 바로 사용할 수 있습니다.

FeatureValue
컨텍스트 윈도우1,000,000 토큰
최대 출력65,000 토큰
사고(Thinking)내장
속도최전선 모델 대비 약 4배 빠름
가격입력 1M당 $1.50 · 출력 1M당 $9

벤치마크 스토리: 3.5 Flash는 거의 모든 벤치마크에서 Gemini 3.1 Pro를 4배 빠른 속도로 앞섭니다. 이것이 바로 전형적인 Flash 베팅—특수하고 어려운 작업에서 약간의 성능 한계를 감수하고, 대부분의 경우 속도와 비용을 절감합니다.

제 테스트에서는 3.1 Pro에서 810초가 걸리던 요청이 3.5 Flash에서는 23초 안에 처리되었습니다. 대규모로 보면, 이는 인터랙티브 툴과 배치 작업 사이의 차이와 같습니다.

pip install google-genai

AI Studio에서 무료 API 키를 받아보세요—테스트에 청구가 발생하지 않습니다.

from google import genai

client = genai.Client(api_key="YOUR_API_KEY")

response = client.models.generate_content(
    model="gemini-3.5-flash",
    contents="What's the most underrated pattern in async Python?",
)

print(response.text)

위가 기본 예시입니다. 이제 진짜 중요한 부분을 보겠습니다.

1백만 토큰은 대략 75만 단어에 해당합니다. 이는 다음과 같습니다:

  • 중간 규모 웹 애플리케이션 전체 소스 코드
  • 바쁜 엔지니어링 채널의 6개월치 Slack 내보내기
  • 300페이지 분량의 계약서와 모든 첨부 문서
  • 1년 치 고객 지원 티켓

이전에는 전체 코드베이스에 대해 추론하려면 청크화, 임베딩, 관련 조각 검색을 거쳐야 했고, 중요한 부분을 놓칠 위험이 있었습니다.

1M 컨텍스트가 있으면 한 번에 전부 보낼 수 있습니다. 한 번의 호출만으로 모델이 모든 정보를 동시에 파악합니다.

대담한 의견: 대부분의 “RAG 파이프라인” 복잡성은 충분하지 않은 컨텍스트 윈도우를 보완하기 위한 우회책입니다. 1M 토큰이 RAG를 완전히 없애지는 않지만, 개발자들이 실제로 구축하는 대부분의 애플리케이션에서 큰 규모의 검색 문제를 제거합니다.

실제 사용 사례: 전체 프로젝트를 Gemini 3.5 Flash에 넣고 구조화된 보안 검토 받기

import os
from pathlib import Path
from google import genai

client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])

def load_codebase(root: str, extensions: list[str] = [".py", ".ts", ".js"]) -> str:
    parts = []
    for path in sorted(Path(root).rglob("*")):
        if path.suffix in extensions and ".git" not in path.parts:
            parts.append(f"\n\n### FILE: {path}\n")
            parts.append(path.read_text(errors="ignore"))
    return "".join(parts)

codebase = load_codebase("./src")

response = client.models.generate_content(
    model="gemini-3.5-flash",
    contents=f"""You are a security-focused code reviewer.

Review this entire codebase for:
1. SQL injection vulnerabilities
2. Unvalidated user input in system calls
3. Hardcoded secrets or credentials
4. Insecure direct object references
5. Missing authentication checks

For each issue: file path, severity (critical/high/medium/low), what's wrong, suggested fix.

Codebase:
{codebase}""",
)

print(response.text)

한 번의 API 호출만으로 청크화, 검색 파이프라인, 파일 간 컨텍스트 누락 없이 검토가 가능합니다. 모델은 api/routes.pymiddleware/auth.py를 동시에 보게 되므로, auth.py에 체크가 없어서 발생하는 취약점도 놓치지 않습니다.

제가 직접 진행한 프로젝트—UXRay, 약 3,000줄 규모의 Next.js + TypeScript 앱—에 적용해 보았습니다. 전체 코드베이스가 한 호출에 들어갈 정도로 충분했으며, 여유까지 있었습니다. Gemini 3.5 Flash는 다음과 같은 결과를 반환했습니다:

  • 2건 고위험: Playwright 스크린샷 엔드포인트에 레이트 리밋이 없음; base64 이미지 데이터를 서브프로세스로 전달하기 전에 정제되지 않음
  • 1건 중위험: 특정 Next.js 설정 하에서 클라이언트 번들에 API 키가 노출됨
  • 3건 정보성: 사소한 입력 검증 누락, 비포괄적 오류 처리

레이트 리밋 문제는 실제로 존재했으며 제가 놓쳤던 부분이었습니다. 클라이언트 측 키 노출은 제 설정에 특화된 유효한 경고였습니다.

총 소요 시간: 14초. 보통 코드베이스 보안 검토에 한 시간 정도 걸리던 작업을 크게 단축했습니다.

내장 사고(Thinking) 기능

Gemini 3.5 Flash는 내장 사고 기능을 제공해, 답변을 생성하기 전에 문제를 스스로 고민합니다.

from google import genai
from google.genai import types

client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])

response = client.models.generate_content(
    model="gemini-3.5-flash",
    contents="Design a database schema for a multi-tenant SaaS with row-level security.",
    config=types.GenerateContentConfig(
        thinking_config=types.ThinkingConfig(
            thinking_budget=8192
        )
    ),
)

print(response.text)

gemini-3-flash-preview에서 업그레이드한다면, 조용히 동작이 바뀐 점을 유의하세요. 프리뷰 모델은 사고 예산을 high(기본)로 두었지만, GA 모델은 medium(기본)으로 바뀌었습니다. 사고 토큰을 명시적으로 지정하지 않으면 모델이 자동으로 적은 사고 토큰을 사용해—더 빠르고 저렴하지만 복잡한 작업에서는 덜 철저해집니다.

명시적으로 설정하는 방법:

# 이전 기본값(high)과 동일
thinking_config=types.ThinkingConfig(thinking_budget=16384)

# 새 GA 기본값(빠르고 저렴, medium)
thinking_config=types.ThinkingConfig(thinking_budget=4096)

프로덕션에서는 이 값을 암묵적으로 두지 마세요. 다단계 추론이 필요한 경우 출력 품질 차이를 확실히 느낄 수 있습니다.

제약된 JSON 출력 지원

API는 응답 스키마를 통해 구조화된 JSON 출력을 보장합니다. 모델은 지정한 스키마에 맞는 유효한 JSON을 반환하므로 파싱 히어리스틱, 정규식, 재시도 등이 필요 없습니다.

import json
from google import genai
from google.genai import types

schema = {
    "type": "object",
    "properties": {
        "summary": {"type": "string"},
        "issues": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "file": {"type": "string"},
                    "severity": {
                        "type": "string",
                        "enum": ["critical", "high", "medium", "low"]
                    },
                    "description": {"type": "string"},
                    "fix": {"type": "string"},
                },
                "required": ["file", "severity", "description", "fix"]
            }
        },
        "risk_score": {"type": "integer", "minimum": 0, "maximum": 100}
    },
    "required": ["summary", "issues", "risk_score"]
}

response = client.models.generate_content(
    model="gemini-3.5-flash",
    contents=f"Security review:\n\n{codebase}",
    config=types.GenerateContentConfig(
        response_mime_type="application/json",
        response_schema=schema,
    ),
)

result = json.loads(response.text)
print(f"Risk score: {result['risk_score']}/100")
for issue in result["issues"]:
    print(f"[{issue['severity'].upper()}] {issue['file']}: {issue['description']}")

Zod, Pydantic 등 스키마 라이브러리로 검증하고, UI에 바로 렌더링할 수 있어 후처리가 필요 없습니다.

1M 컨텍스트 + 구조화된 출력 + 사고 조합이 만든 새로운 실용 애플리케이션

  • 전체 코드베이스 리팩터링 어드바이저: 파일 간 영향을 고려한 우선순위 리팩터링 목록을 요청. 청크가 필요 없습니다.
  • 전체 계약서 분석: 300페이지 계약서를 한 번에 넣고, 책임 제한 조항, 충
0 조회
Back to Blog

관련 글

더 보기 »

내 스킬

프로젝트를 위한 AI 지시문을 만들고, 설치하고, 관리하세요 — 코딩이 필요 없습니다. CREATE 이름을 정하고, 카테고리를 선택하고, 원하는 것을 설명하세요 — 마법사가 자동으로 구성합니다.