大模型應(yīng)用開發(fā)在不使用任何框架和SDK的情況下——基于原生Restful API實現(xiàn)流式傳輸與工具調(diào)用 原創(chuàng)
“ 大模型原生API開發(fā),所有東西都需要自己手動處理,很麻煩;但能夠幫助我們理解大模型開發(fā)的運(yùn)行過程。”
在之前的文章中有說過,openai SDK已經(jīng)成為大模型應(yīng)用開發(fā)中事實上的行業(yè)標(biāo)準(zhǔn),而其本質(zhì)上其實是對大模型API接口的封裝;因此我們今天就不使用任何SDK的情況下,僅僅使用大模型的API接口實現(xiàn)流式返回和工具調(diào)用。
在openai SDK中網(wǎng)絡(luò)工具使用的是最新的httpx,因此今天我們也用httpx實現(xiàn)大模型接口的異步調(diào)用,并實現(xiàn)工具調(diào)用。

基于原生API實現(xiàn)工具調(diào)用
還是之前強(qiáng)調(diào)過很多次的話:
1. 在文本處理模型中,模型的數(shù)據(jù)與輸出只有一種格式,那就是文本格式,也就是字符串;因此雖然我們可以要求模型按照json或其它格式進(jìn)行輸出,但其本質(zhì)上還是字符串,需要我們進(jìn)行轉(zhuǎn)換
2. 任何SDK或框架,都是基于大模型原生的功能進(jìn)行上層開發(fā)與封裝,因此我們需要了解不同模型之間的差異。
在我們平常的業(yè)務(wù)開發(fā)中,我們已經(jīng)習(xí)慣了使用一些開發(fā)框架或已經(jīng)封裝好的SDK工具;但正是由于這些工具導(dǎo)致我們對大模型原生功能和參數(shù)了解不足,這也間接導(dǎo)致我們很多時候不知道問題出在哪里;所以,今天我們就只使用python開發(fā)包,不使用任何與大模型相關(guān)的SDK來實現(xiàn)大模型應(yīng)用開發(fā),體驗一下大模型真正的運(yùn)作流程。
在這里再強(qiáng)調(diào)一句話,大模型實現(xiàn)工具調(diào)用并不是說大模型能夠執(zhí)行代碼,這里的代碼包括任何語言的代碼;而是大模型能夠根據(jù)工具的簽名,根據(jù)用戶需求判斷是否需要調(diào)用工具,然后再生成工具所需要的參數(shù),之后再交給執(zhí)行引擎去執(zhí)行代碼。
這里我們使用阿里云千問系列的模型作為測試模型,文檔地址如下:
# 千問文檔地址
https://bailian.console.aliyun.com/?spm=5176.29870676.nav-v2-dropdown-menu-0.d_main_0_0_0.384a2868HAumHR&tab=doc&scm=20140722.M_10863655._.V_1#/doc/?type=model&url=2862208在代碼中,用戶可以根據(jù)自己的情況把連接,模型和密鑰換成自己的,或者自己注冊也可以。而作者使用的是硅基流動的免費模型。
#模型參數(shù)如下
OPEN_AI_URL="https://api.siliconflow.cn/v1" # 模型地址 這里是硅基流動的地址 官網(wǎng)地址: https://account.siliconflow.cn/zh/login?redirect=https%3A%2F%2Fcloud.siliconflow.cn%2F%3F
API_KEY="API-KEY" # 模型密鑰 自己去官網(wǎng)注冊
MODEL="Qwen/Qwen2.5-32B-Instruct" # 模型名稱
STREAM=True # True代表流式返回 False代表非流式返回根據(jù)文檔所描述,模型本身并不會執(zhí)行工具,工具的運(yùn)行是由你的運(yùn)行環(huán)境去執(zhí)行,這也是前面作者一直強(qiáng)調(diào)的問題。

所以,在使用SDK或框架開發(fā)的過程中,SDK和框架給我們做了大量的輔助工作,因此我們可以省很多事;但在原生的大模型應(yīng)用開發(fā)中,使用大模型的API接口,所有的東西都需要我們自己手動進(jìn)行解析和處理,這雖然增加了工作量,但對學(xué)習(xí)來說能夠讓我們弄明白大模型的具體運(yùn)作流程。
這里有個需要注意的點就是,大模型在流式返回中,工具函數(shù)的名稱,只在第一個流式返回對象中出現(xiàn);這個坑作者找了老半天,就是獲取不到工具名。

其次,由于大模型只會返回函數(shù)名和參數(shù),因此我們需要做一個工具字典,根據(jù)函數(shù)名調(diào)用具體的工具執(zhí)行任務(wù)。
# 創(chuàng)建一個函數(shù)映射表
function_mapper = {
"get_weather": get_weather
}具體代碼地址,在公眾號回復(fù): 大模型原生工具調(diào)用 獲取
本文轉(zhuǎn)載自??AI探索時代?? 作者:DFires

















