AI大模型探索之路-實戰篇6: Function Calling技術調研之詳細流程剖析

系列篇章💥

AI大模型探索之路-實戰篇4:DB-GPT數據應用開發框架調研實踐
AI大模型探索之路-實戰篇5: Open Interpreter開放代碼解釋器調研實踐


目錄

  • 系列篇章💥
  • 一、前言
  • 二、Function Calling詳細流程剖析
    • 1、創建OpenAI客戶端
    • 2、定義函數
    • 3、創建數據參數對象
    • 4、對象轉化
    • 5、函數調用測試
    • 6、定義工具函數
    • 7、發送OpenAI 對話請求測試
    • 8、指定工具函數進行調用
    • 9、存儲返回的結果信息
    • 10、查看函數名稱和參數
    • 11、調用工具函數
    • 12、將第一次返回的結果合并到消息列表
    • 13、將functiona的信息合并到消息列表
    • 14、第二次OpenAI API調用
  • 三、Function Calling完整樣例
  • 四、結語


一、前言

繼之前對DB-GPT和Open Interpreter技術的深入調研,本文將轉向對OpenAI的Function Calling技術進行回顧與探討。此次分析的目的旨在為即將到來的智能數據分析平臺的順利落地做好充分的技術儲備。通過對Function Calling技術的深度剖析,我們希望建立更加堅實的理論基礎,并在此基礎上探索其在實際應用中的潛在價值和實施路徑。這將不僅有助于我們更好地理解語言模型如何與程序代碼交互,而且為未來的開發工作提供指導和靈感。

二、Function Calling詳細流程剖析

本章節旨在深入剖析從OpenAI客戶端的創建到數據參數的定義,再到函數的定義、調用以及最終結果的整理輸出的完整過程。這一詳盡的解析將幫助我們深入理解Function Calling技術的每一個細節和實際應用中的操作流程。

1、創建OpenAI客戶端

首先,我們需要創建一個有效的OpenAI客戶端。這包括獲取必要的API密鑰和配置環境參數。通過這個過程,我們可以確保在后續步驟中順暢地與OpenAI的服務器進行通信。

import openai
import os
import numpy as np
import pandas as pd
import json
import io
from openai import OpenAI
import inspect# 從環境變量中獲取OpenAI API密鑰
openai.api_key = os.getenv("OPENAI_API_KEY")# 使用API密鑰創建OpenAI客戶端實例
client = OpenAI(api_key=openai.api_key)

2、定義函數

定義了一個名為sunwukong_function的函數,該函數接受一個字符串類型的數據集作為參數,并將其轉換為pandas DataFrame對象。然后,它將DataFrame中的每個元素乘以10,并將結果轉換為JSON格式的字符串返回。

def sunwukong_function(data):"""孫悟空算法函數,該函數定義了數據集計算過程:param data: 必要參數,表示帶入計算的數據表,用字符串進行表示:return:sunwukong_function函數計算后的結果,返回結果為表示為JSON格式的Dataframe類型對象"""data = io.StringIO(data)df_new = pd.read_csv(data, sep='\s+', index_col=0)res = df_new * 10return json.dumps(res.to_string())

3、創建數據參數對象

接下來,我們需要定義數據參數。這些參數將作為輸入傳遞給Function Call函數,以生成相應的輸出結果。在本例中,我們將使用一個簡單的數學計算任務作為示例。

#創建了一個名為df的DataFrame對象,其中包含兩列數據x1和x2。
df = pd.DataFrame({'x1':[1, 2], 'x2':[3, 4]})
df

輸出
在這里插入圖片描述

4、對象轉化

#將df對象轉換為字符串類型。

df_str = df.to_string()
df_str

輸出
在這里插入圖片描述

5、函數調用測試

#將df字符串傳遞給sunwukong_function函數進行計算。最后,它將計算結果打印出來。

result_json=sunwukong_function(df_str)
result_json

在這里插入圖片描述

6、定義工具函數

# 定義一個工具函數
sunwukong={"type": "function","function": {"name": "sunwukong_function","description": "用于執行孫悟空算法函數,定義了一種特殊的數據集計算過程","parameters": {"type": "object","properties": {"data": {"type": "string","description": "執行孫悟空算法的數據集"},},"required": ["data"],},}}
# 放入工具列表
tools = [sunwukong]

7、發送OpenAI 對話請求測試

我們通過大模型的對話請求API進行確認,大模型是否能能正確找到對應的函數工具。

# 這段代碼定義了一個名為messages的列表,其中包含兩個字典對象。第一個字典對象表示系統角色,其內容為數據集data的描述信息;第二個字典對象表示用戶角色,其內容為執行孫悟空算法的請求。
messages=[{"role": "system", "content": "數據集data:%s,數據集以字符串形式呈現" % df_str},{"role": "user", "content": "請在數據集data上執行孫悟空算法"}
]
# 使用OpenAI API中的chat.completions.create方法來生成響應。該方法接受兩個參數:model和messages。model參數指定要使用的模型版本,這里使用的是gpt-3.5-turbo模型;messages參數是要發送給API的消息列表,這里傳入的是前面定義的messages列表。response =  client.chat.completions.create(model="gpt-3.5-turbo",messages=messages
)
# 從響應中提取出第一個選擇的消息,并將其打印出來。這個消息應該是由API根據輸入的數據集和請求生成的孫悟空算法的結果。
response.choices[0].message

輸出:

ChatCompletionMessage(content='抱歉,我不清楚您指的“孫悟空算法”是什么意思。請問您能提供更多關于該算法的背景或者說明嗎?這樣我才能幫助您更好地實現您的目標。', role='assistant', function_call=None, tool_calls=None)

當前對話中沒有設置工具函數,因此大模型并沒有找到自定義的工具函數

8、指定工具函數進行調用

我們再次進行大模型API調用,這一次我們指定功能工具函數tools,設置為自動選擇(tool_choice=“auto”,)讓模型自己檢查判斷是否需要調用工具函數。

messages=[{"role": "system", "content": "數據集data:%s,數據集以字符串形式呈現" % df_str},{"role": "user", "content": "請在數據集data上執行孫悟空算法"}
]
# 重新初始化消息列表后,設置tools參數和tool_choice,讓大模型自己選擇是否使用工具
# 不會直接執行function_call函數。這段代碼是調用OpenAI API的chat.completions.create方法,用于生成聊天機器人的回答。其中,model參數指定了使用的模型版本,messages參數傳入了要發送給API的消息列表,tools參數傳入了工具列表,tool_choice參數指定了選擇工具的方式。
response = client.chat.completions.create(model="gpt-3.5-turbo",messages=messages,tools=tools,tool_choice="auto",  )
# 查看消息結果,返回內容為空,但是找到返回了工具函數
response.choices[0].message

輸出:

ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_z16cI8SX4FkoW71SNV95hjIL', function=Function(arguments='{"data":"x1  x2\\n0   1   3\\n1   2   4"}', name='sunwukong_function'), type='function')])

從輸出結果可以看到,工具配置生效,大模型已經找到了工具函數

9、存儲返回的結果信息

將結果信息存儲到first_response

# 打印出消息,可以看到消息中已經找到了函數sunwukong_function
first_response = response.choices[0].message
first_response

輸出:

ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_z16cI8SX4FkoW71SNV95hjIL', function=Function(arguments='{"data":"x1  x2\\n0   1   3\\n1   2   4"}', name='sunwukong_function'), type='function')])

查看結果信息中的工具信息

response.choices[0].message.tool_calls

輸出:

[ChatCompletionMessageToolCall(id='call_z16cI8SX4FkoW71SNV95hjIL', function=Function(arguments='{"data":"x1  x2\\n0   1   3\\n1   2   4"}', name='sunwukong_function'), type='function')]

10、查看函數名稱和參數

將工具函數放入到字典中,再循環獲取到工具列表中的每一個函數的名稱,參數

#定義了一個名為available_tools的字典,其中包含了可用的工具函數
available_tools =  {"sunwukong_function": sunwukong_function,
}
#從API返回的回答中提取出工具調用信息,并遍歷每個工具調用。對于每個工具調用,獲取函數名、函數參數,并使用這些信息調用相應的工具函數。
tool_calls = response.choices[0].message.tool_callsfor tool_call in tool_calls:function_name = tool_call.function.namefunction_to_call = available_tools[function_name]function_args = json.loads(tool_call.function.arguments)function_response = function_to_call(**function_args)# 打印出函數名、函數參數和函數響應。
print(function_name)
print(function_args)
print(function_response)

輸出:
在這里插入圖片描述

11、調用工具函數

#調用工具函數并獲取其響應。它首先使用工具函數名和參數調用相應的工具函數,并將返回值存儲在名為function_response的變量中。然后打印出這個響應
function_response = function_to_call(**function_args)
function_response

輸出:
在這里插入圖片描述

12、將第一次返回的結果合并到消息列表

# 追加第一次模型返回結果消息
messages.append(first_response)  
messages

輸出:

[{'role': 'system','content': '數據集data:   x1  x2\n0   1   3\n1   2   4,數據集以字符串形式呈現'},{'role': 'user', 'content': '請在數據集data上執行孫悟空算法'},ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_z16cI8SX4FkoW71SNV95hjIL', function=Function(arguments='{"data":"x1  x2\\n0   1   3\\n1   2   4"}', name='sunwukong_function'), type='function')])]

13、將functiona的信息合并到消息列表

# 追加function返回消息
messages.append({"tool_call_id": tool_call.id,"role": "tool","name": function_name,"content": function_response,}
)
messages

輸出:

[{'role': 'system','content': '數據集data:   x1  x2\n0   1   3\n1   2   4,數據集以字符串形式呈現'},{'role': 'user', 'content': '請在數據集data上執行孫悟空算法'},ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_z16cI8SX4FkoW71SNV95hjIL', function=Function(arguments='{"data":"x1  x2\\n0   1   3\\n1   2   4"}', name='sunwukong_function'), type='function')]),{'tool_call_id': 'call_z16cI8SX4FkoW71SNV95hjIL','role': 'tool','name': 'sunwukong_function','content': '"   x1  x2\\n0  10  30\\n1  20  40"'}]

14、第二次OpenAI API調用

第二次調用大模型API,讓大模型幫忙整理響應信息

# 再次調用,由大模型重新整理工具函數返回的結果信息(主要是將結果信息整理的更加方便可視化)
second_response = client.chat.completions.create(model="gpt-3.5-turbo",messages=messages,
)print(second_response.choices[0].message.content)

在這里插入圖片描述

三、Function Calling完整樣例

完整的Function Calling函數使用代碼如下

from openai import OpenAI
import jsonopenai.api_key = os.getenv("OPENAI_API_KEY")client = OpenAI(api_key=openai.api_key)# Example dummy function hard coded to return the same weather
# In production, this could be your backend API or an external API
def sunwukong_function(data):"""孫悟空算法函數,該函數定義了數據集計算過程:param data: 必要參數,表示帶入計算的數據表,用字符串進行表示:return:sunwukong_function函數計算后的結果,返回結果為表示為JSON格式的Dataframe類型對象"""data = io.StringIO(data)df_new = pd.read_csv(data, sep='\s+', index_col=0)res = df_new['x1'] * 10return json.dumps(res.to_string())df_str=pd.DataFrame({'x1':[1, 2], 'x2':[3, 4]}).to_stringdef run_conversation():# 步驟1:將對話和可用函數發送給模型messages=[{"role": "system", "content": "數據集data:%s,數據集以字符串形式呈現" % df_str},{"role": "user", "content": "請在數據集data上執行孫悟空算法"}  ]tools = [{"type": "function","function": {"name": "sunwukong_function","description": "用于執行孫悟空算法函數,定義了一種特殊的數據集計算過程","parameters": {"type": "object","properties": {"data": {"type": "string","description": "執行孫悟空算法的數據集"},},"required": ["data"],},}}]response = client.chat.completions.create(model="gpt-3.5-turbo",messages=messages,tools=tools,tool_choice="auto",  # auto is default, but we'll be explicit)response_message = response.choices[0].messagetool_calls = response_message.tool_calls# 步驟2:檢查模型是否想要調用函數if tool_calls:# 步驟3:調用函數# 注意:JSON響應可能不總是有效的;確保處理錯誤available_functions = {"sunwukong_function": sunwukong_function,}  # 這個例子中只有一個函數,但您可以有多個函數messages.append(response_message)  # 將助手的回復擴展到對話中# 步驟4:將每個函數調用和函數響應的信息發送給模型for tool_call in tool_calls:function_name = tool_call.function.namefunction_to_call = available_functions[function_name]function_args = json.loads(tool_call.function.arguments)function_response = function_to_call(**function_args)messages.append({"tool_call_id": tool_call.id,"role": "tool","name": function_name,"content": function_response,})  # 將函數響應擴展到對話中second_response = client.chat.completions.create(model="gpt-3.5-turbo",messages=messages,)  # 從模型獲取新的響應,其中可以看到函數響應return second_response
result=run_conversation()
result.choices[0].message.content

輸出:
在這里插入圖片描述

# 使用StringIO將字符串轉換為文件對象
df_str='\\n    x1\\n0  10\\n1  20\\n.'
data = io.StringIO(df_str)# 使用read_csv()函數讀取數據,并設置第一列為索引
df_new = pd.read_csv(data, sep='\s+', index_col=0)
df_new

輸出:
在這里插入圖片描述

四、結語

本文深入探討了函數調用的全過程,詳細闡述了其每一個細節步驟。在回顧函數調用的實踐應用中,我們不僅加深了對其運作機制的理解,還體會到了其在編程實踐中的強大功能和靈活性。通過逐步剖析與實際操作的結合,本文檔旨在為讀者提供一個全面而實用的指南,以促進對函數調用概念的掌握及其在實際編程中的應用。希望讀者能夠借此更好地利用函數調用,優化代碼結構,提升開發效率。

在這里插入圖片描述

🎯🔖更多專欄系列文章:AIGC-AI大模型探索之路

如果文章內容對您有所觸動,別忘了點贊、?關注,收藏!加入我,讓我們攜手同行AI的探索之旅,一起開啟智能時代的大門!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15175.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15175.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15175.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PCL 法向量加權的RANSAC擬合分割平面

目錄 一、算法原理1、原理概述2、主要函數二、代碼實現三、結果展示四、相關鏈接本文由CSDN點云俠原創,原文鏈接。如果你不是在點云俠的博客中看到該文章,那么此處便是不要臉的爬蟲。 一、算法原理 1、原理概述

鴻蒙布局List簡介

鴻蒙布局List簡介 List--常見的布局容器List 創建方式創建方式一,通過Listitem創建方式二,通過ForEach和Listitem創建方式三,通過ListItemGroup List–常見的布局容器 List是在app開發中最常見的一種布局方式,例如通訊錄、新聞列…

Wpf 使用 Prism 實戰開發Day24

自定義詢問窗口 當需要關閉系統或進行刪除數據或進行其他操作的時候&#xff0c;需要詢問用戶是否要執行對應的操作。那么就需要一個彈窗來給用戶進行提示。 一.添加自定義詢問窗口視圖 (MsgView.xaml) 1.首先&#xff0c;添加一個自定義詢問窗口視圖 (MsgView.xaml) <Use…

域內攻擊 ----->約束非約束委派攻擊

在域中&#xff0c;除了我們常見的橫向移動以外&#xff0c;還有很多攻擊&#xff0c;像什么kerberoasting&#xff0c;委派攻擊&#xff0c;NTLMrelay啊...... 還有很多&#xff08;暫時只知道這些&#xff09; 以前在一篇公眾號看到的一個笑話也薈萃了網安的一些攻擊手法&am…

vscode終端運行pnpm,yarn不成功問題

vscode終端運行pnpm&#xff0c;yarn不成功問題 1.問題描述2.解決辦法 1.問題描述 全局安裝了pnpm后&#xff0c;cmd窗口執行pnpm -v可以查看版本信息&#xff0c;在項目目錄可以執行操作&#xff0c;但是在vscode中無法執行并報錯 2.解決辦法 以管理員身份運行vscode打開vscod…

《拯救大學生課設不掛科第二期之Windows11下安裝VC6.0(VC++6.0)與跑通Hello World C語言程序教程》【官方筆記】

背景與目標人群&#xff1a; 大學第一次學C語言的時候&#xff0c;大部分老師會選擇VC6這個編輯器。 但由于很多人是新手&#xff0c;第一次上大學學C語言。 老師要求VC6.0&#xff08;VC6.0&#xff09;寫C語言跑程序可能很多人還是第一次接觸電腦。 需要安裝VC6這個編輯器…

深入理解ECMAScript:JavaScript的規范與實踐

引言 在當今的Web開發領域&#xff0c;JavaScript幾乎無處不在。它不僅在客戶端編程中占據主導地位&#xff0c;而且在服務器端&#xff08;Node.js&#xff09;和移動應用開發中也越來越受歡迎。然而&#xff0c;JavaScript的核心并非由單一的公司或組織控制&#xff0c;而是…

初識Java--開啟我的Java學習之旅

目錄 一、JAVA語言概述二、JAVA語言的重要性2.1語言使用廣泛程度2.2工作領域2.3在校招崗位的需求2.4 java語言發展簡史2.5Java語言特性 三、初識java的main方法四、運行java程序五、【面試題】JDK、JRE、JVM之間的關系&#xff1f; 一、JAVA語言概述 Java是一種優秀的程序設計…

【Apache Doris】周FAQ集錦:第 4 期

【Apache Doris】周FAQ集錦&#xff1a;第 4 期 SQL問題數據操作問題運維常見問題其它問題關于社區 歡迎查閱本周的 Apache Doris 社區 FAQ 欄目&#xff01; 在這個欄目中&#xff0c;每周將篩選社區反饋的熱門問題和話題&#xff0c;重點回答并進行深入探討。旨在為廣大用戶和…

Redis常見數據類型(6)-set, zset

目錄 Set 命令小結 內部編碼 使用場景 用戶畫像 其它 Zset有序集合 普通指令 zadd zcard zcount zrange zrevrange ?編輯 zrangebyscore zpopmax/zpopmin bzpopmax/bzpopmin zrank/zrevrank zscore zrem zremrangebyrank zremrangebyscore Set 命令小結 …

鏈棧的存儲

單向鏈表在棧中的存儲 typedef struct StackNode {SElemType data;struct StackNode* next; }StackNode, *LinkStack; LinkStack S; //鏈棧初始化 void InitStack(LinkStack& S) {S NULL;return OK; } //判斷鏈棧是否為空 Status StackEmpty(LinkStack S) {if (S NU…

將具有傳統IP的設計遷移到Vivado設計套件

將具有傳統IP的設計遷移到Vivado設計套件 概述 AMD Vivado?設計套件允許您從CORE Generator?工具遷移IP設計。你可以 還可以將IP遷移到Vivado Design Suite的最新版本。 重要&#xff01;Vivado集成開發環境&#xff08;IDE&#xff09;要求IP、實例化和 端口名都是小寫的。將…

Spring 模擬管理Web應用程序

MVC&#xff1a;Model View Controller 1&#xff09;controller&#xff1a;控制層&#xff08;Servlet是運行服務器端&#xff0c;處理請求響應java語言編寫技術&#xff09; 2&#xff09;service&#xff1a;業務層&#xff08;事務&#xff0c;異常&#xff09; 3&#xf…

視頻號小店的保證金是多少錢?2024最新收費標準,一篇了解!

哈嘍~我是電商月月 現實社會&#xff0c;干什么都需要交錢&#xff0c;就連上班&#xff0c;路費也得掏錢 想要入駐視頻號小店&#xff0c;在視頻號里賣貨賺錢&#xff0c;就要繳納類目保證金 那到底要繳多少錢呢&#xff1f; 今天&#xff0c;月月就把最新的收費標準分享給…

輕松拿捏C語言——【字符串函數】的使用及模擬實現

&#x1f970;歡迎關注 輕松拿捏C語言系列&#xff0c;來和 小哇 一起進步&#xff01;? &#x1f389;創作不易&#xff0c;請多多支持&#x1f389; &#x1f308;感謝大家的閱讀、點贊、收藏和關注&#x1f495; &#x1f339;如有問題&#xff0c;歡迎指正 感謝 目錄 一、…

mysql 拼接兩個字段的值 使用CONCAT的函數

CONCAT()函數拼接兩個不用字段的值&#xff0c;最后在一個字段里面顯示出來&#xff0c;具體實例如下&#xff1a; 下面這個案例就行把SSSHENGBH、SSSBH、SSXBH、SSXZBH字段值拼接到一個字段里面進行顯示 select CONCAT(SSSHENGBH,SSSBH,SSXBH,SSXZBH) FROM BLT_JBXXJLB

3D 生成重建013-ProlificDreamer將SDS拓展到VSD算法進行高質量的3D生成

3D 生成重建013-ProlificDreamer將SDS拓展到VSD算法進行高質量的3D生成 文章目錄 0論文工作1論文方法2效果 0論文工作 **分數蒸餾采樣&#xff08;SDS&#xff09;**通過提取預先訓練好的大規模文本到圖像擴散模型&#xff0c;在文本到3d生成方面顯示出了巨大的前景&#xff0…

Windows VS2022 C語言使用 sqlite3.dll 訪問 SQLite數據庫

今天接到一個學生C語言訪問SQLite數據庫的的需求: 第一步,SQLite Download Page下載 sqlite3.dll 庫 下載解壓,發現只有兩個文件: 于是使用x64 Native Tools Command Prompt 終端 生成 sqlite3.lib 和 sqlite3.exp文件 LIB -def:sqlite3.def -out:sqlite3.lib -machin…

廣告圈策劃大師課:活動策劃到品牌企劃的深度解析

對于剛接觸營銷策劃的新人來說&#xff0c;在這個知識密集型行業里生存&#xff0c;要學習非常多各種意思相近的概念&#xff0c;常常讓人感到頭疼&#xff0c;難以區分。 這里對這些策劃概念進行深入解析&#xff0c;幫助您輕松理清各自的含義和區別。 1. 活動策劃&#xff…