<p align="center">
<img src="https://raw.githubusercontent.com/gepa-ai/gepa/refs/heads/main/docs/docs/assets/gepa_logo_with_text.svg" alt="GEPA Logo" width="450">
</p>
<p align="center">
<strong>LLM 기반 리플렉션(reflection)과 파레토 효율적 진화 탐색(Pareto-efficient evolutionary search)을 사용하여 프롬프트, 코드, 에이전트 아키텍처, 설정 등 모든 텍스트 매개변수를 최적화합니다.</strong>
</p>
<p align="center">
<a href="https://gepa-ai.github.io/gepa/"><strong style="font-size: 1em;">웹사이트(Website)</strong></a>  | 
<a href="https://gepa-ai.github.io/gepa/guides/quickstart/"><strong style="font-size: 1em;">빠른 시작(Quick Start)</strong></a>  | 
<a href="https://arxiv.org/abs/2507.19457"><strong style="font-size: 1em;">논문(Paper)</strong></a>  | 
<a href="https://gepa-ai.github.io/gepa/blog/"><strong style="font-size: 1em;">블로그(Blog)</strong></a>  | 
<a href="https://discord.gg/WXFSeVGdbW"><strong style="font-size: 1em;">디스코드(Discord)</strong></a>
</p>
<p align="center">
<a href="https://pypi.org/project/gepa/"><img src="https://img.shields.io/pypi/v/gepa?logo=python&logoColor=white&color=3776ab" alt="PyPI"></a>
<a href="https://pepy.tech/projects/gepa"><img src="https://static.pepy.tech/badge/gepa" alt="Downloads"></a>
<a href="https://github.com/gepa-ai/gepa"><img src="https://img.shields.io/github/stars/gepa-ai/gepa?style=flat&logo=github&color=181717" alt="GitHub stars"></a>
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-green?style=flat" alt="License"></a>
</p>
<p align="center">
<a href="https://join.slack.com/t/gepa-ai/shared_invite/zt-3o352xhyf-QZDfwmMpiQjsvoSYo7M1_w"><img src="https://badgen.net/badge/icon/Slack?icon=slack&label&color=4A154B" alt="Slack"></a>
<a href="https://discord.gg/WXFSeVGdbW"><img src="https://dcbadge.limes.pink/api/server/https://discord.gg/WXFSeVGdbW?style=flat" alt="Discord"></a>
</p>
GEPA란 무엇인가요?
GEPA는 텍스트 매개변수를 가진 모든 시스템을 모든 평가 지표에 대해 최적화하기 위한 프레임워크입니다. 실행 추적(execution traces)을 단일 스칼라 보상으로 축소하는 RL이나 기울기 기반 방법(gradient-based methods)과 달리, GEPA는 LLM을 사용하여 전체 실행 추적—오류 메시지, 프로파일링 데이터, 추론 로그—을 읽어 후보가 왜 실패했는지 진단하고 목표 지향적인 수정 사항을 제안합니다. 반복적인 반성(reflection), 변이(mutation), 그리고 파레토 인식 선택(Pareto-aware selection) 과정을 통해 GEPA는 최소한의 평가만으로 높은 성능의 변형체들을 진화시킵니다.
측정할 수 있다면, 최적화할 수 있습니다: 프롬프트, 코드, 에이전트 아키텍처, 스케줄링 정책, 벡터 그래픽 등 무엇이든 가능합니다.
주요 결과 (Key Results)
| |
|---|
| 90배 저렴 | 오픈 소스 모델 + GEPA가 Databricks에서 Claude Opus 4.1을 능가했습니다. |
| ... | |
*"DSPy와 (특히) GEPA는 현재 AI 컨텍스트 엔지니어링 분야에서 심각하게 과소평가되고 있습니다." — Tobi Lutke, Shopify CEO
설치 (Installation)
main 브랜치에서 최신 버전을 설치하려면:
pip install git+https://github.com/gepa-ai/gepa.git
핵심 패키지 및 종속성 없는 gepa[dspy] 추가 기능은 Python 3.15를 지원합니다. PyPI에서 설치하기 전에 이 지원을 포함하는 릴리스가 필요합니다. 선택적 통합(Optional integrations)은 자체적인 종속성 요구 사항을 가집니다. 호출 가능한 모델 및 평가기는 이러한 추가 기능을 필요로 하지 않습니다. gepa[full]과 gepa[confidence]를 사용하려면, 해당 종속성이 Python 3.15를 지원할 때까지 Python 3.10–3.14를 사용하십시오.
빠른 시작 (Quick Start)
간단한 프롬프트 최적화
몇 줄의 코드로 AIME 벤치마크의 수학 문제에 대한 시스템 프롬프트를 최적화합니다(전체 튜토리얼):
import gepa
trainset, valset, _ = gepa.examples.aime.init_dataset()
...
결과: GPT-4.1 Mini는 AIME 2025에서 46.6% → 56.6%로 향상되었습니다 (+10 퍼센트 포인트).
DSPy 사용 시 (AI 파이프라인에 권장)
GEPA를 프롬프트 최적화에 사용하는 가장 강력한 방법은 DSPy 내에서이며, 여기서 dspy.GEPA로 사용할 수 있습니다. 실행 가능한 노트북을 보려면 dspy.GEPA 튜토리얼을 참조하십시오.
import dspy
optimizer = dspy.GEPA(
...
optimize_anything: 프롬프트 그 이상
optimize_anything API는 단순히 프롬프트뿐만 아니라 모든 텍스트 아티팩트—코드, 에이전트 아키텍처, 구성(configurations), SVG 등—를 최적화합니다. 사용자가 평가자(evaluator)를 제공하면 시스템이 검색을 처리합니다.
import gepa.optimize_anything as oa
from gepa.optimize_anything import optimize_anything, GEPAConfig, EngineConfig
...
GEPA를 에이전트 스킬로 사용하기
GEPA는 또한 에이전트 스킬(Agent Skill) 형태로 제공되어 코딩 에이전트가 여러분을 위해 optimize_anything을 구동할 수 있게 합니다. 이 저장소의 클론본에서 Claude Code와 .claude/skills/를 읽는 다른 에이전트들(Cursor, VS Code/Copilot, Codex, Gemini CLI)은 .claude/skills/gepa-optimize-anything/에서 이를 자동 발견합니다. 다른 프로젝트에서 사용하려면 이 저장소의 마켓플레이스에서 플러그인을 설치하십시오:
/plugin marketplace add gepa-ai/gepa
/plugin install gepa-optimize-anything@gepa
자세한 내용은 에이전트 스킬 가이드를 참조하십시오.
작동 방식
기존 최적화 도구들은 후보가 실패했다는 사실은 알지만, 왜 실패했는지는 모릅니다. GEPA는 다른 접근 방식을 취합니다:
- 선택(Select): 파레토 프론티어(Pareto frontier)에서 후보를 선택합니다 (서로 다른 작업 하위 집합에서 뛰어난 성능을 보이는 후보들).
- 실행(Execute): 미니배치(minibatch)에 대해 실행하고 전체 실행 추적(full execution traces)을 포착합니다.
- 반영(Reflect): LLM이 이 추적(오류 메시지, 프로파일러 출력, 추론 로그)을 읽고 실패 원인을 진단합니다.
- 변이(Mutate): 모든 조상으로부터 축적된 교훈에 기반하여 개선된 후보를 생성합니다.
- 수용(Accept): 개선되었다면 풀(pool)에 추가하고, 파레토 프론트를 업데이트합니다.
GEPA는 또한 시스템 인식 병합(system-aware merge)을 지원합니다. 이는 서로 다른 작업에서 탁월한 두 개의 파레토 최적 후보(Pareto-optimal candidates)의 강점을 결합하는 것입니다. 핵심 개념은 실행 가능한 부가 정보(Actionable Side Information, ASI)입니다. 이는 평가자로부터 반환되는 진단 피드백으로, 텍스트 최적화에서의 기울기(gradient)와 유사한 역할을 합니다.
자세한 내용은 paper 및 documentation를 참조하십시오.
어댑터: GEPA를 모든 시스템에 연결하기
GEPA는 [GEPAAdapter] 인터페이스(src/gepa/core/adapter.py)를 통해 사용자의 시스템과 연결됩니다. evaluate와 make_reflective_dataset을 구현하기만 하면, GEPA가 나머지를 처리합니다.
내장 어댑터:
통합 (Integrations)
GEPA는 여러 주요 프레임워크에 통합되었습니다:
최적화된 프롬프트 예시
GEPA는 최적화 과정에서 추론을 미리 계산하여 미래 작업 인스턴스를 위한 계획을 생성하는 것으로 생각할 수 있습니다. 여기에는 GEPA가 발견한 상세 프롬프트의 예시들이 나와 있습니다:
<table border="1">
<tr>
<td colspan="2" align="center">예시 GEPA 프롬프트</td>
</tr>
<tr>
<td align="center">HotpotQA (다단계 질의응답(multi-hop QA)) 프롬프트</td>
<td align="center">AIME 프롬프트</td>
</tr>
<tr>
<td width="52%" valign="top">
<img src="https://raw.githubusercontent.com/gepa-ai/gepa/refs/heads/main/assets/gepa_prompt_hotpotqa.png" alt="HotpotQA 프롬프트" width="1400">
<!-- <td> -->
<details>
<summary><mark>전체 HotpotQA 프롬프트 보기 클릭</mark></summary>
<mark>[HotpotQA 프롬프트 시작]</mark>
사용자에게 두 개의 입력 필드: question과 summary_1이 제공됩니다.
당신의 임무는 다단계 검색 시스템의 **두 번째 단계(second hop)**에 최적화된 새로운 검색어(query)를 생성하는 것입니다. 원래 사용자 질문은 일반적으로 복잡하며 답변을 위해 여러 문서에서 정보를 필요로 합니다. 첫 번째 단계 검색어는 초기 문서 세트를 검색하는 데 사용되는 원래 질문입니다. 당신의 목표는 원래 질문 전체에 답하는 데 필요한 추가 관련 문서를 검색하는 두 번째 단계 검색어를 생성하는 것입니다.
상세 작업 지침 및 힌트:
-
입력 이해:
question: 사용자가 제기한 원래의 다단계 질문입니다.
summary_1: 첫 번째 단계에서 검색된 문서의 정보를 간결하게 요약한 것입니다. 이 정보는 질문에 부분적으로 답변합니다.
-
목적 및 맥락:
- 생성된
query는 question을 완전히 답변하는 데 필요한 누락된 정보를 찾는 것을 목표로 합니다.
- 다단계 검색 시스템은 여러 단계를 거쳐 작동합니다:
- 첫 번째 단계: 원래 질문이 일부 문서를 반환합니다.
- 두 번째 단계: 당신의 쿼리는 첫 번째 단계에서 발견되지 않은, 최종 답변 추출에 필요한 보완적이거나 더 광범위한 맥락을 담고 있는 다른 관련 문서를 검색하는 데 도움을 주어야 합니다.
-
예시 및 피드백을 통한 주요 관찰 사항:
- 1차 검색 결과 문서(First-hop documents)는 종종 질문의 하나의 개체나 측면만을 다룹니다.
- 남아 있는 관련 문서는
summary_1에 언급되었지만 원래 질문에서 명시적으로 요청되지 않은, 연결되거나 더 상위 수준의 개념을 포함하는 경우가 많습니다.
query는 이러한 누락되었지만 논리적으로 연결된 문서들을 명시적으로 목표로 삼도록 공식화되어야 합니다.
- 단순히 원래 질문을 바꿔 쓰거나(paraphrasing)
summary_1에서 이미 알려진 사실을 반복하는 것은 피해야 합니다.
- 대신, 어떤 더 광범위하거나 관련 있는 개체/개념이 결정적인 누락 정보를 제공할 수 있는지 추론해야 합니다.
- 예를 들어,
summary_1이 작은 민간 교구(civil parish)의 인구를 설명하지만 질문은 더 넓은 지역의 총인구를 원한다면, query는 그 더 넓은 지역을 목표로 삼아야 합니다 (예: "2011년 마데이라 군도 인구").
- 마찬가지로,
summary_1이 노래에 대해 다루고 질문이 그 노래가 속한 앨범을 원하지만 1차 검색 결과에서 노래 수준의 문서를 얻었다면, 쿼리는 앨범 자체에 대한 문서를 검색하도록 해야 합니다.
-
쿼리 구축 방법:
summary_1에 언급되었지만 1차 검색 결과 문서와 관련이 있으면서도 다른 개체나 주제를 식별합니다.
- 원래 질문과 연결되어 있지만 더 광범위하거나 관련된 이러한 개체들을 명시적으로 언급하도록 쿼리를 재구성합니다.
- 구체성을 유지하기 위해 질문에서 관련 핵심 컨텍스트(key context)를 포함하되, 초점을 누락된 부분으로 전환해야 합니다.
- 목표는 처음에 검색된 내용과 연결하거나 보완하는 문서를 검색하는 것입니다.
-
실용적인 전략:
summary_1을 주의 깊게 읽어 1차 검색 단계에서 다루지 않은 더 큰 컨텍스트나 다른 개체에 대한 언급이 있는지 확인합니다.
- 스스로에게 "이 요약은 원래 질문에 답할 수 있지만 아직 발견되지 않은 어떤 개체나 측면을 암시하는가?"라고 질문하십시오?
- 누락된 문서를 검색하기 위해 해당 개체나 개념을 목표로 하는 정확하고 집중적인 사실 기반의 쿼리를 공식화합니다.