Skip to content

Instantly share code, notes, and snippets.

@aurotripathy
Last active December 16, 2024 20:53
Show Gist options
  • Select an option

  • Save aurotripathy/e68f3c7cf56d15fb023b44cc4cdf7c62 to your computer and use it in GitHub Desktop.

Select an option

Save aurotripathy/e68f3c7cf56d15fb023b44cc4cdf7c62 to your computer and use it in GitHub Desktop.
Furiosa RNGD Tool Calling Example
Display the source blob
Display the rendered blob
Raw
{
"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+KuUkqGDAbXal33NRn0TjJJJPkVukXni+jEAjUIkCDZygmWixu3MlMr11pevlvqphaCPqj0gYWW+aLEvNkxEgxpqD3sRix1x9zzDEMYpaG9Dds+5k3kokDhg888IAyq3qJZ1x2FALJGsayxFGRBvaPf/zj5z//uXpO+1TDM5/HzM2mnMOOS4cD3M23cpNcsEEpiR8aMFnCzL3iiivazfzmN79ZcsklhQxQPvyocsNqgSxUSeUq3jJOv7eRRx45VRbDfrrJQ1uccpT7FgHbLAEmRItttOiSvjoW1reD7D23gdZgUlSPWNW0fKQJkBBEjk0iX+uhhx5KhLBxs4cwlLGYo2GjnGuuuRQYOpg70kc8knievGEs/pH3Hpfg0LcIMDSdd9557M4ClHnX04cVlJ2TQyXblHJkoN7R+55tttnSSIgBTFKZ3kNgUEHSZfV75pln5u3nkEu3/AEvtdRSYkAEjNE8mM78PZMuNo+lg3JV8UCQTD755Nrm3okubn8uwGq/URMItI4Ap8vTTz8tcMlWyb6n9YZDiHKgNRjyYM899xQPtsACCwjmYehg+zrggANAlk4wWBroLsL1mC9sdUkRt5i8xe0ss8wylifbTzKfWZzPH4cU8DOEEB+eQ7VAiwysujE32GCD3XbbjV89KaAe91hjjcXx7g/P74HaiiAhxp7mB+CgPsMU/zyH3E9+8pNGYIozpKPYfwgEQM/nT3JoO95449mI8NKTNxQabn+bG5Y0ccaEn9+ScMQTTzyRDZb4ycz96vgCl156aUMVOe0H7Bg2n18miMKwRYD+XbTxwiH/YpvcSnCtuuqqTLWOW9lJF825XQWmPzzxWr4H7OMPm9WLESPj6M+eKSwPwPIB93SXTkPSWCPcZaYQV5qcwBNPPDHjBhuL+iOPPBKxYOXMYcAKAwzdgM2rrY5aAYE1gMWZkChxprla8S3uSXfZfvvt/Rg8TZWcaoKY0ZMlalZffXWxXulXkaIDEivasEohXi5tX3bcccdU788+eXHc9XM6/vjjUz1XP4eqSsQkVjo3I+jZXWFgfm9uEYclbgLSkq3MXVo4dSpxS5FpxGG69M30semmm+bL5oVWoGvOIe5mBAYYzEY7DIeomtz6xS9+4SdkD52GneJQuCfTZQpsqf6Z5Dn2U6H/oPvPIYP+494EDmKG7sLQ4Vu5RGlNUS/ah75SvaWecaNUPyiXgwLdoMy0Sad9AkISMM67iEq3p3PaP/eYBAztQc3LL7/M9pVv9VjgLKn+wN5//31d+E7NGc0cvumRFQK99+0ff59A18rIhwNNgDnCT7n/oBtoExnpnT4cpA7T+fxfxf/8T2FscqsU0vM/LeNiiCNA0cnhyNWppCCRan2jGmpH1jwyDTWl2EXRGpZpagvt9l7LJCoDgeGDwEA7+YcPsjHTEUAgIjVGALRoEgh0LAKDpsF0LCIxsEFBwDkAZqta3ZQ661aEoQ/Kc4lOA4HeIPBfAVPMe9Ebdn3eVjrskfqcaTDsawTi99PXiAa/EUEgfocjglp/thmJX6g/+feW97777bfvPvv0lku0H64IxO9nuD75zpr3sP0dhg+ms36IMZpAIBAIBLoGgRAwXfMoYyKBQCAQCHQWAiFgOut5xGgCgUAgEOgaBELAdM2jjIkEAoFAINBZCISA6aznEaMJBAKBQKBrEAgB0zWPMiYSCAQCgUBnIRACprOeR4wmEAgEAoGuQSAETNc8yphIIBAIBAKdhUAImM56HjGaQCAQCAS6BoEQMF3zKGMigUAgEAh0FgIhYDrrecRoAoFAIBDoGgRCwHTNo4yJBAKBQCDQWQiEgOms5xGjCQQCgUCgaxAIAdM1jzImEggEAoFAZyEQAqaznkeMJhAIBAKBrkEgBEzXPMqYSCAQCAQCnYVACJjOeh4xmkAgEAgEugaBEDBd8yhjIoFAIBAIdBYCIWA663nEaAKBQCAQ6BoEQsB0zaOMiQQCgUAg0FkIhIDprOcRowkEAoFAoGsQCAHTNY8yJhIIBAKBQGchEAKms55HjCYQCAQCga5BIARM1zzKmEggEAgEAp2FQAiYznoeMZpAIBAIBLoGgRAwXfMoYyKBQCAQCHQWAiFgOut5xGgCgUAgEOgaBELAdM2jjIkEAoFAINBZCISA6aznEaMJBAKBQKBrEBilo2ay3377lcYz0pe+VK1Es88++5Qo4zIQCAQCgUCgoxDoLAEDmlYkR63I6ShYYzCDgkD1hxEblEF5ENFpIJAQ6DgBEw8mEOgNArFB6Q160TYQ6FsEwgfTt3gGt0AgEAgEAoH/IhACJn4KgUAgEAgEAv2CQAiYfoE1mAYCgUAgEAiEgInfQCAQCAQCgUC/IBACpl9gDaaBQCAQCAQCIWDiNxAI/A8Cn3766Ysvvvjxxx//T21cBAKBQPsIhIBpH7No0aUIECo/+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",
"![image.png](attachment:image.png)"
]
},
{
"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
}
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment