AI.zip
  • AI 모델
  • 방법론
  • AI 서비스
  • 가격 비교
  • 블로그

AI.zip

AI 모델, 서비스, 방법론을 큐레이션하는 에디토리얼 플랫폼

탐색

  • AI 모델
  • AI 서비스
  • 방법론
  • 블로그

커뮤니티

  • 소개
  • 디스코드 참여
  • 문의

법적고지

  • 이용약관
  • 개인정보처리방침

© 2026 ai.zip. All rights reserved.

Discord 커뮤니티
모델OpenAI: GPT-4o-mini

GPT-4o-mini

OpenAILMM시각-언어 (Vision-Language)오디오-언어 (Audio-Language)통합 모달리티 (Any-to-Any)128K 토큰
2024년 7월 18일Proprietary

GPT-4o mini는 OpenAI의 경량 멀티모달 모델로, GPT-4o의 핵심 능력을 유지하면서 비용과 속도를 대폭 최적화한 모델입니다. 128K 토큰 컨텍스트를 지원하며 텍스트와 이미지 입력을 모두 처리합니다. MMLU 82, HumanEval 87.2, MATH 70.2로 경량 모델 중에서는 최상위 성능을 기록합니다.

GPT-4o mini의 최대 강점은 가격 대비 성능입니다. 입력 0.15/1M토큰,출력0.15/1M 토큰, 출력 0.15/1M토큰,출력0.60/1M 토큰으로 GPT-4o 대비 약 10배 저렴하면서도, 대부분의 일상적인 작업에서 충분한 품질을 제공합니다. 멀티모달 벤치마크에서도 MMBench 77.1, MMMU 60, ScienceQA 85.4로 이미지 이해 능력이 우수하며, IFEval 80.4점으로 지시 따르기 능력도 갖추고 있습니다.

출시 이후 전 세계적으로 가장 많이 사용되는 AI 모델 중 하나로 자리잡았습니다. 빠른 응답 속도와 낮은 비용 덕분에 챗봇, 콘텐츠 생성, 데이터 추출 등 대량 처리 워크플로우의 표준 모델이 되었습니다. Arena에서도 안정적인 사용자 평가를 받고 있습니다.

고객 서비스 챗봇, 콘텐츠 초안 작성, 이메일 분류 및 요약, 간단한 이미지 분석, 데이터 추출 및 정형화 등 '충분히 좋은 품질을 대량으로 빠르게' 처리해야 하는 대부분의 프로덕션 워크플로우에 적합합니다. 고도의 추론이 필요한 작업에는 GPT-4o나 o3를 권장합니다.

스펙

컨텍스트 윈도우

128K 토큰

라이선스

Proprietary

출시일

2024년 7월 18일

학습 마감일

2023년 10월 31일

가성비 지수

10.2

API 가격 (혼합)

입력 $0.150/1M

조회수

0

API 가격 (USD 기준)

입력 (Prompt)

$0.15 / 1M 토큰

출력 (Completion)

$0.60 / 1M 토큰

용도별 성능

태스크 관련 벤치마크 평균 점수

지시따르기최강

80.4

복잡한 지시사항 이해 및 수행

멀티모달

67.3

이미지, 비디오 등 멀티모달 이해

일반지식

64.8

다양한 분야 지식 및 이해

Provider

OpenAI

OpenAI의 다른 모델

OpenAI: GPT-3.5 TurboOpenAI: o4 MiniOpenAI: o3 MiniOpenAI: GPT-4.1 MiniOpenAI: GPT-4

분류

시각-언어 (Vision-Language)오디오-언어 (Audio-Language)통합 모달리티 (Any-to-Any)Multimodal TransformerLMM

성능 평가

꼭지점 클릭 → 벤치마크 행 이동

벤치마크

유사 모델 비교

모델ProviderLLM 점수GPQA·MMLU·MATH·IFEval·HumanEvalAgentic 점수SWE·τ-bench·OSWorld·GAIA
GPT-4o-miniOpenAI62.6-
Nova Pro 1.0Amazon68.4-
Gemma 4Google86.2-
Claude 3 HaikuAnthropic46.5-
Nova Premier 1.0Amazon73.2

관련 블로그 글

튜토리얼2026년 3월 28일

AI로 영어 공부하는 법: 원어민 선생님보다 나은 무료 방법

## AI가 영어 선생님을 바꾼다 원어민 과외는 시간당 5~10만 원입니다. AI는 24시간 365일, 눈치 없이 같은 질문을 무한 반복해도 됩니다. 틀려도 창피하지 않고, 내 속도에 맞게 공부할 수 있습니다. 2025년, AI는 영어 학습의 판도를 바꾸고 있습니다. --- ## 방법 1: ChatGPT / Claude로 회화 연습 가장 간단하고 효과적인 방법입니다. **기본 설정 프롬프트** > "Let's practice English conversation. I'm a Korean intermediate learner. Please correct my grammar mistakes and suggest more natural expressions after each of my messages. Let's talk about daily life." 이렇게 시작하면 AI가 대화 상대가 되어주면서 교정도 해줍니다. **실전 활용법** - **역할극**: "You're a job interviewer. Interview me for a marketing position." - **상황 연습**: "I need to practice ordering food at a restaurant in New York." - **발음 피드백**: 텍스트로는 한계가 있지만 "Is this sentence natural? [내가 쓴 문장]"으로 자연스러운 표현 확인 가능 - **오류 교정**: 내가 쓴 이메일이나 에세이를 붙여넣고 "Please correct my English and explain the mistakes." **팁**: "Please use simple English for B1 level" 처럼 수준을 명시하면 더 적절한 답변을 얻을 수 있습니다. --- ## 방법 2: 스픽(Speak) — AI 회화 특화 앱 스픽은 한국인을 위한 AI 영어 회화 앱으로 국내에서 가장 인기 있는 AI 영어 앱입니다. **특징** - AI와 실제 음성으로 대화 - 발음, 유창성, 문법 실시간 피드백 - 상황별 시나리오 (공항, 회의, 소개팅 등) - 한국인 영어 실수 패턴 특화 교정 **가격**: 월 2만 원대 (연간 구독 시 더 저렴) **어울리는 사람**: 문법보다 실제 말하기가 목표인 사람, 스마트폰으로 틈틈이 공부하고 싶은 사람 --- ## 방법 3: ELSA Speak — 발음 교정 전문 발음이 고민이라면 ELSA(영어 발음 AI)가 최선입니다. - 단어, 문장 단위 발음 정확도 점수 - 한국인이 자주 틀리는 발음 패턴(R/L 구분, th 발음 등) 특화 - AI가 어느 부분이 틀렸는지 시각적으로 표시 **가격**: 무료 기본 / 유료 프리미엄 월 약 1만 5천 원 --- ## 방법 4: 영어 글쓰기 향상 — ChatGPT 피드백 루프 작문 실력을 키우는 가장 효율적인 방법입니다. **3단계 방법** 1. 내가 먼저 영어로 글을 씁니다 (이메일, 일기, 의견 등) 2. ChatGPT/Claude에 붙여넣고: "Please correct this text and explain each correction. Also suggest more advanced vocabulary." 3. 교정된 버전을 읽고 내 버전과 비교 이 방법을 꾸준히 하면 한 달 안에 이메일 작성 실력이 눈에 띄게 향상됩니다. **고급 활용**: "Rewrite this in a more formal tone" / "Make this more concise" / "What's a more sophisticated way to say this?" --- ## 방법 5: 영어 콘텐츠 요약 & 단어 학습 영어 뉴스, 유튜브, 팟캐스트를 AI로 더 효과적으로 활용합니다. - 영어 기사를 복사해 "Summarize this in Korean, then list 5 key vocabulary words with examples." - 모르는 단어를 맥락과 함께 질문: "What does 'exacerbate' mean? Give me 3 example sentences." - 유튜브 자막을 복사해 "Explain the difficult parts in Korean." --- ## AI 영어 학습 주간 플랜 예시 | 요일 | 방법 | 시간 | |------|------|------| | 월 | ChatGPT 회화 연습 (일상 주제) | 20분 | | 화 | ELSA 발음 훈련 | 15분 | | 수 | 영어 글쓰기 + AI 피드백 | 25분 | | 목 | Speak 앱 시나리오 대화 | 20분 | | 금 | 영어 기사 읽기 + AI 단어 학습 | 20분 | | 주말 | 영화/드라마 영어 자막 + 모르는 표현 AI 질문 | 자유 | 하루 20분, 주 5회만 해도 3개월 후 체감 변화가 큽니다. --- ## AI 영어 학습의 한계 솔직히 말하면 AI 영어 학습에도 한계가 있습니다. - **발음 교정**: 텍스트 기반 AI(ChatGPT, Claude)는 실제 발음을 들을 수 없어 한계 - **진짜 대화 압박**: 실수해도 괜찮은 AI 대화가 실전 스피킹 긴장감을 대체하진 못함 - **문화적 뉘앙스**: 원어민 특유의 유머, 관용 표현은 AI가 완벽히 전달하기 어려움 AI는 저비용 고효율 보조 도구입니다. 말하기가 궁극적인 목표라면 AI로 기본기를 다지고, 최소한의 원어민 대화 경험을 병행하는 것이 이상적입니다. --- ## Footnotes [^1]: 스픽(Speak)은 2023년 소프트뱅크 등으로부터 2,700만 달러 투자 유치, 국내 AI 영어 앱 1위 [^2]: ELSA AI 발음 평가 엔진은 구글 출신 AI 연구자들이 개발, 170여 개국 발음 패턴을 학습 [^3]: 미국 교육 연구 저널(2024): AI 튜터와 주 5회 20분 대화 연습 시, 12주 후 스피킹 자신감 지수 42% 향상

이전글

OpenAI: GPT-4o

다음글

OpenAI: GPT-4 Turbo

댓글

0개

댓글을 작성하려면

로그인

해주세요

사용하는 서비스

Microsoft 365 Copilot

Summarization (문서 요약)

Vrew

Summarization (문서 요약)

OpenAI API Platform

Code Generation (코드 생성)

관련 기사

AI로 영어 공부하는 법: 원어민 선생님보다 나은 무료 방법

TUTORIAL

ChatGPT vs Claude vs Gemini: 2025년 어떤 AI를 써야 할까?

COMPARISON

AI 문서 자동화: 코드에서 문서 생성하고 유지하는 방법

TUTORIAL
수학/추론

55.2

수학, 과학, 논리적 추론

코딩

48.0

코드 생성, 버그 수정, 소프트웨어 엔지니어링

카테고리
이 모델
전체 평균
전체 최고
단위
AI2D77.881.393.9%
GPQALLM40.264.094.3%
HallusionBench46.148.964.1%
HumanEvalLLM87.286.097.6%
IFEvalLLM80.485.395.9%
MATH Lvl 5LLM70.275.599.2%
MathVista52.556.080.9%
MMBench77.174.593.7%
MMLU82.084.298.0%
MMLU-PROLLM64.873.890.5%
MMMU60.071.185.0%
MMStar54.859.883.8%
MMVet66.961.683.3%
RealWorldQA67.163.076.5%
ScienceQA85.479.290.1%
SWE-bench VerifiedAgentic8.763.680.9%
-
GPT-4oOpenAI66.2-
비교2026년 3월 28일

ChatGPT vs Claude vs Gemini: 2025년 어떤 AI를 써야 할까?

## 세 AI, 뭐가 다를까? ChatGPT(OpenAI), Claude(Anthropic), Gemini(Google)는 2025년 현재 가장 많이 쓰이는 AI 챗봇입니다. 모두 뛰어나지만 각자 강점이 다릅니다. 어느 것이 "최고"냐가 아니라 **어떤 일에 어느 것을 쓰면 되는지**가 핵심입니다. --- ## 한눈에 보는 비교 | 항목 | ChatGPT | Claude | Gemini | |------|---------|--------|--------| | 만든 곳 | OpenAI (MS 투자) | Anthropic (Amazon 투자) | Google | | 무료 버전 | GPT-4o mini | Claude Sonnet (제한) | Gemini 1.5 Flash | | 유료 버전 | $20/월 (Plus) | $20/월 (Pro) | $20/월 (Advanced) | | 컨텍스트 길이 | 128K 토큰 | 200K 토큰 | 1M 토큰 | | 한국어 수준 | ★★★★ | ★★★★★ | ★★★★ | | 이미지 생성 | ✅ (DALL-E 3) | ❌ | ✅ | | 웹 검색 | ✅ | ✅ | ✅ | | 파일 업로드 | ✅ | ✅ | ✅ | --- ## 업무별 최강자 ### 글쓰기 & 문서 작성 — 🏆 Claude Claude는 자연스러운 문체와 논리적 구성에서 두드러집니다. 긴 보고서, 기획서, 에세이, 블로그 글 등에서 가장 매끄러운 한국어 결과물을 냅니다. "사람이 쓴 것 같다"는 평가를 가장 많이 받는 AI입니다. **시도해볼 것**: 같은 주제로 세 AI에게 블로그 글 초안을 요청해보세요. 차이를 바로 느낄 수 있습니다. ### 코딩 & 개발 — 🏆 ChatGPT (GPT-4o) 개발자 커뮤니티에서 가장 선호하는 코딩 AI입니다. 다양한 언어와 프레임워크에 대한 방대한 학습 데이터, 직접 실행해볼 수 있는 Code Interpreter, GitHub Copilot과의 연동이 강점입니다. Claude도 코딩 실력은 뛰어나지만 ChatGPT의 생태계가 더 풍부합니다. ### 정보 검색 & 최신 정보 — 🏆 Gemini Google 검색 엔진과 연동되어 실시간 정보를 가장 잘 가져옵니다. 뉴스, 주가, 날씨, 최근 이벤트 등 최신 정보가 필요한 작업에 유리합니다. Google Workspace (Gmail, Docs, Sheets)와의 통합도 강점입니다. ### 긴 문서 분석 — 🏆 Claude 200K 토큰의 컨텍스트 창은 경쟁사 대비 월등합니다. 100페이지 이상의 보고서, 계약서, 논문을 한 번에 넣고 분석 요청이 가능합니다. 법무팀, 연구자, 투자자들이 Claude를 선호하는 이유입니다. ### 창작 & 스토리텔링 — 🏆 Claude 소설, 시나리오, 광고 카피 등 창의적 글쓰기에서 가장 독창적이고 일관성 있는 결과물을 냅니다. 캐릭터 묘사, 대화 구성, 세계관 설정 등에서 타 AI보다 확실히 앞섭니다. ### 멀티모달 (이미지+텍스트) — 🏆 Gemini 이미지를 업로드해 분석하거나, DALL-E 3(ChatGPT)로 이미지를 생성하는 것 모두 가능합니다. 동영상 분석은 현재 Gemini만 지원합니다. --- ## 무료 버전으로 충분할까? **충분한 경우** - 가끔 이메일 초안, 번역, 간단한 질문 - 하루 10회 미만 사용 - 속도보다 비용 절감이 우선 **유료가 필요한 경우** - 매일 업무에 활용 - 긴 문서 분석 (무료는 길이 제한 있음) - 이미지 생성, 파일 업로드 등 고급 기능 - 빠른 응답 속도 필요 유료($20/월)는 스타벅스 커피 7잔 가격입니다. 업무에 실제로 활용한다면 가성비는 압도적입니다. --- ## 상황별 추천 정리 | 상황 | 추천 AI | |------|---------| | 처음 시작, 무료로 써보고 싶다 | Gemini (가장 관대한 무료) | | 한국어 글쓰기, 문서 작성 | Claude | | 코딩, 개발 업무 | ChatGPT | | Google 앱 연동, 최신 정보 | Gemini | | 긴 문서 분석 (계약서, 논문) | Claude | | 이미지 생성 포함 | ChatGPT 또는 Gemini | | 창작, 소설, 시나리오 | Claude | --- ## 한 가지만 선택해야 한다면 **일반 직장인**: Claude (한국어 글쓰기 최강, 문서 분석 우수) **개발자**: ChatGPT (생태계와 도구 가장 풍부) **Google 헤비 유저**: Gemini (Workspace 통합) 사실 세 가지를 모두 무료로 써보고 본인 업무에 맞는 걸 유료로 전환하는 것이 가장 현명한 방법입니다. --- ## Footnotes [^1]: LMSYS Chatbot Arena 2025 기준: GPT-4o, Claude 3.5 Sonnet, Gemini 1.5 Pro가 상위권을 번갈아 차지하며 실력 차이가 크지 않음 [^2]: Anthropic에 따르면 Claude의 컨텍스트 200K 토큰은 약 15만 단어, 일반 소설 1권 분량에 해당 [^3]: 2024년 기준 ChatGPT 월간 활성 사용자 2억 명, Claude 약 1,000만 명, Gemini 약 5,000만 명

튜토리얼2026년 3월 28일

AI 문서 자동화: 코드에서 문서 생성하고 유지하는 방법

## 문서 자동화가 필요한 이유 코드는 빠르게 변하지만 문서는 항상 뒤처집니다. LLM은 코드를 읽고 최신 문서를 생성하거나 업데이트할 수 있습니다. ```mermaid flowchart LR Code[소스 코드] --> LLM[LLM] LLM --> Docstring[docstring 생성] LLM --> README[README 업데이트] LLM --> API[OpenAPI 스펙] LLM --> Tutorial[튜토리얼 생성] Git[git diff] --> LLM ``` --- ## Python Docstring 자동 생성 ```python import ast import anthropic client = anthropic.Anthropic() def add_docstrings(source_code: str) -> str: response = client.messages.create( model="claude-sonnet-4-6-20251001", max_tokens=4096, system='''Python 함수와 클래스에 Google 스타일 docstring을 추가하세요. 형식: '''한 줄 요약. Args: param1 (type): 설명. param2 (type): 설명. Returns: type: 설명. Raises: ExceptionType: 발생 조건. Example: >>> result = func(1, 2) >>> print(result) 3 ''' - 이미 docstring이 있는 함수는 수정하지 마세요 - 타입 정보가 있으면 활용하세요''', messages=[{ "role": "user", "content": f"다음 Python 코드에 docstring을 추가해주세요: ```python {source_code} ```" }] ) return response.content[0].text # 전체 파일 처리 import os from pathlib import Path def process_directory(src_dir: str): for py_file in Path(src_dir).rglob("*.py"): if "test_" in py_file.name: continue with open(py_file) as f: code = f.read() # docstring 없는 함수가 있을 때만 처리 tree = ast.parse(code) missing = [n for n in ast.walk(tree) if isinstance(n, (ast.FunctionDef, ast.AsyncFunctionDef)) and not (n.body and isinstance(n.body[0], ast.Expr) and isinstance(n.body[0].value, ast.Constant))] if missing: documented = add_docstrings(code) with open(py_file, "w") as f: f.write(documented) print(f"✅ {py_file}") ``` --- ## OpenAPI 스펙 자동 생성 ```python def generate_openapi_spec(fastapi_code: str) -> dict: response = client.messages.create( model="claude-sonnet-4-6-20251001", max_tokens=4096, system="FastAPI 라우터 코드를 분석해서 OpenAPI 3.0 YAML 스펙을 생성하세요.", messages=[{ "role": "user", "content": f"OpenAPI 스펙 생성: ```python {fastapi_code} ```" }] ) import yaml return yaml.safe_load(response.content[0].text) # FastAPI는 자동 생성되지만, 설명이 빈약할 때 보강 def enhance_openapi_descriptions(spec: dict) -> dict: response = client.messages.create( model="claude-sonnet-4-6-20251001", max_tokens=2048, messages=[{ "role": "user", "content": f'''다음 OpenAPI 스펙의 description 필드를 개선해줘. 각 엔드포인트의 목적, 사용 예시, 에러 케이스를 포함해서. 현재 스펙: {yaml.dump(spec, allow_unicode=True)}''' }] ) return yaml.safe_load(response.content[0].text) ``` --- ## README 자동 생성 및 업데이트 ```python def generate_readme(repo_path: str) -> str: # 코드 구조 분석 structure = [] for root, dirs, files in os.walk(repo_path): dirs[:] = [d for d in dirs if not d.startswith('.') and d != '__pycache__'] level = root.replace(repo_path, '').count(os.sep) structure.append(f"{' ' * level}{os.path.basename(root)}/") for file in files[:5]: # 파일 최대 5개만 structure.append(f"{' ' * (level+1)}{file}") # 주요 파일 내용 main_files = [] for pattern in ["main.py", "app.py", "index.ts", "package.json"]: for f in Path(repo_path).rglob(pattern): with open(f) as fp: main_files.append(f"# ## {f} \`\`\` " + fp.read() [:500] + " \`\`\`") break response = client.messages.create( model="claude-sonnet-4-6-20251001", max_tokens=4096, system='''프로젝트 README.md를 작성하세요. 포함할 항목: - 프로젝트 설명 (2-3문장) - 주요 기능 (bullet) - 설치 방법 - 빠른 시작 예제 - 환경변수 목록 - API 문서 링크 (있는 경우) - 라이센스''', messages=[{ "role": "user", "content": f'''프로젝트 구조: {chr(10).join(structure[:50])} 주요 파일: {chr(10).join(main_files)}''' }] ) return response.content[0].text ``` --- ## Git Commit → Changelog 자동화 ```python import subprocess def generate_changelog_entry(since_tag: str = "HEAD~10") -> str: # 최근 커밋 목록 result = subprocess.run( ["git", "log", since_tag, "--pretty=format:%h %s", "--no-merges"], capture_output=True, text=True ) commits = result.stdout.strip() # 변경된 파일 result2 = subprocess.run( ["git", "diff", since_tag, "--stat"], capture_output=True, text=True ) response = client.messages.create( model="claude-haiku-4-5-20251001", # 간단한 작업은 저렴한 모델로 max_tokens=1024, messages=[{ "role": "user", "content": f'''다음 git 커밋들을 Keep a Changelog 형식으로 정리해줘: 커밋 목록: {commits} 변경 파일: {result2.stdout[:2000]}''' }] ) return response.content[0].text # 매주 자동 실행 (cron) changelog = generate_changelog_entry("v1.2.0") with open("CHANGELOG.md", "a") as f: f.write(f" ## [Unreleased] - {datetime.now().strftime('%Y-%m-%d')} ") f.write(changelog) ``` --- ## CI/CD 통합 ```yaml # .github/workflows/docs.yml name: Auto Documentation on: push: branches: [main] paths: ['src/**/*.py', 'src/**/*.ts'] jobs: update-docs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Generate/Update Docs env: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} run: | python scripts/auto_docs.py --check-missing-docstrings python scripts/update_readme.py - name: Commit docs update run: | git config user.name "docs-bot" git add docs/ README.md git diff --staged --quiet || git commit -m "docs: auto-update documentation" git push ``` 문서 자동화의 핵심은 '완벽한 문서 생성'이 아니라 '항상 최신 상태 유지'입니다. AI 초안 → 개발자 검토 → 머지 흐름으로 운영하세요.

튜토리얼2026년 3월 28일

NL2SQL 완전 가이드: 자연어로 데이터베이스 조회하기

## NL2SQL이란? NL2SQL(Natural Language to SQL)은 "지난 달 매출이 가장 높은 상품 TOP 5는?" 같은 자연어 질문을 `SELECT product, SUM(revenue) FROM orders...` SQL 쿼리로 자동 변환하는 기술입니다. ```mermaid flowchart LR User["사용자 질문<br/>자연어"] --> LLM[LLM<br/>SQL 변환기] Schema["DB 스키마<br/>테이블/컬럼 정보"] --> LLM LLM --> SQL[SQL 쿼리 생성] SQL --> DB[(데이터베이스)] DB --> Result[결과 반환] Result --> Answer["자연어 답변<br/>LLM 해석"] ``` --- ## 기본 NL2SQL 구현 ```python import anthropic import psycopg2 client = anthropic.Anthropic() SCHEMA = ''' 테이블: orders (id, user_id, product_id, amount, created_at) 테이블: products (id, name, category, price) 테이블: users (id, name, email, created_at) ''' def nl2sql(question: str) -> str: response = client.messages.create( model="claude-sonnet-4-6-20251001", max_tokens=1024, system=f'''당신은 PostgreSQL 전문가입니다. 다음 스키마를 참고해서 자연어 질문을 SQL로 변환하세요: {SCHEMA} 규칙: - SELECT 쿼리만 생성 (보안상 DML 금지) - 쿼리만 반환, 설명 없이 - 컬럼명은 항상 테이블명.컬럼명 형식으로''', messages=[{"role": "user", "content": f"질문: {question}"}] ) return response.content[0].text.strip() def execute_query(sql: str, conn) -> list[dict]: with conn.cursor() as cur: cur.execute(sql) cols = [desc[0] for desc in cur.description] return [dict(zip(cols, row)) for row in cur.fetchall()] # 사용 예시 conn = psycopg2.connect("postgresql://localhost/mydb") sql = nl2sql("지난 달 매출 TOP 5 상품과 총 매출액을 알려줘") print(f"생성된 SQL: {sql}") results = execute_query(sql, conn) for row in results: print(row) ``` --- ## 스키마 자동 추출 + 컨텍스트 최적화 LLM 컨텍스트 한계를 고려해 관련 테이블만 선택적으로 주입합니다. ```python from openai import OpenAI import json openai_client = OpenAI() def extract_schema(conn, tables: list[str] = None) -> str: with conn.cursor() as cur: if tables: placeholders = ','.join(['%s'] * len(tables)) cur.execute(f''' SELECT table_name, column_name, data_type, is_nullable FROM information_schema.columns WHERE table_name IN ({placeholders}) ORDER BY table_name, ordinal_position ''', tables) else: cur.execute(''' SELECT table_name, column_name, data_type, is_nullable FROM information_schema.columns WHERE table_schema = 'public' ORDER BY table_name, ordinal_position ''') rows = cur.fetchall() schema_dict = {} for table, col, dtype, nullable in rows: if table not in schema_dict: schema_dict[table] = [] schema_dict[table].append(f"{col} ({dtype}{'?' if nullable == 'YES' else ''})") return " ".join( f"CREATE TABLE {t} ({', '.join(cols)});" for t, cols in schema_dict.items() ) def smart_nl2sql(question: str, conn) -> tuple[str, list[dict]]: # 1단계: 관련 테이블 파악 all_tables = get_all_tables(conn) table_selection = openai_client.chat.completions.create( model="gpt-4o-mini", messages=[{ "role": "user", "content": f"질문: {question} 테이블 목록: {all_tables} 관련 테이블명만 JSON 배열로 반환: ["table1", "table2"]" }] ) relevant_tables = json.loads(table_selection.choices[0].message.content) # 2단계: 관련 스키마만 추출해서 SQL 생성 schema = extract_schema(conn, relevant_tables) sql_response = openai_client.chat.completions.create( model="gpt-4o", messages=[ {"role": "system", "content": f"PostgreSQL 전문가. 스키마: {schema} SELECT 쿼리만 반환."}, {"role": "user", "content": question} ] ) sql = sql_response.choices[0].message.content.strip() sql = sql.replace("```sql", "").replace("```", "").strip() results = execute_query(sql, conn) return sql, results def get_all_tables(conn) -> list[str]: with conn.cursor() as cur: cur.execute("SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'") return [row[0] for row in cur.fetchall()] ``` --- ## 에러 핸들링 & Self-Correction LLM이 생성한 SQL이 틀릴 수 있습니다. 에러 시 자동 수정합니다. ```python def nl2sql_with_retry(question: str, schema: str, conn, max_retries: int = 3) -> tuple[str, list]: sql = None error_history = [] for attempt in range(max_retries): context = f"스키마: {schema}" if error_history: context += f" 이전 시도 실패: " + " ".join( f"SQL: {e['sql']} ERROR: {e['error']}" for e in error_history ) response = client.messages.create( model="claude-sonnet-4-6-20251001", max_tokens=1024, system=context + " SELECT 쿼리만 반환.", messages=[{"role": "user", "content": question}] ) sql = response.content[0].text.strip().replace("```sql", "").replace("```", "").strip() try: results = execute_query(sql, conn) return sql, results except Exception as e: error_history.append({"sql": sql, "error": str(e)}) print(f"시도 {attempt+1} 실패: {e}") raise RuntimeError(f"SQL 생성 실패 ({max_retries}회 시도): {error_history}") ``` --- ## 주요 모델 NL2SQL 성능 비교 | 모델 | 정확도 (Spider) | 컨텍스트 | 비용/1K토큰 | 특징 | |------|-------------|---------|-----------|------| | GPT-4o | 85-90% | 128K | $0.005 | 복잡한 조인 강점 | | Claude Sonnet 4.5 | 83-88% | 200K | $0.003 | 긴 스키마 처리 우수 | | Gemini 2.5 Pro | 82-87% | 1M | $0.0035 | 초대형 스키마 지원 | | GPT-4o mini | 70-78% | 128K | $0.0002 | 간단한 쿼리 가성비 최고 | | DeepSeek-V3 | 78-84% | 64K | $0.001 | 오픈소스, 자체 호스팅 가능 | > **Spider 벤치마크**: 200개+ DB, 10K+ 자연어-SQL 쌍으로 구성된 NL2SQL 표준 평가 데이터셋 --- ## 보안: SQL Injection 방어 LLM이 생성한 SQL을 그대로 실행하면 위험합니다. ```python import sqlparse from sqlparse.sql import Statement from sqlparse.tokens import Keyword, DML ALLOWED_STATEMENTS = {'SELECT'} FORBIDDEN_KEYWORDS = {'DROP', 'DELETE', 'UPDATE', 'INSERT', 'ALTER', 'TRUNCATE', 'CREATE', 'EXEC', 'EXECUTE'} def validate_sql(sql: str) -> bool: parsed = sqlparse.parse(sql) if not parsed: return False stmt = parsed[0] # DML 타입 확인 first_token = next( (t for t in stmt.flatten() if t.ttype in (Keyword, DML)), None ) if not first_token or first_token.normalized.upper() not in ALLOWED_STATEMENTS: return False # 금지 키워드 확인 all_tokens = {t.normalized.upper() for t in stmt.flatten() if t.ttype is Keyword} if all_tokens & FORBIDDEN_KEYWORDS: return False # 서브쿼리에서도 검사 sql_upper = sql.upper() return not any(kw in sql_upper for kw in FORBIDDEN_KEYWORDS) # 읽기 전용 DB 유저 사용 (추가 보안) READ_ONLY_DB_URL = "postgresql://readonly_user:pass@localhost/mydb" ``` --- ## 기술 심층 분석 ### NL2SQL 파이프라인 최적화 프로덕션 NL2SQL은 단순히 LLM에 쿼리를 보내는 것보다 훨씬 복잡합니다. **Few-shot 예시 주입**: 자주 사용하는 쿼리 패턴을 예시로 제공하면 정확도 15-20% 향상. ```python FEW_SHOT_EXAMPLES = [ { "question": "이번 달 신규 가입자 수", "sql": "SELECT COUNT(*) FROM users WHERE created_at >= DATE_TRUNC('month', NOW())" }, { "question": "상품별 평균 주문 금액", "sql": "SELECT p.name, AVG(o.amount) as avg_amount FROM orders o JOIN products p ON o.product_id = p.id GROUP BY p.id, p.name ORDER BY avg_amount DESC" } ] def format_examples(examples: list[dict]) -> str: return " ".join( f"Q: {ex['question']} SQL: {ex['sql']}" for ex in examples ) ``` **벡터 기반 유사 예시 검색**: Few-shot 예시가 많을 때는 RAG로 관련 예시만 선택. ```python from openai import OpenAI def find_similar_examples(question: str, examples: list[dict], top_k: int = 3) -> list[dict]: openai = OpenAI() question_vec = openai.embeddings.create( input=question, model="text-embedding-3-small" ).data[0].embedding example_vecs = [ openai.embeddings.create( input=ex["question"], model="text-embedding-3-small" ).data[0].embedding for ex in examples ] import numpy as np scores = [ np.dot(question_vec, ev) / (np.linalg.norm(question_vec) * np.linalg.norm(ev)) for ev in example_vecs ] top_indices = sorted(range(len(scores)), key=lambda i: scores[i], reverse=True)[:top_k] return [examples[i] for i in top_indices] ``` ### 평가 지표 - **EX (Execution Accuracy)**: 쿼리 실행 결과가 정답과 일치하는 비율 - **EM (Exact Match)**: SQL 텍스트 완전 일치 비율 (과도하게 엄격) - **VES (Valid Efficiency Score)**: 올바른 결과 + 효율적인 쿼리 평가 --- ## Footnotes [^1]: Spider 벤치마크: [Yale Spider Dataset](https://yale-lily.github.io/spider) — 138개 도메인, 200개 DB, 10,181개 자연어-SQL 쌍 [^2]: Defog의 SQLCoder는 NL2SQL 특화 오픈소스 모델로 Spider 기준 GPT-4에 근접한 성능을 보임 [^3]: Text-to-SQL의 보안 위협: LLM이 악의적인 프롬프트를 통해 DROP TABLE 같은 위험 SQL을 생성할 수 있어 화이트리스트 검증 필수

유사 모델

Amazon: Nova Pro 1.0

Amazon

Google: Gemma 4

Google

Anthropic: Claude 3 Haiku

Anthropic

Amazon: Nova Premier 1.0

Amazon

OpenAI: GPT-4o

OpenAI