集成ChatGPT API实现图像物体检测遇异常,求技术答疑
集成ChatGPT API实现图像物体检测时的异常问题
我在集成ChatGPT API实现图像物体检测时遇到异常:根据OpenAI官方视觉接口文档,该API应支持图像分析能力,但调用后API回复称自身是文本模型,无法查看或分析图像。我需要获取图像中物品的名称及数量以对接Edamam API,请求答疑。
错误原因分析
从提供的代码来看,问题出在两个核心点:
- 模型选择错误:使用了不支持视觉能力的
gpt-4模型,必须使用专门的多模态视觉模型gpt-4-vision-preview - 请求格式错误:构造请求时,将
image_url类型的内容转换成纯文本字符串(Image URL: ${contentItem.image_url}),并合并成单一文本内容传递给API,完全不符合视觉API要求的多模态消息格式,导致API将请求识别为纯文本交互。
修复方案
- 替换模型为
gpt-4-vision-preview - 保留消息的多模态结构,直接传递包含
text和image_url类型的内容数组,不做文本转换 - 调整
Message接口,使其支持灵活的内容元素数组(而非固定两个元素)
修复后的代码
openAI.ts
import OpenAI from "openai"; import dotenv from "dotenv"; dotenv.config(); // 调整接口,支持灵活的内容元素类型 export interface Message { role: "user" | "assistant"; content: Array< { type: "text"; text: string } | { type: "image_url"; image_url: { url: string } } >; } const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY, }); async function fetchChatCompletion(messages: Message[]): Promise<string> { console.log("messages: \n", messages); try { const response = await openai.chat.completions.create({ model: "gpt-4-vision-preview", // 使用支持视觉的模型 messages: messages, // 直接传递原始多模态消息结构 max_tokens: 1024, // 按需调整token数量 }); const latestResponse = response.choices[0].message.content; return latestResponse; } catch (error) { console.error("API Error: ", error.message); return error.message; } } export { fetchChatCompletion };
openAI.test.ts
import env from "dotenv"; import { fetchChatCompletion, Message } from "../../services/openAI"; env.config(); const imageURL = "https://www.diabetesfoodhub.org/system/user_files/Images/1837-diabetic-pecan-crusted-chicken-breast_JulAug20DF_clean-simple_061720.jpg"; const message: Message[] = [ { role: "user", content: [ { type: "text", text: "Hello, Could you please provide me the name of each item and the quantity of each item in the image for using it in Edamam API?", }, { type: "image_url", image_url: { url: imageURL }, }, ], }, ]; describe("fetchChatCompletion", () => { test("fetches chat completion successfully", async () => { try { const response = await fetchChatCompletion(message); expect(response).toBeDefined(); console.log("response from API: \n", response); } catch (error) { console.error("API Error: ", error.message); } }, 30000); // 延长超时时间至30秒 });
内容的提问来源于stack exchange,提问作者Dolev Shmueli
相关产品推荐
相关产品推荐

