본문으로 건너뛰기

© 2026 Molayo

GH Trending릴리즈2026. 04. 24. 13:27

ML 연구 및 코딩을 자동화하는 AI 에이전트, ml-intern 소개

요약

huggingface/ml-intern은 사용자가 원하는 ML 관련 목표(예: 모델 파인튜닝)를 제시하면, 이를 자율적으로 조사하고, 계획하며, 고품질의 실행 가능한 코드를 생성 및 배포하는 AI 에이전트입니다. 이 도구는 Hugging Face 생태계에 깊숙이 통합되어 있어 문서 검색, 최신 논문 분석, 데이터셋 접근, 클라우드 컴퓨팅 작업을 모두 처리할 수 있습니다. 개발자는 복잡한 ML 워크플로우를 명령어 한 줄로 실행하며, 내부적으로 에이전트 루프와 툴 라우터(ToolRouter)를 통해 체계적인 작업 흐름을 경험할 수 있어

핵심 포인트

  • ML 연구부터 코드 배포까지 전 과정을 자동화하는 AI 에이전트 'ml-intern'을 Hugging Face에서 제공합니다.
  • Anthropic Claude Opus 등 최신 LLM과 연동하여, 문서 검색, GitHub 코드 탐색, 데이터셋 관리 등 다차원적인 작업을 수행합니다.
  • 에이전트는 ContextManager를 통해 대화 기록 및 작업 결과를 자동 압축(Auto-compaction)하고, 최대 300회 반복을 지원하는 강력한 에이전트 루프를 가집니다.
  • 사용자는 `ml-intern` 명령어만으로 복잡한 파인튜닝 같은 작업을 헤드리스 모드(`ml-intern "fine-tune llama on my dataset"`)로 실행할 수 있습니다.

An ML intern that autonomously researches, writes, and ships good quality ML releated code using the Hugging Face ecosystem — with deep access to docs, papers, datasets, and cloud compute.

git clone git@github.com:huggingface/ml-intern.git
cd ml-intern
uv sync
uv tool install -e .
ml-intern

Create a .env file in the project root (or export these in your shell):
ANTHROPIC_API_KEY=<your-anthropic-api-key> # if using anthropic models
HF_TOKEN=<your-hugging-face-token>
GITHUB_TOKEN=<github-personal-access-token>

If no HF_TOKEN is set, the CLI will prompt you to paste one on first launch. To get a GITHUB_TOKEN follow the tutorial here.

Interactive mode (start a chat session):
ml-intern

Headless mode (single prompt, auto-approve):
ml-intern "fine-tune llama on my dataset"

Options:

  • ml-intern --model anthropic/claude-opus-4-6 "your prompt"
  • ml-intern --max-iterations 100 "your prompt"
  • ml-intern --no-stream "your prompt"

┌─────────────────────────────────────────────────────────────┐
│ User/CLI │
└────────────┬─────────────────────────────────────┬──────────┘
│ Operations │ Events
↓ (user_input, exec_approval, ↑ submission_queue interrupt, compact, ...) event_queue
│ │
↓ │
┌────────────────────────────────────────────────────┐ │
│ submission_loop (agent_loop.py) │ │
│ ┌──────────────────────────────────────────────┐ │
│ │ 1. Receive Operation from queue │ │
│ │ 2. Route to handler (run_agent/compact/...) │ │
│ └──────────────────────────────────────────────┘ │
│ ↓ │ │
┌──────────────────────────────────────────────┐ │
│ Handlers.run_agent() │ ├──┤
│ │ │ │ │
│ │ ┌────────────────────────────────────────┐ │ │ │
│ │ │ Agentic Loop (max 300 iterations) │ │ │ │
│ │ │ │ │ │ │
│ │ │ ┌──────────────────────────────────┐ │ │ │ │
│ │ │ │ Session │ │ │ │ │ │
│ │ │ │ ┌────────────────────────────┐ │ │ │ │ │
│ │ │ │ │ ContextManager │ │ │ │ │ │
│ │ │ │ │ • Message history │ │ │ │ │ │
│ │ │ │ │ (litellm.Message[]) │ │ │ │ │ │
│ │ │ │ │ • Auto-compaction (170k) │ │ │ │ │ │
│ │ │ │ │ • Session upload to HF │ │ │ │ │ │
│ │ │ └────────────────────────────┘ │ │ │ │ │
│ │ │ │ │ │ │ │ │
│ │ │ │ ┌────────────────────────────┐ │ │ │ │ │
│ │ │ │ │ ToolRouter │ │ │ │ │ │
│ │ │ │ │ ├─ HF docs & research │ │ │ │ │ │
│ │ │ │ │ ├─ HF repos, datasets, │ │ │ │ │ │
│ │ │ │ │ │ jobs, papers │ │ │ │ │ │
│ │ │ │ │ ├─ GitHub code search │ │ │ │ │ │
│ │ │ │ │ ├─ Sandbox & local tools │ │ │ │ │ │
│ │ │ │ │ ├─ Planning │ │ │ │ │ │
│ │ │ │ │ └─ MCP server tools │ │ │ │ │ │
│ │ │ │ └────────────────────────────┘ │ │ │ │ │
│ │ │ └──────────────────────────────────┘ │ │ │ │
│ │ │ │ │ │ │
│ │ │ ┌──────────────────────────────────┐ │ │ │ │
│ │ │ │ Doom Loop Detector │ │ │ │ │
│ │ │ │ • Detects repeated tool patterns │ │ │ │ │
│ │ │ │ • Injects corrective prompts │ │ │ │ │
│ │ │ └──────────────────────────────────┘ │ │ │ │
│ │ │ │ │ │ │
│ │ │ Loop: │ │ │ │
│ │ │ 1. LLM call (litellm.acompletion) │ │ │ │
│ │ │ ↓ │ │ │ │
│ │ │ 2. Parse tool_calls[] │ │ │ │
│ │ │ ↓ │ │ │ │
│ │ │ 3. Approval check │ │ │ │
│ │ │ (jobs, sandbox, destructive ops) │ │ │ │
│ │ │ ↓ │ │ │ │
│ │ │ 4. Execute via ToolRouter │ │ │ │
│ │ │ ↓ │ │ │ │
│ │ │ 5. Add results to ContextManager │ │ │ │
│ │ │ ↓ │ │ │ │
│ │ │ 6. Repeat if tool_calls exist │ │ │ │
│ │ └────────────────────────────────────────┘ │ │ │
│ └──────────────────────────────────────────────┘ │ │
└────────────────────────────────────────────────────┴──┘
User Message

[Add to ContextManager]

╔═══════════════════════════════════════════╗
║ Iteration Loop (max 300) ║
║ ║
║ Get messages + tool specs ║
║ ↓ ║
║ litellm.acompletion() ║
║ ↓ ║
║ Has tool_calls? ──No──> Done ║
║ │ ║
║ Yes ║
║ ↓ ║
║ Add assistant msg (with tool_calls) ║
║ ↓ ║
║ Doom loop check ║
║ ↓ ║
║ For each tool_call: ║
║ • Needs approval? ──Yes──> Wait for │ │
║ │ user confirm ║
║ No ║
║ ↓ ║
║ • ToolRouter.execute_tool() ║
║ • Add result to ContextManager ║
║ ↓ ║
║ Continue loop ─────────────────┐ ║
║ ↑ │ ║
║ └───────────────────────┘ ║
╚═══════════════════════════════════════════╝
The agent emits the following events via event_queue:

  • processing: Starting to process user input
  • ready: Agent is ready for input
  • assistant_chunk: Streaming token chunk
  • assistant_message: Complete LLM response text
  • assistant_stream_end: Token stream finished
  • tool_call: Tool being called with argument
  • tool_output: Tool execution result
  • tool_log: Informational tool log message
  • tool_state_change: Tool execution state transition
  • approval_required: Requesting user approval for sensitive operations
  • turn_complete: Agent finished processing
  • error: Error occurred during processing
  • interrupted: Agent was interrupted
  • compacted: Context was compacted
  • undo_complete: Undo operation completed
  • shutdown: Agent shutting down

Edit agent/core/tools.py:

def create_builtin_tools() -> list[ToolSpec]:
    return [
        ToolSpec(
            name="your_tool",
            description="What your tool does",
            parameters={
                "type": "object",
                "properties": {
                    "param": {"type": "string", "description": "Parameter description"}
                },
                "required": ["param"]
            },
            handler=your_async_handler
        ),
        # ... existing tools
    ]

Edit configs/main_agent_config.json:

{
  "model_name": "anthropic/claude-sonnet-4-5-20250929",
  "mcpServers": {
    "your-server-name": {
      "transport": "http",
      "url": "https://example.com/mcp",
      "headers": {
        "Authorization": "Bearer ${YOUR_TOKEN}"
      }
    }
  }
}

Note: Environment variables like ${YOUR_TOKEN} are auto-substituted from .env.

AI 자동 생성 콘텐츠

본 콘텐츠는 GitHub Trending All (daily)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
3

댓글

0