GitHub - huggingface/ml-intern: ๐Ÿค— ml-intern: an open-source ML engineer that reads papers, trains models, and ships ML models
Service

GitHub - huggingface/ml-intern: ๐Ÿค— ml-intern: an open-source ML engineer that reads papers, trains models, and ships ML models

huggingface
2026.05.20
ยทGitHubยทby Leon
#Agent#AI#Automation#Hugging Face#LLM

ํ•ต์‹ฌ ํฌ์ธํŠธ

  • 1ML Intern์€ Hugging Face ์ƒํƒœ๊ณ„๋ฅผ ํ™œ์šฉํ•˜์—ฌ ML ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ์ž์œจ์ ์œผ๋กœ ์—ฐ๊ตฌ, ์ž‘์„ฑ ๋ฐ ๋ฐฐํฌํ•˜๋Š” ML ์—์ด์ „ํŠธ์ž…๋‹ˆ๋‹ค.
  • 2์ด ์—์ด์ „ํŠธ๋Š” ๋‹ค์–‘ํ•œ LLM๊ณผ ๋กœ์ปฌ ๋˜๋Š” Hugging Face Space ์ƒŒ๋“œ๋ฐ•์Šค ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜๋ฉฐ, ContextManager์™€ ToolRouter๋ฅผ ํฌํ•จํ•˜๋Š” Agentic Loop๋ฅผ ํ†ตํ•ด ๋ณต์žกํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • 3๋˜ํ•œ, ์‹คํ–‰ ์ถ”์  ๋ฐ์ดํ„ฐ๋ฅผ Hugging Face ๋ฐ์ดํ„ฐ์…‹์— ์ž๋™์œผ๋กœ ์—…๋กœ๋“œํ•˜๊ณ  Doom Loop Detector ๋ฐ Slack ์•Œ๋ฆผ๊ณผ ๊ฐ™์€ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

ML Intern์€ Hugging Face ์ƒํƒœ๊ณ„๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋จธ์‹ ๋Ÿฌ๋‹ ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ์ž์œจ์ ์œผ๋กœ ์—ฐ๊ตฌํ•˜๊ณ , ์ž‘์„ฑํ•˜๋ฉฐ, ๋ฐฐํฌํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘” ML ์ธํ„ด ์—์ด์ „ํŠธ์ž…๋‹ˆ๋‹ค. ์ด ์—์ด์ „ํŠธ๋Š” Hugging Face์˜ ๋ฌธ์„œ, ๋…ผ๋ฌธ, ๋ฐ์ดํ„ฐ์…‹, ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ… ์ž์›์— ๊นŠ์ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๋ฐฉ๋ฒ•๋ก  ๋ฐ ์•„ํ‚คํ…์ฒ˜

ML Intern์˜ ํ•ต์‹ฌ์€ ๋ณต์žกํ•œ ์ž‘์—…์„ ์ž์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ •๊ตํ•œ ์•„ํ‚คํ…์ฒ˜์™€ ๋ฐ˜๋ณต์ ์ธ Agentic Loop์— ์žˆ์Šต๋‹ˆ๋‹ค.

  1. Operation Submission and Routing: ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์€ submission_loop๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฃจํ”„๋Š” user_input, exec_approval ๋“ฑ ๋‹ค์–‘ํ•œ Operation์„ event_queue์—์„œ ๋ฐ›์•„ ํ•ด๋‹น ํ•ธ๋“ค๋Ÿฌ(run_agent, compact ๋“ฑ)๋กœ ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค.
  1. Agentic Loop (Handlers.run_agent()): ์—์ด์ „ํŠธ์˜ ์ฃผ์š” ๋กœ์ง์€ ์ตœ๋Œ€ 300ํšŒ ๋ฐ˜๋ณต๋˜๋Š” Agentic Loop ๋‚ด์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฃจํ”„๋Š” ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค:
    • LLM Call: ContextManager์— ์ €์žฅ๋œ ํ˜„์žฌ ๋ฉ”์‹œ์ง€ ํžˆ์Šคํ† ๋ฆฌ์™€ ToolRouter๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ tool specifications์„ ๊ธฐ๋ฐ˜์œผ๋กœ litellm.acompletion()์„ ํ˜ธ์ถœํ•˜์—ฌ LLM(Large Language Model)๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • Tool Call Parsing: LLM ์‘๋‹ต์—์„œ tool_calls[]๋ฅผ ํŒŒ์‹ฑํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ tool_calls๊ฐ€ ์—†๋‹ค๋ฉด, ์—์ด์ „ํŠธ๋Š” ์ž‘์—…์„ ์™„๋ฃŒํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ๋ฃจํ”„๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
    • Approval Check: ํŒŒ์‹ฑ๋œ tool_calls ์ค‘ jobs, sandbox ์‚ฌ์šฉ ๋˜๋Š” ํŒŒ๊ดด์ ์ธ ์ž‘์—…์„ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์Šน์ธ(Approval check)์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
    • Tool Execution: ์Šน์ธ๋œ tool_call์€ ToolRouter๋ฅผ ํ†ตํ•ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
    • Result Integration: ToolRouter์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ContextManager์— ์ถ”๊ฐ€๋˜์–ด ๋‹ค์Œ LLM ํ˜ธ์ถœ์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ์ปจํ…์ŠคํŠธ๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • Repetition: tool_calls๊ฐ€ ์กด์žฌํ•˜๊ณ  ์‹คํ–‰๋˜์—ˆ๋‹ค๋ฉด, ์—์ด์ „ํŠธ๋Š” ๋‹ค์Œ ๋ฐ˜๋ณต์„ ์œ„ํ•ด ๋ฃจํ”„๋ฅผ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.
  1. ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ:
    • ContextManager: ์ด ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์—์ด์ „ํŠธ์˜ ์„ธ์…˜ ์ƒํƒœ์™€ ๋ฉ”์‹œ์ง€ ํžˆ์Šคํ† ๋ฆฌ(litellm.Message[] ํ˜•ํƒœ)๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…์ŠคํŠธ์˜ ๊ธธ์ด๊ฐ€ ์ผ์ • ๊ธฐ์ค€(170k ํ† ํฐ)์„ ์ดˆ๊ณผํ•˜๋ฉด ์ž๋™ ์••์ถ•(auto-compaction) ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ํšจ์œจ์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชจ๋“  ์„ธ์…˜์€ Hugging Face Hub์— private ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ์ž๋™ ์—…๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.
    • ToolRouter: ์—์ด์ „ํŠธ๊ฐ€ ๋‹ค์–‘ํ•œ ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ•ต์‹ฌ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ํฌํ•จํ•œ ๊ด‘๋ฒ”์œ„ํ•œ ๋„๊ตฌ์— ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:
      • Hugging Face ๋ฌธ์„œ ๋ฐ ์—ฐ๊ตฌ ์ž๋ฃŒ ๊ฒ€์ƒ‰
      • Hugging Face repository, dataset, job, paper ์ ‘๊ทผ
      • GitHub ์ฝ”๋“œ ๊ฒ€์ƒ‰
      • Sandbox (Hugging Face Space ๊ธฐ๋ฐ˜ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ) ๋ฐ ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ ๋„๊ตฌ (bash, read, write, edit)
      • Planning ๋„๊ตฌ
      • MCP (Multi-party Computation Protocol) ์„œ๋ฒ„ ๋„๊ตฌ
    • Doom Loop Detector: ์—์ด์ „ํŠธ๊ฐ€ ๋ฐ˜๋ณต์ ์ธ tool patterns์— ๋น ์ง€๋Š” ๊ฒƒ์„ ๊ฐ์ง€ํ•˜๊ณ , ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ corrective prompts๋ฅผ LLM์— ์ฃผ์ž…ํ•˜์—ฌ ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ์•ˆ์ „ ์žฅ์น˜์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋ฒ• ๋ฐ ๊ธฐ๋Šฅ

ML Intern์€ ml-intern CLI ๋ช…๋ น์„ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. interactive mode (์ฑ„ํŒ… ์„ธ์…˜) ๋˜๋Š” headless mode (๋‹จ์ผ ํ”„๋กฌํ”„ํŠธ, ์ž๋™ ์Šน์ธ)๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋ชจ๋ธ (Anthropic/Claude, OpenAI/GPT, Ollama/Llama, vLLM/Llama)์„ --model ์˜ต์…˜์„ ํ†ตํ•ด ์„ ํƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, LOCAL_LLM_BASE_URL ๋ฐ *_BASE_URL ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ปฌ ๋ชจ๋ธ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

CLI ๋„๊ตฌ runtime์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ(bash, read, write, edit)์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, --sandbox-tools ์˜ต์…˜์„ ํ†ตํ•ด HF Space sandbox tools(sandbox_create ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Sandbox ๋„๊ตฌ๋Š” ์›๊ฒฉ ์ฝ”๋“œ ํ…Œ์ŠคํŠธ ๋ฐ GPU ์ž์› ์š”์ฒญ์— ์œ ์šฉํ•˜๋ฉฐ, HF_TOKEN์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ์„ธ์…˜์˜ ์‹คํ–‰ ์ถ”์ (traces)์€ Claude Code JSONL format์œผ๋กœ ์‚ฌ์šฉ์ž์˜ private Hugging Face ๋ฐ์ดํ„ฐ์…‹์— ์ž๋™ ์—…๋กœ๋“œ๋˜๋ฉฐ, HF Agent Trace Viewer๋ฅผ ํ†ตํ•ด ํ™•์ธ ๋ฐ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CLI config๋ฅผ ํ†ตํ•ด ์ถ”์  ๊ณต์œ ๋ฅผ ์˜ตํŠธ์•„์›ƒํ•˜๊ฑฐ๋‚˜ ๋Œ€์ƒ ์ €์žฅ์†Œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•Œ๋ฆผ ๊ฒŒ์ดํŠธ์›จ์ด

ML Intern์€ Slack๊ณผ ๊ฐ™์€ one-way notification gateway๋ฅผ ์ง€์›ํ•˜์—ฌ ์—์ด์ „ํŠธ์˜ ์ƒํƒœ ์—…๋ฐ์ดํŠธ(์Šน์ธ ํ•„์š”, ์—๋Ÿฌ ๋ฐœ์ƒ, ํ„ด ์™„๋ฃŒ ๋“ฑ)๋ฅผ ์™ธ๋ถ€ ์„œ๋น„์Šค๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” SLACK_BOT_TOKEN, SLACK_CHANNEL_ID์™€ ๊ฐ™์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋˜๋Š” cli_agent_config.json์„ ํ†ตํ•ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ

์ƒˆ๋กœ์šด ๋‚ด์žฅ ๋„๊ตฌ๋Š” agent/core/tools.py ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์—ฌ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ToolSpec ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•˜์—ฌ name, description, parameters, handler๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. MCP Servers๋Š” configs/cli_agent_config.json์„ ํ†ตํ•ด ์„ค์ •ํ•˜๋ฉฐ, transport, url, headers์™€ ๊ฐ™์€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ์‹œ ruff๋ฅผ ์ด์šฉํ•œ pre-commit checks (์ฝ”๋“œ ํฌ๋งทํŒ… ๋ฐ ๋ฆฐํŒ…)๊ฐ€ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.