Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
huggingface
GitHub Repository: huggingface/notebooks
Path: blob/main/smolagents_doc/ko/guided_tour.ipynb
7411 views
Kernel: Unknown Kernel
# Installation ! pip install smolagents # To install from source instead of the last release, comment the command above and uncomment the following one. # ! pip install git+https://github.com/huggingface/smolagents.git

์—์ด์ „ํŠธ ์•ˆ๋‚ด์„œ[[agents---guided-tour]]

์ด ์•ˆ๋‚ด์„œ์—์„œ๋Š” ์—์ด์ „ํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•, ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋งž๊ฒŒ ๋” ์ž˜ ์ž‘๋™ํ•˜๋„๋ก ๋งž์ถค ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

์—์ด์ „ํŠธ ์œ ํ˜• ์„ ํƒ: CodeAgent ๋˜๋Š” ToolCallingAgent[[choosing-an-agent-type:-codeagent-or-toolcallingagent]]

smolagents๋Š” CodeAgent์™€ ToolCallingAgent ๋‘ ๊ฐ€์ง€ ์—์ด์ „ํŠธ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ด ๋‘ ํด๋ž˜์Šค๋Š” ๊ฐ๊ฐ ์—์ด์ „ํŠธ๊ฐ€ ๋„๊ตฌ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋‘ ๋ฐฉ์‹์˜ ํ•ต์‹ฌ ์ฐจ์ด์ ์€ '์•ก์…˜์„ ์ง€์ •ํ•˜๊ณ  ์‹คํ–‰'ํ•˜๋Š” ๋ฐฉ์‹์— ์žˆ์Šต๋‹ˆ๋‹ค: ์ฝ”๋“œ ์ƒ์„ฑ vs ๊ตฌ์กฐํ™”๋œ ๋„๊ตฌ ํ˜ธ์ถœ.

  • CodeAgent๋Š” ๋„๊ตฌ ํ˜ธ์ถœ์„ Python ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    • ์ฝ”๋“œ๋Š” ๋กœ์ปฌ์—์„œ ์‹คํ–‰๋˜๊ฑฐ๋‚˜(์ž ์žฌ์ ์œผ๋กœ ๋ถˆ์•ˆ์ „) ๋ณด์•ˆ ์ƒŒ๋“œ๋ฐ•์Šค์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

    • ๋„๊ตฌ๋Š” Python ํ•จ์ˆ˜๋กœ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค(๋ฐ”์ธ๋”ฉ์„ ํ†ตํ•ด).

    • ๋„๊ตฌ ํ˜ธ์ถœ ์˜ˆ์‹œ:

      result = search_docs("What is the capital of France?") print(result)
    • ์žฅ์ :

      • ๋†’์€ ํ‘œํ˜„๋ ฅ: ๋ณต์žกํ•œ ๋กœ์ง๊ณผ ์ œ์–ด ํ๋ฆ„์„ ํ—ˆ์šฉํ•˜๊ณ  ๋„๊ตฌ๋ฅผ ๊ฒฐํ•ฉํ•˜๊ณ , ๋ฐ˜๋ณตํ•˜๊ณ , ๋ณ€ํ™˜ํ•˜๊ณ , ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      • ์œ ์—ฐ์„ฑ: ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์•ก์…˜์„ ๋ฏธ๋ฆฌ ์ •์˜ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, ๋™์ ์œผ๋กœ ์ƒˆ๋กœ์šด ์•ก์…˜/๋„๊ตฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      • ์ฐฝ๋ฐœ์  ์ถ”๋ก : ๋‹ค๋‹จ๊ณ„ ๋ฌธ์ œ๋‚˜ ๋™์  ๋กœ์ง์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.

    • ์ œํ•œ์‚ฌํ•ญ

      • ์˜ค๋ฅ˜ ์œ„ํ—˜: ๊ตฌ๋ฌธ ์˜ค๋ฅ˜, ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

      • ์˜ˆ์ธก์„ฑ ๋ถ€์กฑ: ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋˜๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ถœ๋ ฅ์— ๋” ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค.

      • ๋ณด์•ˆ ์‹คํ–‰ ํ™˜๊ฒฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ToolCallingAgent๋Š” ๋„๊ตฌ ํ˜ธ์ถœ์„ ๊ตฌ์กฐํ™”๋œ JSON์œผ๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

    • ์ด๋Š” ๋งŽ์€ ํ”„๋ ˆ์ž„์›Œํฌ(OpenAI API)์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ผ๋ฐ˜์ ์ธ ํ˜•์‹์œผ๋กœ, ์ฝ”๋“œ ์‹คํ–‰ ์—†์ด ๊ตฌ์กฐํ™”๋œ ๋„๊ตฌ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

    • ๋„๊ตฌ๋Š” JSON ์Šคํ‚ค๋งˆ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค: ์ด๋ฆ„, ์„ค๋ช…, ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž… ๋“ฑ.

    • ๋„๊ตฌ ํ˜ธ์ถœ ์˜ˆ์‹œ:

      { "tool_call": { "name": "search_docs", "arguments": { "query": "What is the capital of France?" } } }
    • ์žฅ์ :

      • ์•ˆ์ •์„ฑ: ํ™˜๊ฐ์ด ์ ๊ณ , ์ถœ๋ ฅ์ด ๊ตฌ์กฐํ™”๋˜๊ณ  ๊ฒ€์ฆ๋ฉ๋‹ˆ๋‹ค.

      • ์•ˆ์ „์„ฑ: ์ธ์ˆ˜๊ฐ€ ์—„๊ฒฉํ•˜๊ฒŒ ๊ฒ€์ฆ๋˜๊ณ , ์ž„์˜์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ์œ„ํ—˜์ด ์—†์Šต๋‹ˆ๋‹ค.

      • ์ƒํ˜ธ ์šด์šฉ์„ฑ: ์™ธ๋ถ€ API๋‚˜ ์„œ๋น„์Šค์— ์‰ฝ๊ฒŒ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.

    • ์ œํ•œ์‚ฌํ•ญ:

      • ๋‚ฎ์€ ํ‘œํ˜„๋ ฅ: ๊ฒฐ๊ณผ๋ฅผ ๋™์ ์œผ๋กœ ์‰ฝ๊ฒŒ ๊ฒฐํ•ฉํ•˜๊ฑฐ๋‚˜ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๊ณ , ๋ณต์žกํ•œ ๋กœ์ง์ด๋‚˜ ์ œ์–ด ํ๋ฆ„์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

      • ์œ ์—ฐ์„ฑ ๋ถ€์กฑ: ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์•ก์…˜์„ ๋ฏธ๋ฆฌ ์ •์˜ํ•ด์•ผ ํ•˜๊ณ , ์‚ฌ์ „ ์ •์˜๋œ ๋„๊ตฌ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

      • ์ฝ”๋“œ ํ•ฉ์„ฑ ์—†์Œ: ๋„๊ตฌ ๊ธฐ๋Šฅ์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ์—์ด์ „ํŠธ ์œ ํ˜•์„ ์‚ฌ์šฉํ• ์ง€:

  • CodeAgent๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ:

    • ์ถ”๋ก , ์—ฐ๊ฒฐ ๋˜๋Š” ๋™์  ๊ตฌ์„ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ.

    • ๋„๊ตฌ๊ฐ€ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ธ ๊ฒฝ์šฐ(์˜ˆ: ๊ตฌ๋ฌธ ๋ถ„์„ + ์ˆ˜ํ•™ + ์ฟผ๋ฆฌ).

    • ์—์ด์ „ํŠธ๊ฐ€ ๋ฌธ์ œ ํ•ด๊ฒฐ์ž ๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ์ธ ๊ฒฝ์šฐ.

  • ToolCallingAgent๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ:

    • ๋‹จ์ˆœํ•˜๊ณ  ๋…๋ฆฝ์ ์ธ ๋„๊ตฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ(์˜ˆ: API ํ˜ธ์ถœ, ๋ฌธ์„œ ๊ฐ€์ ธ์˜ค๊ธฐ).

    • ๋†’์€ ์•ˆ์ •์„ฑ๊ณผ ๋ช…ํ™•ํ•œ ๊ฒ€์ฆ์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ.

    • ์—์ด์ „ํŠธ๊ฐ€ ๋””์ŠคํŒจ์ฒ˜๋‚˜ ์ปจํŠธ๋กค๋Ÿฌ ๊ฐ™์€ ์—ญํ• ์ธ ๊ฒฝ์šฐ.

CodeAgent[[codeagent]]

CodeAgent๋Š” ์•ก์…˜์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ž‘์—…์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Python ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ Python ์ฝ”๋“œ ์‹คํ–‰์€ ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ณตํ•œ ๋„๊ตฌ๋“ค(ํŠนํžˆ Hugging Face ๋„๊ตฌ๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ)๊ณผ print๋‚˜ math ๋ชจ๋“ˆ ํ•จ์ˆ˜ ๊ฐ™์€ ์‚ฌ์ „ ์ •์˜๋œ ์•ˆ์ „ํ•œ ํ•จ์ˆ˜๋“ค๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œํ•œ๋˜์–ด ์žˆ์–ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

Python ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์•ˆ์ „ ๋ชฉ๋ก์— ํฌํ•จ๋œ ๋ชจ๋“ˆ๋งŒ import๋ฅผ ํ—ˆ์šฉํ•˜๋ฏ€๋กœ, ๋Œ€๋ถ€๋ถ„์˜ ๋ช…๋ฐฑํ•œ ๋ณด์•ˆ ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CodeAgent๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ additional_authorized_imports ์ธ์ˆ˜์— ๋ฌธ์ž์—ด ๋ชฉ๋ก์œผ๋กœ ์Šน์ธ๋œ ๋ชจ๋“ˆ์„ ์ „๋‹ฌํ•˜์—ฌ ์ถ”๊ฐ€ import๋ฅผ ์Šน์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

model = InferenceClientModel() agent = CodeAgent(tools=[], model=model, additional_authorized_imports=['requests', 'bs4']) agent.run("Could you get me the title of the page at url 'https://huggingface.co/blog'?")

๋˜ํ•œ ์ถ”๊ฐ€ ๋ณด์•ˆ ๊ณ„์ธต์œผ๋กœ, import ๋ชฉ๋ก์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ์Šน์ธ๋˜์ง€ ์•Š๋Š” ํ•œ ์„œ๋ธŒ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์ ‘๊ทผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ธˆ์ง€๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, numpy.random ์„œ๋ธŒ๋ชจ๋“ˆ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด additional_authorized_imports ๋ชฉ๋ก์— 'numpy.random'์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” numpy์™€ numpy.random ๊ฐ™์€ ๋ชจ๋“  ์„œ๋ธŒํŒจํ‚ค์ง€ ๋ฐ ์ž์ฒด ์„œ๋ธŒํŒจํ‚ค์ง€๋ฅผ ํ—ˆ์šฉํ•˜๋Š” numpy.*๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šน์ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

[!WARNING] LLM์€ ์‹คํ–‰๋  ์ž„์˜์˜ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ์•ˆ์ „ํ•˜์ง€ ์•Š์€ import๋Š” ์ถ”๊ฐ€ํ•˜์ง€ ๋งˆ์„ธ์š”!

๋ถˆ๋ฒ•์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ์ฝ”๋“œ๋‚˜ ์—์ด์ „ํŠธ๊ฐ€ ์ƒ์„ฑํ•œ ์ฝ”๋“œ์— ์ผ๋ฐ˜์ ์ธ Python ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์‹คํ–‰์ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ Python ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋Œ€์‹  E2B code executor๋‚˜ Docker๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. E2B์˜ ๊ฒฝ์šฐ, ๋จผ์ € E2B_API_KEY ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•œ ๋‹ค์Œ ์—์ด์ „ํŠธ ์ดˆ๊ธฐํ™” ์‹œ executor_type="e2b"๋ฅผ ์ „๋‹ฌํ•˜์„ธ์š”. Docker์˜ ๊ฒฝ์šฐ, ์ดˆ๊ธฐํ™” ์ค‘์— executor_type="docker"๋ฅผ ์ „๋‹ฌํ•˜์„ธ์š”.

[!TIP] ์ฝ”๋“œ ์‹คํ–‰์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด ์ด ํŠœํ† ๋ฆฌ์–ผ์„ ํ™•์ธํ•˜์„ธ์š”.

ToolCallingAgent[[toolcallingagent]]

ToolCallingAgent๋Š” ๋งŽ์€ ํ”„๋ ˆ์ž„์›Œํฌ(OpenAI API)์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ผ๋ฐ˜์ ์ธ ํ˜•์‹์ธ JSON ๋„๊ตฌ ํ˜ธ์ถœ์„ ์ถœ๋ ฅํ•˜์—ฌ, ์ฝ”๋“œ ์‹คํ–‰ ์—†์ด ๊ตฌ์กฐํ™”๋œ ๋„๊ตฌ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ additional_authorized_imports ์—†์ด๋„ CodeAgent์™€ ๊ฑฐ์˜ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค:

from smolagents import ToolCallingAgent, WebSearchTool agent = ToolCallingAgent(tools=[WebSearchTool()], model=model) agent.run("Could you get me the title of the page at url 'https://huggingface.co/blog'?")

์—์ด์ „ํŠธ ๊ตฌ์ถ•[[building-your-agent]]

์ตœ์†Œํ•œ์˜ ์—์ด์ „ํŠธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋ ค๋ฉด ์ตœ์†Œํ•œ ๋‹ค์Œ ๋‘ ์ธ์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

  • model, ์—์ด์ „ํŠธ๋ฅผ ๊ตฌ๋™ํ•˜๋Š” ํ…์ŠคํŠธ ์ƒ์„ฑ ๋ชจ๋ธ - ์—์ด์ „ํŠธ๋Š” ๋‹จ์ˆœํ•œ LLM๊ณผ ๋‹ค๋ฅด๋ฉฐ, LLM์„ ์—”์ง„์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

    • TransformersModel์€ ์‚ฌ์ „ ์ดˆ๊ธฐํ™”๋œ transformers ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ฐ€์ ธ์™€ transformers๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ปฌ ๋จธ์‹ ์—์„œ ์ถ”๋ก ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    • InferenceClientModel์€ ๋‚ด๋ถ€์ ์œผ๋กœ huggingface_hub.InferenceClient๋ฅผ ํ™œ์šฉํ•˜๋ฉฐ Hub์˜ ๋ชจ๋“  ์ถ”๋ก  ์ œ๊ณต์ž๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค: Cerebras, Cohere, Fal, Fireworks, HF-Inference, Hyperbolic, Nebius, Novita, Replicate, SambaNova, Together ๋“ฑ.

    • LiteLLMModel์€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ LiteLLM์„ ํ†ตํ•ด 100๊ฐœ ์ด์ƒ์˜ ๋‹ค์–‘ํ•œ ๋ชจ๋ธ๊ณผ ์ œ๊ณต์ž๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

    • AzureOpenAIModel์€ Azure์— ๋ฐฐํฌ๋œ OpenAI ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

    • AmazonBedrockModel์€ AWS์˜ Amazon Bedrock์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

    • MLXModel์€ ๋กœ์ปฌ ๋จธ์‹ ์—์„œ ์ถ”๋ก ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ mlx-lm ํŒŒ์ดํ”„๋ผ์ธ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • tools, ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—… ํ•ด๊ฒฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ๋นˆ ๋ชฉ๋ก์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. add_base_tools=True ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋ณธ ์ œ๊ณต๋˜๋Š” ๋„๊ตฌ๋“ค(์›น ๊ฒ€์ƒ‰, ์ฝ”๋“œ ์‹คํ–‰, ์Œ์„ฑ ์ธ์‹ ๋“ฑ)์„ tools ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

tools์™€ model ๋‘ ์ธ์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋ฉด ์—์ด์ „ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”๋ก  ์ œ๊ณต์ž, transformers, ollama, LiteLLM, Azure OpenAI, Amazon Bedrock, ๋˜๋Š” mlx-lm์„ ํ†ตํ•ด ์›ํ•˜๋Š” LLM์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ๋ชจ๋ธ ํด๋ž˜์Šค๋Š” ์ธ์Šคํ„ด์Šคํ™” ์‹œ์ ์— ์ถ”๊ฐ€ ํ‚ค์›Œ๋“œ ์ธ์ˆ˜(์˜ˆ: temperature, max_tokens, top_p ๋“ฑ)๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๊ธฐ๋ณธ ๋ชจ๋ธ์˜ ์™„์„ฑ ํ˜ธ์ถœ์— ์ž๋™์œผ๋กœ ์ „๋‹ฌ๋˜์–ด ์ฐฝ์˜์„ฑ, ์‘๋‹ต ๊ธธ์ด, ์ƒ˜ํ”Œ๋ง ์ „๋žต ๋“ฑ์˜ ๋ชจ๋ธ ๋™์ž‘์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๋ก  ์ œ๊ณต์ž๋Š” ์ธ์ฆ์„ ์œ„ํ•ด HF_TOKEN์ด ํ•„์š”ํ•˜์ง€๋งŒ, ๋ฌด๋ฃŒ HF ๊ณ„์ •์—๋Š” ์ด๋ฏธ ํฌํ•จ๋œ ํฌ๋ ˆ๋”ง์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. PRO๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜์—ฌ ํฌํ•จ๋œ ํฌ๋ ˆ๋”ง์„ ๋Š˜๋ฆฌ์„ธ์š”.

์ œํ•œ๋œ ๋ชจ๋ธ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ PRO ๊ณ„์ •์œผ๋กœ ์†๋„ ์ œํ•œ์„ ๋†’์ด๋ ค๋ฉด ํ™˜๊ฒฝ ๋ณ€์ˆ˜ HF_TOKEN์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ InferenceClientModel ์ดˆ๊ธฐํ™” ์‹œ token ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„ค์ • ํŽ˜์ด์ง€์—์„œ ํ† ํฐ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from smolagents import CodeAgent, InferenceClientModel model_id = "meta-llama/Llama-3.3-70B-Instruct" model = InferenceClientModel(model_id=model_id, token="<YOUR_HUGGINGFACEHUB_API_TOKEN>") # You can choose to not pass any model_id to InferenceClientModel to use a default model # you can also specify a particular provider e.g. provider="together" or provider="sambanova" agent = CodeAgent(tools=[], model=model, add_base_tools=True) agent.run( "Could you give me the 118th number in the Fibonacci sequence?", )
# !pip install smolagents[transformers] from smolagents import CodeAgent, TransformersModel model_id = "meta-llama/Llama-3.2-3B-Instruct" model = TransformersModel(model_id=model_id) agent = CodeAgent(tools=[], model=model, add_base_tools=True) agent.run( "Could you give me the 118th number in the Fibonacci sequence?", )

LiteLLMModel์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ANTHROPIC_API_KEY ๋˜๋Š” OPENAI_API_KEY๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์ดˆ๊ธฐํ™” ์‹œ api_key ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

# !pip install smolagents[litellm] from smolagents import CodeAgent, LiteLLMModel model = LiteLLMModel(model_id="anthropic/claude-3-5-sonnet-latest", api_key="YOUR_ANTHROPIC_API_KEY") # Could use 'gpt-4o' agent = CodeAgent(tools=[], model=model, add_base_tools=True) agent.run( "Could you give me the 118th number in the Fibonacci sequence?", )
# !pip install smolagents[litellm] from smolagents import CodeAgent, LiteLLMModel model = LiteLLMModel( model_id="ollama_chat/llama3.2", # This model is a bit weak for agentic behaviours though api_base="http://localhost:11434", # replace with 127.0.0.1:11434 or remote open-ai compatible server if necessary api_key="YOUR_API_KEY", # replace with API key if necessary num_ctx=8192, # ollama default is 2048 which will fail horribly. 8192 works for easy tasks, more is better. Check https://huggingface.co/spaces/NyxKrage/LLM-Model-VRAM-Calculator to calculate how much VRAM this will need for the selected model. ) agent = CodeAgent(tools=[], model=model, add_base_tools=True) agent.run( "Could you give me the 118th number in the Fibonacci sequence?", )

Azure OpenAI์— ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด AzureOpenAIModel์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ LiteLLMModel์„ ์‚ฌ์šฉํ•˜์—ฌ ์ ์ ˆํžˆ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AzureOpenAIModel์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋ ค๋ฉด ๋ชจ๋ธ ๋ฐฐํฌ ์ด๋ฆ„์„ ์ „๋‹ฌํ•œ ๋‹ค์Œ azure_endpoint, api_key, api_version ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ AZURE_OPENAI_ENDPOINT, AZURE_OPENAI_API_KEY, OPENAI_API_VERSION์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

# !pip install smolagents[openai] from smolagents import CodeAgent, AzureOpenAIModel model = AzureOpenAIModel(model_id="gpt-4o-mini") agent = CodeAgent(tools=[], model=model, add_base_tools=True) agent.run( "Could you give me the 118th number in the Fibonacci sequence?", )

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด LiteLLMModel์„ ๊ตฌ์„ฑํ•˜์—ฌ Azure OpenAI์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ๋ชจ๋ธ ๋ฐฐํฌ ์ด๋ฆ„์„ model_id๋กœ ์ „๋‹ฌํ•˜๊ณ , ์•ž์— azure/๋ฅผ ๋ถ™์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜ AZURE_API_VERSION์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • api_base์™€ api_key ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ AZURE_API_KEY, AZURE_API_BASE๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

import os from smolagents import CodeAgent, LiteLLMModel AZURE_OPENAI_CHAT_DEPLOYMENT_NAME="gpt-35-turbo-16k-deployment" # example of deployment name os.environ["AZURE_API_KEY"] = "" # api_key os.environ["AZURE_API_BASE"] = "" # "https://example-endpoint.openai.azure.com" os.environ["AZURE_API_VERSION"] = "" # "2024-10-01-preview" model = LiteLLMModel(model_id="azure/" + AZURE_OPENAI_CHAT_DEPLOYMENT_NAME) agent = CodeAgent(tools=[], model=model, add_base_tools=True) agent.run( "Could you give me the 118th number in the Fibonacci sequence?", )

AmazonBedrockModel ํด๋ž˜์Šค๋Š” Amazon Bedrock๊ณผ ์ง์ ‘ ์—ฐ๋™๋˜์–ด API ํ˜ธ์ถœ๊ณผ ์„ธ๋ถ€ ๊ตฌ์„ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•:

# !pip install smolagents[aws_sdk] from smolagents import CodeAgent, AmazonBedrockModel model = AmazonBedrockModel(model_id="anthropic.claude-3-sonnet-20240229-v1:0") agent = CodeAgent(tools=[], model=model, add_base_tools=True) agent.run( "Could you give me the 118th number in the Fibonacci sequence?", )

๊ณ ๊ธ‰ ๊ตฌ์„ฑ:

import boto3 from smolagents import AmazonBedrockModel # Create a custom Bedrock client bedrock_client = boto3.client( 'bedrock-runtime', region_name='us-east-1', aws_access_key_id='YOUR_ACCESS_KEY', aws_secret_access_key='YOUR_SECRET_KEY' ) additional_api_config = { "inferenceConfig": { "maxTokens": 3000 }, "guardrailConfig": { "guardrailIdentifier": "identify1", "guardrailVersion": 'v1' }, } # Initialize with comprehensive configuration model = AmazonBedrockModel( model_id="us.amazon.nova-pro-v1:0", client=bedrock_client, # Use custom client **additional_api_config ) agent = CodeAgent(tools=[], model=model, add_base_tools=True) agent.run( "Could you give me the 118th number in the Fibonacci sequence?", )

LiteLLMModel ์‚ฌ์šฉ:

๋˜๋Š” Bedrock ๋ชจ๋ธ๊ณผ ํ•จ๊ป˜ LiteLLMModel์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

from smolagents import LiteLLMModel, CodeAgent model = LiteLLMModel(model_name="bedrock/anthropic.claude-3-sonnet-20240229-v1:0") agent = CodeAgent(tools=[], model=model) agent.run("Explain the concept of quantum computing")
# !pip install smolagents[mlx-lm] from smolagents import CodeAgent, MLXModel mlx_model = MLXModel("mlx-community/Qwen2.5-Coder-32B-Instruct-4bit") agent = CodeAgent(model=mlx_model, tools=[], add_base_tools=True) agent.run("Could you give me the 118th number in the Fibonacci sequence?")

๊ณ ๊ธ‰ ์—์ด์ „ํŠธ ๊ตฌ์„ฑ[[advanced-agent-configuration]]

์—์ด์ „ํŠธ ์ข…๋ฃŒ ์กฐ๊ฑด ๋งž์ถค ์„ค์ •[[customizing-agent-termination-conditions]]

๊ธฐ๋ณธ์ ์œผ๋กœ ์—์ด์ „ํŠธ๋Š” final_answer ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์ตœ๋Œ€ ๋‹จ๊ณ„ ์ˆ˜์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ๊ณ„์† ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. final_answer_checks ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์—์ด์ „ํŠธ๊ฐ€ ์‹คํ–‰์„ ์ข…๋ฃŒํ•˜๋Š” ์‹œ์ ๊ณผ ๋ฐฉ๋ฒ•์„ ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค:

from smolagents import CodeAgent, InferenceClientModel # Define a custom final answer check function def is_integer(final_answer: str, agent_memory=None) -> bool: """Return True if final_answer is an integer.""" try: int(final_answer) return True except ValueError: return False # Initialize agent with custom final answer check agent = CodeAgent( tools=[], model=InferenceClientModel(), final_answer_checks=[is_integer] ) agent.run("Calculate the least common multiple of 3 and 7")

final_answer_checks ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๊ฐ๊ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋“ค์˜ ๋ชฉ๋ก์„ ๋ฐ›์Šต๋‹ˆ๋‹ค:

  • ์—์ด์ „ํŠธ์˜ final_answer ๋ฌธ์ž์—ด๊ณผ ์—์ด์ „ํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค

  • final_answer๊ฐ€ ์œ ํšจํ•œ์ง€(True) ์•„๋‹Œ์ง€(False)๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถˆ๋ฆฌ์–ธ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค

ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ False๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์—์ด์ „ํŠธ๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋กœ๊ทธ์— ๊ธฐ๋กํ•˜๊ณ  ์‹คํ–‰์„ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒ€์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋‹ค์Œ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค:

  • ์ถœ๋ ฅ ํ˜•์‹ ์š”๊ตฌ์‚ฌํ•ญ ๊ฐ•์ œ(์˜ˆ: ์ˆ˜ํ•™ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ˆซ์ž ๋‹ต๋ณ€ ๋ณด์žฅ)

  • ๋„๋ฉ”์ธ๋ณ„ ๊ฒ€์ฆ ๊ทœ์น™ ๊ตฌํ˜„

  • ์ž์ฒด ์ถœ๋ ฅ์„ ๊ฒ€์ฆํ•˜๋Š” ๋” ๊ฒฌ๊ณ ํ•œ ์—์ด์ „ํŠธ ์ƒ์„ฑ

์—์ด์ „ํŠธ ์‹คํ–‰ ๊ฒ€์‚ฌ[[inspecting-an-agent-run]]

์‹คํ–‰ ํ›„ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ ์œ ์šฉํ•œ ๋ช‡ ๊ฐ€์ง€ ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค:

  • agent.logs๋Š” ์—์ด์ „ํŠธ์˜ ์ƒ์„ธํ•œ ์‹คํ–‰ ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์—์ด์ „ํŠธ ์‹คํ–‰์˜ ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ๋ชจ๋“  ์ •๋ณด๊ฐ€ ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜์–ด agent.logs์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

  • agent.write_memory_to_messages()๋Š” ์—์ด์ „ํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ชจ๋ธ์ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ๋ชฉ๋ก์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์†Œ๋“œ๋Š” ๋กœ๊ทธ์˜ ๊ฐ ๋‹จ๊ณ„๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์ค‘์š”ํ•œ ๋‚ด์šฉ๋งŒ ๋ฉ”์‹œ์ง€๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์™€ ์ž‘์—…์„ ๊ฐ๊ฐ ๋ณ„๋„ ๋ฉ”์‹œ์ง€๋กœ ์ €์žฅํ•˜๊ณ , ๊ฐ ๋‹จ๊ณ„์˜ LLM ์ถœ๋ ฅ๊ณผ ๋„๊ตฌ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ๊ฐœ๋ณ„ ๋ฉ”์‹œ์ง€๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด์ ์ธ ํ๋ฆ„ ํŒŒ์•…์ด ํ•„์š”ํ•  ๋•Œ ๊ถŒ์žฅ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‹จ, ๋ชจ๋“  ๋กœ๊ทธ๊ฐ€ ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๊ธฐ๋ก๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋„๊ตฌ[[tools]]

๋„๊ตฌ๋Š” ์—์ด์ „ํŠธ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋…๋ฆฝ์ ์ธ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. LLM์ด ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € API๋ฅผ ๊ตฌ์„ฑํ•ด์•ผํ•˜๋ฉฐ, ๋˜ํ•œ LLM์—๊ฒŒ ํ•ด๋‹น ๋„๊ตฌ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ด์ฃผ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค :

  • ์ด๋ฆ„

  • ์„ค๋ช…

  • ์ž…๋ ฅ ํƒ€์ž…๊ณผ ์„ค๋ช…

  • ์ถœ๋ ฅ ํƒ€์ž…

์˜ˆ๋ฅผ ๋“ค์–ด PythonInterpreterTool์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ์ด๋ฆ„, ์„ค๋ช…, ์ž…๋ ฅ ์„ค๋ช…, ์ถœ๋ ฅ ํƒ€์ž…, ๊ทธ๋ฆฌ๊ณ  ์•ก์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” forward ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์—์ด์ „ํŠธ๊ฐ€ ์ดˆ๊ธฐํ™”๋  ๋•Œ ๋„๊ตฌ ์†์„ฑ์ด ์—์ด์ „ํŠธ์˜ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์— ํฌํ•จ๋˜๋Š” ๋„๊ตฌ ์„ค๋ช…์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์—์ด์ „ํŠธ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์™€ ๊ทธ ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šคํ‚ค๋งˆ ์ •๋ณด: output_schema๊ฐ€ ์ •์˜๋œ ๋„๊ตฌ(๊ตฌ์กฐํ™”๋œ ์ถœ๋ ฅ์„ ๊ฐ€์ง„ MCP ๋„๊ตฌ ๋“ฑ)์˜ ๊ฒฝ์šฐ, CodeAgent ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์— ์ž๋™์œผ๋กœ JSON ์Šคํ‚ค๋งˆ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์—์ด์ „ํŠธ๊ฐ€ ๋„๊ตฌ ์ถœ๋ ฅ์˜ ์˜ˆ์ƒ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋ฐ์ดํ„ฐ์— ์ ์ ˆํžˆ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ํˆด๋ฐ•์Šค[[default-toolbox]]

"toolkit" extra์™€ ํ•จ๊ป˜ smolagents๋ฅผ ์„ค์น˜ํ•˜๋ฉด ์—์ด์ „ํŠธ๋ฅผ ๊ฐ•ํ™”ํ•˜๋Š” ๊ธฐ๋ณธ ํˆด๋ฐ•์Šค๊ฐ€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋ฉฐ, add_base_tools=True ์ธ์ˆ˜๋กœ ์ดˆ๊ธฐํ™” ์‹œ ์—์ด์ „ํŠธ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • DuckDuckGo ์›น ๊ฒ€์ƒ‰*: DuckDuckGo ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • Python ์ฝ”๋“œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ: ๋ณด์•ˆ ํ™˜๊ฒฝ์—์„œ LLM์ด ์ƒ์„ฑํ•œ Python ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋Š” ์ฝ”๋“œ ๊ธฐ๋ฐ˜ ์—์ด์ „ํŠธ๊ฐ€ ์ด๋ฏธ ๊ธฐ๋ณธ์ ์œผ๋กœ Python ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ add_base_tools=True๋กœ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ๋งŒ ToolCallingAgent์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

  • Transcriber: ์˜ค๋””์˜ค๋ฅผ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” Whisper-Turbo ๊ธฐ๋ฐ˜์˜ ์Œ์„ฑ-ํ…์ŠคํŠธ ํŒŒ์ดํ”„๋ผ์ธ์ž…๋‹ˆ๋‹ค.

์ธ์ˆ˜์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•˜์—ฌ ๋„๊ตฌ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# !pip install smolagents[toolkit] from smolagents import WebSearchTool search_tool = WebSearchTool() print(search_tool("Who's the current president of Russia?"))

์ƒˆ๋กœ์šด ๋„๊ตฌ ์ƒ์„ฑ[[create-a-new-tool]]

Hugging Face์˜ ๊ธฐ๋ณธ ๋„๊ตฌ๊ฐ€ ๋‹ค๋ฃจ์ง€ ์•Š๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์œ„ํ•ด ์ž์‹ ๋งŒ์˜ ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Hub์—์„œ ์ฃผ์–ด์ง„ ์ž‘์—…์— ๋Œ€ํ•ด ๊ฐ€์žฅ ๋งŽ์ด ๋‹ค์šด๋กœ๋“œ๋œ ๋ชจ๋ธ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

from huggingface_hub import list_models task = "text-classification" most_downloaded_model = next(iter(list_models(filter=task, sort="downloads", direction=-1))) print(most_downloaded_model.id)

์ด ์ฝ”๋“œ๋Š” ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค๊ณ  tool ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฐ„๋‹จํžˆ ๋„๊ตฌ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ๋„๊ตฌ๋ฅผ ๋งŒ๋“œ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ์•„๋‹™๋‹ˆ๋‹ค. [Tool]์˜ ํ•˜์œ„ ํด๋ž˜์Šค๋กœ ์ง์ ‘ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์œผ๋ฉฐ, ์ด ๋ฐฉ์‹์€ ๋” ๋งŽ์€ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฆฌ์†Œ์Šค ์ง‘์•ฝ์ ์ธ ํด๋ž˜์Šค ์†์„ฑ์„ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‘ ์˜ต์…˜ ๋ชจ๋‘์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:

from smolagents import tool @tool def model_download_tool(task: str) -> str: """ This is a tool that returns the most downloaded model of a given task on the Hugging Face Hub. It returns the name of the checkpoint. Args: task: The task for which to get the download count. """ most_downloaded_model = next(iter(list_models(filter=task, sort="downloads", direction=-1))) return most_downloaded_model.id

ํ•จ์ˆ˜์—๋Š” ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

  • ๋ช…ํ™•ํ•œ ์ด๋ฆ„. ์ด๋ฆ„์€ ์—์ด์ „ํŠธ๋ฅผ ๊ตฌ๋™ํ•˜๋Š” LLM์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด ๋„๊ตฌ๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์ถฉ๋ถ„ํžˆ ์„ค๋ช…์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋Š” ์ž‘์—…์— ๋Œ€ํ•ด ๊ฐ€์žฅ ๋งŽ์ด ๋‹ค์šด๋กœ๋“œ๋œ ๋ชจ๋ธ์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ model_download_tool์ด๋ผ๊ณ  ๋ช…๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ๋ชจ๋‘์— ๋Œ€ํ•œ ํƒ€์ž… ํžŒํŠธ

  • ๊ฐ ์ธ์ˆ˜๊ฐ€ ์„ค๋ช…๋˜๋Š” 'Args:' ๋ถ€๋ถ„์„ ํฌํ•จํ•˜๋Š” ์„ค๋ช…(์ด๋ฒˆ์—๋Š” ํƒ€์ž… ํ‘œ์‹œ ์—†์ด, ํƒ€์ž… ํžŒํŠธ์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค). ๋„๊ตฌ ์ด๋ฆ„๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์ด ์„ค๋ช…์€ ์—์ด์ „ํŠธ๋ฅผ ๊ตฌ๋™ํ•˜๋Š” LLM์„ ์œ„ํ•œ ์„ค๋ช…์„œ์ด๋ฏ€๋กœ ์†Œํ™€ํžˆ ํ•˜์ง€ ๋งˆ์„ธ์š”.

์ด ๋ชจ๋“  ์š”์†Œ๋Š” ์ดˆ๊ธฐํ™” ์‹œ ์—์ด์ „ํŠธ์˜ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์— ์ž๋™์œผ๋กœ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค: ๋”ฐ๋ผ์„œ ์ตœ๋Œ€ํ•œ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค๋„๋ก ๋…ธ๋ ฅํ•˜์„ธ์š”!

[!TIP] ์ด ์ •์˜ ํ˜•์‹์€ apply_chat_template์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋„๊ตฌ ์Šคํ‚ค๋งˆ์™€ ๋™์ผํ•˜๋ฉฐ, ์œ ์ผํ•œ ์ฐจ์ด์ ์€ ์ถ”๊ฐ€๋œ tool ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์ž…๋‹ˆ๋‹ค: ๋„๊ตฌ ์‚ฌ์šฉ API์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด ์—ฌ๊ธฐ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์—์ด์ „ํŠธ๋ฅผ ์ง์ ‘ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

from smolagents import CodeAgent, InferenceClientModel agent = CodeAgent(tools=[model_download_tool], model=InferenceClientModel()) agent.run( "Can you give me the name of the model that has the most downloads in the 'text-to-video' task on the Hugging Face Hub?" )
from smolagents import Tool class ModelDownloadTool(Tool): name = "model_download_tool" description = "This is a tool that returns the most downloaded model of a given task on the Hugging Face Hub. It returns the name of the checkpoint." inputs = {"task": {"type": "string", "description": "The task for which to get the download count."}} output_type = "string" def forward(self, task: str) -> str: most_downloaded_model = next(iter(list_models(filter=task, sort="downloads", direction=-1))) return most_downloaded_model.id

ํ•˜์œ„ ํด๋ž˜์Šค์—๋Š” ๋‹ค์Œ ์†์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

  • ๋ช…ํ™•ํ•œ name (์ด๋ฆ„). ์—์ด์ „ํŠธ๋ฅผ ๊ตฌ๋™ํ•˜๋Š” LLM์ด ๋„๊ตฌ์˜ ๊ธฐ๋Šฅ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด๋ฆ„์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ์„ค๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋Š” ์ž‘์—…์— ๋Œ€ํ•ด ๊ฐ€์žฅ ๋งŽ์ด ๋‹ค์šด๋กœ๋“œ๋œ ๋ชจ๋ธ์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ model_download_tool์ด๋ผ๊ณ  ๋ช…๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • description. name๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์ด ์„ค๋ช…์€ ์—์ด์ „ํŠธ๋ฅผ ๊ตฌ๋™ํ•˜๋Š” LLM์„ ์œ„ํ•œ ์„ค๋ช…์„œ์ด๋ฏ€๋กœ ์†Œํ™€ํžˆ ํ•˜์ง€ ๋งˆ์„ธ์š”.

  • ์ž…๋ ฅ ํƒ€์ž…๊ณผ ์„ค๋ช…

  • ์ถœ๋ ฅ ํƒ€์ž… ์ด ๋ชจ๋“  ์†์„ฑ์€ ์ดˆ๊ธฐํ™” ์‹œ ์—์ด์ „ํŠธ์˜ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์— ์ž๋™์œผ๋กœ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค: ๋”ฐ๋ผ์„œ ์ตœ๋Œ€ํ•œ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค๋„๋ก ๋…ธ๋ ฅํ•˜์„ธ์š”!

๊ทธ๋Ÿฐ ๋‹ค์Œ ์—์ด์ „ํŠธ๋ฅผ ์ง์ ‘ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

from smolagents import CodeAgent, InferenceClientModel agent = CodeAgent(tools=[ModelDownloadTool()], model=InferenceClientModel()) agent.run( "Can you give me the name of the model that has the most downloads in the 'text-to-video' task on the Hugging Face Hub?" )

๋‹ค์Œ ๋กœ๊ทธ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค:

โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ New run โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ โ”‚ โ”‚ Can you give me the name of the model that has the most downloads in the 'text-to-video' โ”‚ โ”‚ task on the Hugging Face Hub? โ”‚ โ”‚ โ”‚ โ•ฐโ”€ InferenceClientModel - Qwen/Qwen2.5-Coder-32B-Instruct โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” Step 0 โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” โ•ญโ”€ Executing this code: โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ 1 model_name = model_download_tool(task="text-to-video") โ”‚ โ”‚ 2 print(model_name) โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ Execution logs: ByteDance/AnimateDiff-Lightning Out: None [Step 0: Duration 0.27 seconds| Input tokens: 2,069 | Output tokens: 60] โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” Step 1 โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” โ•ญโ”€ Executing this code: โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ 1 final_answer("ByteDance/AnimateDiff-Lightning") โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ Out - Final answer: ByteDance/AnimateDiff-Lightning [Step 1: Duration 0.10 seconds| Input tokens: 4,288 | Output tokens: 148] Out[20]: 'ByteDance/AnimateDiff-Lightning'

[!TIP] ๋„๊ตฌ์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด ์ „์šฉ ํŠœํ† ๋ฆฌ์–ผ์„ ์ฝ์–ด๋ณด์„ธ์š”.

๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ[[multi-agents]]

๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ์€ Microsoft์˜ ํ”„๋ ˆ์ž„์›Œํฌ Autogen๊ณผ ํ•จ๊ป˜ ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” ๋‹จ์ผ ์—์ด์ „ํŠธ ๋Œ€์‹  ์—ฌ๋Ÿฌ ์—์ด์ „ํŠธ๊ฐ€ ํ˜‘๋ ฅํ•˜์—ฌ ์ž‘์—…์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ๋ฒค์น˜๋งˆํฌ์—์„œ ๋” ์šฐ์ˆ˜ํ•œ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜๋Š” ์ด์œ ๋Š” ๊ฐœ๋…์ ์œผ๋กœ ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์ž‘์—…์—์„œ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๋Š” ๋ฒ”์šฉ ์‹œ์Šคํ…œ๋ณด๋‹ค๋Š” ํŠน์ • ํ•˜์œ„ ์ž‘์—…์— ํŠนํ™”๋œ ์ „๋ฌธ ๋‹จ์œ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ๊ณผ์ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ๋„๊ตฌ์™€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€์ง„ ์—์ด์ „ํŠธ๋“ค์„ ํ™œ์šฉํ•˜๋ฉด ํšจ์œจ์ ์ธ ์—ญํ•  ๋ถ„๋‹ด์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์›น ๊ฒ€์ƒ‰ ์—์ด์ „ํŠธ๊ฐ€ ์ˆ˜์ง‘ํ•œ ๋ชจ๋“  ์›นํŽ˜์ด์ง€ ๋‚ด์šฉ์„ ์ฝ”๋“œ ์ƒ์„ฑ ์—์ด์ „ํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ์—๊นŒ์ง€ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ์š”? ๊ฐ์ž์˜ ์—ญํ• ์— ๋งž๊ฒŒ ๋ถ„๋ฆฌํ•ด์„œ ์šด์˜ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

smolagents๋กœ ๊ณ„์ธต์  ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ์„ ์‰ฝ๊ฒŒ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์—์ด์ „ํŠธ์— name๊ณผ description ์†์„ฑ๋งŒ ์žˆ์œผ๋ฉด ๋˜๋ฉฐ, ์ด๋Š” ๋„๊ตฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ด€๋ฆฌ์ž ์—์ด์ „ํŠธ์˜ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์— ํฌํ•จ๋˜์–ด ๊ด€๋ฆฌ๋˜๋Š” ์—์ด์ „ํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ด€๋ฆฌ์ž ์—์ด์ „ํŠธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ managed_agents ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ด ๊ด€๋ฆฌ๋˜๋Š” ์—์ด์ „ํŠธ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋„ค์ดํ‹ฐ๋ธŒ WebSearchTool์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์›น ๊ฒ€์ƒ‰ ์—์ด์ „ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—์ด์ „ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค:

from smolagents import CodeAgent, InferenceClientModel, WebSearchTool model = InferenceClientModel() web_agent = CodeAgent( tools=[WebSearchTool()], model=model, name="web_search_agent", description="Runs web searches for you. Give it your query as an argument." ) manager_agent = CodeAgent( tools=[], model=model, managed_agents=[web_agent] ) manager_agent.run("Who is the CEO of Hugging Face?")

[!TIP] ํšจ์œจ์ ์ธ ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ ๊ตฌํ˜„์˜ ์‹ฌํ™” ์˜ˆ์ œ๋ฅผ ๋ณด๋ ค๋ฉด ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ์„ GAIA ๋ฆฌ๋”๋ณด๋“œ ์ƒ์œ„๊ถŒ์œผ๋กœ ๋Œ์–ด์˜ฌ๋ฆฐ ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•˜์„ธ์š”.

์—์ด์ „ํŠธ์™€ ๋Œ€ํ™”ํ•˜๊ณ  ๋ฉ‹์ง„ Gradio ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๊ทธ ์‚ฌ๊ณ  ๊ณผ์ •์„ ์‹œ๊ฐํ™”ํ•˜๊ธฐ[[talk-with-your-agent-and-visualize-its-thoughts-in-a-cool-gradio-interface]]

GradioUI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—์ด์ „ํŠธ์— ๋Œ€ํ™”ํ˜•์œผ๋กœ ์ž‘์—…์„ ์ œ์ถœํ•˜๊ณ  ๊ทธ ์‚ฌ๊ณ ์™€ ์‹คํ–‰ ๊ณผ์ •์„ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค:

from smolagents import ( load_tool, CodeAgent, InferenceClientModel, GradioUI ) # Import tool from Hub image_generation_tool = load_tool("m-ric/text-to-image", trust_remote_code=True) model = InferenceClientModel(model_id=model_id) # Initialize the agent with the image generation tool agent = CodeAgent(tools=[image_generation_tool], model=model) GradioUI(agent).launch()

๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ƒˆ๋กœ์šด ์š”์ฒญ์„ ์ž…๋ ฅํ•˜๋ฉด ์—์ด์ „ํŠธ๋Š” agent.run(user_request, reset=False)๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. reset=False ํ”Œ๋ž˜๊ทธ๋Š” ์ด ์ƒˆ๋กœ์šด ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์—์ด์ „ํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ”Œ๋Ÿฌ์‹œ๋˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋Œ€ํ™”๊ฐ€ ๊ณ„์†๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์—์ด์ „ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋„ ์ด reset=False ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€ํ™”๋ฅผ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Gradio UI์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ์—์ด์ „ํŠธ๋ฅผ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ ค๋ฉด agent.interrupt() ๋ฉ”์†Œ๋“œ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๋ฒ„ํŠผ์œผ๋กœ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ˜„์žฌ ๋‹จ๊ณ„๊ฐ€ ๋๋‚  ๋•Œ ์—์ด์ „ํŠธ๊ฐ€ ์ค‘์ง€๋˜๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„[[next-steps]]

๋งˆ์ง€๋ง‰์œผ๋กœ ์—์ด์ „ํŠธ๋ฅผ ํ•„์š”์— ๋งž๊ฒŒ ๊ตฌ์„ฑํ–ˆ๋‹ค๋ฉด Hub์— ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

agent.push_to_hub("m-ric/my_agent")

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๋„๊ตฌ์˜ ์ฝ”๋“œ๋ฅผ ์‹ ๋ขฐํ•œ๋‹ค๋ฉด Hub์— ์—…๋กœ๋“œ๋œ ์—์ด์ „ํŠธ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋ ค๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์„ธ์š”:

agent.from_hub("m-ric/my_agent", trust_remote_code=True)