作者:donx
GPTs全景解析 GPTs 是什么
GPTs 是 AI target=_blank class=infotextkey>OpenAI 在2023年11月發(fā)布的新版本,具有可定制性和完成特定任務(wù)的強(qiáng)大功能。它提供了一種新的方式來使用ChatGPT,可以讓用戶根據(jù)自己的需求定制化,并與其他用戶共享。
以下是OpenAI 對(duì)它的能力介紹。
You can now create custom versions of ChatGPT that combine instructions, extra knowledge, and any combination of skills. (現(xiàn)在您可以創(chuàng)建定制版的ChatGPT,將指令、額外知識(shí)和任意技能組合起來。)
GPTs 提供了一種更智能、更個(gè)性化的體驗(yàn),無需每次都進(jìn)行教育,使用戶能夠更快地獲得答案。它可以通過組合指令、額外知識(shí)和任意技能,來適應(yīng)各種場景。用戶可以通過OpenAI的平臺(tái)創(chuàng)建自己的GPT,并與其他用戶共享。
但是 GPTs 提供的方式是讓所有人都可以得到定制版的ChatGPT,用戶可以根據(jù)自己的生活,工作,學(xué)習(xí)等不同的場景,制定適合自己的ChatGPT,并且可以和其他人進(jìn)行共享。
任何人都可以通過OpenAI的平臺(tái)搭建自己的GPTs,用戶不需要懂得編程或者技術(shù),只要擁有自己的idea,就可以創(chuàng)建屬于自己的GPTs。
創(chuàng)建GPT的過程簡單且直觀。用戶可以通過對(duì)話形式,為GPT提供指令和額外的知識(shí)庫,然后選擇所需的能力,例如聯(lián)網(wǎng)、繪圖、分析數(shù)據(jù)等。這可以在OpenAI的搭建平臺(tái)上進(jìn)行嘗試。
例如,OpenAI 提供了如下一些GPTs,例如
- 數(shù)據(jù)分析GPTs: 支持上傳文件,并且執(zhí)行代碼進(jìn)行數(shù)據(jù)分析
- Game Time GPTs:支持對(duì)桌游或者卡牌游戲進(jìn)行解釋等
OpenAI 提供了 GPTs 商店(暫時(shí)還沒有第三方的GPTs)方便用戶進(jìn)行 GPTs 的分享和使用。GPTs 的引入方便了用戶可以更大限度地使用OpenAI ChatGPT 的能力。
- 可以快速地根據(jù)自己的需求定制 ChatGPT
- OpenAI 相信最好的GPTs,肯定是由社區(qū)創(chuàng)建的,所以它選擇成為一個(gè)平臺(tái),只有最終的基礎(chǔ)的插件或者功能它會(huì)開發(fā),其他的能力均由開發(fā)者研發(fā)。
- 開發(fā)者可以將將GPT和內(nèi)部數(shù)據(jù)庫等進(jìn)行連接,從而獲取數(shù)據(jù)
- 企業(yè)版用戶可以創(chuàng)建內(nèi)部的GPTs
登陸 OpenAI 網(wǎng)站,選擇 Explore,然后再 My GPTs 中選擇 create a GPTs.
有兩種方式可以進(jìn)行GPTs 的創(chuàng)建:
- 通過對(duì)話的方式進(jìn)行,選擇 Create
- 通過配置的方式進(jìn)行,選擇 Configure
只需要將需要的配置進(jìn)行設(shè)置,就能得到一個(gè)想到的GPTs的能力。
例如下面設(shè)置的一個(gè)游戲GPTs,我們通過配置,使得GPT可以進(jìn)行數(shù)據(jù)分析,并且可以使用
- Web Browsing:網(wǎng)頁瀏覽能力
- Code Interpreter:代碼編寫以及執(zhí)行能力
下圖是這個(gè)數(shù)據(jù)分析助手的一個(gè)demo情況,用戶可以在兩三分鐘內(nèi)快速實(shí)現(xiàn)一個(gè)AI助手。
GPTs 的問題與漏洞
- GPTs 安全性存在一定的問題,網(wǎng)上有針對(duì)GPTs提示詞泄露攻擊,并且可以得到結(jié)果。具體可以查看 OpenAI 的 GPTs 提示詞泄露攻擊與防護(hù)實(shí)戰(zhàn)
- GPTs 暫無私有化部署,并且在微軟 Azure API 中不支持
- AI 的數(shù)據(jù)安全問題是無法保證的,目前有傳言認(rèn)為 Sam 的出走是因?yàn)樵诋a(chǎn)品商業(yè)化和AI安全性的選擇導(dǎo)致的(參考)。
Assistants API 允許用戶在自己的應(yīng)用中通過API實(shí)現(xiàn)類似 GPTs 的 AI 助理,目前支持的能力和GPTs一樣(截止2023年11月12日),允許接入三種不同類型的 tools:
- 代碼解釋器(Code Interpreter)
- 知識(shí)庫集成(Retrieval)
- 函數(shù)調(diào)用(Function calling)
通過構(gòu)建 AI 助手,用戶可以通過指令(instructions)設(shè)置助手的角色和能力。然后,AI 助手將利用其強(qiáng)大的大語言模型能力、各種工具(tools)和知識(shí)庫來回答用戶的問題。
Assistants API實(shí)踐案例
用戶可以通過Assistant playground 進(jìn)行Assistants API 的探索,參考以下教程使用 API 進(jìn)行 AI Assistant 集成。
通常進(jìn)行 Assistants API 集成需要一下四個(gè)步驟:
- 首先創(chuàng)建一個(gè)AI助手 (Assistant)。
- 通過自定義指令(custom instructions)進(jìn)行 AI 助手能力定義,實(shí)現(xiàn) AI 助手的形象和能力定位。
- 選擇基礎(chǔ)模型,可以選擇 GPT-3.5、GPT-4 等作為基礎(chǔ)模型。
- 選擇擴(kuò)展能力 tools 例如 code interpreter, retrieval 以及其他的 function call 工具。
- 創(chuàng)建一個(gè)對(duì)話(Thread) 進(jìn)行一個(gè)交流。
- 在對(duì)話中傳入消息(Messages),進(jìn)行提問。
- 在對(duì)話中進(jìn)行執(zhí)行(Run),AI Assistant 會(huì)自動(dòng)運(yùn)行相關(guān)的tools。
下面的例子會(huì)一步一步進(jìn)行AI Assistant的構(gòu)建。
步驟 1: 創(chuàng)建一個(gè)AI助手
一個(gè) AI assistant 可以通過下面的幾個(gè)參數(shù)進(jìn)行配置:
- 指令(Instructions): 針對(duì)AI助手和模型,定制他們的表現(xiàn)和響應(yīng)行為。
- 模型(Model): 提供了各種供選擇的 GPT-3.5 或者 GPT-4 模型,包括自己進(jìn)行精細(xì)調(diào)校的模型。如果希望使用信息檢索工具(Retrieval tool),則需要采用 gpt-3.5-turbo-1106或者 gpt-4-1106-preview模型。
- 工具(Tools): Assistant API 支持使用OpenAI自行開發(fā)的 Code Interpreter 編碼解釋器以及 Retrieval 召回工具。
- 函數(shù)(Functions): API 支持用戶使用自定義的函數(shù)作為額外工具使用,類似 Open AI 的 function calling 特性。
在這個(gè)例子中,我們會(huì)創(chuàng)建一個(gè)自己的數(shù)學(xué)導(dǎo)師,使用到 Code Interpreter 能力:
# Upgrade to Python/ target=_blank class=infotextkey>Python SDK v1.2 with pip install --upgrade openai assistant = client.beta.assistants.create( name="Math Tutor", # 助手的名字 instructions="You are a personal math tutor. Write and run code to answer math questions.", #助手能力 tools=[{"type": "code_interpreter"}], #助手的工具 model="gpt-4-1106-preview" #模型選擇 ) 步驟 2: 創(chuàng)建一個(gè)對(duì)話 Thread
一個(gè) Thread 就代表了一個(gè)對(duì)話。OpenAI 建議每個(gè)用戶在開始對(duì)話的時(shí)候都創(chuàng)建一個(gè) Thread,把所有用戶相關(guān)的內(nèi)容和文件都通過在 Thread 創(chuàng)建Message完成。
可以將 Thread 理解為與 AI 助手創(chuàng)建的一個(gè)對(duì)話窗口,所有的對(duì)話行為都在這個(gè)Thread 中進(jìn)行。
thread = client.beta.threads.create
Threads 本身并無大小限制,因此你可以在單個(gè) Thread 對(duì)話中發(fā)送任意數(shù)量的消息(Messages)。API 會(huì)自動(dòng)對(duì)請(qǐng)求的消息進(jìn)行適當(dāng)?shù)奶幚恚源_保請(qǐng)求滿足模型的最大窗口長度限制,如通過截?cái)嗟确绞竭M(jìn)行調(diào)整。
步驟3: 在對(duì)話(Thread) 中傳入 消息(Message)
一個(gè)消息可以包含用戶的文本輸入,還有可能包含用戶上傳的文件。盡管目前還不支持圖片,但OpenAI將在不久的將來添加這一功能。
message = client.beta.threads.messages.create( thread_id=thread.id, #需要傳入的Thread ID role="user", content="I need to solve the equation `3x + 11 = 14`. Can you help me?" )
如果現(xiàn)在你展示在對(duì)話Thread 中的所有消息,你會(huì)看到這條消息被加入到了對(duì)話中:
{ "object": "list", "data": [ { "created_at": 1696995451, "id": "msg_4rb1Skx3XgQZEe4PHVRFQhr0", "object": "thread.message", "thread_id": "thread_34p0sfdas0823smfv", "role": "user", "content": [{ "type": "text", "text": { "value": "I need to solve the equation `3x + 11 = 14`. Can you help me?", "annotations": [] } }], ... 步驟 4: 執(zhí)行AI助手
為了得到AI 助手的結(jié)果,你需要?jiǎng)?chuàng)建一個(gè) Run對(duì)象,這使得AI 助手可以獲取對(duì)話的消息,并決定是使用工具(tools)回答用戶的問題,還是僅僅依賴模型自身的能力進(jìn)行問題解答。
當(dāng) AI 得到答案,會(huì)在對(duì)話(Thread)的消息列表中加入角色(*role="assistant"*)的一個(gè)回復(fù)。
run = client.beta.threads.runs.create( thread_id=thread.id, assistant_id=assistant.id, instructions="Please address the user as Jane Doe. The user has a premium account." ) 步驟5: 展示AI 助手的回復(fù)
當(dāng)我們需要獲取AI回復(fù)的時(shí)候,可以對(duì) Run對(duì)象進(jìn)行不斷的查詢,獲取當(dāng)前執(zhí)行的狀態(tài)。
run = client.beta.threads.runs.retrieve( thread_id=thread.id, run_id=run.id )
當(dāng)狀態(tài)碼 == completed時(shí),代表AI已經(jīng)完成回復(fù),并且可以在Thread 中看到AI的回答。
messages = client.beta.threads.messages.list( thread_id=thread.id )
最后我們就可以把內(nèi)容展示給用戶,下面是一個(gè)例子。AI給出了兩個(gè)回答(role== assistant)
可以通過運(yùn)行步驟 Run Steps,獲取執(zhí)行的中間狀態(tài),從而提供給用戶中間結(jié)果以及使用的tools等信息。
步驟*: Playground 今天調(diào)試和測試
開發(fā)者可以在 Playground 中進(jìn)行調(diào)試和測試,具體如下,其具體的能力和GPTs比較相似,只是可以看到更多的debug信息。也是可視化的具體界面。
Assistants API工作機(jī)制剖析
Assistant API 的目標(biāo)是幫助開發(fā)者更高效地開發(fā)出功能強(qiáng)大的AI助手,這些助手可以有效地利用OpenAI提供的多項(xiàng)能力以及用戶自身構(gòu)建的工具。
- AI 助手可以調(diào)用 OpenAI 的模型,并通過特定的指令來定義助手的行為特性和能力。
- AI 助手可以同時(shí)調(diào)用多個(gè)工具tools,這些工具可以是 OpenAI 自己開發(fā)的工具,例如 like Code interpreter 和 Knowledge retrieval 也可以是用戶自己通過 Function calling自己實(shí)現(xiàn)的工具。這樣,AI助手就能拓寬其解決問題的能力范圍。
- AI 助手可以訪問持久化的對(duì)話,新引入的對(duì)話Thread功能簡化了AI應(yīng)用的對(duì)話管理工作。用戶只需要?jiǎng)?chuàng)建一次對(duì)話(Thread),就可以在后續(xù)快速地訪問并與其進(jìn)行對(duì)話,并輕松獲取答案,這樣就無需再關(guān)心模型對(duì)對(duì)話窗口的限制。
- AI 助手可以訪問多種類型的文件。 AI助手可以在初始化創(chuàng)建時(shí)訪問文件,或是在對(duì)話初始化的時(shí)候獲取文件。它也可以在使用工具時(shí)創(chuàng)建新的文件,然后在之后的調(diào)用中引用這些文件。
從我們上述的講解內(nèi)容中,我們可以很清楚,AI助手API的調(diào)用主要由 Assistant、Thread、Message、Run 和 Run Step 這五個(gè)對(duì)象組成
對(duì)象(OBJECT)含義助手對(duì)象(Assistant)調(diào)用 OpenAI 模型的任務(wù)型 AI,該AI 具備訪問 tools 的能力對(duì)話(Thread)用戶和AI之間的對(duì)話。Thread 對(duì)話存儲(chǔ)消息,并且自動(dòng)處理文本長度超出限制的問題消息(Message)消息由用戶或者AI產(chǎn)生,可以包含文本,圖片(暫時(shí)不支持),或者文件。消息在一個(gè)Thread對(duì)話中以有序列表形式存儲(chǔ)執(zhí)行(Run)通過AI助手對(duì)某個(gè)對(duì)話進(jìn)行顯式執(zhí)行。AI助手根據(jù)自身的配置信息和Thread中的消息內(nèi)容,調(diào)用不同的工具(tools),從而得出回復(fù)。執(zhí)行得到的結(jié)果會(huì)被存儲(chǔ)在Thread的消息中,作為AI的回復(fù)執(zhí)行步驟(Run Step)執(zhí)行(Run)的中間過程詳細(xì)記錄。包括AI使用了哪些tool,或者產(chǎn)生了哪些消息。這個(gè)對(duì)象可以幫助開發(fā)者理解AI如何得出最終的結(jié)果
創(chuàng)建一個(gè)AI Assistant 對(duì)象
創(chuàng)建一個(gè)AI 助手對(duì)象非常簡單,只需要指定使用的語言 model,然后通過instruction 指令規(guī)定AI 助手的性格以及能力(或者是目標(biāo))。
- name: AI 助手的名字
- instructions: 該參數(shù)指定了AI的性格以及目標(biāo)或者能力,這個(gè)很重要,會(huì)影響AI助手的輸出可靠性。
- tools:list,可以傳入最多128個(gè)tools,可以使用 OpenAI 自己的 Code Interpreter 和 retrieval 工具,或者是自己構(gòu)建的第三方 functioncalling.
- file_ids: list,文件的ID,這里傳入的文件ID 可以將文件傳給Code Interpreter 和 retrieval使用。文件需要通過File的上傳接口 進(jìn)行上傳,并且需要將接口的purpose設(shè)置成 assistants. 一個(gè)AI 助手可以使用最多20個(gè)文件。每個(gè)文件最多512M。
文件上傳:
file = client.files.create( file=open("speech.py", "rb"), purpose='assistants' )
AI助手創(chuàng)建:
assistant = client.beta.assistants.create( name="Data visualizer", instructions="You are great at creating beautiful data visualizations. You analyze data present in .csv files, understand trends, and come up with data visualizations relevant to those trends. You also share a brief text summary of the trends observed.", model="gpt-4-1106-preview", tools=[{"type": "code_interpreter"}], file_ids=[file.id] ) 管理對(duì)話和消息
對(duì)話(Thread)和消息(Messages)代表了AI 助手和用戶的聊天。一個(gè)對(duì)話中消息的個(gè)數(shù)是沒有限制的,一旦消息的內(nèi)容超過了模型可以處理的最長的窗口長度,Thread會(huì)自動(dòng)舍棄最舊的消息,包含盡可能多的消息內(nèi)容。(注意,該策略O(shè)penAI可能會(huì)更新)
Thread 和 Messages 的創(chuàng)建如下:
thread = client.beta.threads.create( messages=[ { "role": "user", "content": "Create 3 data visualizations based on the trends in this file.", "file_ids": [file.id] } ] )
messages 可以有如下兩種角色(role):
- user: 用戶消息
- assistant: AI 助手的回復(fù) messages消息可以包含文本,圖片,以及文件。但是目前的API暫時(shí)不支持圖片消息,相信很快就能支持
消息注解Message annotationsAI 助手返回的消息可能會(huì)包含 Message annotations,存儲(chǔ)在content 的對(duì)象中。注解(Annotations)提供了如何解析消息的信息;
目前支持兩種不同的注解:
- file_citation: 該注解是 retrieval工具提供的,它定了了參考的內(nèi)容的來源。
- file_path:該注解是 code_interpreter工具提供,指定了參考文件的地址目錄。
當(dāng)返回的內(nèi)容有注解的時(shí)候,我們需要進(jìn)行解析,將其轉(zhuǎn)化成用戶可以理解的文本,例如下面的代碼可以將參考文本以及下載鏈接進(jìn)行解析,方便用戶理解回復(fù)。
# Retrieve the message object import openai as client message = client.beta.threads.messages.retrieve( thread_id="...", message_id="..." ) # Extract the message content message_content = message.content[0].text annotations = message_content.annotations citations = [] # Iterate over the annotations and add footnotes for index, annotation in enumerate(annotations): # Replace the text with a footnote message_content.value = message_content.value.replace(annotation.text, f' [{index}]') # Gather citations based on annotation attributes if (file_citation := getattr(annotation, 'file_citation', None)): cited_file = client.files.retrieve(file_citation.file_id) citations.Append(f'[{index}] {file_citation.quote} from {cited_file.filename}') elif (file_path := getattr(annotation, 'file_path', None)): cited_file = client.files.retrieve(file_path.file_id) citations.append(f'[{index}] Click to download {cited_file.filename}') # Note: File download functionality not implemented above for brevity # Add footnotes to the end of the message before displaying to user message_content.value += 'n' + 'n'.join(citations) 執(zhí)行(Run)和執(zhí)行步驟(Run Steps)
當(dāng)我們需要AI Assistant 對(duì)用戶問題進(jìn)行回復(fù),,需要?jiǎng)?chuàng)建一個(gè)Run對(duì)象,該對(duì)象包含了兩個(gè)參數(shù):
- thread_id: 之前創(chuàng)建的Thread的id
- assistant_id: 該AI Assistant 的id
通常情況下,我們?cè)趧?chuàng)建 Assistant 對(duì)象的時(shí)候,已經(jīng)指定了model和tools,但是我們?nèi)钥梢栽趧?chuàng)建執(zhí)行對(duì)象(Run)的時(shí)候,進(jìn)行重新指定。
run = client.beta.threads.runs.create( thread_id=thread.id, assistant_id=assistant.id, model="gpt-4-1106-preview", instructions="additional instructions", tools=[{"type": "code_interpreter"}, {"type": "retrieval"}] )
注意:file_ids不可以在執(zhí)行中進(jìn)行修改,需要使用修改Assistant的API進(jìn)行修改
執(zhí)行的生命周期(Run lifecycle)
Run對(duì)象有不同的狀態(tài)
獲取進(jìn)度 Polling for updates
為了可以及時(shí)獲取執(zhí)行的進(jìn)度,可以設(shè)置定時(shí)獲取 retrieve the Run 執(zhí)行狀態(tài)。你可以獲取每次 Run 的執(zhí)行狀態(tài),從而決定下一步該做什么。 目前還不支持 streaming 的輸出(2023-11-12日)
對(duì)話鎖 Thread locks當(dāng)執(zhí)行對(duì)象 Run處于進(jìn)行中 in_progress的狀態(tài)的時(shí)候,對(duì)話Thread 對(duì)象會(huì)被鎖上,這意味著:
- 新消息不能加到對(duì)話中
- 新的執(zhí)行Run 不能被創(chuàng)建
執(zhí)行步驟 Run steps
當(dāng)執(zhí)行進(jìn)入 in_progress后,會(huì)有下面四種可能的狀態(tài),分別是
- 完成
- 失敗
- 取消
- 超時(shí)
執(zhí)行步驟Run steps可能耗時(shí)比較長,為了能了解執(zhí)行的細(xì)節(jié),我們可以通過 step_details這個(gè)字段進(jìn)行觀察,包含了兩種類型的內(nèi)容:
- message_creation: 展示了產(chǎn)生了什么消息
- tool_calls: 展示了使用了什么tool
目前是beta 版本,將會(huì)持續(xù)解決后續(xù)這些如下問題
- 支持流式輸出
- 支持通知的功能,可以在無需輪詢的情況下共享對(duì)象狀態(tài)更新
- 支持 DALL·E 作為工具
- 支持用戶上傳圖片
Code Interpreter(代碼解釋器) 允許 Assistant API 去創(chuàng)建并且執(zhí)行代碼。這個(gè)代碼解釋器能力,支持多種文件處理,以及代碼執(zhí)行。
代碼解釋器能夠通過代碼運(yùn)行,完成多種困難的任務(wù),并且能解決很多GPT地薄弱能力,例如數(shù)學(xué)能力等。Code Interpreter 支持如果發(fā)現(xiàn)自己的代碼執(zhí)行失敗了,會(huì)通過多輪重試,直到執(zhí)行成功。
開啟Code Interpreter
如果需要開啟 Code Interpreter 能力,只需要在tools參數(shù)中加入 Code Interpreter, 如 tools=[{"type": "code_interpreter"}]即可。
import openai as client assistant = client.beta.assistants.create( instructions="You are a personal math tutor. When asked a math question, write and run code to answer the question.", model="gpt-4-1106-preview", tools=[{"type": "code_interpreter"}] )
模型之后會(huì)選擇是否使用 Code Interpreter 去運(yùn)行用戶的請(qǐng)求。
在 Code Interpreter 中傳入文件
Code Interpreter 可以解析多種不同類型的文件,所以當(dāng)你需要處理大量的數(shù)據(jù)時(shí),AI Assistant 允許你傳入自己的文件進(jìn)行分析。
注意:上傳的文件需要設(shè)置 purpose='assistants'
# Upload a file with an "assistants" purpose import openai as client file = client.files.create( file=open("speech.py", "rb"), purpose='assistants' ) # Create an assistant using the file ID assistant = client.beta.assistants.create( instructions="You are a personal math tutor. When asked a math question, write and run code to answer the question.", model="gpt-4-1106-preview", tools=[{"type": "code_interpreter"}], file_ids=[file.id] )
如果需要指定 對(duì)話級(jí)別的文件訪問(即改文件只在這個(gè)對(duì)話中可以被訪問),則可以使用如下的代碼:
thread = client.beta.threads.create( messages=[ { "role": "user", "content": "I need to solve the equation `3x + 11 = 14`. Can you help me?", "file_ids": [file.id] } ] )
文件最大可以支持512 MB,z支持的格式包含 .csv, .pdf, .json 和其他格式
知識(shí)庫獲取 Knowledge Retrieval
知識(shí)庫獲取是克服 ChatGPT 知識(shí)儲(chǔ)備時(shí)效性問題,以及數(shù)據(jù)私有化的有效手段,例如利用知識(shí)庫獲取能力,可以把業(yè)務(wù)數(shù)據(jù)知識(shí)庫集成到GPT中。
開發(fā)者可以將文件(知識(shí)庫)上傳到AI 助手中,Open AI 會(huì)自動(dòng)化對(duì)文檔進(jìn)行分塊,加索引(index)以及embedding存儲(chǔ)和實(shí)現(xiàn)向量化檢索。
所以不需要用戶自己進(jìn)行這一系列操作就可以完成知識(shí)庫檢索的能力。
開啟知識(shí)庫檢索
Assistant 如果需要開啟知識(shí)庫增強(qiáng),只需要在初始化中的 tools加入 tools=[{"type": "retrieval"}]參數(shù)。
assistant = client.beta.assistants.create( instructions="You are a customer support chatbot. Use your knowledge base to best respond to customer queries.", model="gpt-4-1106-preview", tools=[{"type": "retrieval"}] ) 工作原理
模型會(huì)自動(dòng)地根據(jù)你的輸入進(jìn)行內(nèi)容的選擇,主要的召回邏輯如下:
- 短文檔直接傳入GPT
- 對(duì)于長文檔進(jìn)行向量化召回
跟 ChatGPT 的 Completion API 一樣,Assistant API 也支持 function calling。 Function Calling 允許你將函數(shù)的描述告訴AI 助手,包含了函數(shù)的定義以及參數(shù)等,然后 AI 助手會(huì)智能調(diào)用。
但是 Assistant API 不會(huì)直接調(diào)用函數(shù),而是將函數(shù)的參數(shù)和函數(shù)返回,等待你提交函數(shù)調(diào)用結(jié)果,才會(huì)進(jìn)行下一步的執(zhí)行。
定義函數(shù)
首先需要按照如下的樣例遞交函數(shù)定義
{ "type": "function", # 類型一定是function "function": { "name": "getCurrentWeather", # 函數(shù)名 "deion": "Get the weather in location", #函數(shù)的描述 "parameters": { # 函數(shù)的參數(shù) "type": "object", "properties": { "location": {"type": "string", "deion": "The city and state e.g. San Francisco, CA"}, "unit": {"type": "string", "enum": ["c", "f"]} }, "required": ["location"] } } }
然后將函數(shù)的參入 Assistant API的tools 參數(shù)中。例如下面的例子,定義了一個(gè)天氣機(jī)器人,可以獲取天氣信息。 包含了兩個(gè)函數(shù):
- getCurrentWeather:獲取城市的天氣
- getNickname: 獲取城市別名
當(dāng) 初始化一個(gè)執(zhí)行(Run) 的時(shí)候,如果調(diào)用了一個(gè)function,則會(huì)進(jìn)入到 pending的狀態(tài)。需要你進(jìn)行提交函數(shù)的結(jié)果。
模型支持并發(fā)調(diào)用,參考 parallel function calling
如下的返回結(jié)果,可以看到 required_action是需要提交的函數(shù)調(diào)用的函數(shù)名和參數(shù)。這里面可以 獲取 call id , 用于提交使用函數(shù)結(jié)果使用。
{ "id": "run_3HV7rrQsagiqZmYynKwEdcxS", "object": "thread.run", "assistant_id": "asst_rEEOF3OGMan2ChvEALwTQakP", "thread_id": "thread_dXgWKGf8Cb7md8p0wKiMDGKc", "status": "requires_action", "required_action": { "type": "submit_tool_outputs", "submit_tool_outputs": { "tool_calls": [ { "id": "call_Vt5AqcWr8QsRTNGv4cDIpsmA", # 返回的call id,用于提交使用 "type": "function", "function": { "name": "getCurrentWeather", "arguments": "{"location":"San Francisco"}" } }, { "id": "call_45y0df8230430n34f8saa", "type": "function", "function": { "name": "getNickname", "arguments": "{"location":"Los Angeles"}" } } ] } }, ... 提交函數(shù)結(jié)果
需要對(duì)于每個(gè)函數(shù)都進(jìn)行 提交函數(shù)輸出 ,對(duì)于每個(gè)輸出的結(jié)果需要提交給哪個(gè)函數(shù),則是對(duì)應(yīng)了函數(shù)調(diào)用返回的 required_action中的 tool_call_id。
具體的代碼如下。
run = client.beta.threads.runs.submit_tool_outputs( thread_id=thread.id, # 對(duì)話id run_id=run.id, # 執(zhí)行id tool_outputs=[ { "tool_call_id": call_ids[0], # call id "output": "22C", }, { "tool_call_id": call_ids[1], "output": "LA", }, ] ) LangChain 集成 Assistant API
截止2023-11-15日,LangChain 集成API 還只是一個(gè)實(shí)驗(yàn)版本 langchain-experimental,未有正式版本。所以需要使用的讀者,可以使用如下版本:
!pip install -U -q "langchain==0.0.331rc2" langchain-experimental "openai>=1.1" import os os.environ["OPENAI_API_KEY"] = 'YOUR OPENAI KEY' # !pip install -U -q "langchain==0.0.331rc2" langchain-experimental "openai>=1.1" from langchain_experimental.openai_assistant import OpenAIAssistantRunnable import openai as client file = client.files.create( file=open("TEST.csv", "rb"), purpose='assistants' ) interpreter_assistant = OpenAIAssistantRunnable.create_assistant( name="data analysis assistant", instructions="You are a profession data analysis. When asked a question, write and run Python code to answer the question.", tools=[{"type": "code_interpreter"}], file_ids=[file.id], model="gpt-4" ) output = interpreter_assistant.invoke( {"content": "最近2周活躍表現(xiàn)最突出的是哪一天?", "file_ids": [file.id] }) output
其他更多的內(nèi)容可以參考:langchain cookbook
使用curl調(diào)用 Assistant API
具體可以參考如下的 Jupyter Notebook
Capabilities 和 Actions
我們?cè)趧?chuàng)建 GPTs 的時(shí)候,可以給GPTs 提供多種不同的能力
- Knowledge:知識(shí)庫
- Capabilities(內(nèi)置能力):包含了 OpenAI 提供的基礎(chǔ)能力,主要包含了,這些能力都是最重要最基礎(chǔ)的,所以O(shè)penAI選擇自己做。
- Web Browsing(網(wǎng)絡(luò)瀏覽能力)
- DALLE Image Generation(圖片生成能力)
- Code Interpreter(代碼能力)
- Actions:動(dòng)作,指的是GPTs的其他能力,類似于額外的能力插件,OpenAI不可能幫用戶把所有的業(yè)務(wù)需求的能力都提供了額,所以它提供了一個(gè)接口,方便用戶可以使用規(guī)定的接口協(xié)議,給GPT提供額外的能力。目前Actions 采用的是OpenAPI的接口協(xié)議,方便GPT調(diào)用外部的API。具體的使用可以參考下面教程。
雖然 GPTs 和 Assistant API 都是為了創(chuàng)建自定義的 AI 助手創(chuàng)建的,到那時(shí)兩者的方法和使用的場景不同。reference
GPTs 有著簡單易用的前端交互,可以很快速地方便小白用戶快速搭建 AI 助手,可以快速地驗(yàn)證方案和效果,并且可以很快速的在 GPTs 的商店中進(jìn)行分享。
然而, Assistant API 需要通過API的方式進(jìn)行操作,雖然可以使用 Assistant API 的 Assistant playground 進(jìn)行配置使用,但是其主要的目的還是為開發(fā)者提供一個(gè)API 方式,方便開發(fā)者可以在在自己的應(yīng)用中,快速集成這些能力。
參考資料
- YouTube:OpenAI Assistants API 極簡入門(附LangChain集成)
- OpenAI Assistants API with LangChain
- langchain cookbook
- Assistant playground
- introducing GPTs
- OpenAI Assistants API
- Difference of GPT’s and Assistants
- OpenAI Announces GPTs & Assistants. What is the difference?