想了解更多AIGC的内容,请访问:
51CTO AI.x社区
https://www.51cto.com/aigc/
OpenAI最新发布的GPT-4o模型及其在多模态处理上的卓越能力,标志着人机交互迈向新的高度。GPT-4o能够处理文本、音频、图片和视频,响应速度极快,且在多语言处理上表现优异。本文通过具体的应用实例和对比测试,展示了GPT-4o在问答系统和图像理解方面的实际应用,并提供了详细的集成方法和代码实现。无论是个人用户还是企业开发者,都能通过GPT-4o体验到更智能、更自然的人机交互。
OpenAI 最近发布了GPT-4o(“o”代表“omni”,中文中可以读作“欧姆尼”),这标志着人机交互朝着更自然的方向迈出了一大步。GPT-4o能够接受任意组合的文本、音频、图片和视频输入,并生成任意组合的文本、音频和图片输出。它能够在232毫秒内对音频输入做出反应,平均响应时间为320毫秒,这与人类对话中的反应时间相似。在文本和代码处理方面,GPT-4o的性能与GPT-4 Turbo相当,并且在处理非英语语言文本时有显著提升,同时速度更快,API调用成本降低了50%。
相比之前的模型,GPT-4o在视觉和音频理解方面表现尤为出色。在GPT-4o之前,使用语音模式与ChatGPT对话的延迟分别为2.8秒(GPT-3.5)和5.4秒(GPT-4),这个过程涉及三个独立的模型:一个简单的模型将音频转录为文本,GPT-3.5或GPT-4处理文本并生成响应,最后一个模型将文本转换回音频。这种模式导致主要的智能源——GPT-4无法直接观察语调、多名讲话者或背景噪音,也无法输出笑声、歌声或情感表达。GPT-4o通过端到端训练一个新模型,统一处理文本、视觉和音频输入输出。这是我们首次将所有这些模态结合在一个模型中,因此我们仍在探索其能力和局限性。
可以通过这个例子来感受GPT-4o给我们带来了什么。假设你在外国旅游,遇到了一家当地餐馆。你拿起手机拍下菜单的照片,过去的模型可能需要几秒钟来处理这张图片,然后再翻译成中文,过程中可能会有延迟和信息丢失。而现在有了GPT-4o,你拍下照片后,模型能够立即识别图片内容,快速翻译菜单,并告诉你每道菜的历史和推荐。更重要的是,GPT-4o响应速度更快,能够在几百毫秒内做出反应。同时,它还能感知周围的环境和背景噪音,理解你的情感和语调,甚至能够回应你的情绪,比如通过语音识别你的疑问或惊喜,提供更贴心的建议。
GPT-4o的发布不仅展示了OpenAI在技术上的突破,也预示着人机交互的新时代。通过这篇文章,我们将探讨如何将GPT-4o集成到实际应用中,实现问答和图像理解功能。
GPT-4o的发布不仅展示了其在多模态处理上的强大能力,也为开发者提供了全新的API接口,使得集成GPT-4o变得更加简便和高效。通过调用OpenAI提供的API,开发者可以轻松地将GPT-4o的强大功能融入到自己的应用中,无论是实现快速响应的问答系统,还是增强的图像理解功能,GPT-4o都能提供卓越的性能。
GPT-4o最初将在ChatGPT和API中作为文本和视觉模型提供。具体来说,GPT-4o将在ChatGPT Free、Plus和Team(即将推出Enterprise)以及Chat Completions API、Assistants API和Batch API中提供。这意味着不仅普通用户(ToC)可以通过ChatGPT体验到GPT-4o的强大功能,企业用户(ToB)也可以通过API访问新模型,将其集成到各自的业务应用中,满足不同场景的需求。
对于IT从业者来说,看到GPT-4o在文本和视觉上的强大功能,是否已经跃跃欲试了呢?接下来,我们将详细介绍如何通过API调用实现GPT-4o的集成,并通过具体的示例代码,展示如何将其问答功能和图像理解能力整合到实际应用中。
既然要测试GPT-4o在文本和视觉方面的能力,我们需要尝试调用新模型进行提问。例如,可以提出一个复杂的数学题目,看看GPT-4o能否准确地解答。这样的测试不仅可以检验GPT-4o在数学推理和计算上的能力,也能展示其处理复杂文本问题的性能。
不仅如此,我们还应该引入其他几个模型进行对比测试,例如百度千帆的Llama2-Chinese-7b版本、Qwen-Plus以及GPT-3.5-Turbo。通过对比这些模型在相同任务上的表现,这种对比测试可以帮助我们确定GPT-4o在实际应用中的可靠性和有效性。
另外,为了全面评估GPT-4o的视觉理解能力,我们还可以通过输入一张风景图片和一张数学公式图片来测试其图像识别和理解的能力。通过这种方式,我们能够直观地看到GPT-4o在处理视觉信息上的表现,验证其在多模态处理上的卓越性能。
通过这些步骤,我们将能够测试GPT-4o在文本和视觉处理上的强大能力,接下来,将详细介绍具体的测试方法和代码实现。
前面已经说明了,需要测试GPT-4o模型在问答方面与其他模型的异同,同时还要测试其在视觉方面的能力。基于如上的思路,我们需要梳理执行步骤。首先,创建一个 selected_model.py 文件,用来存放访问不同大模型的函数。为了简化代码并统一调用这些大模型,我们使用LangChain框架。LangChain框架能够帮助我们方便地切换和管理不同模型的调用逻辑,使代码更加简洁和易于维护。接着,创建 App.py 文件,利用Streamlit创建一个Web交互界面。在这个界面中,用户可以通过选择框选择对应的大模型,然后在提供的窗口中输入问题。当用户提交问题请求时(点击“发送”按钮),app.py 文件将调用 selected_model.py 文件中写好的大模型函数,对用户的请求进行响应,并将响应内容返回到 app.py 文件中进行展示。
这个文件包含所有访问不同大模型的函数。每个函数对应一个大模型,并通过LangChain框架进行调用。这些函数负责接受用户的问题并返回相应的答案。
先创建调用gpt-4o的函数,如下:
def get_response_from_gpt_4o(question:str):
llm = ChatOpenAI(model="gpt-4o")
template = """问题: {question}
回答: 请一步一步思考,然后回答."""
prompt = PromptTemplate(template=template, input_variables=["question"])
llm_chain = LLMChain(prompt=prompt, llm=llm)
response = llm_chain.run(question)
return response
代码整体比较简单,我们对其进行解释如下:
代码,def get_response_from_gpt_4o(question:str):,定义了一个名为get_response_from_gpt_4o的函数,该函数接受一个字符串类型的参数question作为用户的提问,并返回一个响应。
通过llm = ChatOpenAI(model="gpt-4o", base_url="https://api.chatanywhere.tech/v1")语句,实例化了一个ChatOpenAI对象,并将其赋值给变量llm(Large Language Model ,大语言模型)。通过初始化对象的model参数指定该对象使用了模型gpt-4o。
template = """问题: {question}
回答: 请一步一步思考,然后回答."""
定义了一个模板字符串并将其赋值给变量template。该模板用于生成提示,其中包含占位符{question},表示将问题插入其中。
prompt = PromptTemplate(template=template, input_variables=["question"])
创建了一个PromptTemplate对象,并将其赋值给变量prompt。该对象使用之前定义的template字符串,并指定question为输入变量。
llm_chain = LLMChain(prompt=prompt, llm=llm)
创建了一个LLMChain对象,并将其赋值给变量llm_chain。该对象使用之前定义的prompt和llm。
response = llm_chain.run(question)
return response
调用llm_chain的run方法,传入question参数,并将返回的响应赋值给变量response。同时,返回response变量的值,即函数get_response_from_gpt_4o的输出。
该函数首先初始化一个ChatOpenAI对象以使用gpt-4o模型,然后定义一个包含问题和指示的模板字符串。接着,它创建一个PromptTemplate实例,并用它和ChatOpenAI对象创建一个LLMChain实例。最后,函数运行LLMChain实例,生成并返回一个基于输入问题的响应。我们可以按照这个套路生成调用其他大模型的函数。
创建调用通义千问大模型的函数代码,如下:
def get_response_from_qwen(question:str):
#创建模版
template = """问题: {question}
回答: 请一步一步思考,然后回答."""
#定义模版输入变量
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
该函数使用了Tongyi类来实例化一个名为llm的大语言模型对象,模型名称为qwen-plus。它与之前的get_response_from_gpt_4o函数相同的地方在于,它们都创建了一个模板字符串,定义了一个PromptTemplate对象,并使用一个LLMChain对象来生成响应。
接着是百度千帆平台微调的Llama2-Chinese-7B 版本的模型调用函数,代码如下:
def get_response_from_llama2(question:str):
llm = QianfanLLMEndpoint(model="Qianfan-Chinese-Llama-2-7B")
template = """问题: {question}
回答: 请一步一步思考,然后回答."""
prompt = PromptTemplate(template=template, input_variables=["question"])
llm_chain = LLMChain(prompt=prompt, llm=llm)
response = llm_chain.run(question)
return response
该函数使用了QianfanLLMEndpoint类来实例化一个名为llm的大语言模型对象,模型名称为Qianfan-Chinese-Llama-2-7B。其余部分与之前的get_response_from_gpt_4o函数相同,包括模板的定义、PromptTemplate和LLMChain的创建及运行。
最后,是调用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 = """问题: {question}
回答: 请一步一步思考,然后回答."""
prompt = PromptTemplate(template=template, input_variables=["question"])
llm_chain = LLMChain(prompt=prompt, llm=llm)
response = llm_chain.run(question)
return response
需要说明的是,由于调用了多个平台的大模型,因此需要预先配置多平台模型访问的Key,可以通过创建.env 文件定义这些Key。可以在程序相同的目录下创建.env 文件,文件内容如下:
OPENAI_API_KEY=sk-3M3Cg1uLVDS7nXXXkFSlNV0Ts1CamgSP
QIANFAN_AK=Y5DvSDyyAZKXXXHu719rP
QIANFAN_SK=CKsfjtXawcjsg1XXXU3VwpACgZdorI
DASHSCOPE_API_KEY=sk-f93952eXXX4b3b65f0906a1e0e7
`.env` 文件用于存储应用程序的环境变量,包括访问API的密钥和其他配置参数。这些变量提供了应用程序在不同平台和服务之间进行交互所需的认证信息和配置。文件中包含多个API密钥和配置参数,用于不同的服务提供商:
创建完基本的模型调用函数之后,再来看看Web 页面的交互功能。创建app.py文件,使用Streamlit创建一个Web交互界面。用户在界面中可以选择要使用的大模型,并输入他们的问题。当用户点击“发送”按钮时,app.py 文件将根据用户选择的大模型,调用 selected_model.py 文件中的相应函数来处理问题。响应结果将显示在界面上,供用户查看和对比不同模型的表现。
下面来看看代码的实现,如下:
# 定义模型列表
models = ["Qianfan-Chinese-Llama-2-7B", "gpt-3.5-turbo", "qwen-plus","gpt-4o"]
# 创建一个下拉框,用户可以从中选择一个模型
selected_model = st.selectbox("请选择一个大模型:", models)
# 显示所选模型
# st.write(f"你现在选择了 {selected_model} 大模型")
st.markdown(f"你现在选择了 <span style='color:red; font-weight:bold;'>{selected_model}</span> 大模型", unsafe_allow_html=True)
# 创建文本输入框让用户输入问题
user_question = st.text_input("请输入你的问题:")
# 创建一个发送按钮
if st.button("发送"):
# 根据所选模型调用对应的函数
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 = "未知模型,请重新选择。"
# 确保LaTeX公式用双美元符号包围,并正确处理反斜杠
response_with_latex = response.replace("\(", "$$").replace("\)", "$$")
response_with_latex = response_with_latex.replace("[", "$$").replace("]", "$$")
# 显示返回的结果
st.markdown(response_with_latex, unsafe_allow_html=True)
这些代码内容与Web 交互息息相关,我们来逐一解释如下:
models = ["Qianfan-Chinese-Llama-2-7B", "gpt-3.5-turbo", "qwen-plus", "gpt-4o"]
selected_model = st.selectbox("请选择一个大模型:", models)
定义了一个包含模型名称的列表,命名为models,其中包括四个模型:Qianfan-Chinese-Llama-2-7B,gpt-3.5-turbo,qwen-plus,和gpt-4o。在下拉框选择的时候,会用到这个列表的信息。创建一个下拉框,用户可以从中选择一个模型。使用Streamlit的selectbox函数创建了一个下拉框,供用户选择模型。selectbox的第一个参数是提示文本,第二个参数是可供选择的选项列表。用户选择的模型存储在变量selected_model中。
st.markdown(f"你现在选择了 <span style='color:red; font-weight:bold;'>{selected_model}</span> 大模型", unsafe_allow_html=True)
使用st.markdown函数显示用户所选的模型,并通过HTML标签使所选模型的名称以红色和加粗的样式显示。unsafe_allow_html=True参数允许使用HTML标签。
user_question = st.text_input("请输入你的问题:")
使用Streamlit的text_input函数创建了一个文本输入框,提示用户输入问题。用户输入的问题存储在变量user_question中。
if st.button("发送"):
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 = "未知模型,请重新选择。"
使用Streamlit的button函数创建了一个按钮,按钮标签为“发送”。当用户点击按钮时,执行后续逻辑:
response_with_latex = response.replace("\(", "$$").replace("\)", "$$")
response_with_latex = response_with_latex.replace("[", "$$").replace("]", "$$")
st.markdown(response_with_latex, unsafe_allow_html=True)
由于每类模型返回的响应格式各不相同,为了确保显示的效果需要确保LaTeX公式用双美元符号包围,并正确处理反斜杠。代码中,将返回的响应中的LaTeX公式进行替换处理,将“(”替换为“$$”,将“)”替换为“$$”,同时将“[”替换为“$$”,将“]”替换为$$,进行了一些列处理。其目的是为了确保LaTeX公式在Markdown中能够正确渲染。
最后,使用st.markdown函数显示处理过的响应,并允许HTML标签通过设置unsafe_allow_html=True。这样可以确保返回的结果在界面上正确显示,包括可能的LaTeX公式。
完成代码之后,进入命令行工具保证在app.py 同一级目录下面,执行如下命令进行测试。
streamlit run app.py
看到如下图所示,说明Streamlit 已经在 本机的8502 端口启动了,此时会自动弹出浏览器并访问对应的Web页面地址。如果没有自动访问,可以手动在浏览器中输入http://localhost:8502 进行访问。
接下来,我们希望模型回答一个方程求解的问题:“求解下列方程组的所有实数解: 2x + 3y = 7 4x y = 1”。看看我们定义的4个模型的表现如何。
如下图所示,在展示的界面中,选择了“Qianfan-Chinese-Llama-2-7B”的模型,这个是百度千帆平台对Llama2模型进行中文训练集微调之后的模型,其参数是7B,也就是70亿。然后输入对应的问题,点击“发送”按钮,可以看到结果如下:
从显示结果来看Llama2模型返回了一些解题的思路,并给出了一个解:(5,-1)。我们把该解带入到第一个式子:2x+3y=7 发现没有问题,但是带入第二个式子:4x-y=1 发现明显不对(有兴趣大家可以自己算算哈)。
再来到第二个测试模型:“gpt-3.5-turbo”,如下图所示,输入同样的问题并且点击“发送”。
从结果上看x=-4, y=5 将其带入到第一个式子结果是正确的,再将其带入到第二个式子好像不太对了。
接着,看看“qwen-plus”文心一言模型的表现,如下图所示,输入问题,并且通过发送按钮请求结果。
如下图所示,结果是x=5/7 y=13/7。
我们可以将 x=5/7 y=13/7 都带入到方程式 2x + 3y = 7 4x y = 1 进行演算,发现结果同时满足两个方程式,“Qwen-plus”完成数学题。
最后,来看看gpt-4o的表现,如下图所示,选择“gpt-4o”然后提交同样的问题。
如下图所示,gpt-4o得到了和“Qwen-plus”相同的结果,从执行过程上看,gpt-4o通过三步计算出方程的解之后,还加了一个“第四步”将计算的结果带入原方程进行演算,显得比较“严谨”。
通过上面的实验,我们发现GPT-4o在解决方程组的问题上表现出了强大的能力。它不仅能够准确地识别并理解输入的方程组,还能够逐步地提供详细的解题过程。这充分展示了GPT-4o在以下几个方面的优势:
虽然此次展示的是文本和数学能力,但是从响应速度上看GPT-4o比之前的GPT-4有明显的提升。但是这些能力还是在文字生成方面,通过前面的介绍GPT-4o还具备处理图像、音频等多模态信息的能力。它能够综合利用多种信息源,提供更加全面和准确的解决方案。接下来我们还要介绍其在多模态处理方面的能力。
上面我们已经详细介绍了GPT-4o在文本理解、推理和生成方面的强大能力。通过对复杂数学问题的准确解答,GPT-4o展示了其在处理复杂文本任务上的卓越性能。接下来,我们将深入探讨GPT-4o的视觉处理能力。
为了全面评估其在这一方面的表现,我们准备了两张图片进行测试。首先,我们将展示一张风景图片,看看GPT-4o是否能够准确理解图片内容,识别出其中的细节和场景信息。其次,我们将测试一张包含多个数学公式的图片,检验GPT-4o是否能够识别这些公式并理解它们的含义,甚至进一步解答其中涉及的数学方程式。
直接上代码, 在原有的selected_model.py文件中加入新函数,让gpt-4o进行视觉识别。代码如下:
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
定义了一个名为get_response_from_pic_by_gpt_4o的函数,该函数接受两个参数:一个字符串类型的question用来接收用户的提问,另一个字符串类型的url用来接收图片的URL地址。函数将根据这两个参数生成并返回一个响应,也就是识别图片的内容信息。
human_message = HumanMessage(content=[
{ "type": "text", "text": question },
{ "type": "image_url", "image_url": { "url": url }}
])
创建了一个HumanMessage对象,并将其赋值给变量human_message。该对象包含一个content列表,列表中的第一个元素是包含文本问题的字典,第二个元素是包含图片URL的字典。这种结构将文本和图片信息组合在一起,以便传递给大语言模型。
llm = ChatOpenAI(model="gpt-4o")
response = llm.invoke([ human_message ])
return response.content
实例化一个ChatOpenAI对象,并将其赋值给变量llm。该对象使用了模型gpt-4o,用于处理输入的human_message并生成响应。接着,调用llm对象的invoke方法,传入包含human_message的列表。该方法会处理输入的消息并返回一个响应。返回的响应赋值给变量response,并将识别图片的内容信息content通过response.content的方式返回给调用者。
除了在selected_model.py 文件中添加函数之外,还需要修改app.py的部分代码,如下:
image_url = st.text_input("请输入图片的URL:")
使用Streamlit的text_input函数创建了一个文本输入框,提示用户输入图片的URL。用户输入的URL存储在变量image_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+)?' # 可选端口号
r'(?:/?|[/?]S+)$', re.IGNORECASE)
return re.match(regex, url) is not None
定义了一个名为is_valid_url的函数,该函数接受一个URL字符串作为参数。通过正则表达式regex验证URL的格式是否有效。如果URL匹配正则表达式,函数返回True,否则返回False。有了这个函数就可以判断我们输入的URL是否是符合规则的。
if st.button("发送"):
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)
这部分代码是在原来代码基础上进行了修改,根据用户选择的模型调用相应的函数处理问题。如果选择了gpt-4o,首先检查用户是否输入了图片URL且URL格式有效。如果满足条件,则调用get_response_from_pic_by_gpt_4o函数,传入用户输入的问题和图片URL,获取响应。如果未输入图片URL或URL格式无效,则调用get_response_from_gpt_4o函数,传入用户输入的问题,获取响应。
说白了,这段代码通过以下步骤实现了用户输入图片URL并调用相应函数生成响应的功能:
完成代码编写之后,我们开始功能的测试,首先确定要识别的图片,我们通过地址得到如下图所示的图片。
然后,通过streamlit run app.py 启动Web 交互界面,如下图所示,输入问题和图片的URL地址,然后点击“发送”按钮,请求gpt-4o模型。
从输出的内容可以看出,gpt-4o识别出了整个图片,包括:步道、草地、树木、蓝天、白云、阳光等信息。
看来gpt-4o的表现还不错,接着我们上点难度,提交一张多个数学公式组成的图片,如下图所示,图片包含了多个数学公式,我们可以通过地址访问。
看看gpt-4o能否理解、分析、计算出图片中的数学公式,如下图所示,在问题的部分我们告诉大模型“理解并求解图片中的数学题”,然后给出图片的URL地址,最后点击“发送”按钮请求大模型。
由于图片中的公式众多,我们取前面一部分展示给大家。 如下图所示,gpt-4o 解析出图片的公式按照图片公式的序号:(a) (b) (c) 进行排列,针对每个公式提供了详细的解题步骤,检查了一下结果是正确的。
通过本文的详细探讨和实例展示,我们看到了GPT-4o在多模态处理上的强大能力,以及它在实际应用中的广泛潜力。无论是处理复杂的数学问题还是进行精确的图像识别,GPT-4o都展现了卓越的性能和速度。本文提供的集成方法和代码实现为开发者提供了实用的参考,帮助他们将GPT-4o的强大功能融入到自己的应用中。展望未来,GPT-4o的发布预示着AI技术的又一次飞跃,它将引领人机交互进入一个更加智能和自然的新时代。
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社区编辑,资深架构师,拥有18年的软件开发和架构经验,10年分布式架构经验。
想了解更多AIGC的内容,请访问:
51CTO AI.x社区
https://www.51cto.com/aigc/