DGM-H를 쓰려면
모델 하나만 갈아끼우면 될까.
보통은 그렇게 상상한다.
논문을 읽고 나면
더 강한 모델,
더 좋은 프롬프트,
더 긴 컨텍스트만 떠오르기 쉽다.
근데 레포를 열어보면
첫인상은 좀 다르다.
진짜 먼저 보이는 건
모델 이름이 아니라
generate_loop.py,
run_meta_agent.py,
select_next_parent.py,
그리고 Docker,
평가,
출력 폴더다.
즉 DGM-H는
그럴싸한 논문 이름보다
실제로는
반복 생성 -> 평가 -> 부모 선택 -> 다시 생성
루프를 어떻게 굴리느냐가 더 중요하다.
2026년 4월 13일 기준
arXiv 2603.19461 초록은
HyperAgents를
task agent와 meta agent를
하나의 editable program으로 통합한
self-referential agent framework라고 설명한다.
그리고 그 구현체로
DGM-Hyperagents,
즉 DGM-H를 제시한다.
GitHub README는
이 프로젝트를
any computable task에 최적화할 수 있는
self-referential self-improving agents라고 소개한다.
하지만 같은 README를 보면
setup 단계부터
API key,
Python 3.12,
graphviz,
cmake,
ninja,
Docker build,
setup_initial.sh
순서가 나온다.
이 말은 곧
DGM-H는
완성된 앱을 켜는 사용법보다,
실험 러너를 세팅하고
탐색 루프를 굴리는 사용법이 더 중요하다는 뜻이다.
그래서 이 글은
HyperAgents 개론의 후속편이지만,
논문 요약을 또 하지 않는다.
대신
처음 레포를 열었을 때
정말 어디부터 만져야 하는지,
어떤 옵션이
탐색 폭과 비용과 위험을 같이 바꾸는지,
레포 기준으로 정리한다.
한 줄 답
- DGM-H를 처음 볼 때 가장 먼저 건드릴 파일은
generate_loop.py다. - 핵심 설정은
run_baseline,optimize_option,skip_staged_eval,edit_select_parent,parent_selection다섯 개라고 봐도 된다. run_meta_agent.py는 meta agent를 돌린 뒤domains/변경을 base commit으로 되돌리고model_patch.diff를 저장하는 래퍼 역할을 한다.select_next_parent.py는 유효한 부모만 남기고 도메인별 점수를 평균낸 뒤, 최종 후보 중 하나를 랜덤 선택해 탐색 공간을 열어두는 쪽으로 구현돼 있다.- 즉 DGM-H 사용법의 핵심은 모델보다
루프를 얼마나 공격적으로 돌릴지,평가를 어디까지 생략할지,부모 선택을 얼마나 열어둘지를 정하는 일이다.
먼저 이것부터 알아야 한다
DGM-H는
사용자용 제품이 아니다.
이 말이 괜히 중요하다.
README가 맨 처음 설명하는 것도
대시보드나 웹 UI가 아니라
환경 세팅이다.
공식 README 기준으로
먼저 필요한 건 이렇다.
.env에OPENAI_API_KEY,ANTHROPIC_API_KEY,GEMINI_API_KEY- Python 3.12 개발 헤더
- graphviz와 graphviz-devel
- cmake, ninja-build, 각종 빌드 의존성
- 가상환경 생성과 requirements 설치
docker build --network=host -t hyperagents .bash ./setup_initial.sh
그리고 실행 예시는
정말 짧다.
python generate_loop.py --domains <domain>
README는
기본 출력이
outputs/ 폴더에 저장된다고 적는다.
이 간단한 설명이
오히려 중요하다.
왜냐하면 여기서 이미
이 프로젝트의 사용 단위가
대화창이 아니라
출력 폴더를 남기는 실험 루프
라는 게 드러나기 때문이다.
즉
처음부터
무슨 질문을 던지지
보다
어떤 도메인으로 몇 세대를 돌릴지
를 생각해야 한다.
내 해석으로는
이 레포를 처음 만지는 사람의 첫 실수는
논문에서 느낀 감탄을
바로 제품 기대치로 옮기는 거다.
실제로는
연구 코드에 가깝고,
사용법도
채팅형 인터페이스가 아니라
하네스형 실행 흐름에 가깝다.
이걸 먼저 받아들이면
나머지 설정도 훨씬 덜 헷갈린다.
진짜 시작점은 generate_loop.py다
레포 기준으로
DGM-H의 메인 엔트리포인트는
generate_loop.py다.
README도
entry point for running the algorithm
라고 직접 적어둔다.
코드를 보면
generate_loop( 함수 시그니처가
바로 이 프로젝트의 조종간이다.
기본값은 이렇게 잡혀 있다.
max_generation=3eval_samples=-1eval_workers=5parent_selection="score_prop"run_baseline=Noneoptimize_option="only_agent"eval_test=Falseskip_staged_eval=Falseedit_select_parent=False
이 조합을 한 줄로 읽으면
처음 기본 모드는
세대 수는 보수적으로,
평가는 켠 상태로,
부모 선택 메커니즘 수정은 끈 상태로,
에이전트 최적화만 우선
쪽에 가깝다.
중요한 건
이 옵션들이 서로 독립처럼 보여도
실제로는 묶여서 움직인다는 점이다.
예를 들어
skip_staged_eval을 켜면
실험 속도는 빨라질 수 있지만,
안 좋은 변형이
더 빨리 다음 단계까지 올라갈 수 있다.
edit_select_parent를 켜면
탐색 자유도는 커지지만,
부모 선택 메커니즘 자체를
에이전트가 건드릴 수 있게 되므로
실험 해석 난이도도 같이 올라간다.
즉
DGM-H에서 설정은
토글 모음이 아니다.
실험 철학을 고르는 버튼들에 가깝다.
처음 만져야 할 설정 1번은 run_baseline이다
내가 보기엔
초심자가 가장 먼저 고정해야 하는 건
run_baseline이다.
이유는 단순하다.
이 옵션이
지금 내가 HyperAgents를 돌리는 건지,
아니면 비교군을 돌리는 건지
를 결정하기 때문이다.
generate_loop.py의 CLI는
run_baseline에 대해
이 선택지를 둔다.
no_selfimproveno_archivedgmdgm_customdgm+no_selfimprovedgm_custom+no_selfimprove
즉
이 레포는
처음부터
하나의 절대 정답 실행만 상정하지 않는다.
비교군과 변형 실험을
같은 엔트리포인트에서 돌리게 설계돼 있다.
그리고 함수 내부를 보면
run_baseline == "no_archive"일 때는
parent_selection을 강제로 latest로 바꾼다.
이건 매우 실전적인 디테일이다.
왜냐하면
baseline이 바뀌면
부모 선택 규칙도 같이 바뀐다는 뜻이기 때문이다.
즉
baseline은
그냥 실험 이름표가 아니라
탐색 구조 자체를 바꾸는 레버다.
처음 레포를 읽는 사람은
종종 이걸 놓친다.
baseline도 어차피 비슷하겠지
라고 보면
이후 결과 차이를
제대로 해석하기 어려워진다.
그래서 첫 단계는
항상 이거다.
나는 지금 진짜 하이퍼에이전트 루프를 보려는 건가
아니면 비교군을 보려는 건가
이 질문을 먼저 잠근다.
두 번째는 optimize_option이다
두 번째로 중요한 설정은
optimize_option이다.
코드에서 기본값은
only_agent다.
CLI 선택지는
이렇게 나온다.
both_agent_ensembleonly_agentonly_ensemble
그리고 코드에는
--optimize_option=only_ensemble일 때
--agent_archive_path가 반드시 필요하다는
검증도 들어 있다.
이건 그냥 친절한 에러 메시지가 아니다.
레포가 무엇을 최적화 단위로 보는지
드러내는 힌트다.
즉
이 프로젝트는
항상 하나의 단일 에이전트만 고치는 게 아니라,
에이전트와 앙상블을
분리해서 최적화할 수 있게 설계돼 있다.
여기서 초심자 판단 기준은 꽤 명확하다.
- 레포 구조를 이해하려는 첫 실행이면
only_agent - 앙상블 효과까지 보려면
both_agent_ensemble - 이미 있는 agent archive를 기반으로 ensemble만 만지려면
only_ensemble
내 해석으로는
처음부터 both_agent_ensemble로 가면
실험 해석 복잡도가 꽤 빨리 올라간다.
왜냐하면
성능 변화가
에이전트 개선에서 왔는지,
앙상블 전략에서 왔는지,
두 개가 섞여서 왔는지
구분하기가 어려워지기 때문이다.
그래서
첫 삽은 only_agent,
그다음에
앙상블을 붙이는 순서가
훨씬 읽기 쉽다.
연구 코드도
처음부터 모든 손잡이를 다 잡으면
손이 아니라 머리가 미끄러진다.
세 번째는 staged eval을 끌지 말지다
실행 속도를 고민할 때
사람이 제일 먼저 건드리고 싶어지는 옵션이
skip_staged_eval이다.
이건 이해할 만하다.
평가가 제일 비싸고,
제일 오래 걸리고,
제일 답답해 보이기 때문이다.
그런데 코드 흐름을 보면
이 옵션은 생각보다 중요하다.
generate_loop.py는
staged evaluation이 켜져 있으면
먼저 작은 샘플 평가를 돌리고,
stagedeval_scores를 모은 뒤,
모든 도메인 점수가 0보다 큰 경우에만
run_next_eval = True로 두고
full evaluation으로 넘어간다.
즉
staged eval은
단순한 시간 낭비가 아니라
초기 필터 역할을 한다.
말 그대로
이 후보를 다음 라운드까지 데려갈 가치가 있나
를 거르는 문지기다.
그래서
skip_staged_eval=False 기본값은
꽤 설득력 있다.
초반에는
느려 보여도
쓰레기 후보를 일찍 걸러줘서
오히려 전체 루프를 덜 망가뜨릴 수 있기 때문이다.
반대로
실험을 아주 공격적으로 돌리고 싶고,
이미 도메인과 평가 구조를 충분히 이해했고,
빠른 탐색을 일부러 우선하는 상황이면
그때 skip_staged_eval=True를 고민할 수 있다.
내가 보기엔
이 옵션은
속도 옵션이 아니라
리스크 허용치 옵션에 가깝다.
네 번째는 parent selection이다
DGM-H를 읽다가
사람들이 자꾸 모델 쪽만 보는데,
실제로 재미있는 건
부모를 어떻게 뽑느냐다.
generate_loop.py CLI를 보면
parent_selection 선택지는
다섯 개다.
randomlatestbestscore_propscore_child_prop
그리고 기본값은
score_child_prop다.
하지만 함수 generate_loop(의 기본 인자는
parent_selection="score_prop"로 되어 있다.
즉
실행 경로를 어떻게 타느냐에 따라
기본 체감이 달라질 수 있고,
CLI가 실제 권장 진입점 역할을 한다고 읽는 편이 자연스럽다.
여기서 더 중요한 건
edit_select_parent다.
코드를 보면
edit_select_parent가 꺼져 있거나
run_baseline == "no_archive"면
기존 select_parent(...)를 쓴다.
반대로
edit_select_parent가 켜져 있으면
select_next_parent_container(...) 경로로 간다.
즉
부모 선택 메커니즘 자체를
에이전트가 건드릴 여지를 열어주는 거다.
그리고 select_next_parent.py를 보면
이 로직은
유효한 부모만 남긴 뒤,
도메인별 점수를 모으고,
val split이 있으면 val,
없으면 train의 max score를 써서
평균 점수를 만든다.
그 다음
child count도 계산하지만,
최종 선택은
후보 집합 안에서
랜덤으로 하나를 뽑는 방식이다.
코드 주석도
탐색 공간을 열어두기 위해
랜덤 선택을 한다는 취지다.
이 포인트가 재밌다.
왜냐하면
겉으로 보면
굉장히 똑똑한 selection policy를 기대하게 되는데,
실제 구현은
후보 정제까지는 점수 기반으로 하고,
마지막은 의도적으로
열어둔다는 철학이 보이기 때문이다.
즉
DGM-H의 parent selection은
제일 점수 높은 놈만 고집한다
보다
탐색을 너무 빨리 닫지 않는다
에 더 가깝다.
다섯 번째는 run_meta_agent.py다
이 레포를 실전적으로 읽을 때
제일 좋은 파일 중 하나는
run_meta_agent.py다.
왜냐하면
meta agent가
결과를 어떻게 남기고,
어떤 변경을 버리고,
무슨 patch를 저장하는지
가장 압축적으로 보여주기 때문이다.
CLI 인자를 보면
여기서 챙기는 건 이렇다.
--model--chat_history_file--repo_path--evals_folder--iterations_left--git_dir--base_commit--outdir
실행 순서는 더 중요하다.
MetaAgent(...)를 생성한다.meta_agent.forward(...)로 repo와 eval path를 넣고 돈다.- 그 뒤
reset_paths_to_commit(... paths=["domains/"])를 호출한다. - 마지막으로 base commit 대비 diff를 떠서
model_patch.diff로 저장한다.
이 흐름은
실무적으로 꽤 큰 힌트다.
즉
meta agent를 한 번 돌린 다음
아무 diff나 그대로 받는 게 아니라,
적어도 domains/ 쪽 변경은
base commit 기준으로 리셋하고,
남는 변경만 patch로 남긴다.
내 해석으로는
이건
무엇을 메타 수준 개선 대상으로 볼지
경계를 정하는 장치다.
모든 걸 다 바꾸게 두면
결과 해석이 너무 어려워질 수 있으니,
도메인 정의 변경 같은 부분은
걷어내고 보는 거다.
이런 경계선이 있어야
자기개선이
그냥 난장 diff가 아니라
실험 가능한 patch로 남는다.
즉
run_meta_agent.py는
단순한 실행 래퍼가 아니라
자기개선 결과를
관리 가능한 diff로 정리하는 파일이다.
로그와 출력은 어떻게 읽어야 하나
README는
기본 출력이 outputs/로 간다고만 짧게 말하지만,
generate_loop.py를 보면
출력 구조가 꽤 일관되다.
generate_loop(는
새 실행이면
outputs/generate_<run_id>/
형태의 폴더를 만들고,
그 아래에
gen_<generation>/
단위로 세대별 결과를 저장한다.
각 generation 폴더에는
generate.log,
agent_output/,
그리고 마지막에 저장되는
metadata.json
같은 흔적이 남는다.
코드를 보면
metadata에는
gen_output_dir,
run_eval,
valid_parent
같은 값이 포함된다.
그리고 generation이 끝나면
archive를 갱신한다.
이 구조가 좋은 이유는
실험이 실패해도
어느 세대에서
무슨 patch가 나왔고
평가를 탔는지
를 뒤에서 읽어낼 수 있기 때문이다.
즉
DGM-H 사용법에서
중요한 건
화려한 성공 캡처보다
출력 폴더를 읽는 습관이다.
로그를 안 보면
자기개선은 신비주의가 되고,
로그를 보면
하네스가 된다.
처음 돌릴 때 나는 이 순서를 추천한다
여기부터는
공식 문서와 코드 구조를 바탕으로 한
내 운영 추천이다.
즉
직접적 사실 인용이 아니라
실행 순서에 대한 해석이다.
1단계. 기본 모드로 구조부터 확인
run_baseline=Noneoptimize_option=only_agentskip_staged_eval=Falseedit_select_parent=False- 세대 수는 기본
max_generation=3또는 더 작게
이렇게 가면
루프 구조를 읽기 좋다.
무슨 세대에서
무슨 patch가 나오고,
언제 평가가 붙고,
어떻게 archive가 갱신되는지
파악하기 쉽다.
2단계. baseline을 바꿔 비교군 감 잡기
그 다음에
run_baseline만 바꿔서
비교군을 본다.
이때는
모든 옵션을 같이 흔들지 않는 편이 좋다.
그래야
차이가 baseline 때문인지
평가/선택 옵션 때문인지
섞이지 않는다.
3단계. staged eval을 줄일지 판단
속도가 너무 느리다고 느껴질 때
그제서야
skip_staged_eval을 건드린다.
이걸 너무 빨리 건드리면
빠르긴 한데
왜 망했는지를 읽기 어려워진다.
4단계. parent selection을 연다
마지막에
edit_select_parent=True
같은 옵션을 붙여서
선택 메커니즘 자체를 열어본다.
이건 탐색 자유도를 올리는 대신
실험 해석 난이도도 같이 올린다.
그래서 처음부터 켜는 것보다
루프를 이해한 뒤 여는 편이 낫다.
흔히 잘못 읽는 포인트
1. DGM-H를 그냥 모델 오케스트레이터로 읽는 것
아니다.
코드 구조를 보면
이건
실험 러너와 평가 하네스에 더 가깝다.
모델 호출은 중요하지만,
핵심은
수정 -> 평가 -> 선택 -> 기록
루프다.
2. parent selection이 완전히 점수 최적화라고 생각하는 것
select_next_parent.py를 보면
후보 정제는 점수 기반이지만
최종 선택은 랜덤이다.
즉
탐색을 일부러 닫지 않는 철학이 들어 있다.
3. staged eval을 단순한 속도 저하로만 보는 것
코드상으론
초기 필터 역할이 있다.
좋지 않은 후보를
full evaluation 전에 거르는 장치다.
4. meta agent가 만든 diff를 전부 그대로 채택한다고 생각하는 것
run_meta_agent.py는
domains/ 변경을 base commit으로 되돌린 다음
diff를 저장한다.
즉
변경 경계가 있다.
5. 이 레포를 안전한 샌드박스라고 착각하는 것
README는
모델이 생성한 신뢰할 수 없는 코드를 실행하므로
안전 리스크를 인지하라고 경고한다.
이건 장식 문구가 아니다.
연구 코드에서 제일 위험한 건
성능보다도
안전 경계를 과신하는 태도다.
제일 먼저 확인할 체크리스트
DGM-H를 처음 만질 때
나는 이 체크리스트를 먼저 본다.
| 체크 항목 | 왜 먼저 보나 |
|---|---|
.env API key 준비 |
모델 호출이 막히면 나머지가 다 멈춤 |
| Docker build 성공 여부 | 루프가 컨테이너 기반으로 돌기 때문 |
setup_initial.sh 완료 여부 |
초기 agent 뼈대가 없으면 이후 흐름이 불안정 |
run_baseline 선택 |
지금이 본 실험인지 비교군인지 정해짐 |
optimize_option 선택 |
에이전트만 볼지 앙상블까지 볼지 결정 |
skip_staged_eval 유지 여부 |
속도와 리스크 허용치가 바뀜 |
edit_select_parent 여부 |
부모 선택 메커니즘 자체를 열지 결정 |
outputs/ 읽기 습관 |
결과를 신비주의가 아니라 로그로 읽게 됨 |
이 표에서 중요한 건
설정을 다 외우는 게 아니다.
실험이 흔들릴 때
어디를 먼저 의심해야 하는지
순서를 잡는 것이다.
연구 레포는
정답을 주는 앱이 아니라
오답이 왜 났는지 스스로 읽어야 하는 도구에 가깝다.
그래서 순서가 중요하다.
이 글을 읽고 바로 할 수 있는 최소 실험
실제로 바로 해볼 수 있는
가장 작은 실험도 정리해보자.
여기부터는
공식 문서의 직접 지시가 아니라
내가 추천하는 최소 실험 단위다.
최소 실험 A
- 한 개 도메인만 선택
only_agentskip_staged_eval=Falseedit_select_parent=False- generation 수는 작게
이건
레포의 기본 숨결을 느끼는 실험이다.
무엇이 생성되고
어디에 저장되고
무슨 로그가 남는지만 봐도
학습이 된다.
최소 실험 B
- 같은 조건에서 baseline만 변경
이건
자기개선 루프와 비교군 차이를
해석하는 실험이다.
최소 실험 C
- staged eval만 끄고 속도 차이 확인
이건
비용과 리스크를
어떻게 교환하는지 보는 실험이다.
최소 실험 D
- parent selection 관련 옵션 열기
이건 제일 마지막이다.
왜냐하면
탐색 메커니즘이 바뀌면
결과가 재밌어지는 대신
무엇 때문인지 설명이 어려워지기 때문이다.
결국 DGM-H 사용법은 어디를 읽느냐의 문제다
논문만 읽으면
HyperAgents는
굉장히 큰 개념처럼 보인다.
맞다.
실제로 큰 개념이다.
하지만 레포를 열면
DGM-H 사용법은
상당히 구체적인 파일 몇 개로 내려온다.
README.md에서 환경과 진입점 확인generate_loop.py에서 실험 철학 확인run_meta_agent.py에서 patch 경계 확인select_next_parent.py에서 탐색 철학 확인
이 네 개를 읽으면
DGM-H는 뭘 만져야 하는가
라는 질문은 훨씬 덜 추상적이 된다.
그리고 내 결론은 이거다.
DGM-H의 핵심 설정 포인트는
모델 이름보다
baseline,
최적화 범위,
평가 단계,
부모 선택 자유도
에 있다.
즉
이 레포를 잘 쓰는 법은
더 센 모델을 찾는 일보다
실험 루프를 얼마나 이해한 상태에서 옵션을 여느냐에 가깝다.
이걸 모르고 만지면
자기개선이 아니라
자기혼란이 된다.
반대로
이걸 알고 만지면
논문이 말한 자기개선 구조를
조금 더 하네스 언어로 읽게 된다.
연구 레포는
원래 약간 무섭다.
근데 무서운 이유를 알고 건드리면
그 순간부터는
도구가 된다.
FAQ
DGM-H는 HyperAgents랑 같은 말인가
완전히 같은 말은 아니다.
arXiv 초록은
HyperAgents를 프레임워크로 설명하고,
DGM-Hyperagents,
즉 DGM-H를
그 프레임워크의 구현체로 제시한다.
그러니까 HyperAgents가 큰 개념이고,
DGM-H는 그 개념을 실제 루프로 돌리는 구체 구현으로 이해하는 쪽이 자연스럽다.
DGM-H를 처음 돌릴 때 제일 먼저 볼 옵션은 뭐냐
내 기준으로는
run_baseline,
optimize_option,
skip_staged_eval
세 개다.
이 셋이
실험 성격,
최적화 범위,
속도와 리스크 균형을
제일 크게 바꾼다.
parent selection은 결국 최고 점수만 따라가는 구조냐
레포 기준으로는
그렇게 단순하지 않다.
select_next_parent.py는
유효한 부모만 남기고
도메인별 점수를 평균낸 뒤,
최종 후보 중 하나를 랜덤으로 선택해
탐색 공간을 열어두는 방향을 취한다.
즉
무조건 top-1만 고집하는 구조라고 읽으면 안 된다.
staged eval은 꺼도 되나
기술적으로는 가능하다.
CLI에 --skip_staged_eval 옵션이 있다.
하지만 코드 흐름상
staged eval은
작은 샘플 평가 뒤
full evaluation로 갈지 말지 거르는 문지기 역할을 한다.
그래서 초반 이해 단계에서는
끄지 않는 편이 더 안전하다.
왜 run_meta_agent.py가 domains 변경을 되돌리냐
코드 기준으로
run_meta_agent.py는
meta agent를 실행한 뒤
paths=["domains/"]를 base commit으로 reset하고,
그 다음 diff를 model_patch.diff로 저장한다.
내 해석으로는
메타 수준 개선 결과를
해석 가능한 patch로 남기기 위한 경계 설정에 가깝다.
공식 출처
- Hyperagents arXiv 초록
- facebookresearch/HyperAgents GitHub repo
- generate_loop.py
- run_meta_agent.py
- select_next_parent.py