GPT-4o:實(shí)現(xiàn)跨越文本與視覺(jué)的智能交互 原創(chuàng)
摘要
OpenAI最新發(fā)布的GPT-4o模型及其在多模態(tài)處理上的卓越能力,標(biāo)志著人機(jī)交互邁向新的高度。GPT-4o能夠處理文本、音頻、圖片和視頻,響應(yīng)速度極快,且在多語(yǔ)言處理上表現(xiàn)優(yōu)異。本文通過(guò)具體的應(yīng)用實(shí)例和對(duì)比測(cè)試,展示了GPT-4o在問(wèn)答系統(tǒng)和圖像理解方面的實(shí)際應(yīng)用,并提供了詳細(xì)的集成方法和代碼實(shí)現(xiàn)。無(wú)論是個(gè)人用戶(hù)還是企業(yè)開(kāi)發(fā)者,都能通過(guò)GPT-4o體驗(yàn)到更智能、更自然的人機(jī)交互。
GPT-4的發(fā)布及其特性
OpenAI 最近發(fā)布了GPT-4o(“o”代表“omni”,中文中可以讀作“歐姆尼”),這標(biāo)志著人機(jī)交互朝著更自然的方向邁出了一大步。GPT-4o能夠接受任意組合的文本、音頻、圖片和視頻輸入,并生成任意組合的文本、音頻和圖片輸出。它能夠在232毫秒內(nèi)對(duì)音頻輸入做出反應(yīng),平均響應(yīng)時(shí)間為320毫秒,這與人類(lèi)對(duì)話(huà)中的反應(yīng)時(shí)間相似。在文本和代碼處理方面,GPT-4o的性能與GPT-4 Turbo相當(dāng),并且在處理非英語(yǔ)語(yǔ)言文本時(shí)有顯著提升,同時(shí)速度更快,API調(diào)用成本降低了50%。
相比之前的模型,GPT-4o在視覺(jué)和音頻理解方面表現(xiàn)尤為出色。在GPT-4o之前,使用語(yǔ)音模式與ChatGPT對(duì)話(huà)的延遲分別為2.8秒(GPT-3.5)和5.4秒(GPT-4),這個(gè)過(guò)程涉及三個(gè)獨(dú)立的模型:一個(gè)簡(jiǎn)單的模型將音頻轉(zhuǎn)錄為文本,GPT-3.5或GPT-4處理文本并生成響應(yīng),最后一個(gè)模型將文本轉(zhuǎn)換回音頻。這種模式導(dǎo)致主要的智能源——GPT-4無(wú)法直接觀察語(yǔ)調(diào)、多名講話(huà)者或背景噪音,也無(wú)法輸出笑聲、歌聲或情感表達(dá)。GPT-4o通過(guò)端到端訓(xùn)練一個(gè)新模型,統(tǒng)一處理文本、視覺(jué)和音頻輸入輸出。這是我們首次將所有這些模態(tài)結(jié)合在一個(gè)模型中,因此我們?nèi)栽谔剿髌淠芰途窒扌浴?/p>
可以通過(guò)這個(gè)例子來(lái)感受GPT-4o給我們帶來(lái)了什么。假設(shè)你在外國(guó)旅游,遇到了一家當(dāng)?shù)夭宛^。你拿起手機(jī)拍下菜單的照片,過(guò)去的模型可能需要幾秒鐘來(lái)處理這張圖片,然后再翻譯成中文,過(guò)程中可能會(huì)有延遲和信息丟失。而現(xiàn)在有了GPT-4o,你拍下照片后,模型能夠立即識(shí)別圖片內(nèi)容,快速翻譯菜單,并告訴你每道菜的歷史和推薦。更重要的是,GPT-4o響應(yīng)速度更快,能夠在幾百毫秒內(nèi)做出反應(yīng)。同時(shí),它還能感知周?chē)沫h(huán)境和背景噪音,理解你的情感和語(yǔ)調(diào),甚至能夠回應(yīng)你的情緒,比如通過(guò)語(yǔ)音識(shí)別你的疑問(wèn)或驚喜,提供更貼心的建議。
GPT-4o的發(fā)布不僅展示了OpenAI在技術(shù)上的突破,也預(yù)示著人機(jī)交互的新時(shí)代。通過(guò)這篇文章,我們將探討如何將GPT-4o集成到實(shí)際應(yīng)用中,實(shí)現(xiàn)問(wèn)答和圖像理解功能。
如何將GPT-4集成到應(yīng)用中
GPT-4o的發(fā)布不僅展示了其在多模態(tài)處理上的強(qiáng)大能力,也為開(kāi)發(fā)者提供了全新的API接口,使得集成GPT-4o變得更加簡(jiǎn)便和高效。通過(guò)調(diào)用OpenAI提供的API,開(kāi)發(fā)者可以輕松地將GPT-4o的強(qiáng)大功能融入到自己的應(yīng)用中,無(wú)論是實(shí)現(xiàn)快速響應(yīng)的問(wèn)答系統(tǒng),還是增強(qiáng)的圖像理解功能,GPT-4o都能提供卓越的性能。
GPT-4o最初將在ChatGPT和API中作為文本和視覺(jué)模型提供。具體來(lái)說(shuō),GPT-4o將在ChatGPT Free、Plus和Team(即將推出Enterprise)以及Chat Completions API、Assistants API和Batch API中提供。這意味著不僅普通用戶(hù)(ToC)可以通過(guò)ChatGPT體驗(yàn)到GPT-4o的強(qiáng)大功能,企業(yè)用戶(hù)(ToB)也可以通過(guò)API訪(fǎng)問(wèn)新模型,將其集成到各自的業(yè)務(wù)應(yīng)用中,滿(mǎn)足不同場(chǎng)景的需求。
對(duì)于IT從業(yè)者來(lái)說(shuō),看到GPT-4o在文本和視覺(jué)上的強(qiáng)大功能,是否已經(jīng)躍躍欲試了呢?接下來(lái),我們將詳細(xì)介紹如何通過(guò)API調(diào)用實(shí)現(xiàn)GPT-4o的集成,并通過(guò)具體的示例代碼,展示如何將其問(wèn)答功能和圖像理解能力整合到實(shí)際應(yīng)用中。
既然要測(cè)試GPT-4o在文本和視覺(jué)方面的能力,我們需要嘗試調(diào)用新模型進(jìn)行提問(wèn)。例如,可以提出一個(gè)復(fù)雜的數(shù)學(xué)題目,看看GPT-4o能否準(zhǔn)確地解答。這樣的測(cè)試不僅可以檢驗(yàn)GPT-4o在數(shù)學(xué)推理和計(jì)算上的能力,也能展示其處理復(fù)雜文本問(wèn)題的性能。
不僅如此,我們還應(yīng)該引入其他幾個(gè)模型進(jìn)行對(duì)比測(cè)試,例如百度千帆的Llama2-Chinese-7b版本、Qwen-Plus以及GPT-3.5-Turbo。通過(guò)對(duì)比這些模型在相同任務(wù)上的表現(xiàn),這種對(duì)比測(cè)試可以幫助我們確定GPT-4o在實(shí)際應(yīng)用中的可靠性和有效性。
另外,為了全面評(píng)估GPT-4o的視覺(jué)理解能力,我們還可以通過(guò)輸入一張風(fēng)景圖片和一張數(shù)學(xué)公式圖片來(lái)測(cè)試其圖像識(shí)別和理解的能力。通過(guò)這種方式,我們能夠直觀地看到GPT-4o在處理視覺(jué)信息上的表現(xiàn),驗(yàn)證其在多模態(tài)處理上的卓越性能。
通過(guò)這些步驟,我們將能夠測(cè)試GPT-4o在文本和視覺(jué)處理上的強(qiáng)大能力,接下來(lái),將詳細(xì)介紹具體的測(cè)試方法和代碼實(shí)現(xiàn)。
問(wèn)答功能的實(shí)現(xiàn)
前面已經(jīng)說(shuō)明了,需要測(cè)試GPT-4o模型在問(wèn)答方面與其他模型的異同,同時(shí)還要測(cè)試其在視覺(jué)方面的能力。基于如上的思路,我們需要梳理執(zhí)行步驟。首先,創(chuàng)建一個(gè) selected_model.py 文件,用來(lái)存放訪(fǎng)問(wèn)不同大模型的函數(shù)。為了簡(jiǎn)化代碼并統(tǒng)一調(diào)用這些大模型,我們使用LangChain框架。LangChain框架能夠幫助我們方便地切換和管理不同模型的調(diào)用邏輯,使代碼更加簡(jiǎn)潔和易于維護(hù)。接著,創(chuàng)建 app.py 文件,利用Streamlit創(chuàng)建一個(gè)Web交互界面。在這個(gè)界面中,用戶(hù)可以通過(guò)選擇框選擇對(duì)應(yīng)的大模型,然后在提供的窗口中輸入問(wèn)題。當(dāng)用戶(hù)提交問(wèn)題請(qǐng)求時(shí)(點(diǎn)擊“發(fā)送”按鈕),app.py 文件將調(diào)用 selected_model.py 文件中寫(xiě)好的大模型函數(shù),對(duì)用戶(hù)的請(qǐng)求進(jìn)行響應(yīng),并將響應(yīng)內(nèi)容返回到 app.py 文件中進(jìn)行展示。
創(chuàng)建selected_model.py 文件,添加模型調(diào)用方法
這個(gè)文件包含所有訪(fǎng)問(wèn)不同大模型的函數(shù)。每個(gè)函數(shù)對(duì)應(yīng)一個(gè)大模型,并通過(guò)LangChain框架進(jìn)行調(diào)用。這些函數(shù)負(fù)責(zé)接受用戶(hù)的問(wèn)題并返回相應(yīng)的答案。
先創(chuàng)建調(diào)用gpt-4o的函數(shù),如下:
def get_response_from_gpt_4o(question:str):
llm = ChatOpenAI(model="gpt-4o")
template = """問(wèn)題: {question}
回答: 請(qǐng)一步一步思考,然后回答."""
prompt = PromptTemplate(template=template, input_variables=["question"])
llm_chain = LLMChain(prompt=prompt, llm=llm)
response = llm_chain.run(question)
return response
代碼整體比較簡(jiǎn)單,我們對(duì)其進(jìn)行解釋如下:
(1) 定義函數(shù)get_response_from_gpt_4o
代碼,def get_response_from_gpt_4o(question:str):,定義了一個(gè)名為get_response_from_gpt_4o的函數(shù),該函數(shù)接受一個(gè)字符串類(lèi)型的參數(shù)question作為用戶(hù)的提問(wèn),并返回一個(gè)響應(yīng)。
(2) 實(shí)例化ChatOpenAI
通過(guò)llm = ChatOpenAI(model="gpt-4o", base_url="https://api.chatanywhere.tech/v1")語(yǔ)句,實(shí)例化了一個(gè)ChatOpenAI對(duì)象,并將其賦值給變量llm(Large Language Model ,大語(yǔ)言模型)。通過(guò)初始化對(duì)象的model參數(shù)指定該對(duì)象使用了模型gpt-4o。
(3)定義模板字符串
template = """問(wèn)題: {question}
回答: 請(qǐng)一步一步思考,然后回答."""
定義了一個(gè)模板字符串并將其賦值給變量template。該模板用于生成提示,其中包含占位符{question},表示將問(wèn)題插入其中。
(4)創(chuàng)建PromptTemplate實(shí)例
prompt = PromptTemplate(template=template, input_variables=["question"])
創(chuàng)建了一個(gè)PromptTemplate對(duì)象,并將其賦值給變量prompt。該對(duì)象使用之前定義的template字符串,并指定question為輸入變量。
(5) 創(chuàng)建LLMChain實(shí)例
llm_chain = LLMChain(prompt=prompt, llm=llm)
創(chuàng)建了一個(gè)LLMChain對(duì)象,并將其賦值給變量llm_chain。該對(duì)象使用之前定義的prompt和llm。
(6) 運(yùn)行LLMChain并獲取響應(yīng)
response = llm_chain.run(question)
return response
調(diào)用llm_chain的run方法,傳入question參數(shù),并將返回的響應(yīng)賦值給變量response。同時(shí),返回response變量的值,即函數(shù)get_response_from_gpt_4o的輸出。
該函數(shù)首先初始化一個(gè)ChatOpenAI對(duì)象以使用gpt-4o模型,然后定義一個(gè)包含問(wèn)題和指示的模板字符串。接著,它創(chuàng)建一個(gè)PromptTemplate實(shí)例,并用它和ChatOpenAI對(duì)象創(chuàng)建一個(gè)LLMChain實(shí)例。最后,函數(shù)運(yùn)行LLMChain實(shí)例,生成并返回一個(gè)基于輸入問(wèn)題的響應(yīng)。我們可以按照這個(gè)套路生成調(diào)用其他大模型的函數(shù)。
創(chuàng)建調(diào)用通義千問(wèn)大模型的函數(shù)代碼,如下:
def get_response_from_qwen(question:str):
#創(chuàng)建模版
template = """問(wèn)題: {question}
回答: 請(qǐng)一步一步思考,然后回答."""
#定義模版輸入變量
prompt = PromptTemplate(template=template, input_variables=["question"])
llm = Tongyi(model_name = "qwen-plus")
llm_chain = LLMChain(prompt=prompt, llm=llm)
response = llm_chain.run(question)
return response
該函數(shù)使用了Tongyi類(lèi)來(lái)實(shí)例化一個(gè)名為llm的大語(yǔ)言模型對(duì)象,模型名稱(chēng)為qwen-plus。它與之前的get_response_from_gpt_4o函數(shù)相同的地方在于,它們都創(chuàng)建了一個(gè)模板字符串,定義了一個(gè)PromptTemplate對(duì)象,并使用一個(gè)LLMChain對(duì)象來(lái)生成響應(yīng)。
接著是百度千帆平臺(tái)微調(diào)的Llama2-Chinese-7B 版本的模型調(diào)用函數(shù),代碼如下:
def get_response_from_llama2(question:str):
llm = QianfanLLMEndpoint(model="Qianfan-Chinese-Llama-2-7B")
template = """問(wèn)題: {question}
回答: 請(qǐng)一步一步思考,然后回答."""
prompt = PromptTemplate(template=template, input_variables=["question"])
llm_chain = LLMChain(prompt=prompt, llm=llm)
response = llm_chain.run(question)
return response
該函數(shù)使用了QianfanLLMEndpoint類(lèi)來(lái)實(shí)例化一個(gè)名為llm的大語(yǔ)言模型對(duì)象,模型名稱(chēng)為Qianfan-Chinese-Llama-2-7B。其余部分與之前的get_response_from_gpt_4o函數(shù)相同,包括模板的定義、PromptTemplate和LLMChain的創(chuàng)建及運(yùn)行。
最后,是調(diào)用gpt-3.5-turbo模型,代碼如下:
def get_response_from_gpt(question:str):
llm = ChatOpenAI(model="gpt-3.5-turbo",base_url="https://api.chatanywhere.tech/v1")
template = """問(wèn)題: {question}
回答: 請(qǐng)一步一步思考,然后回答."""
prompt = PromptTemplate(template=template, input_variables=["question"])
llm_chain = LLMChain(prompt=prompt, llm=llm)
response = llm_chain.run(question)
return response
需要說(shuō)明的是,由于調(diào)用了多個(gè)平臺(tái)的大模型,因此需要預(yù)先配置多平臺(tái)模型訪(fǎng)問(wèn)的Key,可以通過(guò)創(chuàng)建.env 文件定義這些Key??梢栽诔绦蛳嗤哪夸浵聞?chuàng)建.env 文件,文件內(nèi)容如下:
OPENAI_API_KEY=sk-3M3Cg1uLVDS7nXXXkFSlNV0Ts1CamgSP
QIANFAN_AK=Y5DvSDyyAZKXXXHu719rP
QIANFAN_SK=CKsfjtXawcjsg1XXXU3VwpACgZdorI
DASHSCOPE_API_KEY=sk-f93952eXXX4b3b65f0906a1e0e7
`.env` 文件用于存儲(chǔ)應(yīng)用程序的環(huán)境變量,包括訪(fǎng)問(wèn)API的密鑰和其他配置參數(shù)。這些變量提供了應(yīng)用程序在不同平臺(tái)和服務(wù)之間進(jìn)行交互所需的認(rèn)證信息和配置。文件中包含多個(gè)API密鑰和配置參數(shù),用于不同的服務(wù)提供商:
- OpenAI 密鑰 (`OPENAI_API_KEY`):用于訪(fǎng)問(wèn)OpenAI提供的服務(wù),例如GPT-4o模型。
- 百度千帆密鑰 (`QIANFAN_AK` 和 `QIANFAN_SK`):用于驗(yàn)證和訪(fǎng)問(wèn)百度千帆平臺(tái)的服務(wù)。
- 阿里靈積密鑰 (`DASHSCOPE_API_KEY`):用于驗(yàn)證和訪(fǎng)問(wèn)阿里靈積(Dashscope)平臺(tái)的服務(wù)。
創(chuàng)建 app.py 文件,添加Web交互功能
創(chuàng)建完基本的模型調(diào)用函數(shù)之后,再來(lái)看看Web 頁(yè)面的交互功能。創(chuàng)建app.py文件,使用Streamlit創(chuàng)建一個(gè)Web交互界面。用戶(hù)在界面中可以選擇要使用的大模型,并輸入他們的問(wèn)題。當(dāng)用戶(hù)點(diǎn)擊“發(fā)送”按鈕時(shí),app.py 文件將根據(jù)用戶(hù)選擇的大模型,調(diào)用 selected_model.py 文件中的相應(yīng)函數(shù)來(lái)處理問(wèn)題。響應(yīng)結(jié)果將顯示在界面上,供用戶(hù)查看和對(duì)比不同模型的表現(xiàn)。
下面來(lái)看看代碼的實(shí)現(xiàn),如下:
# 定義模型列表
models = ["Qianfan-Chinese-Llama-2-7B", "gpt-3.5-turbo", "qwen-plus","gpt-4o"]
# 創(chuàng)建一個(gè)下拉框,用戶(hù)可以從中選擇一個(gè)模型
selected_model = st.selectbox("請(qǐng)選擇一個(gè)大模型:", models)
# 顯示所選模型
# st.write(f"你現(xiàn)在選擇了 {selected_model} 大模型")
st.markdown(f"你現(xiàn)在選擇了 <span style='color:red; font-weight:bold;'>{selected_model}</span> 大模型", unsafe_allow_html=True)
# 創(chuàng)建文本輸入框讓用戶(hù)輸入問(wèn)題
user_question = st.text_input("請(qǐng)輸入你的問(wèn)題:")
# 創(chuàng)建一個(gè)發(fā)送按鈕
if st.button("發(fā)送"):
# 根據(jù)所選模型調(diào)用對(duì)應(yīng)的函數(shù)
if selected_model == "Qianfan-Chinese-Llama-2-7B":
response = get_response_from_llama2(user_question)
elif selected_model == "gpt-3.5-turbo":
response = get_response_from_gpt(user_question)
elif selected_model == "qwen-plus":
response = get_response_from_qwen(user_question)
elif selected_model == "gpt-4o":
response = get_response_from_gpt_4o(user_question)
else:
response = "未知模型,請(qǐng)重新選擇。"
# 確保LaTeX公式用雙美元符號(hào)包圍,并正確處理反斜杠
response_with_latex = response.replace("\\(", "$$").replace("\\)", "$$")
response_with_latex = response_with_latex.replace("\[", "$$").replace("\]", "$$")
# 顯示返回的結(jié)果
st.markdown(response_with_latex, unsafe_allow_html=True)
這些代碼內(nèi)容與Web 交互息息相關(guān),我們來(lái)逐一解釋如下:
(1) 定義模型列表和下拉框
models = ["Qianfan-Chinese-Llama-2-7B", "gpt-3.5-turbo", "qwen-plus", "gpt-4o"]
selected_model = st.selectbox("請(qǐng)選擇一個(gè)大模型:", models)
定義了一個(gè)包含模型名稱(chēng)的列表,命名為models,其中包括四個(gè)模型:Qianfan-Chinese-Llama-2-7B,gpt-3.5-turbo,qwen-plus,和gpt-4o。在下拉框選擇的時(shí)候,會(huì)用到這個(gè)列表的信息。創(chuàng)建一個(gè)下拉框,用戶(hù)可以從中選擇一個(gè)模型。使用Streamlit的selectbox函數(shù)創(chuàng)建了一個(gè)下拉框,供用戶(hù)選擇模型。selectbox的第一個(gè)參數(shù)是提示文本,第二個(gè)參數(shù)是可供選擇的選項(xiàng)列表。用戶(hù)選擇的模型存儲(chǔ)在變量selected_model中。
(2) 顯示所選模型
st.markdown(f"你現(xiàn)在選擇了 <span style='color:red; font-weight:bold;'>{selected_model}</span> 大模型", unsafe_allow_html=True)
使用st.markdown函數(shù)顯示用戶(hù)所選的模型,并通過(guò)HTML標(biāo)簽使所選模型的名稱(chēng)以紅色和加粗的樣式顯示。unsafe_allow_html=True參數(shù)允許使用HTML標(biāo)簽。
(3) 創(chuàng)建文本輸入框讓用戶(hù)輸入問(wèn)題
user_question = st.text_input("請(qǐng)輸入你的問(wèn)題:")
使用Streamlit的text_input函數(shù)創(chuàng)建了一個(gè)文本輸入框,提示用戶(hù)輸入問(wèn)題。用戶(hù)輸入的問(wèn)題存儲(chǔ)在變量user_question中。
(4) 創(chuàng)建“發(fā)送”按鈕,調(diào)用模型
if st.button("發(fā)送"):
if selected_model == "Qianfan-Chinese-Llama-2-7B":
response = get_response_from_llama2(user_question)
elif selected_model == "gpt-3.5-turbo":
response = get_response_from_gpt(user_question)
elif selected_model == "qwen-plus":
response = get_response_from_qwen(user_question)
elif selected_model == "gpt-4o":
response = get_response_from_gpt_4o(user_question)
else:
response = "未知模型,請(qǐng)重新選擇。"
使用Streamlit的button函數(shù)創(chuàng)建了一個(gè)按鈕,按鈕標(biāo)簽為“發(fā)送”。當(dāng)用戶(hù)點(diǎn)擊按鈕時(shí),執(zhí)行后續(xù)邏輯:
- 如果選擇了Qianfan-Chinese-Llama-2-7B,則調(diào)用get_response_from_llama2函數(shù)。
- 如果選擇了gpt-3.5-turbo,則調(diào)用get_response_from_gpt函數(shù)。
- 如果選擇了qwen-plus,則調(diào)用get_response_from_qwen函數(shù)。
- 如果選擇了gpt-4o,則調(diào)用get_response_from_gpt_4o函數(shù)。
- 如果選擇了未知模型,返回提示信息“未知模型,請(qǐng)重新選擇?!?/li>
(5) 處理輸出并展示響應(yīng)結(jié)果
response_with_latex = response.replace("\\(", "$$").replace("\\)", "$$")
response_with_latex = response_with_latex.replace("\[", "$$").replace("\]", "$$")
st.markdown(response_with_latex, unsafe_allow_html=True)
由于每類(lèi)模型返回的響應(yīng)格式各不相同,為了確保顯示的效果需要確保LaTeX公式用雙美元符號(hào)包圍,并正確處理反斜杠。代碼中,將返回的響應(yīng)中的LaTeX公式進(jìn)行替換處理,將“\(”替換為“$$”,將“\)”替換為“$$”,同時(shí)將“\[”替換為“$$”,將“\]”替換為$$,進(jìn)行了一些列處理。其目的是為了確保LaTeX公式在Markdown中能夠正確渲染。
最后,使用st.markdown函數(shù)顯示處理過(guò)的響應(yīng),并允許HTML標(biāo)簽通過(guò)設(shè)置unsafe_allow_html=True。這樣可以確保返回的結(jié)果在界面上正確顯示,包括可能的LaTeX公式。
對(duì)比測(cè)試
完成代碼之后,進(jìn)入命令行工具保證在app.py 同一級(jí)目錄下面,執(zhí)行如下命令進(jìn)行測(cè)試。
streamlit run app.py
看到如下圖所示,說(shuō)明Streamlit 已經(jīng)在 本機(jī)的8502 端口啟動(dòng)了,此時(shí)會(huì)自動(dòng)彈出瀏覽器并訪(fǎng)問(wèn)對(duì)應(yīng)的Web頁(yè)面地址。如果沒(méi)有自動(dòng)訪(fǎng)問(wèn),可以手動(dòng)在瀏覽器中輸入http://localhost:8502 進(jìn)行訪(fǎng)問(wèn)。
接下來(lái),我們希望模型回答一個(gè)方程求解的問(wèn)題:“求解下列方程組的所有實(shí)數(shù)解: 2x + 3y = 7 4x y = 1”??纯次覀兌x的4個(gè)模型的表現(xiàn)如何。
如下圖所示,在展示的界面中,選擇了“Qianfan-Chinese-Llama-2-7B”的模型,這個(gè)是百度千帆平臺(tái)對(duì)Llama2模型進(jìn)行中文訓(xùn)練集微調(diào)之后的模型,其參數(shù)是7B,也就是70億。然后輸入對(duì)應(yīng)的問(wèn)題,點(diǎn)擊“發(fā)送”按鈕,可以看到結(jié)果如下:
從顯示結(jié)果來(lái)看Llama2模型返回了一些解題的思路,并給出了一個(gè)解:(5,-1)。我們把該解帶入到第一個(gè)式子:2x+3y=7 發(fā)現(xiàn)沒(méi)有問(wèn)題,但是帶入第二個(gè)式子:4x-y=1 發(fā)現(xiàn)明顯不對(duì)(有興趣大家可以自己算算哈)。
再來(lái)到第二個(gè)測(cè)試模型:“gpt-3.5-turbo”,如下圖所示,輸入同樣的問(wèn)題并且點(diǎn)擊“發(fā)送”。
從結(jié)果上看x=-4, y=5 將其帶入到第一個(gè)式子結(jié)果是正確的,再將其帶入到第二個(gè)式子好像不太對(duì)了。
接著,看看“qwen-plus”文心一言模型的表現(xiàn),如下圖所示,輸入問(wèn)題,并且通過(guò)發(fā)送按鈕請(qǐng)求結(jié)果。
如下圖所示,結(jié)果是x=5/7 y=13/7。
我們可以將 x=5/7 y=13/7 都帶入到方程式 2x + 3y = 7 4x y = 1 進(jìn)行演算,發(fā)現(xiàn)結(jié)果同時(shí)滿(mǎn)足兩個(gè)方程式,“Qwen-plus”完成數(shù)學(xué)題。
最后,來(lái)看看gpt-4o的表現(xiàn),如下圖所示,選擇“gpt-4o”然后提交同樣的問(wèn)題。
如下圖所示,gpt-4o得到了和“Qwen-plus”相同的結(jié)果,從執(zhí)行過(guò)程上看,gpt-4o通過(guò)三步計(jì)算出方程的解之后,還加了一個(gè)“第四步”將計(jì)算的結(jié)果帶入原方程進(jìn)行演算,顯得比較“嚴(yán)謹(jǐn)”。
通過(guò)上面的實(shí)驗(yàn),我們發(fā)現(xiàn)GPT-4o在解決方程組的問(wèn)題上表現(xiàn)出了強(qiáng)大的能力。它不僅能夠準(zhǔn)確地識(shí)別并理解輸入的方程組,還能夠逐步地提供詳細(xì)的解題過(guò)程。這充分展示了GPT-4o在以下幾個(gè)方面的優(yōu)勢(shì):
- 精確的數(shù)學(xué)運(yùn)算能力:GPT-4o能夠準(zhǔn)確地進(jìn)行代數(shù)運(yùn)算,包括加減乘除以及分?jǐn)?shù)運(yùn)算。在解題過(guò)程中,它清晰地展示了每一步的計(jì)算步驟,確保結(jié)果的正確性。
- 邏輯推理和問(wèn)題分解能力:在解決方程組時(shí),GPT-4o展示了良好的邏輯推理能力。它首先通過(guò)消元法簡(jiǎn)化方程,然后逐步解出每一個(gè)變量的值,整個(gè)過(guò)程條理清晰,步驟分明。
- 文本生成和解釋能力:除了數(shù)學(xué)運(yùn)算,GPT-4o還能夠生成易于理解的文本解釋。這對(duì)于幫助用戶(hù)理解解題過(guò)程和結(jié)果非常有用,特別是在教育和學(xué)習(xí)場(chǎng)景中,能夠起到很好的輔導(dǎo)作用。
雖然此次展示的是文本和數(shù)學(xué)能力,但是從響應(yīng)速度上看GPT-4o比之前的GPT-4有明顯的提升。但是這些能力還是在文字生成方面,通過(guò)前面的介紹GPT-4o還具備處理圖像、音頻等多模態(tài)信息的能力。它能夠綜合利用多種信息源,提供更加全面和準(zhǔn)確的解決方案。接下來(lái)我們還要介紹其在多模態(tài)處理方面的能力。
圖片理解功能的實(shí)現(xiàn)
上面我們已經(jīng)詳細(xì)介紹了GPT-4o在文本理解、推理和生成方面的強(qiáng)大能力。通過(guò)對(duì)復(fù)雜數(shù)學(xué)問(wèn)題的準(zhǔn)確解答,GPT-4o展示了其在處理復(fù)雜文本任務(wù)上的卓越性能。接下來(lái),我們將深入探討GPT-4o的視覺(jué)處理能力。
為了全面評(píng)估其在這一方面的表現(xiàn),我們準(zhǔn)備了兩張圖片進(jìn)行測(cè)試。首先,我們將展示一張風(fēng)景圖片,看看GPT-4o是否能夠準(zhǔn)確理解圖片內(nèi)容,識(shí)別出其中的細(xì)節(jié)和場(chǎng)景信息。其次,我們將測(cè)試一張包含多個(gè)數(shù)學(xué)公式的圖片,檢驗(yàn)GPT-4o是否能夠識(shí)別這些公式并理解它們的含義,甚至進(jìn)一步解答其中涉及的數(shù)學(xué)方程式。
圖片識(shí)別代碼執(zhí)行
直接上代碼, 在原有的selected_model.py文件中加入新函數(shù),讓gpt-4o進(jìn)行視覺(jué)識(shí)別。代碼如下:
def get_response_from_pic_by_gpt_4o(question:str,url: str):
human_message = HumanMessage(content=[
{ "type": "text", "text": question },
{ "type": "image_url", "image_url": { "url": url }}
])
llm = ChatOpenAI(model="gpt-4o")
response = llm.invoke([ human_message ])
print(response.content)
return response.content
(1) 定義視覺(jué)處理函數(shù)
定義了一個(gè)名為get_response_from_pic_by_gpt_4o的函數(shù),該函數(shù)接受兩個(gè)參數(shù):一個(gè)字符串類(lèi)型的question用來(lái)接收用戶(hù)的提問(wèn),另一個(gè)字符串類(lèi)型的url用來(lái)接收?qǐng)D片的URL地址。函數(shù)將根據(jù)這兩個(gè)參數(shù)生成并返回一個(gè)響應(yīng),也就是識(shí)別圖片的內(nèi)容信息。
(2) 創(chuàng)建HumanMessage對(duì)象
human_message = HumanMessage(content=[
{ "type": "text", "text": question },
{ "type": "image_url", "image_url": { "url": url }}
])
創(chuàng)建了一個(gè)HumanMessage對(duì)象,并將其賦值給變量human_message。該對(duì)象包含一個(gè)content列表,列表中的第一個(gè)元素是包含文本問(wèn)題的字典,第二個(gè)元素是包含圖片URL的字典。這種結(jié)構(gòu)將文本和圖片信息組合在一起,以便傳遞給大語(yǔ)言模型。
(3) 調(diào)用gpt-4o處理圖片信息
llm = ChatOpenAI(model="gpt-4o")
response = llm.invoke([ human_message ])
return response.content
實(shí)例化一個(gè)ChatOpenAI對(duì)象,并將其賦值給變量llm。該對(duì)象使用了模型gpt-4o,用于處理輸入的human_message并生成響應(yīng)。接著,調(diào)用llm對(duì)象的invoke方法,傳入包含human_message的列表。該方法會(huì)處理輸入的消息并返回一個(gè)響應(yīng)。返回的響應(yīng)賦值給變量response,并將識(shí)別圖片的內(nèi)容信息content通過(guò)response.content的方式返回給調(diào)用者。
除了在selected_model.py 文件中添加函數(shù)之外,還需要修改app.py的部分代碼,如下:
(1) 創(chuàng)建文本輸入框讓用戶(hù)輸入圖片的URL
image_url = st.text_input("請(qǐng)輸入圖片的URL:")
使用Streamlit的text_input函數(shù)創(chuàng)建了一個(gè)文本輸入框,提示用戶(hù)輸入圖片的URL。用戶(hù)輸入的URL存儲(chǔ)在變量image_url中。
(2) 定義函數(shù)is_valid_url,驗(yàn)證輸入的URL
def is_valid_url(url):
regex = re.compile(
r'^(?:http|ftp)s?://' # http:// 或 https://
r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|' # 域名
r'localhost|' # 本地地址
r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|' # IPv4 地址
r'\[?[A-F0-9]*:[A-F0-9:]+\]?)' # IPv6 地址
r'(?::\d+)?' # 可選端口號(hào)
r'(?:/?|[/?]\S+)$', re.IGNORECASE)
return re.match(regex, url) is not None
定義了一個(gè)名為is_valid_url的函數(shù),該函數(shù)接受一個(gè)URL字符串作為參數(shù)。通過(guò)正則表達(dá)式regex驗(yàn)證URL的格式是否有效。如果URL匹配正則表達(dá)式,函數(shù)返回True,否則返回False。有了這個(gè)函數(shù)就可以判斷我們輸入的URL是否是符合規(guī)則的。
(3) 調(diào)用模型識(shí)別圖片
if st.button("發(fā)送"):
if selected_model == "gpt-4o":
if image_url.strip() and is_valid_url(image_url):
response = get_response_from_pic_by_gpt_4o(user_question, image_url)
else:
response = get_response_from_gpt_4o(user_question)
這部分代碼是在原來(lái)代碼基礎(chǔ)上進(jìn)行了修改,根據(jù)用戶(hù)選擇的模型調(diào)用相應(yīng)的函數(shù)處理問(wèn)題。如果選擇了gpt-4o,首先檢查用戶(hù)是否輸入了圖片URL且URL格式有效。如果滿(mǎn)足條件,則調(diào)用get_response_from_pic_by_gpt_4o函數(shù),傳入用戶(hù)輸入的問(wèn)題和圖片URL,獲取響應(yīng)。如果未輸入圖片URL或URL格式無(wú)效,則調(diào)用get_response_from_gpt_4o函數(shù),傳入用戶(hù)輸入的問(wèn)題,獲取響應(yīng)。
說(shuō)白了,這段代碼通過(guò)以下步驟實(shí)現(xiàn)了用戶(hù)輸入圖片URL并調(diào)用相應(yīng)函數(shù)生成響應(yīng)的功能:
- 創(chuàng)建一個(gè)文本輸入框讓用戶(hù)輸入圖片的URL。
- 定義一個(gè)函數(shù)is_valid_url來(lái)驗(yàn)證輸入的URL格式是否有效。
- 創(chuàng)建一個(gè)發(fā)送按鈕,用戶(hù)點(diǎn)擊按鈕后執(zhí)行代碼。
- 根據(jù)所選模型和圖片URL的有效性,調(diào)用相應(yīng)的函數(shù)生成并返回響應(yīng)。
圖片識(shí)別功能測(cè)試
完成代碼編寫(xiě)之后,我們開(kāi)始功能的測(cè)試,首先確定要識(shí)別的圖片,我們通過(guò)地址得到如下圖所示的圖片。
然后,通過(guò)streamlit run app.py 啟動(dòng)Web 交互界面,如下圖所示,輸入問(wèn)題和圖片的URL地址,然后點(diǎn)擊“發(fā)送”按鈕,請(qǐng)求gpt-4o模型。
從輸出的內(nèi)容可以看出,gpt-4o識(shí)別出了整個(gè)圖片,包括:步道、草地、樹(shù)木、藍(lán)天、白云、陽(yáng)光等信息。
看來(lái)gpt-4o的表現(xiàn)還不錯(cuò),接著我們上點(diǎn)難度,提交一張多個(gè)數(shù)學(xué)公式組成的圖片,如下圖所示,圖片包含了多個(gè)數(shù)學(xué)公式,我們可以通過(guò)??地址??訪(fǎng)問(wèn)。
看看gpt-4o能否理解、分析、計(jì)算出圖片中的數(shù)學(xué)公式,如下圖所示,在問(wèn)題的部分我們告訴大模型“理解并求解圖片中的數(shù)學(xué)題”,然后給出圖片的URL地址,最后點(diǎn)擊“發(fā)送”按鈕請(qǐng)求大模型。
由于圖片中的公式眾多,我們?nèi)∏懊嬉徊糠终故窘o大家。 如下圖所示,gpt-4o 解析出圖片的公式按照?qǐng)D片公式的序號(hào):(a) (b) (c) 進(jìn)行排列,針對(duì)每個(gè)公式提供了詳細(xì)的解題步驟,檢查了一下結(jié)果是正確的。
總結(jié)
通過(guò)本文的詳細(xì)探討和實(shí)例展示,我們看到了GPT-4o在多模態(tài)處理上的強(qiáng)大能力,以及它在實(shí)際應(yīng)用中的廣泛潛力。無(wú)論是處理復(fù)雜的數(shù)學(xué)問(wèn)題還是進(jìn)行精確的圖像識(shí)別,GPT-4o都展現(xiàn)了卓越的性能和速度。本文提供的集成方法和代碼實(shí)現(xiàn)為開(kāi)發(fā)者提供了實(shí)用的參考,幫助他們將GPT-4o的強(qiáng)大功能融入到自己的應(yīng)用中。展望未來(lái),GPT-4o的發(fā)布預(yù)示著AI技術(shù)的又一次飛躍,它將引領(lǐng)人機(jī)交互進(jìn)入一個(gè)更加智能和自然的新時(shí)代。
參考
??https://platform.openai.com/docs/guides/vision。??
??https://openai.com/index/hello-gpt-4o/。??
??https://openai.com/index/gpt-4o-and-more-tools-to-chatgpt-free/。??
??https://github.com/sugarforever/LangChain-。Tutorials/blob/main/langchain_openai_gpt4o.ipynb。??
作者介紹
崔皓,51CTO社區(qū)編輯,資深架構(gòu)師,擁有18年的軟件開(kāi)發(fā)和架構(gòu)經(jīng)驗(yàn),10年分布式架構(gòu)經(jīng)驗(yàn)。
