Buckets:
| import{s as dM,a as me,n as hM,o as _M}from"../chunks/scheduler.cc52f4b9.js";import{S as RM,i as vM,e as J,s,c as i,h as FM,a as n,d as e,b as U,f as Ae,g as y,j as T,k as w,l as Qe,m as M,n as a,t as p,o as C,p as j}from"../chunks/index.1e918bfb.js";import{C as SM}from"../chunks/CopyLLMTxtMenu.78755bbc.js";import{C as u}from"../chunks/CodeBlock.c7d979f8.js";import{H as $l,E as kM}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.6664ed43.js";function xM(re){let I,Hl,Dl,ql,m,Wl,V,Xl,A,ce,zl,Q,fe="AI 에이전트(AI Agents)의 핵심 요소 중 하나는 <strong>행동(Actions)</strong>을 수행할 수 있는 능력입니다. 이러한 행동은 <strong>도구(Tools)</strong>를 사용하여 이루어집니다.",Yl,r,be="이번 섹션에서는 도구란 무엇이고, 어떻게 효과적으로 설계하는지, 시스템 메시지를 통해 에이전트에 통합하는 방법을 학습합니다.",Zl,c,Be="에이전트에게 적절한 도구를 제공하고, 해당 도구의 동작 방식을 명확히 설명하면, AI의 수행 능력을 극적으로 향상시킬 수 있습니다. 함께 살펴보겠습니다!",Pl,f,Kl,b,ge="<strong>도구</strong>란 LLM에 제공하는 함수라고 할 수 있습니다. 이 함수는 <strong>명확한 목적을</strong> 수행합니다.",lt,B,Ee="다음은 AI 에이전트에서 일반적으로 사용되는 도구의 예시입니다:",tt,g,de="<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>",et,E,he="이러한 예시는 일부일 뿐이며, 사실상 어떠한 용도를 위한 도구든지 생성할 수 있습니다!",Mt,d,_e="좋은 도구는 <strong>LLM의 능력을 보완하는</strong> 역할을 수행합니다.",st,h,Re="예를 들어, 계산이 필요한 경우, <strong>계산기 도구</strong>를 제공하면 모델 자체의 계산 능력보다 훨씬 정확한 결과를 얻을 수 있습니다.",Ut,_,ve="또한, <strong>LLM은 학습 데이터에 기반해 프롬프트의 다음 단어를 예측</strong>하므로, 사실상 훈련 이전 정보만 알고 있는 상태입니다. 따라서, 에이전트가 최신 데이터를 필요로 하는 경우 적절한 도구를 제공해야 합니다.",Jt,R,Fe="예를 들어, 검색 도구 없이 LLM에 직접적으로 오늘의 날씨에 대해 묻는다면, LLM은 임의로 날씨 정보를 생성(환각, hallucination)할 가능성이 높습니다.",nt,v,Se,Tt,F,ke="<li><p>도구는 다음을 포함해야 합니다:</p> <ul><li>함수가 <strong>수행하는 기능에 대한 설명</strong></li> <li><em>호출 가능한 함수(Callable, 실행 가능한 동작)</em></li> <li><em>인자(Arguments)</em> 명시</li> <li>(선택 사항) 출력 데이터(Outputs) 명시</li></ul></li>",it,S,yt,k,xe=`LLM은 본질적으로 텍스트 입력을 받아 텍스트 출력을 생성할 수 있을 뿐, 스스로 도구를 호출할 수는 없습니다.<br/> | |
| 따라서 <em>에이전트(Agent)에 도구를 제공한다는 것</em>은 LLM에게 <strong>도구의 존재를 가르치고, 필요할 때 해당 도구를 호출하는 텍스트를 생성</strong>하도록 유도하는 것을 의미합니다. | |
| 예를 들어, 특정 위치의 날씨를 조회할 수 있는 도구를 제공한 후, LLM에게 파리의 날씨를 묻는다면, LLM은 해당 질문이 “날씨” 도구를 사용할 적절한 상황임을 인식합니다. 그러면 LLM은 해당 도구를 호출하도록 코드 형태의 <em>텍스트</em>를 생성합니다.`,at,x,Le=`<strong>에이전트(Agent)</strong>는 LLM의 출력을 파싱해 도구 호출이 필요한지를 파악하고, LLM을 대신하여 해당 도구를 실행하는 역할을 담당합니다. | |
| 이후 도구에서 반환된 결과를 다시 LLM에 전달하면, LLM은 이를 바탕으로 사용자에게 제공할 최종 응답을 생성합니다.`,pt,L,Oe=`도구 호출의 출력은 대화 중 하나의 메시지로 간주됩니다. 일반적으로 이러한 도구 호출 과정은 사용자에게 직접 노출되지 않습니다: | |
| 에이전트는 대화를 조회한 후, 도구를 실행하고, 결과(출력)를 얻고, 이 결과를 새로운 대화 메시지로 추가한 뒤, 업데이트된 대화를 다시 LLM에게 전달합니다. | |
| 사용자의 관점에서는 마치 LLM이 직접 도구를 사용한 것처럼 보이지만, 실제로는 <strong>에이전트(Agent)</strong>가 이를 수행한 것입니다.`,Ct,O,Ne="이 과정에 대한 자세한 내용은 이후 세션에서 더 깊이 다룰 예정입니다.",jt,N,wt,$,$e="전체 과정은 복잡할 수 있지만, 기본적으로 <strong>시스템 프롬프트(system prompt)</strong>를 사용하여 LLM에게 사용 가능한 도구들의 설명을 텍스트 형태로 제공하면 됩니다:",It,D,De,ut,G,Ge="도구를 효과적으로 활용하려면 이 두 가지를 명확하게 LLM에게 전달해야 합니다:",ot,H,He="<li><strong>이 도구가 수행하는 기능</strong></li> <li><strong>도구에게 제공해야하는 입력값의 형식</strong></li>",mt,q,qe=`이러한 이유로, 도구에 대한 설명은 프로그래밍 언어나 JSON과 같이 표현력이 뛰어나고 구조적인 형식으로 제공하는 경우가 많습니다. | |
| <em>반드시</em> 이런 형식을 사용할 필요는 없지만, 표현력이 뛰어나고 일관된 방식이면 어떤 형식이라도 사용할 수 있습니다.`,Vt,W,We="이론적으로 들릴 수도 있으니, 구체적인 예시를 통해 이해해 보겠습니다.",At,X,Xe="두 개의 정수를 곱하는 간단한 <strong>계산기 도구</strong>를 구현해 봅시다. 이를 Python 코드로 작성하면 다음과 같습니다.",Qt,z,rt,Y,ze="이 도구의 이름은 <code>calculator</code>(계산기)이고, <strong>두 개의 정수를 곱하는</strong> 기능을 수행합니다. 그리고 다음과 같은 입력값을 필요로 합니다 :",ct,Z,Ye="<li><strong><code>a</code></strong> (<em>int</em>): 정수</li> <li><strong><code>b</code></strong> (<em>int</em>): 정수</li>",ft,P,Ze="이 도구의 출력값은 정수이며, 이렇게 표현할 수 있습니다.",bt,K,Pe="<li>(<em>int</em>): <code>a</code> 와 <code>b</code>의 곱</li>",Bt,ll,Ke="위의 모든 세부 정보는 중요합니다. 따라서, LLM이 이 도구를 이해할 수 있도록 텍스트 형식으로 정리해 봅시다!",gt,tl,Et,el,lM="<p><strong>참고:</strong> 이 텍스트 설명은 <em>LLM에게 도구에 대한 정보를 전달하기 위한 것입니다</em>.</p>",dt,Ml,tM="이 문자열을 LLM의 입력으로 제공하면, 모델은 이를 도구로 인식하고, 어떤 입력값을 전달해야 하며 어떤 출력을 얻을 지 알수 있습니다.",ht,sl,eM="추가적인 도구를 제공하려면, 항상 동일한 형식을 유지해야 합니다. 이 과정은 꽤나 까다롭고, 실수로 중요한 세부 정보를 빠뜨릴 수도 있습니다.",_t,Ul,MM="더 나은 방법이 있을까요?",Rt,Jl,vt,nl,sM="우리가 만든 도구는 Python으로 작성되었으며, 이미 필요한 정보를 모두 포함하고 있습니다:",Ft,Tl,UM="<li>수행 작업을 설명해주는 이름: <code>calculator</code>(계산기)</li> <li>함수의 docstring 주석을 통해 제공되는 상세 설명: <code>두 정수를 곱하세요</code></li> <li>입력값 및 변수 타입: 함수는 두 개의 <code>int</code>(정수)를 요함</li> <li>출력값의 타입</li>",St,il,JM="프로그래밍 언어를 사용하는 데에는 이유가 있습니다. 표현력이 높고, 간결하며, 정확하기 때문입니다.",kt,yl,nM="Python 소스 코드를 LLM에게 도구의 명세서(specification) 로 제공할 수도 있지만, 도구가 실제로 어떻게 구현되었는지는 중요하지 않습니다. 중요한 것은 이름, 수행하는 작업, 필요한 입력값, 그리고 제공하는 출력값입니다.",xt,al,TM=`우리는 Python의 내부 정보(Introspection) 기능을 활용하여 소스 코드에서 필요한 정보를 자동으로 추출하고, 도구 설명을 생성 할 것입니다. 이를 위해 도구 구현시 타입 힌트(type hints), docstring, 그리고 직관적인 함수 이름을 사용합니다. | |
| 우리는 소스 코드에서 필요한 정보를 추출하는 코드를 작성하고, 이후에는 Python의 데코레이터(decorator) 를 사용하여 <code>calculator</code> 함수가 도구임을 표시하기만 하면 됩니다 :`,Lt,pl,Ot,Cl,iM="함수 정의 앞에 <code>@tool</code> 데코레이터를 추가해주었습니다.",Nt,jl,yM="다음으로 볼 부분은, <code>to_string()</code> 함수를 사용해 소스 코드에서 다음과 같은 텍스트를 자동으로 가져옵니다 :",$t,wl,Dt,Il,aM="보면 아시겠지만, 이전에 저희가 수동으로 작성한 것과 동일합니다!",Gt,ul,Ht,ol,pM="우리는 여러 도구를 필요할 때마다 재사용할 수 있도록 범용적인 <code>Tool</code> 클래스를 생성할 것입니다.",qt,ml,CM="<p><strong>참고:</strong> 이 예제는 가상이지만 실제 라이브러리에서 사용되는 방식과 유사합니다.</p>",Wt,Vl,Xt,Al,jM="위 코드가 복잡해 보일 수 있지만, 하나씩 살펴보도록 하겠습니다. 이 <strong><code>Tool</code></strong>클래스는 다음을 포함합니다:",zt,Ql,wM="<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>",Yt,rl,IM="이제 위 클래스를 활용하여 도구를 만들 수 있습니다:",Zt,cl,Pt,fl,uM="그러나 Python의 <code>inspect</code> 모듈을 사용하면 이 정보를 자동으로 추출할 수 있습니다. 바로 이 역할을 하는 것이 @tool 데코레이터입니다.",Kt,bl,oM="<p>데코레이터 구현 부분을 확인하고 싶다면 클릭하세요.</p>",le,o,Nl,mM="데코레이터 코드 보기",Ve,Bl,te,gl,VM="이제 @tool 데코레이터를 활용하면, 다음과 같이 도구를 간단하게 정의할 수 있습니다.",ee,El,Me,dl,AM="그리고 <code>Tool</code> 클래스의 <code>to_string</code> 메서드를 사용하면 LLM이 사용할 수 있는 적절한 도구 설명을 자동으로 생성해줍니다:",se,hl,Ue,_l,QM="이 도구 설명은 시스템 프롬프트에 삽입됩니다. 이 섹션의 처음 예제를 다시 살펴보면, <code>tools_description</code>을 대체한 후 시스템 프롬프트는 다음과 같이 보이게 됩니다:",Je,Rl,rM,ne,vl,cM='<a href="actions">Actions</a> 섹션에서 우리가 방금 만든 도구를 에이전트가 어떻게 <strong>호출</strong>하는지에 대해 살펴볼 것입니다.',Te,ie,ye,Fl,fM="도구는 AI에이전트의 기능을 확장하는데 핵심적인 역할을 합니다.",ae,Sl,bM="요약:",pe,kl,BM="<li><p><em>도구란?</em>: LLM이 계산, 외부 데이터 조회 등 추가적인 기능을 할 수 있도록 하는 함수</p></li> <li><p><em>도구 정의하는 법</em>: 명확한 텍스트 설명, 입력값, 출력값, 호출 가능한 함수 제공</p></li> <li><p><em>도구가 중요한 이유</em>: 에이전트가 사전에 학습된 정적 모델의 한계를 뛰어넘어, 실시간 작업 및 특수 기능을 수행할 수 있도록 함</p></li>",Ce,xl,gM=`이제 <a href="agent-steps-and-structure">에이전트의 작동 방식(Workflow)</a>에 대해 알아볼 차례입니다! 이 과정에서는 에이전트가 관찰하고, 사고하며, 행동하는 방법을 살펴보게 됩니다. | |
| 이 과정을 마치게 되면, 이제까지 배운 모든 내용을 통합하여 나만의 AI 에이전트를 만들 준비가 될 것입니다!`,je,Ll,EM="하지만 그 전에, 짧은 퀴즈를 풀어볼까요? 😊",we,Ol,Ie,Gl,ue;return m=new SM({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),V=new $l({props:{title:"도구(Tool)란?",local:"what-are-tools",headingTag:"h1"}}),f=new $l({props:{title:"AI 도구란?",local:"what-are-ai-tools",headingTag:"h2"}}),S=new $l({props:{title:"도구는 어떻게 작동하는가?",local:"how-do-tools-work",headingTag:"h2"}}),N=new $l({props:{title:"LLM에게 도구를 제공하는 방법",local:"how-do-we-give-tools-to-an-llm",headingTag:"h2"}}),z=new u({props:{code:"ZGVmJTIwY2FsY3VsYXRvcihhJTNBJTIwaW50JTJDJTIwYiUzQSUyMGludCklMjAtJTNFJTIwaW50JTNBJTBBJTIwJTIwJTIwJTIwJTIyJTIyJTIyJUVCJTkxJTkwJTIwJUVDJUEwJTk1JUVDJTg4JTk4JUVCJUE1JUJDJTIwJUVBJUIzJUIxJUVEJTk1JTk4JUVDJTg0JUI4JUVDJTlBJTk0JTIyJTIyJTIyJTBBJTIwJTIwJTIwJTIwcmV0dXJuJTIwYSUyMColMjBi",highlighted:`<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`,lang:"python",wrap:!1}}),tl=new u({props:{code:"VG9vbCUyME5hbWUoJUVCJThGJTg0JUVBJUI1JUFDJTIwJUVCJUFBJTg1KSUzQSUyMGNhbGN1bGF0b3IlMkMlMjBEZXNjcmlwdGlvbiglRUMlODQlQTQlRUIlQUElODUpJTNBJTIwJUVCJTkxJTkwJTIwJUVDJUEwJTk1JUVDJTg4JTk4JUVCJUE1JUJDJTIwJUVBJUIzJUIxJUVEJTk1JTk4JUVDJTg0JUI4JUVDJTlBJTk0LiUyQyUyMEFyZ3VtZW50cyglRUMlOUQlQjglRUMlOUUlOTApJTNBJTIwYSUzQSUyMGludCUyQyUyMGIlM0ElMjBpbnQlMkMlMjBPdXRwdXRzKCVFQyVCNiU5QyVFQiVBMCVBNSklM0ElMjBpbnQ=",highlighted:"Tool Name(도구 명): calculator, Description(설명): 두 정수를 곱하세요., Arguments(인자): a: int, b: int, Outputs(출력): int",lang:"text",wrap:!1}}),Jl=new $l({props:{title:"자동 포맷팅된 도구 섹션",local:"auto-formatting-tool-sections",headingTag:"h3"}}),pl=new u({props:{code:"JTQwdG9vbCUwQWRlZiUyMGNhbGN1bGF0b3IoYSUzQSUyMGludCUyQyUyMGIlM0ElMjBpbnQpJTIwLSUzRSUyMGludCUzQSUwQSUyMCUyMCUyMCUyMCUyMiUyMiUyMiVFQiU5MSU5MCUyMCVFQyVBMCU5NSVFQyU4OCU5OCVFQiVBNSVCQyUyMCVFQSVCMyVCMSVFRCU5NSU5OCVFQyU4NCVCOCVFQyU5QSU5NCUyMiUyMiUyMiUwQSUyMCUyMCUyMCUyMHJldHVybiUyMGElMjAqJTIwYiUwQSUwQXByaW50KGNhbGN1bGF0b3IudG9fc3RyaW5nKCkp",highlighted:`<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())`,lang:"python",wrap:!1}}),wl=new u({props:{code:"VG9vbCUyME5hbWUoJUVCJThGJTg0JUVBJUI1JUFDJUVCJUFBJTg1KSUzQSUyMGNhbGN1bGF0b3IlMkMlMjBEZXNjcmlwdGlvbiglRUMlODQlQTQlRUIlQUElODUpJTNBJTIwTXVsdGlwbHklMjB0d28lMjBpbnRlZ2Vycy4oJUVCJTkxJTkwJTIwJUVDJUEwJTk1JUVDJTg4JTk4JUVCJUE1JUJDJTIwJUVBJUIzJUIxJUVEJTk1JTk4JUVDJTg0JUI4JUVDJTlBJTk0KSUyQyUyMEFyZ3VtZW50cyglRUMlOUQlQjglRUMlOUUlOTApJTNBJTIwYSUzQSUyMGludCUyQyUyMGIlM0ElMjBpbnQlMkMlMjBPdXRwdXRzKCVFQyVCNiU5QyVFQiVBMCVBNSklM0ElMjBpbnQ=",highlighted:"Tool Name(도구명): calculator, Description(설명): Multiply two integers.(두 정수를 곱하세요), Arguments(인자): a: int, b: int, Outputs(출력): int",lang:"text",wrap:!1}}),ul=new $l({props:{title:"범용적인 도구(Generic Tool) 구현",local:"generic-tool-implementation",headingTag:"h3"}}),Vl=new u({props:{code:"Y2xhc3MlMjBUb29sJTNBJTBBJTIwJTIwJTIwJTIwJTIyJTIyJTIyJTBBJTIwJTIwJTIwJTIwJUVDJTlFJUFDJUVDJTgyJUFDJUVDJTlBJUE5JTIwJUVBJUIwJTgwJUVCJThBJUE1JUVEJTk1JTlDJTIwJUVDJUJEJTk0JUVCJTkzJTlDJTIwJUVDJUExJUIwJUVBJUIwJTgxKCVFQiU4RiU4NCVFQSVCNSVBQyklRUMlOUQlODQlMjAlRUIlODIlOTglRUQlODMlODAlRUIlODIlQjQlRUIlOEElOTQlMjAlRUQlODElQjQlRUIlOUUlOTglRUMlOEElQTQlRUMlOUUlODUlRUIlOEIlODglRUIlOEIlQTQuJTBBJTIwJTIwJTIwJTIwJTBBJTIwJTIwJTIwJTIwQXR0cmlidXRlcyglRUMlODYlOEQlRUMlODQlQjEpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbmFtZSUyMChzdHIpJTNBJTIwJUVCJThGJTg0JUVBJUI1JUFDJUVDJTlEJTk4JTIwJUVDJTlEJUI0JUVCJUE2JTg0JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZGVzY3JpcHRpb24lMjAoc3RyKSUzQSUyMCVFQiU4RiU4NCVFQSVCNSVBQyVFQSVCMCU4MCUyMCVFQyU4OCU5OCVFRCU5NiU4OSVFRCU5NSU5OCVFQiU4QSU5NCUyMCVFQyU5RSU5MSVFQyU5NyU4NSVFQyU5NyU5MCUyMCVFQiU4QyU4MCVFRCU5NSU5QyUyMCVFQyU4NCVBNCVFQiVBQSU4NSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZ1bmMlMjAoY2FsbGFibGUpJTNBJTIwJUVCJThGJTg0JUVBJUI1JUFDJUVBJUIwJTgwJTIwJUVEJTk4JUI4JUVDJUI2JTlDJUVEJTk1JTk4JUVCJThBJTk0JTIwJUVEJTk1JUE4JUVDJTg4JTk4JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYXJndW1lbnRzJTIwKGxpc3QpJTNBJTIwJUVEJTk1JUE4JUVDJTg4JTk4JUVDJTlEJTk4JTIwJUVDJTlFJTg1JUVCJUEwJUE1JUVBJUIwJTkyJTIwJUVCJUE2JUFDJUVDJThBJUE0JUVEJThBJUI4JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwb3V0cHV0cyUyMChzdHIlMjAlRUIlOTglOTAlRUIlOEElOTQlMjBsaXN0KSUzQSUyMCVFRCU5NSVBOCVFQyU4OCU5OCVFQyU5RCU5OCUyMCVFQyVCNiU5QyVFQiVBMCVBNSVFQSVCMCU5MiUwQSUyMCUyMCUyMCUyMCUyMiUyMiUyMiUwQSUyMCUyMCUyMCUyMGRlZiUyMF9faW5pdF9fKHNlbGYlMkMlMjAlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBuYW1lJTNBJTIwc3RyJTJDJTIwJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZGVzY3JpcHRpb24lM0ElMjBzdHIlMkMlMjAlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmdW5jJTNBJTIwY2FsbGFibGUlMkMlMjAlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBhcmd1bWVudHMlM0ElMjBsaXN0JTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwb3V0cHV0cyUzQSUyMHN0ciklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzZWxmLm5hbWUlMjAlM0QlMjBuYW1lJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc2VsZi5kZXNjcmlwdGlvbiUyMCUzRCUyMGRlc2NyaXB0aW9uJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc2VsZi5mdW5jJTIwJTNEJTIwZnVuYyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHNlbGYuYXJndW1lbnRzJTIwJTNEJTIwYXJndW1lbnRzJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc2VsZi5vdXRwdXRzJTIwJTNEJTIwb3V0cHV0cyUwQSUwQSUyMCUyMCUyMCUyMGRlZiUyMHRvX3N0cmluZyhzZWxmKSUyMC0lM0UlMjBzdHIlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjIlMjIlMjIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlRUIlOEYlODQlRUElQjUlQUMlRUMlOUQlOTglMjAlRUMlODYlOEQlRUMlODQlQjElRUMlOUQlODQlMjAlRUIlQUMlQjglRUMlOUUlOTAlRUMlOTclQjQlRUIlQTElOUMlMjAlRUIlQjMlODAlRUQlOTklOTglRUQlOTUlOTglRUMlOTclQUMlMjAlRUIlQjAlOTglRUQlOTklOTglRUQlOTUlQTklRUIlOEIlODglRUIlOEIlQTQuJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbmFtZSUyQyUyMGRlc2NyaXB0aW9uJTJDJTIwYXJndW1lbnRzJTJDJTIwb3V0cHV0cyVFQyU5RCU4NCUyMCVFRCU4RiVBQyVFRCU5NSVBOCVFRCU5NSVBOSVFQiU4QiU4OCVFQiU4QiVBNC4lMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjIlMjIlMjIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBhcmdzX3N0ciUyMCUzRCUyMCUyMiUyQyUyMCUyMi5qb2luKCU1QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGYlMjIlN0JhcmdfbmFtZSU3RCUzQSUyMCU3QmFyZ190eXBlJTdEJTIyJTIwZm9yJTIwYXJnX25hbWUlMkMlMjBhcmdfdHlwZSUyMGluJTIwc2VsZi5hcmd1bWVudHMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUQpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmV0dXJuJTIwKCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGYlMjJUb29sJTIwTmFtZSUzQSUyMCU3QnNlbGYubmFtZSU3RCUyQyUyMiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGYlMjIlMjBEZXNjcmlwdGlvbiUzQSUyMCU3QnNlbGYuZGVzY3JpcHRpb24lN0QlMkMlMjIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmJTIyJTIwQXJndW1lbnRzJTNBJTIwJTdCYXJnc19zdHIlN0QlMkMlMjIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmJTIyJTIwT3V0cHV0cyUzQSUyMCU3QnNlbGYub3V0cHV0cyU3RCUyMiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCklMEElMEElMjAlMjAlMjAlMjBkZWYlMjBfX2NhbGxfXyhzZWxmJTJDJTIwKmFyZ3MlMkMlMjAqKmt3YXJncyklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjIlMjIlMjIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlRUMlQTAlODAlRUMlOUUlQTUlRUIlOTAlOUMlMjAlRUQlOTUlQTglRUMlODglOTgoY2FsbGFibGUpJUVCJUE1JUJDJTIwJUVDJUEzJUJDJUVDJTk2JUI0JUVDJUE3JTg0JTIwJUVDJTlFJTg1JUVCJUEwJUE1JUVBJUIwJTkyJUVDJTlDJUJDJUVCJUExJTlDJTIwJUVDJThCJUE0JUVEJTk2JTg5JUVEJTk1JUE5JUVCJThCJTg4JUVCJThCJUE0LiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMiUyMiUyMiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHJldHVybiUyMHNlbGYuZnVuYygqYXJncyUyQyUyMCoqa3dhcmdzKQ==",highlighted:`<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)`,lang:"python",wrap:!1}}),cl=new u({props:{code:"Y2FsY3VsYXRvcl90b29sJTIwJTNEJTIwVG9vbCglMEElMjAlMjAlMjAlMjAlMjJjYWxjdWxhdG9yJTIyJTJDJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwJUVCJThGJTg0JUVBJUI1JUFDJTIwJUVDJTlEJUI0JUVCJUE2JTg0JTBBJTIwJTIwJTIwJTIwJTIyTXVsdGlwbHklMjB0d28lMjBpbnRlZ2Vycy4lMjIlMkMlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjAlRUMlODQlQTQlRUIlQUElODUlMEElMjAlMjAlMjAlMjBjYWxjdWxhdG9yJTJDJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwJUVDJThCJUE0JUVEJTk2JTg5JUVEJTk1JUEwJTIwJUVEJTk1JUE4JUVDJTg4JTk4JTBBJTIwJTIwJTIwJTIwJTVCKCUyMmElMjIlMkMlMjAlMjJpbnQlMjIpJTJDJTIwKCUyMmIlMjIlMkMlMjAlMjJpbnQlMjIpJTVEJTJDJTIwJTIwJTIwJTIzJTIwJUVDJTlFJTg1JUVCJUEwJUE1JUVBJUIwJTkyJTIwKCVFQyU5RCVCNCVFQiVBNiU4NCVFQSVCMyVCQyUyMCVFRCU4MyU4MCVFQyU5RSU4NSklMEElMjAlMjAlMjAlMjAlMjJpbnQlMjIlMkMlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjAlRUMlQjYlOUMlRUIlQTAlQTUlRUElQjAlOTIlMjAlRUQlODMlODAlRUMlOUUlODUlMEEp",highlighted:`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> | |
| )`,lang:"python",wrap:!1}}),Bl=new u({props:{code:"ZGVmJTIwdG9vbChmdW5jKSUzQSUwQSUyMCUyMCUyMCUyMCUyMiUyMiUyMiUwQSUyMCUyMCUyMCUyMCVFQyVBMyVCQyVFQyU5NiVCNCVFQyVBNyU4NCUyMCVFRCU5NSVBOCVFQyU4OCU5OCVFQiVBNSVCQyUyMCVFQSVCOCVCMCVFQiVCMCU5OCVFQyU5QyVCQyVFQiVBMSU5QyUyMFRvb2wlMjAlRUMlOUQlQjglRUMlOEElQTQlRUQlODQlQjQlRUMlOEElQTQlRUIlQTUlQkMlMjAlRUMlODMlOUQlRUMlODQlQjElRUQlOTUlOTglRUIlOEElOTQlMjAlRUIlOEQlQjAlRUMlQkQlOTQlRUIlQTAlODglRUMlOUQlQjQlRUQlODQlQjAlRUMlOUUlODUlRUIlOEIlODglRUIlOEIlQTQuJTBBJTIwJTIwJTIwJTIwJTIyJTIyJTIyJTBBJTIwJTIwJTIwJTIwJTIzJTIwJUVEJTk1JUE4JUVDJTg4JTk4JUVDJTlEJTk4JTIwJUVDJTg0JTlDJUVCJUFBJTg1KHNpZ25hdHVyZSklMjAlRUElQjAlODAlRUMlQTAlQjglRUMlOTglQTQlRUElQjglQjAlMEElMjAlMjAlMjAlMjBzaWduYXR1cmUlMjAlM0QlMjBpbnNwZWN0LnNpZ25hdHVyZShmdW5jKSUwQSUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMCUyMyUyMCVFQyU5RSU4NSVFQiVBMCVBNSUyMCVFQyU5RCVCOCVFQyU5RSU5MCUyMCVFQyVCNiU5NCVFQyVCNiU5QyUyMChwYXJhbV9uYW1lJTJDJTIwcGFyYW1fYW5ub3RhdGlvbiklMEElMjAlMjAlMjAlMjBhcmd1bWVudHMlMjAlM0QlMjAlNUIlNUQlMEElMjAlMjAlMjAlMjBmb3IlMjBwYXJhbSUyMGluJTIwc2lnbmF0dXJlLnBhcmFtZXRlcnMudmFsdWVzKCklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBhbm5vdGF0aW9uX25hbWUlMjAlM0QlMjAoJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcGFyYW0uYW5ub3RhdGlvbi5fX25hbWVfXyUyMCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGlmJTIwaGFzYXR0cihwYXJhbS5hbm5vdGF0aW9uJTJDJTIwJ19fbmFtZV9fJyklMjAlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBlbHNlJTIwc3RyKHBhcmFtLmFubm90YXRpb24pJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGFyZ3VtZW50cy5hcHBlbmQoKHBhcmFtLm5hbWUlMkMlMjBhbm5vdGF0aW9uX25hbWUpKSUwQSUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMCUyMyUyMCVFQiVBNiVBQyVFRCU4NCVCNCVFQSVCMCU5MiUyMCVFRCU4MyU4MCVFQyU5RSU4NSUyMCVFQSVCMiVCMCVFQyVBMCU5NSUwQSUyMCUyMCUyMCUyMHJldHVybl9hbm5vdGF0aW9uJTIwJTNEJTIwc2lnbmF0dXJlLnJldHVybl9hbm5vdGF0aW9uJTBBJTIwJTIwJTIwJTIwaWYlMjByZXR1cm5fYW5ub3RhdGlvbiUyMGlzJTIwaW5zcGVjdC5fZW1wdHklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBvdXRwdXRzJTIwJTNEJTIwJTIyTm8lMjByZXR1cm4lMjBhbm5vdGF0aW9uJTIyJTBBJTIwJTIwJTIwJTIwZWxzZSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG91dHB1dHMlMjAlM0QlMjAoJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmV0dXJuX2Fubm90YXRpb24uX19uYW1lX18lMjAlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBpZiUyMGhhc2F0dHIocmV0dXJuX2Fubm90YXRpb24lMkMlMjAnX19uYW1lX18nKSUyMCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGVsc2UlMjBzdHIocmV0dXJuX2Fubm90YXRpb24pJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwKSUwQSUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMCUyMyUyMCVFRCU5NSVBOCVFQyU4OCU5OCVFQyU5RCU5OCUyMGRvY3N0cmluZyVFQyU5RCU4NCUyMCVFQyU4NCVBNCVFQiVBQSU4NSVFQyU5QyVCQyVFQiVBMSU5QyUyMCVFQyU4MiVBQyVFQyU5QSVBOSUwQSUyMCUyMCUyMCUyMGRlc2NyaXB0aW9uJTIwJTNEJTIwZnVuYy5fX2RvY19fJTIwb3IlMjAlMjJObyUyMGRlc2NyaXB0aW9uJTIwcHJvdmlkZWQuJTIyJTBBJTIwJTIwJTIwJTIwJTBBJTIwJTIwJTIwJTIwJTIzJTIwJUVEJTk1JUE4JUVDJTg4JTk4JUVCJUFBJTg1JUVDJTlEJTg0JTIwJUVCJThGJTg0JUVBJUI1JUFDJTIwJUVDJTlEJUI0JUVCJUE2JTg0JUVDJTlDJUJDJUVCJUExJTlDJTIwJUVDJTgyJUFDJUVDJTlBJUE5JTBBJTIwJTIwJTIwJTIwbmFtZSUyMCUzRCUyMGZ1bmMuX19uYW1lX18lMEElMjAlMjAlMjAlMjAlMEElMjAlMjAlMjAlMjAlMjMlMjBUb29sJTIwJUVDJTlEJUI4JUVDJThBJUE0JUVEJTg0JUI0JUVDJThBJUE0JUVCJUE1JUJDJTIwJUVCJUE2JUFDJUVEJTg0JUI0JTBBJTIwJTIwJTIwJTIwcmV0dXJuJTIwVG9vbCglMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBuYW1lJTNEbmFtZSUyQyUyMCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGRlc2NyaXB0aW9uJTNEZGVzY3JpcHRpb24lMkMlMjAlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmdW5jJTNEZnVuYyUyQyUyMCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGFyZ3VtZW50cyUzRGFyZ3VtZW50cyUyQyUyMCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMG91dHB1dHMlM0RvdXRwdXRzJTBBJTIwJTIwJTIwJTIwKQ==",highlighted:`<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 | |
| )`,lang:"python",wrap:!1}}),El=new u({props:{code:"JTQwdG9vbCUwQWRlZiUyMGNhbGN1bGF0b3IoYSUzQSUyMGludCUyQyUyMGIlM0ElMjBpbnQpJTIwLSUzRSUyMGludCUzQSUwQSUyMCUyMCUyMCUyMCUyMiUyMiUyMiVFQiU5MSU5MCUyMCVFQyVBMCU5NSVFQyU4OCU5OCVFQiVBNSVCQyUyMCVFQSVCMyVCMSVFRCU5NSU5OCVFQyU4NCVCOCVFQyU5QSU5NCUyMiUyMiUyMiUwQSUyMCUyMCUyMCUyMHJldHVybiUyMGElMjAqJTIwYiUwQSUwQXByaW50KGNhbGN1bGF0b3IudG9fc3RyaW5nKCkp",highlighted:`<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())`,lang:"python",wrap:!1}}),hl=new u({props:{code:"VG9vbCUyME5hbWUlM0ElMjBjYWxjdWxhdG9yJTJDJTIwRGVzY3JpcHRpb24lM0ElMjBNdWx0aXBseSUyMHR3byUyMGludGVnZXJzLiUyQyUyMEFyZ3VtZW50cyUzQSUyMGElM0ElMjBpbnQlMkMlMjBiJTNBJTIwaW50JTJDJTIwT3V0cHV0cyUzQSUyMGludA==",highlighted:"Tool Name: calculator, Description: Multiply two integers., Arguments: a: int, b: int, Outputs: int",lang:"text",wrap:!1}}),Ol=new kM({props:{source:"https://github.com/huggingface/agents-course/blob/main/units/ko/unit1/tools.mdx"}}),{c(){I=J("meta"),Hl=s(),Dl=J("p"),ql=s(),i(m.$$.fragment),Wl=s(),i(V.$$.fragment),Xl=s(),A=J("img"),zl=s(),Q=J("p"),Q.innerHTML=fe,Yl=s(),r=J("p"),r.textContent=be,Zl=s(),c=J("p"),c.textContent=Be,Pl=s(),i(f.$$.fragment),Kl=s(),b=J("p"),b.innerHTML=ge,lt=s(),B=J("p"),B.textContent=Ee,tt=s(),g=J("table"),g.innerHTML=de,et=s(),E=J("p"),E.textContent=he,Mt=s(),d=J("p"),d.innerHTML=_e,st=s(),h=J("p"),h.innerHTML=Re,Ut=s(),_=J("p"),_.innerHTML=ve,Jt=s(),R=J("p"),R.textContent=Fe,nt=s(),v=J("img"),Tt=s(),F=J("ul"),F.innerHTML=ke,it=s(),i(S.$$.fragment),yt=s(),k=J("p"),k.innerHTML=xe,at=s(),x=J("p"),x.innerHTML=Le,pt=s(),L=J("p"),L.innerHTML=Oe,Ct=s(),O=J("p"),O.textContent=Ne,jt=s(),i(N.$$.fragment),wt=s(),$=J("p"),$.innerHTML=$e,It=s(),D=J("img"),ut=s(),G=J("p"),G.textContent=Ge,ot=s(),H=J("ol"),H.innerHTML=He,mt=s(),q=J("p"),q.innerHTML=qe,Vt=s(),W=J("p"),W.textContent=We,At=s(),X=J("p"),X.innerHTML=Xe,Qt=s(),i(z.$$.fragment),rt=s(),Y=J("p"),Y.innerHTML=ze,ct=s(),Z=J("ul"),Z.innerHTML=Ye,ft=s(),P=J("p"),P.textContent=Ze,bt=s(),K=J("ul"),K.innerHTML=Pe,Bt=s(),ll=J("p"),ll.textContent=Ke,gt=s(),i(tl.$$.fragment),Et=s(),el=J("blockquote"),el.innerHTML=lM,dt=s(),Ml=J("p"),Ml.textContent=tM,ht=s(),sl=J("p"),sl.textContent=eM,_t=s(),Ul=J("p"),Ul.textContent=MM,Rt=s(),i(Jl.$$.fragment),vt=s(),nl=J("p"),nl.textContent=sM,Ft=s(),Tl=J("ul"),Tl.innerHTML=UM,St=s(),il=J("p"),il.textContent=JM,kt=s(),yl=J("p"),yl.textContent=nM,xt=s(),al=J("p"),al.innerHTML=TM,Lt=s(),i(pl.$$.fragment),Ot=s(),Cl=J("p"),Cl.innerHTML=iM,Nt=s(),jl=J("p"),jl.innerHTML=yM,$t=s(),i(wl.$$.fragment),Dt=s(),Il=J("p"),Il.textContent=aM,Gt=s(),i(ul.$$.fragment),Ht=s(),ol=J("p"),ol.innerHTML=pM,qt=s(),ml=J("blockquote"),ml.innerHTML=CM,Wt=s(),i(Vl.$$.fragment),Xt=s(),Al=J("p"),Al.innerHTML=jM,zt=s(),Ql=J("ul"),Ql.innerHTML=wM,Yt=s(),rl=J("p"),rl.textContent=IM,Zt=s(),i(cl.$$.fragment),Pt=s(),fl=J("p"),fl.innerHTML=uM,Kt=s(),bl=J("blockquote"),bl.innerHTML=oM,le=s(),o=J("details"),Nl=J("summary"),Nl.textContent=mM,Ve=s(),i(Bl.$$.fragment),te=s(),gl=J("p"),gl.textContent=VM,ee=s(),i(El.$$.fragment),Me=s(),dl=J("p"),dl.innerHTML=AM,se=s(),i(hl.$$.fragment),Ue=s(),_l=J("p"),_l.innerHTML=QM,Je=s(),Rl=J("img"),ne=s(),vl=J("p"),vl.innerHTML=cM,Te=s(),ie=J("hr"),ye=s(),Fl=J("p"),Fl.textContent=fM,ae=s(),Sl=J("p"),Sl.textContent=bM,pe=s(),kl=J("ul"),kl.innerHTML=BM,Ce=s(),xl=J("p"),xl.innerHTML=gM,je=s(),Ll=J("p"),Ll.textContent=EM,we=s(),i(Ol.$$.fragment),Ie=s(),Gl=J("p"),this.h()},l(l){const t=FM("svelte-u9bgzb",document.head);I=n(t,"META",{name:!0,content:!0}),t.forEach(e),Hl=U(l),Dl=n(l,"P",{}),Ae(Dl).forEach(e),ql=U(l),y(m.$$.fragment,l),Wl=U(l),y(V.$$.fragment,l),Xl=U(l),A=n(l,"IMG",{src:!0,alt:!0}),zl=U(l),Q=n(l,"P",{"data-svelte-h":!0}),T(Q)!=="svelte-2lj48b"&&(Q.innerHTML=fe),Yl=U(l),r=n(l,"P",{"data-svelte-h":!0}),T(r)!=="svelte-1erzl60"&&(r.textContent=be),Zl=U(l),c=n(l,"P",{"data-svelte-h":!0}),T(c)!=="svelte-19n6lwi"&&(c.textContent=Be),Pl=U(l),y(f.$$.fragment,l),Kl=U(l),b=n(l,"P",{"data-svelte-h":!0}),T(b)!=="svelte-b0cx07"&&(b.innerHTML=ge),lt=U(l),B=n(l,"P",{"data-svelte-h":!0}),T(B)!=="svelte-1hskflb"&&(B.textContent=Ee),tt=U(l),g=n(l,"TABLE",{"data-svelte-h":!0}),T(g)!=="svelte-179yg6o"&&(g.innerHTML=de),et=U(l),E=n(l,"P",{"data-svelte-h":!0}),T(E)!=="svelte-q0xfd8"&&(E.textContent=he),Mt=U(l),d=n(l,"P",{"data-svelte-h":!0}),T(d)!=="svelte-1s4gqea"&&(d.innerHTML=_e),st=U(l),h=n(l,"P",{"data-svelte-h":!0}),T(h)!=="svelte-q1ut6r"&&(h.innerHTML=Re),Ut=U(l),_=n(l,"P",{"data-svelte-h":!0}),T(_)!=="svelte-10x22ir"&&(_.innerHTML=ve),Jt=U(l),R=n(l,"P",{"data-svelte-h":!0}),T(R)!=="svelte-gd48l2"&&(R.textContent=Fe),nt=U(l),v=n(l,"IMG",{src:!0,alt:!0}),Tt=U(l),F=n(l,"UL",{"data-svelte-h":!0}),T(F)!=="svelte-1iw0pe0"&&(F.innerHTML=ke),it=U(l),y(S.$$.fragment,l),yt=U(l),k=n(l,"P",{"data-svelte-h":!0}),T(k)!=="svelte-qvxnn6"&&(k.innerHTML=xe),at=U(l),x=n(l,"P",{"data-svelte-h":!0}),T(x)!=="svelte-12iwnao"&&(x.innerHTML=Le),pt=U(l),L=n(l,"P",{"data-svelte-h":!0}),T(L)!=="svelte-i133bk"&&(L.innerHTML=Oe),Ct=U(l),O=n(l,"P",{"data-svelte-h":!0}),T(O)!=="svelte-4vpkzc"&&(O.textContent=Ne),jt=U(l),y(N.$$.fragment,l),wt=U(l),$=n(l,"P",{"data-svelte-h":!0}),T($)!=="svelte-1e8132k"&&($.innerHTML=$e),It=U(l),D=n(l,"IMG",{src:!0,alt:!0}),ut=U(l),G=n(l,"P",{"data-svelte-h":!0}),T(G)!=="svelte-1nf3f0g"&&(G.textContent=Ge),ot=U(l),H=n(l,"OL",{"data-svelte-h":!0}),T(H)!=="svelte-1taixl7"&&(H.innerHTML=He),mt=U(l),q=n(l,"P",{"data-svelte-h":!0}),T(q)!=="svelte-a0w24d"&&(q.innerHTML=qe),Vt=U(l),W=n(l,"P",{"data-svelte-h":!0}),T(W)!=="svelte-faj8xi"&&(W.textContent=We),At=U(l),X=n(l,"P",{"data-svelte-h":!0}),T(X)!=="svelte-223plm"&&(X.innerHTML=Xe),Qt=U(l),y(z.$$.fragment,l),rt=U(l),Y=n(l,"P",{"data-svelte-h":!0}),T(Y)!=="svelte-16o9jiy"&&(Y.innerHTML=ze),ct=U(l),Z=n(l,"UL",{"data-svelte-h":!0}),T(Z)!=="svelte-wy9x9l"&&(Z.innerHTML=Ye),ft=U(l),P=n(l,"P",{"data-svelte-h":!0}),T(P)!=="svelte-1ne24fu"&&(P.textContent=Ze),bt=U(l),K=n(l,"UL",{"data-svelte-h":!0}),T(K)!=="svelte-y08eiw"&&(K.innerHTML=Pe),Bt=U(l),ll=n(l,"P",{"data-svelte-h":!0}),T(ll)!=="svelte-1dm719v"&&(ll.textContent=Ke),gt=U(l),y(tl.$$.fragment,l),Et=U(l),el=n(l,"BLOCKQUOTE",{"data-svelte-h":!0}),T(el)!=="svelte-vy6e71"&&(el.innerHTML=lM),dt=U(l),Ml=n(l,"P",{"data-svelte-h":!0}),T(Ml)!=="svelte-1nj012o"&&(Ml.textContent=tM),ht=U(l),sl=n(l,"P",{"data-svelte-h":!0}),T(sl)!=="svelte-1m2dsgp"&&(sl.textContent=eM),_t=U(l),Ul=n(l,"P",{"data-svelte-h":!0}),T(Ul)!=="svelte-1po3r15"&&(Ul.textContent=MM),Rt=U(l),y(Jl.$$.fragment,l),vt=U(l),nl=n(l,"P",{"data-svelte-h":!0}),T(nl)!=="svelte-1vnxojk"&&(nl.textContent=sM),Ft=U(l),Tl=n(l,"UL",{"data-svelte-h":!0}),T(Tl)!=="svelte-npivcx"&&(Tl.innerHTML=UM),St=U(l),il=n(l,"P",{"data-svelte-h":!0}),T(il)!=="svelte-1xfam2p"&&(il.textContent=JM),kt=U(l),yl=n(l,"P",{"data-svelte-h":!0}),T(yl)!=="svelte-rs7nvw"&&(yl.textContent=nM),xt=U(l),al=n(l,"P",{"data-svelte-h":!0}),T(al)!=="svelte-1bothlt"&&(al.innerHTML=TM),Lt=U(l),y(pl.$$.fragment,l),Ot=U(l),Cl=n(l,"P",{"data-svelte-h":!0}),T(Cl)!=="svelte-14gcwo3"&&(Cl.innerHTML=iM),Nt=U(l),jl=n(l,"P",{"data-svelte-h":!0}),T(jl)!=="svelte-1kedr6"&&(jl.innerHTML=yM),$t=U(l),y(wl.$$.fragment,l),Dt=U(l),Il=n(l,"P",{"data-svelte-h":!0}),T(Il)!=="svelte-1s5vsgd"&&(Il.textContent=aM),Gt=U(l),y(ul.$$.fragment,l),Ht=U(l),ol=n(l,"P",{"data-svelte-h":!0}),T(ol)!=="svelte-1rw428h"&&(ol.innerHTML=pM),qt=U(l),ml=n(l,"BLOCKQUOTE",{"data-svelte-h":!0}),T(ml)!=="svelte-u3dndf"&&(ml.innerHTML=CM),Wt=U(l),y(Vl.$$.fragment,l),Xt=U(l),Al=n(l,"P",{"data-svelte-h":!0}),T(Al)!=="svelte-gkrogk"&&(Al.innerHTML=jM),zt=U(l),Ql=n(l,"UL",{"data-svelte-h":!0}),T(Ql)!=="svelte-633ak8"&&(Ql.innerHTML=wM),Yt=U(l),rl=n(l,"P",{"data-svelte-h":!0}),T(rl)!=="svelte-yldhqa"&&(rl.textContent=IM),Zt=U(l),y(cl.$$.fragment,l),Pt=U(l),fl=n(l,"P",{"data-svelte-h":!0}),T(fl)!=="svelte-uifb3q"&&(fl.innerHTML=uM),Kt=U(l),bl=n(l,"BLOCKQUOTE",{"data-svelte-h":!0}),T(bl)!=="svelte-1wp8ghv"&&(bl.innerHTML=oM),le=U(l),o=n(l,"DETAILS",{});var oe=Ae(o);Nl=n(oe,"SUMMARY",{"data-svelte-h":!0}),T(Nl)!=="svelte-jpdddo"&&(Nl.textContent=mM),Ve=U(oe),y(Bl.$$.fragment,oe),oe.forEach(e),te=U(l),gl=n(l,"P",{"data-svelte-h":!0}),T(gl)!=="svelte-nbayho"&&(gl.textContent=VM),ee=U(l),y(El.$$.fragment,l),Me=U(l),dl=n(l,"P",{"data-svelte-h":!0}),T(dl)!=="svelte-zc2oog"&&(dl.innerHTML=AM),se=U(l),y(hl.$$.fragment,l),Ue=U(l),_l=n(l,"P",{"data-svelte-h":!0}),T(_l)!=="svelte-qzwccu"&&(_l.innerHTML=QM),Je=U(l),Rl=n(l,"IMG",{src:!0,alt:!0}),ne=U(l),vl=n(l,"P",{"data-svelte-h":!0}),T(vl)!=="svelte-zdf5d3"&&(vl.innerHTML=cM),Te=U(l),ie=n(l,"HR",{}),ye=U(l),Fl=n(l,"P",{"data-svelte-h":!0}),T(Fl)!=="svelte-w3dczj"&&(Fl.textContent=fM),ae=U(l),Sl=n(l,"P",{"data-svelte-h":!0}),T(Sl)!=="svelte-106vzz3"&&(Sl.textContent=bM),pe=U(l),kl=n(l,"UL",{"data-svelte-h":!0}),T(kl)!=="svelte-12oj0ks"&&(kl.innerHTML=BM),Ce=U(l),xl=n(l,"P",{"data-svelte-h":!0}),T(xl)!=="svelte-14b2y2n"&&(xl.innerHTML=gM),je=U(l),Ll=n(l,"P",{"data-svelte-h":!0}),T(Ll)!=="svelte-gi6kft"&&(Ll.textContent=EM),we=U(l),y(Ol.$$.fragment,l),Ie=U(l),Gl=n(l,"P",{}),Ae(Gl).forEach(e),this.h()},h(){w(I,"name","hf:doc:metadata"),w(I,"content",LM),me(A.src,ce="https://huggingface.co/datasets/agents-course/course-images/resolve/main/en/unit1/whiteboard-check-2.jpg")||w(A,"src",ce),w(A,"alt","Unit 1 planning"),me(v.src,Se="https://huggingface.co/datasets/agents-course/course-images/resolve/main/en/unit1/weather.jpg")||w(v,"src",Se),w(v,"alt","Weather"),me(D.src,De="https://huggingface.co/datasets/agents-course/course-images/resolve/main/en/unit1/Agent_system_prompt.png")||w(D,"src",De),w(D,"alt","System prompt for tools"),me(Rl.src,rM="https://huggingface.co/datasets/agents-course/course-images/resolve/main/en/unit1/Agent_system_prompt_tools.png")||w(Rl,"src",rM),w(Rl,"alt","System prompt for tools")},m(l,t){Qe(document.head,I),M(l,Hl,t),M(l,Dl,t),M(l,ql,t),a(m,l,t),M(l,Wl,t),a(V,l,t),M(l,Xl,t),M(l,A,t),M(l,zl,t),M(l,Q,t),M(l,Yl,t),M(l,r,t),M(l,Zl,t),M(l,c,t),M(l,Pl,t),a(f,l,t),M(l,Kl,t),M(l,b,t),M(l,lt,t),M(l,B,t),M(l,tt,t),M(l,g,t),M(l,et,t),M(l,E,t),M(l,Mt,t),M(l,d,t),M(l,st,t),M(l,h,t),M(l,Ut,t),M(l,_,t),M(l,Jt,t),M(l,R,t),M(l,nt,t),M(l,v,t),M(l,Tt,t),M(l,F,t),M(l,it,t),a(S,l,t),M(l,yt,t),M(l,k,t),M(l,at,t),M(l,x,t),M(l,pt,t),M(l,L,t),M(l,Ct,t),M(l,O,t),M(l,jt,t),a(N,l,t),M(l,wt,t),M(l,$,t),M(l,It,t),M(l,D,t),M(l,ut,t),M(l,G,t),M(l,ot,t),M(l,H,t),M(l,mt,t),M(l,q,t),M(l,Vt,t),M(l,W,t),M(l,At,t),M(l,X,t),M(l,Qt,t),a(z,l,t),M(l,rt,t),M(l,Y,t),M(l,ct,t),M(l,Z,t),M(l,ft,t),M(l,P,t),M(l,bt,t),M(l,K,t),M(l,Bt,t),M(l,ll,t),M(l,gt,t),a(tl,l,t),M(l,Et,t),M(l,el,t),M(l,dt,t),M(l,Ml,t),M(l,ht,t),M(l,sl,t),M(l,_t,t),M(l,Ul,t),M(l,Rt,t),a(Jl,l,t),M(l,vt,t),M(l,nl,t),M(l,Ft,t),M(l,Tl,t),M(l,St,t),M(l,il,t),M(l,kt,t),M(l,yl,t),M(l,xt,t),M(l,al,t),M(l,Lt,t),a(pl,l,t),M(l,Ot,t),M(l,Cl,t),M(l,Nt,t),M(l,jl,t),M(l,$t,t),a(wl,l,t),M(l,Dt,t),M(l,Il,t),M(l,Gt,t),a(ul,l,t),M(l,Ht,t),M(l,ol,t),M(l,qt,t),M(l,ml,t),M(l,Wt,t),a(Vl,l,t),M(l,Xt,t),M(l,Al,t),M(l,zt,t),M(l,Ql,t),M(l,Yt,t),M(l,rl,t),M(l,Zt,t),a(cl,l,t),M(l,Pt,t),M(l,fl,t),M(l,Kt,t),M(l,bl,t),M(l,le,t),M(l,o,t),Qe(o,Nl),Qe(o,Ve),a(Bl,o,null),M(l,te,t),M(l,gl,t),M(l,ee,t),a(El,l,t),M(l,Me,t),M(l,dl,t),M(l,se,t),a(hl,l,t),M(l,Ue,t),M(l,_l,t),M(l,Je,t),M(l,Rl,t),M(l,ne,t),M(l,vl,t),M(l,Te,t),M(l,ie,t),M(l,ye,t),M(l,Fl,t),M(l,ae,t),M(l,Sl,t),M(l,pe,t),M(l,kl,t),M(l,Ce,t),M(l,xl,t),M(l,je,t),M(l,Ll,t),M(l,we,t),a(Ol,l,t),M(l,Ie,t),M(l,Gl,t),ue=!0},p:hM,i(l){ue||(p(m.$$.fragment,l),p(V.$$.fragment,l),p(f.$$.fragment,l),p(S.$$.fragment,l),p(N.$$.fragment,l),p(z.$$.fragment,l),p(tl.$$.fragment,l),p(Jl.$$.fragment,l),p(pl.$$.fragment,l),p(wl.$$.fragment,l),p(ul.$$.fragment,l),p(Vl.$$.fragment,l),p(cl.$$.fragment,l),p(Bl.$$.fragment,l),p(El.$$.fragment,l),p(hl.$$.fragment,l),p(Ol.$$.fragment,l),ue=!0)},o(l){C(m.$$.fragment,l),C(V.$$.fragment,l),C(f.$$.fragment,l),C(S.$$.fragment,l),C(N.$$.fragment,l),C(z.$$.fragment,l),C(tl.$$.fragment,l),C(Jl.$$.fragment,l),C(pl.$$.fragment,l),C(wl.$$.fragment,l),C(ul.$$.fragment,l),C(Vl.$$.fragment,l),C(cl.$$.fragment,l),C(Bl.$$.fragment,l),C(El.$$.fragment,l),C(hl.$$.fragment,l),C(Ol.$$.fragment,l),ue=!1},d(l){l&&(e(Hl),e(Dl),e(ql),e(Wl),e(Xl),e(A),e(zl),e(Q),e(Yl),e(r),e(Zl),e(c),e(Pl),e(Kl),e(b),e(lt),e(B),e(tt),e(g),e(et),e(E),e(Mt),e(d),e(st),e(h),e(Ut),e(_),e(Jt),e(R),e(nt),e(v),e(Tt),e(F),e(it),e(yt),e(k),e(at),e(x),e(pt),e(L),e(Ct),e(O),e(jt),e(wt),e($),e(It),e(D),e(ut),e(G),e(ot),e(H),e(mt),e(q),e(Vt),e(W),e(At),e(X),e(Qt),e(rt),e(Y),e(ct),e(Z),e(ft),e(P),e(bt),e(K),e(Bt),e(ll),e(gt),e(Et),e(el),e(dt),e(Ml),e(ht),e(sl),e(_t),e(Ul),e(Rt),e(vt),e(nl),e(Ft),e(Tl),e(St),e(il),e(kt),e(yl),e(xt),e(al),e(Lt),e(Ot),e(Cl),e(Nt),e(jl),e($t),e(Dt),e(Il),e(Gt),e(Ht),e(ol),e(qt),e(ml),e(Wt),e(Xt),e(Al),e(zt),e(Ql),e(Yt),e(rl),e(Zt),e(Pt),e(fl),e(Kt),e(bl),e(le),e(o),e(te),e(gl),e(ee),e(Me),e(dl),e(se),e(Ue),e(_l),e(Je),e(Rl),e(ne),e(vl),e(Te),e(ie),e(ye),e(Fl),e(ae),e(Sl),e(pe),e(kl),e(Ce),e(xl),e(je),e(Ll),e(we),e(Ie),e(Gl)),e(I),j(m,l),j(V,l),j(f,l),j(S,l),j(N,l),j(z,l),j(tl,l),j(Jl,l),j(pl,l),j(wl,l),j(ul,l),j(Vl,l),j(cl,l),j(Bl),j(El,l),j(hl,l),j(Ol,l)}}}const LM='{"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}';function OM(re){return _M(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class qM extends RM{constructor(I){super(),vM(this,I,OM,xM,dM,{})}}export{qM as component}; | |
Xet Storage Details
- Size:
- 45.7 kB
- Xet hash:
- d1b5d2896803e9520854bb113ed62604ce05a89ce7cdec733323dedbc1a41a28
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.