Last active
December 16, 2024 20:53
-
-
Save aurotripathy/e68f3c7cf56d15fb023b44cc4cdf7c62 to your computer and use it in GitHub Desktop.
Furiosa RNGD Tool Calling Example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "attachments": { | |
| "image.png": { | |
| "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiAAAAGgCAIAAAAcs0sOAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAACIKADAAQAAAABAAABoAAAAADT6GpHAABAAElEQVR4AezdBbx1RfU3cJFQUlIQ6VS6uzskJKVBEJGSEJEOAWlpBSQkBEE6JQXp7m4QBAlBkFTer4z/ebd773PuOc+tc89d5/N8zjN79po1M7997qxZMWuP9Pnnn++3335fis+IIrDPPvuMaNMuaRe/n948yPj99Aa9Ytv4HRbRaLfcT7/DUdI4+ol7u5MccvTxm47fT29+tPH76Q161baxjlUxaaWm/36HX26l+6AJBAKBQCAQCATaRSAETLuIBX0gEAgEAoFASwgMtIC5/fbbv/zlLx922GGl0e20007qX3jhhVJ9XHYfAj/60Y886w033LBPpnbRRRfhdscdd+A2+uij77zzziPM9tprr018EodechvhYUTDIYHAvvvu64d3//33V0fb5NZBBx2k1fjjj//xxx+XGp511llu+bz55pulW0P3cqAFzKeffiqswKcE2SeffFKtLNHEZRcg8NFHH5177rme9YUXXvjuu+/2fkb/+TF98cFqiimmmGCCCUaY55ZbbnnEEUfk5r3klvlEoSsR+Pe//+13Vzu1JrfQa/XOO+9cfvnlpbZnnnlm+iU3YluiHxKXAy1ghgQoMcj+Q4DC8fe//33vvff+8MMPf//73/dtR08++eTuu+/eVzz7lltfjSr4dAECI400EnFSnMhrr712/fXXpxp3i7eGdLkTBcxll10299xzf/WrXx133HGXW265hx56KEN83HHHzT777GOMMcbiiy9+9tlnp3qq5TzzzPO3v/1t/fXXn3DCCd94441MH4VOQ+D000//5je/uddee33jG9847bTT8vCuueYaD92jXGyxxcYee+zppptuu+22I4QQfPbZZ24dcsghm2yyibbMCyuttNLjjz+e2+bC/PPPf9RRR6VLvwdWOFqIX4ufB4Up1dseYjX99NOPNtpoOlp++eWff/752267TRevvvrqddddp3DTTTchLnK78847/RR1bdjf/e53n3322cQNW/R33XXXsssuO+aYY7orIKebdqBpmvHdtwisu+66V1111dtvv53Z/u53v6P3rLPOOmq66ffTcQLmiSeeWGONNd57772f/exnG2200S233LLyyiuDHu42pxYdf8M77LADHdNdT0X966+/fu+996633nr+2qeaaqqvfOUr+bFFoaMQeOWVV6zg/rpGGWWUtddem8PD404jZHe+7777PNMPPvhgm222mXrqqW0mvvOd77jr780tvwd/k34ba6655o033rjgggs+99xzpdndc889L730ksp//vOf8803H1vcIosssvnmm9se6o4Mc4sEwoqo2GWXXVTyu2y11VZkw4wzzjjqqKPa1iiQSSgzt5tvvpnYu/vuuzfeeONVVlnlyiuvJFRS72nYpAvTOd8Stw37+6WXXloaWFwGAkUEbH04BYoaPIXGb8x+qEjWBeWOEzAWHTtWrjB/qMceeyybOLeNP+YXX3xReYsttrj66qvd9cc/xxxzFMPeBQg8+uij6r/2ta91wYPpyimcccYZ9gq2Amb3ve99z3dRiXG56KKLCgM5+OCDrfs/+MEPbrjhBoUEhaXfbsNP4uSTT7aC898gS7eq37/+9a/9Hk444QRbEE0YH5gdNER5wQUX8NPgfOCBB5566qkrrLACPy21GOVEE01EICnMO++8RZ677rqr5n6ZhNNJJ51Ew9Z78egAsffHP/7x8MMPJ3s0/NOf/lRsHuVAoITADDPMYANEX0/1jDQPPvig3VWJrAsuO07AsEuAdeutt95///2tNVaZv/71rwwmFhcyn2Xjii8+1p1ZZpnlmWeeIVTSY2B1mXbaabvgkXTxFH77299ONtlktMy33nrLM/36179u4/avf/0rT/nHP/4xy1W6tKwrUFbS5WqrrebPMpVpDHPOOWe+lSqL327ZZ2y22Wap8lvf+haTWopdvPjii/1sKCuPPPLIKaecQi+xoSm2LZUpQ+xja621Fs0m3WIrI4GKvX//+9/PHTHSFk0fJW5xGQgkBCgxDLPJ1krS2D/5jXUfOAMtYFgSgFj9kxZcpN7db3/72+eccw7vC+1koYUW8ue6xx572PYmi4RFh9kkfZKXjPhJT4WdvfseTzfNyJ/TU089xUpGUfBYSRfeMsYre/88TVInl6eZZhplmmuqKe0e3M23cpNccGvKKackRXKNrQnB5tIPhq9unHHGmXXWWQXHV3+KuUkqGDAbXal33NRn0TjJJJPk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0aUIECo/+MEPxhprrGmmmWaCCSa47rrrunSi/53WM888s9Zaaw3pOXbBFIY0/j0OPgRMjxAFwXBBYI899rjqqqtuv/32Tz755NJLLx177LG7e+ZvvfXWBRdcMKTn2AVTGNL49zj4EDA9QhQEwwIB6suvf/3rn/70p3PNNdfII4+81FJLzT///Gb+6KOPLrzwwmOOOea3v/3tyy67TI1FbcYZZ0T2zW9+c6uttqLrHHXUUer//Oc/zz333JtssgnJNM888zz22GMJuFNPPXXaaadVufzyy7/88sup8oUXXlhnnXXGG288zXfaaadU+dlnnxFyk08++bjjjrvpppt+8MEHqb72+/zzz19sscW++tWvTj311FdeeSUa0lG/pGOi32uvvQxPubavOeaYwwDcNS+f008/PbW64oorZptttjHGGMP0H374YZUbbbTRggsuOM4442y99daTTDLJ6quv3mRgu++++4Ybbggc9BtvvPFHH32U2BqMW2pMbfrpp//LX/6ivorMWWedpS+YrLDCCh4BnO+66y6UgP3hD3846aSTTjbZZCeffHLi2WgK6W58dwICIWA64SnEGAYfgZdeesm6ucACCxSH8vnnn6+77rqjjDLK5ZdfvtBCC1mR//rXv1rBn3rqqV122eUb3/jGQw89dOSRR+67775a/eMf/7jvvvv+/ve/037Y2X72s5+ptEZvscUWLFF0hddff33zzTdP/A8//PC33377jjvuuOGGG2adddZUeeihh1o9fZ933nluWX9TffVbX9iuuOKKTz75JLlI/qFZdNFFXZIQyjxJv/rVr4xZubYvXejI3Yu++Ky22mrKjz/+OPmx8sor/+lPf5puuum22WYbleTTt771rW233fakk046++yzrfi33nqr+trPa6+9hma99dY75ZRTrr76alIwkb366quHHHLIP//5T/3+5Cc/AWwtMjDB4ZxzzvnjH/9IfJKXSZyYF24nnngiEUXOvf/++9jWTqF2VFE5WAhEqpjBQj767SwE3njjDQOyvy4Oi4mfBnPttdcuueSSFjvb/GuuuWbZZZdFs+qqq3LS2Kfba7/77rtZbzjggAMIDJek0b/+9S9KD54HH3zwSCONZJHdbLPNPvzww9FHH52wsciONtpoNumzzz576tSiPOecc/773//+29/+Zs9+xhlnbLfddsXx5PKXv/xl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AoFAIBBoF4EQMO0iFvSBQCAQCAQCLSEQAqYlmIIoEAgEAoFAoF0EQsC0i1jQBwKBQCAQCLSEQAiYlmAKokAgEAgEAoF2EQgB0y5iQR8IBAKBQCDQEgIhYFqCKYgCgUAgEAgE2kUgBEy7iAV9IBAIBAKBQEsIhIBpCaYgCgQCgUAgEGgXgRAw7SIW9IFAIBAIBAItIRACpiWYgigQCAQCgUCgXQRCwLSLWNAHAoFAIBAItIRACJiWYAqiQCAQCAQCgXYRCAHTLmJBHwgEAoFAINASAiFgWoIpiAKBQCAQCATaRSAETLuIBX0gEAgEAoFASwiEgGkJpiAKBLoMgeeee+6cc865/fbb+3tef//73y+44ILPP/+8vzsK/h2IQAiYDnwoMaSBRsAKONJII/3kJz8Z6I4Hqb+jjz567rnn/v3vf3///ff31RCeeeaZtdZaq8ot1f/73/+u3oqarkcgBEzXP+KYYM8IXHbZZeOPP/6ll17aM2lXUPzhD3/Ya6+9Lr744q233rqvJvTWW2+R01Vus84661NPPTXyyCNXb0VN1yMQAqbrH3FMsAcEbK6vuOKKAw444Omnn37yyScTtQ3+D3/4w0knnXSyySY7+eSTU+Xuu+++4YYbzjXXXOOMM87GG2/80UcfNWL95z//GYdNNtlk7LHHnmeeeR577LFE+bOf/QzDr371q7PMMssll1ySm1vuMcdz3HHHnX766f/yl7+wKdGolMcYY4z55puPoSkRG+pss82mcv7553/44YdT5QsvvLDOOuuMN954E0wwwU477ZTZVgv77bfft7/97TvvvPPwww9X2G233dDcfffdukjE11133TLLLKN81113malRTTjhhMsuu+xDDz2UCMCl7XTTTWcW5vjEE0+on2OOOQxAAU+f008/PRGvsMIKxrn22mv/61//SjW+Tz311GmnnRYyyy+//Msvv5zqF1poISDMOOOMbv32t7/NxFEY0giEgBnSjy8G3wcI8ENYvjfYYAN77azEkDRXX331iSeeaNG3zX///ff19Nprr5199tnrrbfeKaec4u7555/fqPt//OMf9913H7YYjjXWWORKovza17521llnWaxXX311BqXXX3891b/66quHHHLIP//5z/POO49cIV1oA7/+9a9PO+20Rx999Pvf//6Xv/yfP9XHH39cw5VXXvlPf/qTJX6b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AqaMSFwPXQRakRxVeTN05xsjDwQ6HIEwkXX4A4rhBQKBQCAwVBEIATNUn1yMOxAIBAKBDkcgBEyHP6AYXiAQCAQCQxWBEDBD9cnFuAOBQCAQ6HAEQsAMzgP605/+9NBDDw1O39FrIBAIBAIDgkDXCpgLLrhgpJFG+slPfjIgMLbdyWGHHfaHP/yh7WYd0OCZZ55Za621OmAgMYRAIBDodAS6VsBcdtll448//qWXXtrpT2Coje+tt94ivIfaqGO8gUAgMAgIdKeA+fe//33FFVcccMABTz/99JNPPplwnXvuuX/4wx9OOumkk0022cknn5wqd9999w033HCuueYaZ5xxNt54448++qjJQzj//PMXW2yxr371q1NPPfWVV16ZKF9++eVVVlnla1/72pRTTnnSSSelSoctttpqq2WWWWa88cbbdtttP/zwQ/Vvv/32qquuOtZYYy266KKvv/56k47c+tnPfmac+pplllkuueSSRLzQQgvttddeM84447TTTvvb3/42VX7++ecUtemnn36MMcaYb775/v73v//xj39ccskli/xzDVhmm202lPPPP//DDz+caeadd16Y4D/66KOvv/76ub5UmGOOOdZZZx2V3/7ic/rppyeCU0891ZDGHnvs5ZdfHiClVsVLc7/llltSjZE8+OCDytUpJILa0WpumkY7zTTTjDvuuL/73e+K/KMcCAQCnYNAdwqY22+/3Tq7wQYbzDrrrFmJIWmuvvrqE088kSDZeuut33//fY/htddeO/vss9dbb71TTjnFXSKk0bP5xz/+scUWW6y44or4/PrXvx5zzDFRkmSrr776Bx98cPnll++6665kyauvvprY6mi11VY744wzTjvttFtvvVXlr371q0ceeeT3v//9ggsueO+99zbqKNWTWGeddRY/Df5MUkkg6VrlL3/5SzU77bSTdRkxfcJ49PLoo49+//vf//KXv0wC8fG88cYbuYubbrrJWvz444/jtvLKK7s73XTTbbPNNpkA55/+9KdLLbXUtddeu8ACC+T6UuG888479NBDVV70xccElQkqyBiSkRjn5ptvXmpVvHzsscfee++9VAMN0ClXp6Cy0Wg9uLvvvvu4447be++9zz33XFKtyD/KgUAg0DkIdKeAYR+zSlJKbKiVM9ybbLIJbePAAw8kHm6++eZU/61vfWuXXXZZe+21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" | |
| } | |
| }, | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Tool Calling with Llama 3.1 and Furiosa RNGD\n", | |
| "This notebook highlights the tool-calling capabilities of the Llama 3.1 models executing on the \\\n", | |
| "Furiosa RNGD LLM accelerator card. \\\n", | |
| "Our goal is show the flow of a tool-calling system. \\\n", | |
| "We use the Llama-3.2-8B-Instruct model.\n", | |
| "\n", | |
| "This notebook is inspired by the notebook at the link below \\\n", | |
| "https://github.com/huggingface/huggingface-llama-recipes/blob/main/tool_calling/tool_calling.ipynb\n", | |
| "\n", | |
| "The tool calling capability is important to Enterprise AI. \\\n", | |
| "We expect enterprise LLMs to compute functions, make database-dips,\\\n", | |
| "read rows/cols in spreadsheets, draw charts & graphs, etc.\\\n", | |
| "The sequence diagram below captures the flow of the code below.\n", | |
| "\n", | |
| "" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "/home/furiosa/.local/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", | |
| " from .autonotebook import tqdm as notebook_tqdm\n", | |
| "2024-12-12 10:38:38,841\tINFO util.py:154 -- Missing packages: ['ipywidgets']. Run `pip install -U ipywidgets`, then restart the notebook server for rich notebook output.\n", | |
| "Xformers is not installed correctly. If you want to use memory_efficient_attention to accelerate training use the following command to install Xformers\n", | |
| "pip install xformers.\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "from furiosa_llm import LLM, SamplingParams" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Create a custom tool of your choice that Llama will invoke (if warrented)\n", | |
| "We'll create a custom tool that adds two integer numbers.\\\n", | |
| "You can create any custom tool, here we created on that adds two integers" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 2, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# our custom tool\n", | |
| "def add_two_integers(x: int, y: int):\n", | |
| " \"\"\"\n", | |
| " Adds two integer numerals\n", | |
| "\n", | |
| " Args:\n", | |
| " x: An integer\n", | |
| " y: An integer\n", | |
| " \"\"\"\n", | |
| " return x + y" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Create the System Prompt and the Custom Tool spec \n", | |
| "Below, we define the system_prompt.\n", | |
| "We could use a chat template, we're doing it manually to illustrate the steps.\n", | |
| "\n", | |
| "The system prompt for tool calling is made up of two key components:\n", | |
| "\n", | |
| "`system instruction for tool calling`: This is the default system-level prompt. It describes the tool-calling functionality and outlines its workflow. \n", | |
| "\n", | |
| "`custom tool spec in JSON format`: This is the tool (function) the model can access (e.g., the `add_two_integers` function in our example).\n", | |
| "These two parts are combined to form the complete system_prompt." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 3, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "*** Tool calling system prompt + custom tool spec: ***\n", | |
| "<|start_header_id|>system<|end_header_id|>\n", | |
| "\n", | |
| "You are an expert in composing functions. You are given a question and a set of possible functions.\n", | |
| "Based on the question, you will need to make one or more function/tool calls to achieve the purpose.\n", | |
| "If none of the function can be used, point it out. If the given question lacks the parameters required by the function,\n", | |
| "also point it out. You should only return the function call in tools call sections.\n", | |
| "\n", | |
| "If you decide to invoke any of the function(s), you MUST put it in the format of [func_name1(params_name1=params_value1, params_name2=params_value2...), func_name2(params)]\n", | |
| "You SHOULD NOT include any other text in the response.\n", | |
| "\n", | |
| "Here is a list of functions in JSON format that you can invoke.[\n", | |
| " {\n", | |
| " \"name\": \"add_two_integers\",\n", | |
| " \"description\": \"Adds two integer numerals\",\n", | |
| " \"parameters\": {\n", | |
| " \"type\": \"dict\",\n", | |
| " \"required\": [\"x\", \"y\"],\n", | |
| " \"properties\": {\n", | |
| " \"x\": {\n", | |
| " \"type\": \"integer\",\n", | |
| " \"description\": \"An integer\"\n", | |
| " },\n", | |
| " \"y\": {\n", | |
| " \"type\": \"integer\",\n", | |
| " \"description\": \"An integer\"\n", | |
| " },\n", | |
| " }\n", | |
| " }\n", | |
| " }\n", | |
| "]<|eot_id|><|start_header_id|>user<|end_header_id|>\n", | |
| "\n", | |
| "\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "system_instruction_for_tool_calling = \"\"\"\\\n", | |
| "<|start_header_id|>system<|end_header_id|>\n", | |
| "\n", | |
| "You are an expert in composing functions. You are given a question and a set of possible functions.\n", | |
| "Based on the question, you will need to make one or more function/tool calls to achieve the purpose.\n", | |
| "If none of the function can be used, point it out. If the given question lacks the parameters required by the function,\n", | |
| "also point it out. You should only return the function call in tools call sections.\n", | |
| "\n", | |
| "If you decide to invoke any of the function(s), you MUST put it in the format of [func_name1(params_name1=params_value1, params_name2=params_value2...), func_name2(params)]\n", | |
| "You SHOULD NOT include any other text in the response.\n", | |
| "\n", | |
| "Here is a list of functions in JSON format that you can invoke.\"\"\"\n", | |
| "\n", | |
| "custom_tool = \"\"\"\\\n", | |
| "[\n", | |
| " {\n", | |
| " \"name\": \"add_two_integers\",\n", | |
| " \"description\": \"Adds two integer numerals\",\n", | |
| " \"parameters\": {\n", | |
| " \"type\": \"dict\",\n", | |
| " \"required\": [\"x\", \"y\"],\n", | |
| " \"properties\": {\n", | |
| " \"x\": {\n", | |
| " \"type\": \"integer\",\n", | |
| " \"description\": \"An integer\"\n", | |
| " },\n", | |
| " \"y\": {\n", | |
| " \"type\": \"integer\",\n", | |
| " \"description\": \"An integer\"\n", | |
| " },\n", | |
| " }\n", | |
| " }\n", | |
| " }\n", | |
| "]\"\"\"\n", | |
| "\n", | |
| "\n", | |
| "system_prompt = f\"{system_instruction_for_tool_calling}{custom_tool}<|eot_id|><|start_header_id|>user<|end_header_id|>\\n\\n\"\n", | |
| "\n", | |
| "\n", | |
| "print(f'*** Tool calling system prompt + custom tool spec: ***\\n{system_prompt}')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Add the user prompt\n", | |
| "This is the two-number-addition question you'll pose to the LLM and expect it to invoke the tool calling capability" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 4, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "*** Prompt after adding the user prompt: ***\n", | |
| "<|start_header_id|>system<|end_header_id|>\n", | |
| "\n", | |
| "You are an expert in composing functions. You are given a question and a set of possible functions.\n", | |
| "Based on the question, you will need to make one or more function/tool calls to achieve the purpose.\n", | |
| "If none of the function can be used, point it out. If the given question lacks the parameters required by the function,\n", | |
| "also point it out. You should only return the function call in tools call sections.\n", | |
| "\n", | |
| "If you decide to invoke any of the function(s), you MUST put it in the format of [func_name1(params_name1=params_value1, params_name2=params_value2...), func_name2(params)]\n", | |
| "You SHOULD NOT include any other text in the response.\n", | |
| "\n", | |
| "Here is a list of functions in JSON format that you can invoke.[\n", | |
| " {\n", | |
| " \"name\": \"add_two_integers\",\n", | |
| " \"description\": \"Adds two integer numerals\",\n", | |
| " \"parameters\": {\n", | |
| " \"type\": \"dict\",\n", | |
| " \"required\": [\"x\", \"y\"],\n", | |
| " \"properties\": {\n", | |
| " \"x\": {\n", | |
| " \"type\": \"integer\",\n", | |
| " \"description\": \"An integer\"\n", | |
| " },\n", | |
| " \"y\": {\n", | |
| " \"type\": \"integer\",\n", | |
| " \"description\": \"An integer\"\n", | |
| " },\n", | |
| " }\n", | |
| " }\n", | |
| " }\n", | |
| "]<|eot_id|><|start_header_id|>user<|end_header_id|>\n", | |
| "\n", | |
| "What is the result of 12322 added to 1242453<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n", | |
| "\n", | |
| "\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "user_prompt = \"What is the result of 12322 added to 1242453\"\n", | |
| "\n", | |
| "prompt = f\"{system_prompt}{user_prompt}<|eot_id|><|start_header_id|>assistant<|end_header_id|>\\n\\n\"\n", | |
| "\n", | |
| "print(f'*** Prompt after adding the user prompt: ***\\n{prompt}')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Use Llama 3.1 to generate the completion based on the prompt\n", | |
| "Now you're ready to execute step 1 generation\\\n", | |
| "This step completes the prompt you just created \\\n", | |
| "and should return the function call with the appropriate paramters filled in." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 5, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "INFO:2024-12-12 10:38:39 Prefill buckets: [Bucket(batch_size=1, attention_size=512), Bucket(batch_size=1, attention_size=1024)]\n", | |
| "INFO:2024-12-12 10:38:39 Decode buckets: [Bucket(batch_size=64, attention_size=2048), Bucket(batch_size=128, attention_size=2048)]\n", | |
| "INFO:2024-12-12 10:38:39 For some LLaMA V1 models, initializing the fast tokenizer may take a long time. To reduce the initialization time, consider using 'hf-internal-testing/llama-tokenizer' instead of the original tokenizer.\n", | |
| "/home/furiosa/.local/lib/python3.10/site-packages/huggingface_hub/file_download.py:797: FutureWarning: `resume_download` is deprecated and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use `force_download=True`.\n", | |
| " warnings.warn(\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "***Response from step 1:\n", | |
| "[add_two_integers(x=12322, y=1242453)]\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "path = \"./Llama-3.1-8B-Instruct\"\n", | |
| "llm = LLM.from_artifacts(path)\n", | |
| "\n", | |
| "# step 1 of 2\n", | |
| "sampling_params = SamplingParams(min_tokens=10, top_p=0.3, top_k=100)\n", | |
| "responses = llm.generate([prompt], sampling_params)\n", | |
| "\n", | |
| "\n", | |
| "for response in responses:\n", | |
| " print(f'***Response from step 1:\\n{response.outputs[0].text}')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Execute the function call locally\n", | |
| "Now that the LLM has given you he function call, execute it locally. \\\n", | |
| "Note, the LLM has no way to execute it. " | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 6, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "*****To be used in step 2:\n", | |
| "[add_two_integers(x=12322, y=1242453)]\n", | |
| "Local function execution result:\n", | |
| "1254775\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "model_tool_call_response = responses[0].outputs[0].text\n", | |
| "print(f'*****To be used in step 2:\\n{model_tool_call_response}')\n", | |
| "\n", | |
| "# function executed locally\n", | |
| "tool_call_response = str(add_two_integers(x=12322, y=1242453))\n", | |
| "print(f'Local function execution result:\\n{tool_call_response}')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Assemble the entire prompt\n", | |
| "Now that you executed the extracted function locally, you're ready to construct the entire prompt and elicit a completion" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "***Print the assembled from from step 2:\n", | |
| "\n", | |
| "<|start_header_id|>system<|end_header_id|>\n", | |
| "\n", | |
| "You are an expert in composing functions. You are given a question and a set of possible functions.\n", | |
| "Based on the question, you will need to make one or more function/tool calls to achieve the purpose.\n", | |
| "If none of the function can be used, point it out. If the given question lacks the parameters required by the function,\n", | |
| "also point it out. You should only return the function call in tools call sections.\n", | |
| "\n", | |
| "If you decide to invoke any of the function(s), you MUST put it in the format of [func_name1(params_name1=params_value1, params_name2=params_value2...), func_name2(params)]\n", | |
| "You SHOULD NOT include any other text in the response.\n", | |
| "\n", | |
| "Here is a list of functions in JSON format that you can invoke.[\n", | |
| " {\n", | |
| " \"name\": \"add_two_integers\",\n", | |
| " \"description\": \"Adds two integer numerals\",\n", | |
| " \"parameters\": {\n", | |
| " \"type\": \"dict\",\n", | |
| " \"required\": [\"x\", \"y\"],\n", | |
| " \"properties\": {\n", | |
| " \"x\": {\n", | |
| " \"type\": \"integer\",\n", | |
| " \"description\": \"An integer\"\n", | |
| " },\n", | |
| " \"y\": {\n", | |
| " \"type\": \"integer\",\n", | |
| " \"description\": \"An integer\"\n", | |
| " },\n", | |
| " }\n", | |
| " }\n", | |
| " }\n", | |
| "]<|eot_id|><|start_header_id|>user<|end_header_id|>\n", | |
| "\n", | |
| "What is the result of 12322 added to 1242453<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n", | |
| "\n", | |
| "<|python_tag|>[add_two_integers(x=12322, y=1242453)]<|start_header_id|>ipython<|end_header_id|>\n", | |
| "\n", | |
| "\"1254775\"<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n", | |
| "\n", | |
| "\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "# Step 2 of 2\n", | |
| "# setting up the prompt for step 2\n", | |
| "prompt = f\"{prompt}<|python_tag|>{model_tool_call_response}<|start_header_id|>ipython<|end_header_id|>\\n\\n\"\n", | |
| "prompt = prompt + f'\"{tool_call_response}\"<|eot_id|><|start_header_id|>assistant<|end_header_id|>\\n\\n'\n", | |
| "print(f'***Print the assembled from from step 2:\\n\\n{prompt}')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Finally, have the LLm generate a cogent answer \n", | |
| "From the prompt above generate a cogent answer" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Completing the step 2 prompt...\n", | |
| "The result of 12322 added to 1242453 is 125477\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "# Generation in step 2\n", | |
| "print(f'Completing the step 2 prompt...')\n", | |
| "responses = llm.generate([prompt], sampling_params)\n", | |
| "for response in responses:\n", | |
| " print(response.outputs[0].text)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Note that, in spite of LLM hallucinations, this answer is repeatable which is a requirement in Enterpise AI applications as they go about computing functions \\\n", | |
| "making database-dips, extracting rows/columns/cells from spreadsheets, drawing charts and graphs, etc." | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [] | |
| } | |
| ], | |
| "metadata": { | |
| "kernelspec": { | |
| "display_name": "Python 3", | |
| "language": "python", | |
| "name": "python3" | |
| }, | |
| "language_info": { | |
| "codemirror_mode": { | |
| "name": "ipython", | |
| "version": 3 | |
| }, | |
| "file_extension": ".py", | |
| "mimetype": "text/x-python", | |
| "name": "python", | |
| "nbconvert_exporter": "python", | |
| "pygments_lexer": "ipython3", | |
| "version": "3.10.12" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 2 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment