Skip to content

Instantly share code, notes, and snippets.

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

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

Select an option

Save aurotripathy/bffa7b2125594b75912dafc78ac16c30 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"attachments": {
"image.png": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAi0AAAGqCAIAAABI1uPYAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAACLaADAAQAAAABAAABqgAAAACL5tH0AABAAElEQVR4AezdCdx1U/UH8AwZQqaQKUOiMmVWksyRDJEIIUNCmYcM8QoZyxAyJIVkLkNShkhkHpJMJUNkJhUZ/1/233Y659zz3Ps895nus+7n/dx3n3XWXnvv37nPXnutvfY6473xxhvvik8gEAgEAoFAIDBMCIw/TO1Gs4FAIBAIBAKBwJsIhB6K30EgEAgEAoHAcCIQemg40Y+2A4FAIBAIBEIPxW8gEAgEAoFAYDgRCD00nOhH24FAIBAIBAKhh+I3EAgEAoFAIDCcCIQeGk70o+1AIBAIBEYyAv/9739bda/hVqsqreihh1ohE/RAIBAIBMY0AgcddNCHP/zhI488soTCyy+/fMghhyywwALf+973Srf6dzlenGPtH3BRKxAIBAKBHkbgjjvuWGKJJdZbb70zzzzzxhtvnHfeedNgX3/99RtuuOEzn/nMZz/72csuu+zyyy+fb775BojDhOqPGzdugFLGcvV99tlnLA8/fj8DfPrx+xkggLl6zGMZin4Uqr/DSy+9dJZZZjnhhBOuueaaSy65ZLbZZrvrrrsmmGCC2Wef/YorrphzzjmPPvropZdeWrk7ekinq53ox0jGYJX46aeHHr+f/v344/fTP9xa1YrfYStkmum1v8O//e1vc8wxx7vf/e7FFlvsuOOO+/73v//cc8+NN954U001FeKnPvWpiSeeeNZZZ33ooYeahbdzN/aH2kEpeAKBQCAQGFsITDTRRCIRaKMXXnjhiSee2GGHHW6//XYOuq9+9atPPvnkP//5zwcffPCVV16hkwaOy5t+ufgEAoFAIBAIBAJFBN7znvdcffXVCy644KuvvnrGGWesvvrq6e7OO+/MR7f55ptz3FFUn/70p4u1+lceanvouuuuG3/88Q899NBSd3fccUd0urdEj8veQ+BrX/uaZ73hhht2ZWjnn38+aX/4wx9Im3TSSXfaaad+i/3Nb36T5CQJA5TW725ExVGBwL777uuHd+utt1Z723DrwAMPVGuaaaapBj2fdtppbvk8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bLHF5JNPPuecc0477bSXXXbZmIbjfwf/1a9+9Q9/+MP/0uIqEOgOAqGHuoNjSOkBBPbcc89LLrnkuuuue/nlly+44IIpppiiBwbVrSFA5uGHH+6WtJATCBQRCD1URCPKYxcBxtAPfvCDXXfddeGFF55gggmWW265JZZYAhx/+tOfllpqqckmm+wjH/nIhRdeiPL000/PM8882GaeeeatttqK5XTEEUeg/+53v1tkkUU23nhjCmzRRRe96667Eponn3zyBz/4QcSVV145T+V/+9vf1l133amnnlr1HXfcMXG++uqrdOGss8461VRTbbLJJv/+978Tvfrdqi2ciy222IknnviJT3xi0kkn/dKXvoQywCF885vfNPbHHntsu+22U1h//fVzfw455JB55533zDPPzJQoBAL9QCD0UD9Aiyo9iMBDDz1k3l9yySWLY3vjjTe++MUvTjjhhBdddJGZneb4xz/+wVq69957d9lllxlnnPGOO+747ne/u++++6r1wgsv3HLLLc899xxbinNv9913R/zjH/+4+eabr7POOueee+7jjz++2WabJfmHHXbYM888w9N1xRVXzD///IloWqdCfJ911lluUWCJXv2ubSux3XPPPbQpPfqb3/zGcAY+hG984xvnn38+fUmswkEHHZT7Aw3q1kAyJQqBQD8QiLw+/QAtqvQgAk888YRRMUSKY7v//vsZEyb0ZZddlolzyimn/PrXv15xxRXxrL766jaQ3vve937mM595/vnnKadUcf/996dXXFJar732GhOKTHP3eOON9+ijj2666aYvvvgiS4VOoiEmmmgiptWCCy6Y6v7whz9caKGFXn/99SeffJJp9ZOf/OTrX/96sT+lcqktZlxiWHvttd1S/uQnP3nfffcNcAjUrY+usv8+/OEPF/uw2mqrTT/99CXlXWSIciDQDgJhD7WDUvD0PgIzzDCDQT777LPFoXJGuVxggQV8c6zNPvvsdEliMC/7TDzxxO9+97tRUnzd+OOP/9GPftSl73/+859sBRKoJUoIMclJMvfaay9eOAERc80119lnn+0utcQmU+uXb31Qsp2kXP1U28o8SVOmy4EPIYutFlhdzD66s3orKIFA+wiEHmofq+DsZQTsynCmXXPNNcVBvu9973PJKvJN0zzyyCOJUuQplpkyNn5QfNNStoW4s1J1xFRAUWYD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+fTTT8+XUQgE+oGArIbx6QiB0EMdwRXMPYLAQh/72HunmII99Lf/tYcmmmiiddZZ50NzzdUj44xhDAcCkcOwU9RDD3WKWPD3AgL2geZ56/Mf+0N//COF9M9//vNNw+iNN3pheDGGQGBUIRB6aFQ9ruhstxF4z3ves+QSS/j3+OOP33TzzTfeeOM0EaTQbZBDXiDQjEDEbTfjE3fHCgIzzDDDZ1dddd999snBcgsvvPBee+1VGn+V6GUTk0wyyRlnnIHzySefnGyyyRZbbLFSrZF2+ZOf/OTwww8fab2K/oxZBEIPjdlHHwPvA4E36nx0VaJYu//+978/+9nPiDv33HM5+gQ79CF6uG8LVb/++uuHuxfRfiDw/wiEHoqfQiAwUASWW2653//+988//zxttPrqqzeL23///aebbro55phj6623XmuttRLzww8//LnPfW7KKaecbbbZTjjhhES03b3VVlutsMIKU0899bbbbvviiy+iizjfc889Z5111qmmmmqTTTb597//nZivueaaxRdf/MQTT5xzzjnd+ulPf4q+++67zzLLLMy1+eab7xe/+AXKb3/724985CMnn3yycEEFn3/84x8NYs8+++xPfepTJOjwL3/5y9RWfAcC3UUg9FB38QxpYxGBSSeddMUVVzzuuOPuuusuOqkBgnvvvfdb3/rWrrvuethhh5155pl33303ZuHja665Jo1y0UUX7bbbblTOo48+iv7YY48df/zxa6yxBjfaj370I6oO8ZBDDqFsfJ911ll/+MMfaJTUnHO4Nre+//3vk08dTjHFFOgU22mnncb6IV8coD0wPsPzzz+fzE984hMKPu973/taiX3hhRc233zzVVZZ5Z577vnBD37A5Zjaiu9AoLsIhB7qLp4hbYwisO6669pMYgy9+93vboDgN7/5zYc//OFddtll7bXX/vznP584b7vttltuuYXZ8dBDD9EcH/jAByiPdOtjH/vY17/+daYSWyfpoR/+8IcLLbQQ1WUvapFFFqGiis0deuihjKTPfOYzqqB/85vfnH/++WlHMhlS9913H12iA9NOO62GFHyEDuKsFeuEr1raYpCtvPLKyyyzTLGtKAcC3UIg9FC3kAw5YxoBRsMCCyyw4YYbNqMgQJyLLPHQAanwt7/9TYGS4PjyWWKJJSiJdIvMVJh++umfe+45u1N0lRDz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H9MBBTJ9TjnllMT8mc98Rj+/8IUvvPbaa4ni++STT/7gBz8ImZVXXvnhhx9O9E984hNAmGeeedz68Y9/nJmjMBYQCD00Fp5yjLEJAXskZvkNNtjAyj2bRBTSr371q+OPP55uYDT861//IuKxxx47/fTT119//R/+8Ifunn322a3kvvDCC7fccguxBE4++eTUT+KccsopTzvtNHP6mmuuyYv1+OOPJ/qjjz568MEH/+c//znrrLOoH0qIbfGDH/zgRz/60Z/+9KevfOUr44//5p/qn//8ZxU/+9nP/va3v6UJttlmm1SdYnjmmWf+8Ic/XHHFFUaRiLXfX/va184///xZZ5112223Vdhuu+2w6a1WEr8+a0XZkHnteNX05N///vcxxxyTGIz9W9/61iabbOLuFltskRSkbh9yyCEYyPRZY401EvMRRxyx22673X777enSN925+eabGzuxhr/ZZpulWwCHzPe+9z23qNLYT8qIjYXChGNhkDHGQKABAU65JZdckoljea68yy67JGbWzOc+97nVVlvt2GOPvfrqq1dddVX0D3/4w4nh0ksvNelvtNFGDZLZWLTCyy+/zFZgEPBNsT/4r1hLH/jAB1599VUW2AwzzJAkUFE2bLL/itlhy8otnFtttVXiYShMNtlkbCkV2Rk//elPH3jggTnmmMOEbuKeaKKJ2BMLLrhgQ5emf+uDk6lnLA2c6daBBx5I4bECgZAorJlVVlllr732csn0ScS555772WefVS7JdJlUeGLzDWE230EHHWR0tO+mm2764osvTjrppG7RakBmmVFpdOFHP/rRXCsKvY1A2EO9/XxjdH0jwGQx+x911FFPPvnktddeS0+kOqZ7BdOlyZSpUSQqmyUzMd0qfbNg0kzq+5///GdyzTEFTOsMHYqNZFNwrrXccstlJYRIBX7+859fdtllzdrsg1deeQXxwQcf5JH75VsfvrUvfelLzz//PDqtQKvNOeechDdYabmtNgvUA4GYKa9k9yjrwyc/+ck2JVTZ2JR0c1KxHIwYUBJb0qDcgO7m5qoSgtJ7CIQe6r1nGiPqAIG//OUvlt4md54u2oKhYJJP9UU2p4Ldl7w2x5+IDJFsDdS2x6BR0S3fxNr2MIPbOPn973/Pp8dTx4LxyXXt7uSyAh3A+qFmOMSOPvro3/zmN4jvf//7ieIbzB8bM+hm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C2CCHAgEAoFAIDAkCIQeGhKYo5FAIBAIBAKBFgiEHmoBTJADgUAgEAgEhgSB0ENDAnM0EggEAoFAINACgdBDLYAJciAQCAQCgcCQIBB6aEhgrjTy29/+9o477qiQgzAMCLz40ks33HDD94444oorrxyG5qPJQGDMI9Czeujcc88db7zxdt5555H5iA899NBzzjlnZPZtjPTq9ddfv/e++047/fTDDjvsN5dd9vzzzz/66KNjZOwxzEBgRCHQs/nlLrzwwmmmmeaCCy4wy4woxKMzw47AM888c/0NN9x2221vvPHGyy+/rD+vvfbasPcqOhAIjFkEelMPWepefPHF+++//9Zbb33PPffMM888HvAiiyyy6KKL0k/jjz++hJhbbLEF4h577PHQQw/ddddd999//5prrnnCCSdMMskkrX4NZ5999tFHH82HM+OMMx5zzDGrrroqzocfflgrV1999VRTTbXnnntuueWWiJJpPvbYY2TefPPNG2ywAetn0kknNf1tsskmV1xxxUILLfTiiy/mVmrF5rvFwu67737aaac99dRTc8011wEHHLDGGmu0agu9JHaCCSY46KCDriy4ni699NJEqR0CCXvvvbcJ+pFHHqHOp5tuOr7EmWeemTtx/fXXX2KJJU4++eRi30ZR+aijj4ZGVfd4XvuOGzeKBhJdDQR6A4He1EPXXXfdc889RwEcd9xx5tBddtnF06KQzODHH3+8uzSHyXTyySenLU4//fRDDjlk9tln32abbczdG220Ue2jfeGFFzbffHOa4NRTT7377ruTuqLwaK8pp5zyoosu+uMf/7jtttuuttpqM800E7EaOuqoo7bbbrv11lsPzworrKAzd95555lnnnnVVVfRTEmN1Yqt7QCihugh8n/yk5+s83/t3VnIZVeVAGBoHKKiYCvGBwccEpwjQoImapLSDEVQiKZUqmJC9MGIVBCFFGK1HaNEIqhRRLRNk4gQgxEHkE4Z9cUJ7TjlIQiK04PggB0QtSP60F/X6l5u9xn+ff/x3vvv8/D/+6yz9rTuOXvtNe7LLsMhTj311NG+hs0+8YlPxEh++9vfPuYxj4n2DQPvnJoCHHqqW2+99dJLL/30pz/985//nPQA+Kc//Qnb1m80sop/rzl6tJKHYha4++VHjqzijPqYl4cCPaH7Jn6L9bQPEXqe//znP+IRj7jo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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 running on the \\\n",
"Furiosa RNGD (pronounced Renegade) LLM accelerator card. \\\n",
"Our goal is show the flow of a tool-calling LLM system. \\\n",
"We use the Llama-3.2-8B-Instruct model (running on RNGD) to demonstrate this. \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 LLM tool calling capability is important for Enterprise AI Apps. \\\n",
"To aid their generation, LLMs must be able to compute functions, make database-dips,\\\n",
"read rows/cols in spreadsheets, and draw charts & graphs (among other deterministic transformation on private data).\\\n",
"The sequence diagram below captures the flow of the code.\n",
"\n",
"![image.png](attachment:image.png)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from furiosa_llm import LLM, SamplingParams"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Create a custom tool that Llama will suggest you use to solve your task\n",
"We'll create a custom tool that adds two integer numbers.\\\n",
"Note, Llama will decide whether to invoke this tool (based on the prompt you provide) \\\n",
"You can create any custom tool; for demo purposes, here, we created one that adds two integers."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# our custom tool\n",
"def add_two_integers(x: int, y: int):\n",
" \"\"\"\n",
" Adds two integers\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 \n",
"Below, we define the system_prompt.\n",
"We could use a chat template, however we chose to expose the details of the prompt to illustrate the steps.\n",
"\n",
"The system prompt for tool calling as two components:\n",
"\n",
"`system instruction for tool calling`: This is the default system-level prompt. \\\n",
"It describes the tool-calling functionality and outlines its behaviour (including failure modes). \n",
"\n",
"`custom tool spec in JSON format`: This is the lilst of tools (function) the model can access.\\\n",
" In our example there's just one function `add_two_integers` with two input paramters. \\\n",
"\n",
"These two parts are combined to form the full system_prompt."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"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 question you, the user, will pose to the LLM and expect it to invoke the tool calling capability.\\\n",
"In this example, its \"What is the result of 12322 added to 1242453\"."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"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 of the LLM 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": null,
"metadata": {},
"outputs": [],
"source": [
"path = \"./Llama-3.1-8B-Instruct\"\n",
"llm = LLM.from_artifacts(path)\n",
"\n",
"# step 1 of 2\n",
"sampling_params = SamplingParams(max_tokens=20, top_p=0.3, top_k=100)\n",
"responses = llm.generate([prompt], sampling_params)\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 handed your app the function call; execute it locally on your server.\\\n",
"Note, the LLM has no means to execute it. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"model_tool_call_response = responses[0].outputs[0].text\n",
"tool_call = model_tool_call_response[1:-1] # remove outer square brackets\n",
"print(f'*** Call to be executed locally: ***\\n{tool_call}')\n",
"\n",
"# execute function locally\n",
"executed_response = eval(tool_call)\n",
"print(f'*** Local function execution result: ***\\n{executed_response}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Assemble the entire prompt\n",
"Now that you executed the extracted function locally and executed it, you're ready to construct the entire prompt and elicit a completion.\n",
"\n",
"We can combine all the components into the complete prompt for the final output. This includes:\n",
"\n",
"* The initial system prompt\n",
"* The user input\n",
"* The tool's response (including local execution of the response)\n",
"\n",
"These elements together form the full interaction for the model.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Step 2 of 2\n",
"prompt = f\"{prompt}<|python_tag|>{model_tool_call_response}<|start_header_id|>ipython<|end_header_id|>\\n\\n\"\n",
"prompt = prompt + f'\"{executed_response}\"<|eot_id|><|start_header_id|>assistant<|end_header_id|>\\n\\n'\n",
"print(f'***Print the assembled prompt from step 2: ***\\n\\n{prompt}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Finally, let's have the LLM generate a cogent answer to the user question\n",
"From the prompt above, have the LLM generate a cogent answer to the user question,\\\n",
"\"What is the result of 12322 added to 1242453\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"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's unpredictable hallucinations, this tool-calling answer is repeatable \\\n",
"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