Buckets:
| <meta charset="utf-8" /><meta name="hf:doc:metadata" content="{"title":"Tools là gì?","local":"tools-là-gì","sections":[{"title":"AI Tools là gì?","local":"ai-tools-là-gì","sections":[],"depth":2},{"title":"Tools hoạt động thế nào?","local":"tools-hoạt-động-thế-nào","sections":[],"depth":2},{"title":"Cách cung cấp Tools cho LLM?","local":"cách-cung-cấp-tools-cho-llm","sections":[{"title":"Tự động định dạng phần Tools","local":"tự-động-định-dạng-phần-tools","sections":[],"depth":3},{"title":"Triển khai Tool tổng quát","local":"triển-khai-tool-tổng-quát","sections":[],"depth":3}],"depth":2}],"depth":1}"> | |
| <link href="/docs/agents-course/pr_545/vi/_app/immutable/assets/0.e3b0c442.css" rel="modulepreload"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/vi/_app/immutable/entry/start.aedc0924.js"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/vi/_app/immutable/chunks/scheduler.f6b352c8.js"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/vi/_app/immutable/chunks/singletons.21caee07.js"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/vi/_app/immutable/chunks/index.26cf6c5a.js"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/vi/_app/immutable/chunks/paths.9e3b2f65.js"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/vi/_app/immutable/entry/app.7987e38c.js"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/vi/_app/immutable/chunks/index.7f38e934.js"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/vi/_app/immutable/nodes/0.ec512cbf.js"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/vi/_app/immutable/chunks/each.e59479a4.js"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/vi/_app/immutable/nodes/22.3732e5a3.js"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/vi/_app/immutable/chunks/CodeBlock.3ee8293b.js"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/vi/_app/immutable/chunks/Heading.333929c4.js"> | |
| <link rel="modulepreload" href="/docs/agents-course/pr_545/vi/_app/immutable/chunks/getInferenceSnippets.40a969e5.js"><!-- HEAD_svelte-u9bgzb_START --><meta name="hf:doc:metadata" content="{"title":"Tools là gì?","local":"tools-là-gì","sections":[{"title":"AI Tools là gì?","local":"ai-tools-là-gì","sections":[],"depth":2},{"title":"Tools hoạt động thế nào?","local":"tools-hoạt-động-thế-nào","sections":[],"depth":2},{"title":"Cách cung cấp Tools cho LLM?","local":"cách-cung-cấp-tools-cho-llm","sections":[{"title":"Tự động định dạng phần Tools","local":"tự-động-định-dạng-phần-tools","sections":[],"depth":3},{"title":"Triển khai Tool tổng quát","local":"triển-khai-tool-tổng-quát","sections":[],"depth":3}],"depth":2}],"depth":1}"><!-- HEAD_svelte-u9bgzb_END --> <p></p> <h1 class="relative group"><a id="tools-là-gì" 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="#tools-là-gì"><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>Tools là gì?</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-2p41u">Một khía cạnh quan trọng của AI agents là khả năng thực hiện <strong>hành động</strong>. Như ta đã thấy, điều này xảy ra thông qua việc sử dụng <strong>Tools</strong> (công cụ).</p> <p data-svelte-h="svelte-rwyg54">Trong phần này, ta sẽ tìm hiểu Tools là gì, cách thiết kế chúng hiệu quả và cách tích hợp vào Agent thông qua System Message.</p> <p data-svelte-h="svelte-9megkf">Bằng cách cung cấp đúng Tools cho Agent - và mô tả rõ ràng cách chúng hoạt động - bạn có thể nâng cao đáng kể khả năng của AI. Cùng tìm hiểu nhé!</p> <h2 class="relative group"><a id="ai-tools-là-gì" 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="#ai-tools-là-gì"><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 Tools là gì?</span></h2> <p data-svelte-h="svelte-a86si3"><strong>Tool là một hàm được cung cấp cho LLM</strong>. Hàm này cần đáp ứng <strong>một mục tiêu rõ ràng</strong>.</p> <p data-svelte-h="svelte-17jtymc">Dưới đây là những Tools phổ biến trong AI agents:</p> <table data-svelte-h="svelte-1iher6y"><thead><tr><th>Tool</th> <th>Mô tả</th></tr></thead> <tbody><tr><td>Web Search</td> <td>Cho phép agent truy cập thông tin cập nhật từ internet.</td></tr> <tr><td>Image Generation</td> <td>Tạo hình ảnh dựa trên mô tả văn bản.</td></tr> <tr><td>Retrieval</td> <td>Truy xuất thông tin từ nguồn bên ngoài.</td></tr> <tr><td>API Interface</td> <td>Tương tác với API bên ngoài (GitHub, YouTube, Spotify, v.v.).</td></tr></tbody></table> <p data-svelte-h="svelte-1mbp1x8">Đây chỉ là ví dụ - bạn hoàn toàn có thể tạo Tool cho bất kỳ use case nào!</p> <p data-svelte-h="svelte-1886wxo">Một Tool tốt cần <strong>bổ sung năng lực của LLM</strong>.</p> <p data-svelte-h="svelte-1pt564x">Ví dụ: nếu cần tính toán số học, việc cung cấp <strong>công cụ máy tính</strong> cho LLM sẽ cho kết quả tốt hơn so với dựa vào khả năng tự nhiên của mô hình.</p> <p data-svelte-h="svelte-axt7x1">Hơn nữa, <strong>LLM dự đoán phần tiếp theo của prompt dựa trên dữ liệu huấn luyện</strong>, nghĩa là kiến thức của chúng chỉ bao gồm sự kiện trước thời điểm huấn luyện. Do đó, nếu agent cần dữ liệu mới nhất, bạn phải cung cấp thông qua Tools.</p> <p data-svelte-h="svelte-10ieale">Ví dụ: nếu hỏi trực tiếp LLM (không dùng công cụ tìm kiếm) về thời tiết hôm nay, LLM có thể “bịa” (hallucinate) ra một thông tin thời tiết ngẫu nhiên.</p> <img src="https://huggingface.co/datasets/agents-course/course-images/resolve/main/en/unit1/weather.jpg" alt="Weather"> <ul data-svelte-h="svelte-jkodp7"><li><p>Một Tool cần chứa:</p> <ul><li><strong>Mô tả bằng văn bản</strong> về chức năng</li> <li><em>Callable</em> (thứ để thực thi hành động)</li> <li><em>Arguments</em> với kiểu dữ liệu</li> <li>(Tùy chọn) Đầu ra với kiểu dữ liệu</li></ul></li></ul> <h2 class="relative group"><a id="tools-hoạt-động-thế-nào" 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="#tools-hoạt-động-thế-nào"><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>Tools hoạt động thế nào?</span></h2> <p data-svelte-h="svelte-sm5g1l">Như đã biết, LLM chỉ nhận đầu vào dạng text và tạo đầu ra dạng text. Chúng không thể tự gọi Tools. Khi nói về <em>cung cấp Tools cho Agent</em>, nghĩa là ta <strong>dạy</strong> LLM về sự tồn tại của Tools và yêu cầu mô hình tạo text để kích hoạt Tools khi cần. Ví dụ: nếu cung cấp Tool kiểm tra thời tiết từ Internet, khi hỏi LLM về thời tiết Paris, LLM sẽ nhận ra cần dùng Tool “weather”. LLM sẽ tạo <em>text</em> dạng code để gọi Tool. <strong>Agent</strong> có nhiệm vụ phân tích đầu ra của LLM, nhận diện lệnh gọi Tool và thực thi thay cho LLM. Đầu ra từ Tool sẽ được gửi lại LLM để tổng hợp trả lời (response) cuối cho người dùng.</p> <p data-svelte-h="svelte-1f6lqo8">Đầu ra từ Tool là một loại message khác trong hội thoại. Các bước gọi Tool thường không hiển thị cho người dùng: Agent lấy hội thoại, gọi Tool(s), nhận đầu ra, thêm chúng vào hội thoại và gửi lại LLM. Từ góc độ người dùng, trông như LLM tự dùng Tool nhưng thực chất là code ứng dụng (<strong>Agent</strong>) thực hiện.</p> <p data-svelte-h="svelte-109dsnw">Chúng ta sẽ nói thêm về quy trình này trong các bài sau.</p> <h2 class="relative group"><a id="cách-cung-cấp-tools-cho-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="#cách-cung-cấp-tools-cho-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>Cách cung cấp Tools cho LLM?</span></h2> <p data-svelte-h="svelte-55s67k">Câu trả lời đầy đủ có vẻ phức tạp, nhưng về cơ bản ta dùng system prompt để cung cấp mô tả Tools cho mô hình:</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-nstjsl">Để điều này hoạt động, ta cần chính xác về:</p> <ol data-svelte-h="svelte-1oara07"><li><strong>Chức năng của Tool</strong></li> <li><strong>Đầu vào mà nó mong đợi</strong></li></ol> <p data-svelte-h="svelte-1amnc7o">Đây là lý do mô tả Tools thường dùng cấu trúc chính xác như ngôn ngữ máy tính hoặc JSON. Không <em>bắt buộc</em> phải làm vậy, bất kỳ định dạng chính xác nào cũng được.</p> <p data-svelte-h="svelte-u4cbr9">Nếu lý thuyết quá trừu tượng, hãy xem qua ví dụ cụ thể.</p> <p data-svelte-h="svelte-1ovoyqt">Ta sẽ triển khai <strong>calculator</strong> Tool đơn giản để nhân hai số nguyên. Đây là code 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">"""Nhân hai số nguyên."""</span> | |
| <span class="hljs-keyword">return</span> a * b<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-qlm97k">Tool của ta tên <code>calculator</code>, <strong>nhân hai số nguyên</strong> và cần các đầu vào:</p> <ul data-svelte-h="svelte-o76bur"><li><strong><code>a</code></strong> (<em>int</em>): Số nguyên</li> <li><strong><code>b</code></strong> (<em>int</em>): Số nguyên</li></ul> <p data-svelte-h="svelte-kmc1vj">Đầu ra của Tool là số nguyên:</p> <ul data-svelte-h="svelte-sstlyg"><li>(<em>int</em>): Tích của <code>a</code> và <code>b</code></li></ul> <p data-svelte-h="svelte-1x4n002">Tất cả chi tiết này đều quan trọng. Hãy tổng hợp chúng thành chuỗi mô tả Tool cho 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> <blockquote data-svelte-h="svelte-11x1hn9"><p><strong>Nhắc nhở:</strong> Mô tả text này là <em>thứ ta muốn LLM biết về Tool</em>.</p></blockquote> <p data-svelte-h="svelte-6lx76t">Khi đưa chuỗi trên vào đầu vào của LLM, mô hình sẽ nhận diện nó là Tool và biết cần truyền đầu vào gì, mong đợi đầu ra gì.</p> <p data-svelte-h="svelte-fprolt">Nếu muốn cung cấp nhiều Tools, ta cần nhất quán định dạng. Quá trình này có thể mong manh và dễ bỏ sót chi tiết.</p> <p data-svelte-h="svelte-1py072j">Có cách nào tốt hơn?</p> <h3 class="relative group"><a id="tự-động-định-dạng-phần-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="#tự-động-định-dạng-phần-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>Tự động định dạng phần Tools</span></h3> <p data-svelte-h="svelte-9rpxzi">Tool của ta được viết bằng Python, và phần triển khai đã cung cấp mọi thứ cần thiết:</p> <ul data-svelte-h="svelte-ze2jy7"><li>Tên mô tả: <code>calculator</code></li> <li>Mô tả dài trong docstring: <code>Multiply two integers.</code></li> <li>Đầu vào và kiểu dữ liệu: hàm mong đợi hai <code>int</code></li> <li>Kiểu đầu ra.</li></ul> <p data-svelte-h="svelte-1dpp2kw">Có lý do để mọi người dùng ngôn ngữ lập trình: chúng biểu đạt tốt, ngắn gọn và chính xác.</p> <p data-svelte-h="svelte-wip9fz">Ta có thể đưa mã nguồn Python làm <em>đặc tả</em> Tool cho LLM, nhưng cách triển khai Tool không quan trọng. Điều quan trọng là tên, chức năng, đầu vào và đầu ra.</p> <p data-svelte-h="svelte-r6d88b">Ta sẽ tận dụng tính năng introspection của Python để tự động xây dựng mô tả Tool từ mã nguồn. Điều kiện là phần triển khai Tool phải dùng type hints, docstrings và tên hàm hợp lý. Ta sẽ viết code để trích xuất thông tin từ mã nguồn.</p> <p data-svelte-h="svelte-pcbbl5">Sau đó, ta chỉ cần dùng Python decorator để đánh dấu hàm <code>calculator</code> là 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">"""Multiply two integers."""</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-90yupq">Chú ý decorator <code>@tool</code> trước định nghĩa hàm.</p> <p data-svelte-h="svelte-pulin">Với phần triển khai sẽ học tiếp theo, ta có thể tự động lấy text mô tả Tool thông qua hàm <code>to_string()</code> từ decorator:</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-stkani">Như bạn thấy, nó giống hệt phần ta viết tay trước đó!</p> <h3 class="relative group"><a id="triển-khai-tool-tổng-quát" 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="#triển-khai-tool-tổng-quát"><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>Triển khai Tool tổng quát</span></h3> <p data-svelte-h="svelte-z8pmns">Ta tạo lớp <code>Tool</code> tổng quát để tái sử dụng khi cần dùng Tool.</p> <blockquote data-svelte-h="svelte-1w02mmv"><p><strong>Lưu ý:</strong> Ví dụ này là giả định nhưng gần với phần triển khai thực tế trong các thư viện.</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">""" | |
| Lớp đại diện cho Tool có thể tái sử dụng. | |
| Thuộc tính: | |
| name (str): Tên Tool | |
| description (str): Mô tả chức năng | |
| func (callable): Hàm được wrap | |
| arguments (list): Danh sách tham số | |
| outputs (str hoặc list): Kiểu dữ liệu trả về | |
| """</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">""" | |
| Trả về chuỗi biểu diễn Tool, | |
| bao gồm tên, mô tả, arguments và 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">""" | |
| Gọi hàm cơ sở với arguments được cung cấp. | |
| """</span> | |
| <span class="hljs-keyword">return</span> self.func(*args, **kwargs)<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-109lxuk">Trông có vẻ phức tạp, nhưng nếu xem kỹ ta sẽ hiểu cách hoạt động. Lớp <strong><code>Tool</code></strong> bao gồm:</p> <ul data-svelte-h="svelte-3m7pkd"><li><strong><code>name</code></strong> (<em>str</em>): Tên Tool</li> <li><strong><code>description</code></strong> (<em>str</em>): Mô tả chức năng</li> <li><strong><code>function</code></strong> (<em>callable</em>): Hàm thực thi</li> <li><strong><code>arguments</code></strong> (<em>list</em>): Tham số đầu vào</li> <li><strong><code>outputs</code></strong> (<em>str</em> hoặc <em>list</em>): Đầu ra mong đợi</li> <li><strong><code>__call__()</code></strong>: Gọi hàm khi Tool được invoke</li> <li><strong><code>to_string()</code></strong>: Chuyển thuộc tính Tool thành chuỗi mô tả</li></ul> <p data-svelte-h="svelte-le148w">Ta có thể tạo Tool bằng code như sau:</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"># tên</span> | |
| <span class="hljs-string">"Multiply two integers."</span>, <span class="hljs-comment"># mô tả</span> | |
| calculator, <span class="hljs-comment"># hàm gọi</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"># đầu vào (tên và kiểu)</span> | |
| <span class="hljs-string">"int"</span>, <span class="hljs-comment"># đầu ra</span> | |
| )<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-1simmhq">Nhưng ta cũng có thể dùng module <code>inspect</code> của Python để tự động lấy thông tin! Đây chính là cách decorator <code>@tool</code> hoạt động.</p> <blockquote data-svelte-h="svelte-1nrg98s"><p>Nếu quan tâm, bạn có thể xem phần code decorator bên dưới.</p></blockquote> <details><summary data-svelte-h="svelte-14wmf42">decorator code</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">""" | |
| Decorator tạo instance Tool từ hàm được cung cấp. | |
| """</span> | |
| <span class="hljs-comment"># Lấy signature của hàm</span> | |
| signature = inspect.signature(func) | |
| <span class="hljs-comment"># Trích xuất cặp (tên tham số, kiểu dữ liệu) cho đầu vào</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"># Xác định kiểu trả về</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">"Không có chú thích kiểu trả về"</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"># Dùng docstring của hàm làm mô tả (mặc định nếu không có)</span> | |
| description = func.__doc__ <span class="hljs-keyword">or</span> <span class="hljs-string">"Không có mô tả."</span> | |
| <span class="hljs-comment"># Tên hàm trở thành tên Tool</span> | |
| name = func.__name__ | |
| <span class="hljs-comment"># Trả về instance Tool mới</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-urtaks">Tóm lại, với decorator này ta có thể triển khai Tool như sau:</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">"""Multiply two integers."""</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-1d4z8mf">Và dùng method <code>to_string</code> của <code>Tool</code> để tự động lấy text mô tả phù hợp cho 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-1wi09cq">Mô tả này được <strong>đưa vào</strong> system prompt. Xem ví dụ ban đầu sau khi thay thế <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-2hibqp">Trong phần <a href="actions">Actions</a>, ta sẽ học cách Agent <strong>Gọi</strong> Tool vừa tạo.</p> <hr> <p data-svelte-h="svelte-1kzl1bn">Tools đóng vai trò quan trọng trong việc nâng cao năng lực của AI agents.</p> <p data-svelte-h="svelte-1ifd4fz">Tóm lại, ta đã học:</p> <ul data-svelte-h="svelte-9grvc"><li><p><em>Tools là gì</em>: Các hàm mở rộng khả năng của LLM như tính toán hay truy cập dữ liệu ngoài</p></li> <li><p><em>Cách định nghĩa Tool</em>: Bằng cách cung cấp mô tả rõ ràng, đầu vào, đầu ra và hàm thực thi</p></li> <li><p><em>Tại sao Tools quan trọng</em>: Chúng giúp Agent vượt giới hạn của mô hình tĩnh, xử lý tác vụ thời gian thực và thực hiện hành động chuyên biệt</p></li></ul> <p data-svelte-h="svelte-t7lsbp">Giờ ta có thể chuyển sang <a href="agent-steps-and-structure">Agent Workflow</a> để xem cách Agent quan sát, tư duy và hành động. Đây là <strong>tổng hợp mọi thứ đã học</strong> và đặt nền móng để bạn tạo AI agent chức năng hoàn chỉnh.</p> <p data-svelte-h="svelte-d0h6bn">Nhưng trước hết, hãy cùng làm Kiểm tra nhanh!</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/vi/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_1ae7zjt = { | |
| assets: "/docs/agents-course/pr_545/vi", | |
| base: "/docs/agents-course/pr_545/vi", | |
| env: {} | |
| }; | |
| const element = document.currentScript.parentElement; | |
| const data = [null,null]; | |
| Promise.all([ | |
| import("/docs/agents-course/pr_545/vi/_app/immutable/entry/start.aedc0924.js"), | |
| import("/docs/agents-course/pr_545/vi/_app/immutable/entry/app.7987e38c.js") | |
| ]).then(([kit, app]) => { | |
| kit.start(app, element, { | |
| node_ids: [0, 22], | |
| data, | |
| form: null, | |
| error: null | |
| }); | |
| }); | |
| } | |
| </script> | |
Xet Storage Details
- Size:
- 42.1 kB
- Xet hash:
- eba2bab104026a18000d8836fdbab275850add48265f64994384188466df760d
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.