Buckets:
| <meta charset="utf-8" /><meta name="hf:doc:metadata" content="{"title":"도구(Tool)란?","local":"what-are-tools","sections":[{"title":"AI 도구란?","local":"what-are-ai-tools","sections":[],"depth":2},{"title":"도구는 어떻게 작동하는가?","local":"how-do-tools-work","sections":[],"depth":2},{"title":"LLM에게 도구를 제공하는 방법","local":"how-do-we-give-tools-to-an-llm","sections":[{"title":"자동 포맷팅된 도구 섹션","local":"auto-formatting-tool-sections","sections":[],"depth":3},{"title":"범용적인 도구(Generic Tool) 구현","local":"generic-tool-implementation","sections":[],"depth":3}],"depth":2}],"depth":1}"> | |
| <link href="/docs/agents-course/pr_545/ko/_app/immutable/assets/0.e3b0c442.css" rel="modulepreload"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/ko/_app/immutable/entry/start.6bd6007b.js"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/ko/_app/immutable/chunks/scheduler.f6b352c8.js"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/ko/_app/immutable/chunks/singletons.d509bc8a.js"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/ko/_app/immutable/chunks/index.26cf6c5a.js"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/ko/_app/immutable/chunks/paths.ee75497a.js"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/ko/_app/immutable/entry/app.5df77bcf.js"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/ko/_app/immutable/chunks/index.7f38e934.js"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/ko/_app/immutable/nodes/0.e7b8cf8b.js"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/ko/_app/immutable/chunks/each.e59479a4.js"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/ko/_app/immutable/nodes/17.fbb7ca90.js"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/ko/_app/immutable/chunks/CodeBlock.3ee8293b.js"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/ko/_app/immutable/chunks/getInferenceSnippets.1ddaa658.js"><!-- HEAD_svelte-u9bgzb_START --><meta name="hf:doc:metadata" content="{"title":"도구(Tool)란?","local":"what-are-tools","sections":[{"title":"AI 도구란?","local":"what-are-ai-tools","sections":[],"depth":2},{"title":"도구는 어떻게 작동하는가?","local":"how-do-tools-work","sections":[],"depth":2},{"title":"LLM에게 도구를 제공하는 방법","local":"how-do-we-give-tools-to-an-llm","sections":[{"title":"자동 포맷팅된 도구 섹션","local":"auto-formatting-tool-sections","sections":[],"depth":3},{"title":"범용적인 도구(Generic Tool) 구현","local":"generic-tool-implementation","sections":[],"depth":3}],"depth":2}],"depth":1}"><!-- HEAD_svelte-u9bgzb_END --> <p></p> <h1 class="relative group"><a id="what-are-tools" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#what-are-tools"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>도구(Tool)란?</span></h1> <img src="https://huggingface.co/datasets/agents-course/course-images/resolve/main/en/unit1/whiteboard-check-2.jpg" alt="Unit 1 planning"> <p data-svelte-h="svelte-2lj48b">AI 에이전트(AI Agents)의 핵심 요소 중 하나는 <strong>행동(Actions)</strong>을 수행할 수 있는 능력입니다. 이러한 행동은 <strong>도구(Tools)</strong>를 사용하여 이루어집니다.</p> <p data-svelte-h="svelte-1erzl60">이번 섹션에서는 도구란 무엇이고, 어떻게 효과적으로 설계하는지, 시스템 메시지를 통해 에이전트에 통합하는 방법을 학습합니다.</p> <p data-svelte-h="svelte-nhsnjo">By giving your Agent the right Tools—and clearly describing how those Tools work—you can dramatically increase what your AI can accomplish. Let’s dive in! | |
| 에이전트에게 적절한 도구를 제공하고, 해당 도구의 동작 방식을 명확히 설명하면, AI의 수행 능력을 극적으로 향상시킬 수 있습니다. 함께 살펴보겠습니다!</p> <h2 class="relative group"><a id="what-are-ai-tools" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#what-are-ai-tools"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>AI 도구란?</span></h2> <p data-svelte-h="svelte-b0cx07"><strong>도구</strong>란 LLM에 제공하는 함수라고 할 수 있습니다. 이 함수는 <strong>명확한 목적을</strong> 수행합니다.</p> <p data-svelte-h="svelte-1hskflb">다음은 AI 에이전트에서 일반적으로 사용되는 도구의 예시입니다:</p> <table data-svelte-h="svelte-f59njy"><thead><tr><th>도구</th> <th>설명</th></tr></thead> <tbody><tr><td>웹 검색 (Web Search)</td> <td>인터넷에서 최신 정보를 검색하여 가져옵니다.</td></tr> <tr><td>이미지 생성(Image generation)</td> <td>주어진 설명을 기반으로 이미지를 생성합니다.</td></tr> <tr><td>정보 검색 (Retrieval)</td> <td>외부 데이터 소스에서 정보를 검색하여 제공합니다.</td></tr> <tr><td>API 인터페이스</td> <td>외부 API (GitHub, YouTube, Spotify 등)와 상호작용합니다.</td></tr></tbody></table> <p data-svelte-h="svelte-q0xfd8">이러한 예시는 일부일 뿐이며, 사실상 어떠한 용도를 위한 도구든지 생성할 수 있습니다!</p> <p data-svelte-h="svelte-1s4gqea">좋은 도구는 <strong>LLM의 능력을 보완하는</strong> 역할을 수행합니다.</p> <p data-svelte-h="svelte-q1ut6r">예를 들어, 계산이 필요한 경우, <strong>계산기 도구</strong>를 제공하면 모델 자체의 계산 능력보다 훨씬 정확한 결과를 얻을 수 있습니다.</p> <p data-svelte-h="svelte-1mov6i7">또한, <strong>LLM은 학습 데이터에 기반해 프롬프트의 다음 단어를 예측</strong>하므로, 사실상 훈련 이전 정보만 알고 있는 상태입니다. 따라서, 에이전트가 최신 데이터를 필요로하는 경우 적절한 도구를 제공해야 합니다.</p> <p data-svelte-h="svelte-gd48l2">예를 들어, 검색 도구 없이 LLM에 직접적으로 오늘의 날씨에 대해 묻는다면, LLM은 임의로 날씨 정보를 생성(환각, hallucination)할 가능성이 높습니다.</p> <img src="https://huggingface.co/datasets/agents-course/course-images/resolve/main/en/unit1/weather.jpg" alt="Weather"> <ul data-svelte-h="svelte-1iw0pe0"><li><p>도구는 다음을 포함해야 합니다:</p> <ul><li>함수가 <strong>수행하는 기능에 대한 설명</strong></li> <li><em>호출 가능한 함수(Callable, 실행 가능한 동작)</em></li> <li><em>인자(Arguments)</em> 명시</li> <li>(선택 사항) 출력 데이터(Outputs) 명시</li></ul></li></ul> <h2 class="relative group"><a id="how-do-tools-work" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#how-do-tools-work"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>도구는 어떻게 작동하는가?</span></h2> <p data-svelte-h="svelte-qvxnn6">LLM은 본질적으로 텍스트 입력을 받아 텍스트 출력을 생성할 수 있을 뿐, 스스로 도구를 호출할 수는 없습니다.<br> | |
| 따라서 <em>에이전트(Agent)에 도구를 제공한다는 것</em>은 LLM에게 <strong>도구의 존재를 가르치고, 필요할 때 해당 도구를 호출하는 텍스트를 생성</strong>하도록 유도하는 것을 의미합니다. | |
| 예를 들어, 특정 위치의 날씨를 조회할 수 있는 도구를 제공한 후, LLM에게 파리의 날씨를 묻는다면, LLM은 해당 질문이 “날씨” 도구를 사용할 적절한 상황임을 인식합니다. 그러면 LLM은 해당 도구를 호출하도록 코드 형태의 <em>텍스트</em>를 생성합니다.</p> <p data-svelte-h="svelte-12iwnao"><strong>에이전트(Agent)</strong>는 LLM의 출력을 파싱해 도구 호출이 필요한지를 파악하고, LLM을 대신하여 해당 도구를 실행하는 역할을 담당합니다. | |
| 이후 도구에서 반환된 결과를 다시 LLM에 전달하면, LLM은 이를 바탕으로 사용자에게 제공할 최종 응답을 생성합니다.</p> <p data-svelte-h="svelte-i133bk">도구 호출의 출력은 대화 중 하나의 메시지로 간주됩니다. 일반적으로 이러한 도구 호출 과정은 사용자에게 직접 노출되지 않습니다: | |
| 에이전트는 대화를 조회한 후, 도구를 실행하고, 결과(출력)를 얻고, 이 결과를 새로운 대화 메시지로 추가한 뒤, 업데이트된 대화를 다시 LLM에게 전달합니다. | |
| 사용자의 관점에서는 마치 LLM이 직접 도구를 사용한 것처럼 보이지만, 실제로는 <strong>에이전트(Agent)</strong>가 이를 수행한 것입니다.</p> <p data-svelte-h="svelte-4vpkzc">이 과정에 대한 자세한 내용은 이후 세션에서 더 깊이 다룰 예정입니다.</p> <h2 class="relative group"><a id="how-do-we-give-tools-to-an-llm" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#how-do-we-give-tools-to-an-llm"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>LLM에게 도구를 제공하는 방법</span></h2> <p data-svelte-h="svelte-1e8132k">전체 과정은 복잡할 수 있지만, 기본적으로 <strong>시스템 프롬프트(system prompt)</strong>를 사용하여 LLM에게 사용 가능한 도구들의 설명을 텍스트 형태로 제공하면 됩니다:</p> <img src="https://huggingface.co/datasets/agents-course/course-images/resolve/main/en/unit1/Agent_system_prompt.png" alt="System prompt for tools"> <p data-svelte-h="svelte-1nf3f0g">도구를 효과적으로 활용하려면 이 두 가지를 명확하게 LLM에게 전달해야 합니다:</p> <ol data-svelte-h="svelte-1taixl7"><li><strong>이 도구가 수행하는 기능</strong></li> <li><strong>도구에게 제공해야하는 입력값의 형식</strong></li></ol> <p data-svelte-h="svelte-a0w24d">이러한 이유로, 도구에 대한 설명은 프로그래밍 언어나 JSON과 같이 표현력이 뛰어나고 구조적인 형식으로 제공하는 경우가 많습니다. | |
| <em>반드시</em> 이런 형식을 사용할 필요는 없지만, 표현력이 뛰어나고 일관된 방식이면 어떤 형식이라도 사용할 수 있습니다.</p> <p data-svelte-h="svelte-faj8xi">이론적으로 들릴 수도 있으니, 구체적인 예시를 통해 이해해 보겠습니다.</p> <p data-svelte-h="svelte-223plm">두 개의 정수를 곱하는 간단한 <strong>계산기 도구</strong>를 구현해 봅시다. 이를 Python 코드로 작성하면 다음과 같습니다.</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-keyword">def</span> <span class="hljs-title function_">calculator</span>(<span class="hljs-params">a: <span class="hljs-built_in">int</span>, b: <span class="hljs-built_in">int</span></span>) -> <span class="hljs-built_in">int</span>: | |
| <span class="hljs-string">"""두 정수를 곱하세요"""</span> | |
| <span class="hljs-keyword">return</span> a * b<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-16o9jiy">이 도구의 이름은 <code>calculator</code>(계산기)이고, <strong>두 개의 정수를 곱하는</strong> 기능을 수행합니다. 그리고 다음과 같은 입력값을 필요로 합니다 :</p> <ul data-svelte-h="svelte-wy9x9l"><li><strong><code>a</code></strong> (<em>int</em>): 정수</li> <li><strong><code>b</code></strong> (<em>int</em>): 정수</li></ul> <p data-svelte-h="svelte-1ne24fu">이 도구의 출력값은 정수이며, 이렇게 표현할 수 있습니다.</p> <ul data-svelte-h="svelte-y08eiw"><li>(<em>int</em>): <code>a</code> 와 <code>b</code>의 곱</li></ul> <p data-svelte-h="svelte-1dm719v">위의 모든 세부 정보는 중요합니다. 따라서, LLM이 이 도구를 이해할 수 있도록 텍스트 형식으로 정리해 봅시다!</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START -->Tool Name(도구 명): calculator, Description(설명): 두 정수를 곱하세요., Arguments(인자): a: int, b: int, Outputs(출력): int<!-- HTML_TAG_END --></pre></div> <blockquote data-svelte-h="svelte-vy6e71"><p><strong>참고:</strong> 이 텍스트 설명은 <em>LLM에게 도구에 대한 정보를 전달하기 위한 것입니다</em>.</p></blockquote> <p data-svelte-h="svelte-1nj012o">이 문자열을 LLM의 입력으로 제공하면, 모델은 이를 도구로 인식하고, 어떤 입력값을 전달해야 하며 어떤 출력을 얻을 지 알수 있습니다.</p> <p data-svelte-h="svelte-1m2dsgp">추가적인 도구를 제공하려면, 항상 동일한 형식을 유지해야 합니다. 이 과정은 꽤나 까다롭고, 실수로 중요한 세부 정보를 빠뜨릴 수도 있습니다.</p> <p data-svelte-h="svelte-1po3r15">더 나은 방법이 있을까요?</p> <h3 class="relative group"><a id="auto-formatting-tool-sections" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#auto-formatting-tool-sections"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>자동 포맷팅된 도구 섹션</span></h3> <p data-svelte-h="svelte-1vnxojk">우리가 만든 도구는 Python으로 작성되었으며, 이미 필요한 정보를 모두 포함하고 있습니다:</p> <ul data-svelte-h="svelte-npivcx"><li>수행 작업을 설명해주는 이름: <code>calculator</code>(계산기)</li> <li>함수의 docstring 주석을 통해 제공되는 상세 설명: <code>두 정수를 곱하세요</code></li> <li>입력값 및 변수 타입: 함수는 두 개의 <code>int</code>(정수)를 요함</li> <li>출력값의 타입</li></ul> <p data-svelte-h="svelte-1xfam2p">프로그래밍 언어를 사용하는 데에는 이유가 있습니다. 표현력이 높고, 간결하며, 정확하기 때문입니다.</p> <p data-svelte-h="svelte-rs7nvw">Python 소스 코드를 LLM에게 도구의 명세서(specification) 로 제공할 수도 있지만, 도구가 실제로 어떻게 구현되었는지는 중요하지 않습니다. 중요한 것은 이름, 수행하는 작업, 필요한 입력값, 그리고 제공하는 출력값입니다.</p> <p data-svelte-h="svelte-1bothlt">우리는 Python의 내부 정보(Introspection) 기능을 활용하여 소스 코드에서 필요한 정보를 자동으로 추출하고, 도구 설명을 생성 할 것입니다. 이를 위해 도구 구현시 타입 힌트(type hints), docstring, 그리고 직관적인 함수 이름을 사용합니다. | |
| 우리는 소스 코드에서 필요한 정보를 추출하는 코드를 작성하고, 이후에는 Python의 데코레이터(decorator) 를 사용하여 <code>calculator</code> 함수가 도구임을 표시하기만 하면 됩니다 :</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-meta">@tool</span> | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">calculator</span>(<span class="hljs-params">a: <span class="hljs-built_in">int</span>, b: <span class="hljs-built_in">int</span></span>) -> <span class="hljs-built_in">int</span>: | |
| <span class="hljs-string">"""두 정수를 곱하세요"""</span> | |
| <span class="hljs-keyword">return</span> a * b | |
| <span class="hljs-built_in">print</span>(calculator.to_string())<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-14gcwo3">함수 정의 앞에 <code>@tool</code> 데코레이터를 추가해주었습니다.</p> <p data-svelte-h="svelte-1kedr6">다음으로 볼 부분은, <code>to_string()</code> 함수를 사용해 소스 코드에서 다음과 같은 텍스트를 자동으로 가져옵니다 :</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START -->Tool Name(도구명): calculator, Description(설명): Multiply two integers.(두 정수를 곱하세요), Arguments(인자): a: int, b: int, Outputs(출력): int<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-1s5vsgd">보면 아시겠지만, 이전에 저희가 수동으로 작성한 것과 동일합니다!</p> <h3 class="relative group"><a id="generic-tool-implementation" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#generic-tool-implementation"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>범용적인 도구(Generic Tool) 구현</span></h3> <p data-svelte-h="svelte-1rw428h">우리는 여러 도구를 필요할 때마다 재사용할 수 있도록 범용적인 <code>Tool</code> 클래스를 생성할 것입니다.</p> <blockquote data-svelte-h="svelte-u3dndf"><p><strong>참고:</strong> 이 예제는 가상이지만 실제 라이브러리에서 사용되는 방식과 유사합니다.</p></blockquote> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-keyword">class</span> <span class="hljs-title class_">Tool</span>: | |
| <span class="hljs-string">""" | |
| 재사용 가능한 코드 조각(도구)을 나타내는 클래스입니다. | |
| Attributes(속성): | |
| name (str): 도구의 이름 | |
| description (str): 도구가 수행하는 작업에 대한 설명 | |
| func (callable): 도구가 호출하는 함수 | |
| arguments (list): 함수의 입력값 리스트 | |
| outputs (str 또는 list): 함수의 출력값 | |
| """</span> | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, | |
| name: <span class="hljs-built_in">str</span>, | |
| description: <span class="hljs-built_in">str</span>, | |
| func: <span class="hljs-built_in">callable</span>, | |
| arguments: <span class="hljs-built_in">list</span>, | |
| outputs: <span class="hljs-built_in">str</span></span>): | |
| self.name = name | |
| self.description = description | |
| self.func = func | |
| self.arguments = arguments | |
| self.outputs = outputs | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">to_string</span>(<span class="hljs-params">self</span>) -> <span class="hljs-built_in">str</span>: | |
| <span class="hljs-string">""" | |
| 도구의 속성을 문자열로 변환하여 반환합니다. | |
| name, description, arguments, outputs을 포함합니다. | |
| """</span> | |
| args_str = <span class="hljs-string">", "</span>.join([ | |
| <span class="hljs-string">f"<span class="hljs-subst">{arg_name}</span>: <span class="hljs-subst">{arg_type}</span>"</span> <span class="hljs-keyword">for</span> arg_name, arg_type <span class="hljs-keyword">in</span> self.arguments | |
| ]) | |
| <span class="hljs-keyword">return</span> ( | |
| <span class="hljs-string">f"Tool Name: <span class="hljs-subst">{self.name}</span>,"</span> | |
| <span class="hljs-string">f" Description: <span class="hljs-subst">{self.description}</span>,"</span> | |
| <span class="hljs-string">f" Arguments: <span class="hljs-subst">{args_str}</span>,"</span> | |
| <span class="hljs-string">f" Outputs: <span class="hljs-subst">{self.outputs}</span>"</span> | |
| ) | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">__call__</span>(<span class="hljs-params">self, *args, **kwargs</span>): | |
| <span class="hljs-string">""" | |
| 저장된 함수(callable)를 주어진 입력값으로 실행합니다. | |
| """</span> | |
| <span class="hljs-keyword">return</span> self.func(*args, **kwargs)<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-gkrogk">위 코드가 복잡해 보일 수 있지만, 하나씩 살펴보도록 하겠습니다. 이 <strong><code>Tool</code></strong>클래스는 다음을 포함합니다:</p> <ul data-svelte-h="svelte-633ak8"><li><strong><code>name</code></strong> (<em>str</em>): 도구의 이름</li> <li><strong><code>description</code></strong> (<em>str</em>): 도구의 기능 설명</li> <li><strong><code>function</code></strong> (<em>callable</em>): 도구가 실행하는 함수</li> <li><strong><code>arguments</code></strong> (<em>list</em>): 함수가 필요로 하는 입력값들</li> <li><strong><code>outputs</code></strong> (<em>str</em> or <em>list</em>): 함수가 반환하는 출력값</li> <li><strong><code>__call__()</code></strong>: 도구 객체가 호출될 때 함수 실행</li> <li><strong><code>to_string()</code></strong>: 구의 속성을 LLM이 이해할 수 있도록 문자열로 변환</li></ul> <p data-svelte-h="svelte-yldhqa">이제 위 클래스를 활용하여 도구를 만들 수 있습니다:</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START -->calculator_tool = Tool( | |
| <span class="hljs-string">"calculator"</span>, <span class="hljs-comment"># 도구 이름</span> | |
| <span class="hljs-string">"Multiply two integers."</span>, <span class="hljs-comment"># 설명</span> | |
| calculator, <span class="hljs-comment"># 실행할 함수</span> | |
| [(<span class="hljs-string">"a"</span>, <span class="hljs-string">"int"</span>), (<span class="hljs-string">"b"</span>, <span class="hljs-string">"int"</span>)], <span class="hljs-comment"># 입력값 (이름과 타입)</span> | |
| <span class="hljs-string">"int"</span>, <span class="hljs-comment"># 출력값 타입</span> | |
| )<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-87agig">그러나 Python의 <code>inspect</code> 모듈을 사용하면 이 정보를 자동으로 추출할 수 있습니다.바로 이 역할을 하는 것이 @tool 데코레이터입니다.</p> <blockquote data-svelte-h="svelte-1wp8ghv"><p>데코레이터 구현 부분을 확인하고 싶다면 클릭하세요.</p></blockquote> <details><summary data-svelte-h="svelte-jpdddo">데코레이터 코드 보기</summary> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-keyword">def</span> <span class="hljs-title function_">tool</span>(<span class="hljs-params">func</span>): | |
| <span class="hljs-string">""" | |
| 주어진 함수를 기반으로 Tool 인스턴스를 생성하는 데코레이터입니다. | |
| """</span> | |
| <span class="hljs-comment"># 함수의 서명(signature) 가져오기</span> | |
| signature = inspect.signature(func) | |
| <span class="hljs-comment"># 입력 인자 추출 (param_name, param_annotation)</span> | |
| arguments = [] | |
| <span class="hljs-keyword">for</span> param <span class="hljs-keyword">in</span> signature.parameters.values(): | |
| annotation_name = ( | |
| param.annotation.__name__ | |
| <span class="hljs-keyword">if</span> <span class="hljs-built_in">hasattr</span>(param.annotation, <span class="hljs-string">'__name__'</span>) | |
| <span class="hljs-keyword">else</span> <span class="hljs-built_in">str</span>(param.annotation) | |
| ) | |
| arguments.append((param.name, annotation_name)) | |
| <span class="hljs-comment"># 리턴값 타입 결정</span> | |
| return_annotation = signature.return_annotation | |
| <span class="hljs-keyword">if</span> return_annotation <span class="hljs-keyword">is</span> inspect._empty: | |
| outputs = <span class="hljs-string">"No return annotation"</span> | |
| <span class="hljs-keyword">else</span>: | |
| outputs = ( | |
| return_annotation.__name__ | |
| <span class="hljs-keyword">if</span> <span class="hljs-built_in">hasattr</span>(return_annotation, <span class="hljs-string">'__name__'</span>) | |
| <span class="hljs-keyword">else</span> <span class="hljs-built_in">str</span>(return_annotation) | |
| ) | |
| <span class="hljs-comment"># 함수의 docstring을 설명으로 사용</span> | |
| description = func.__doc__ <span class="hljs-keyword">or</span> <span class="hljs-string">"No description provided."</span> | |
| <span class="hljs-comment"># 함수명을 도구 이름으로 사용</span> | |
| name = func.__name__ | |
| <span class="hljs-comment"># Tool 인스턴스를 리턴</span> | |
| <span class="hljs-keyword">return</span> Tool( | |
| name=name, | |
| description=description, | |
| func=func, | |
| arguments=arguments, | |
| outputs=outputs | |
| )<!-- HTML_TAG_END --></pre></div></details> <p data-svelte-h="svelte-nbayho">이제 @tool 데코레이터를 활용하면, 다음과 같이 도구를 간단하게 정의할 수 있습니다.</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-meta">@tool</span> | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">calculator</span>(<span class="hljs-params">a: <span class="hljs-built_in">int</span>, b: <span class="hljs-built_in">int</span></span>) -> <span class="hljs-built_in">int</span>: | |
| <span class="hljs-string">"""두 정수를 곱하세요"""</span> | |
| <span class="hljs-keyword">return</span> a * b | |
| <span class="hljs-built_in">print</span>(calculator.to_string())<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-zc2oog">그리고 <code>Tool</code> 클래스의 <code>to_string</code> 메서드를 사용하면 LLM이 사용할 수 있는 적절한 도구 설명을 자동으로 생성해줍니다:</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START -->Tool Name: calculator, Description: Multiply two integers., Arguments: a: int, b: int, Outputs: int<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-qzwccu">이 도구 설명은 시스템 프롬프트에 삽입됩니다. 이 섹션의 처음 예제를 다시 살펴보면, <code>tools_description</code>을 대체한 후 시스템 프롬프트는 다음과 같이 보이게 됩니다:</p> <img src="https://huggingface.co/datasets/agents-course/course-images/resolve/main/en/unit1/Agent_system_prompt_tools.png" alt="System prompt for tools"> <p data-svelte-h="svelte-1292qbx"><a href="actions">Actions</a> 섹션에서 우리가 방금 만든 도구를 에이전트가 어떻게 <strong>호출</strong>하는지에 대해 살펴볼 것 입니다.</p> <hr> <p data-svelte-h="svelte-w3dczj">도구는 AI에이전트의 기능을 확장하는데 핵심적인 역할을 합니다.</p> <p data-svelte-h="svelte-106vzz3">요약:</p> <ul data-svelte-h="svelte-12oj0ks"><li><p><em>도구란?</em>: LLM이 계산, 외부 데이터 조회 등 추가적인 기능을 할 수 있도록 하는 함수</p></li> <li><p><em>도구 정의하는 법</em>: 명확한 텍스트 설명, 입력값, 출력값, 호출 가능한 함수 제공</p></li> <li><p><em>도구가 중요한 이유</em>: 에이전트가 사전에 학습된 정적 모델의 한계를 뛰어넘어, 실시간 작업 및 특수 기능을 수행할 수 있도록 함</p></li></ul> <p data-svelte-h="svelte-fuhhcx">이제 <a href="agent-steps-and-structure">에이전트의 작동 방식(Workflow)</a>에 대해 알아볼 차례입니다!이 과정에서는 에이전트가 관찰하고, 사고하며, 행동하는 방법을 살펴보게 됩니다. | |
| 이 과정을 마치게 되면, 이제까지 배운 모든 내용을 통합하여 나만의 AI 에이전트를 만들 준비가 될 것입니다!</p> <p data-svelte-h="svelte-gi6kft">하지만 그 전에, 짧은 퀴즈를 풀어볼까요? 😊</p> <a class="!text-gray-400 !no-underline text-sm flex items-center not-prose mt-4" href="https://github.com/huggingface/agents-course/blob/main/units/ko/unit1/tools.mdx" target="_blank"><span data-svelte-h="svelte-1kd6by1"><</span> <span data-svelte-h="svelte-x0xyl0">></span> <span data-svelte-h="svelte-1dajgef"><span class="underline ml-1.5">Update</span> on GitHub</span></a> <p></p> | |
| <script> | |
| { | |
| __sveltekit_wsuob5 = { | |
| assets: "/docs/agents-course/pr_545/ko", | |
| base: "/docs/agents-course/pr_545/ko", | |
| env: {} | |
| }; | |
| const element = document.currentScript.parentElement; | |
| const data = [null,null]; | |
| Promise.all([ | |
| import("/docs/agents-course/pr_545/ko/_app/immutable/entry/start.6bd6007b.js"), | |
| import("/docs/agents-course/pr_545/ko/_app/immutable/entry/app.5df77bcf.js") | |
| ]).then(([kit, app]) => { | |
| kit.start(app, element, { | |
| node_ids: [0, 17], | |
| data, | |
| form: null, | |
| error: null | |
| }); | |
| }); | |
| } | |
| </script> | |
Xet Storage Details
- Size:
- 44.4 kB
- Xet hash:
- 264401c77c0509b0ff031f862b5d5d9d1f40d56363fdc4ea464befe7d88acf10
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.