You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

.NET SDK调用Azure OpenAI GPT-4o分析图片时请求卡住无响应问题排查

.NET SDK调用Azure OpenAI GPT-4o分析图片时请求卡住无响应问题排查

我帮你排查了下代码,发现问题主要出在多模态消息的格式构造上——和Python版本的正确写法对比,你的.NET代码没有按照Azure OpenAI要求的多模态请求格式传递图片内容,导致服务端无法正确解析请求,进而出现长时间无响应的情况。下面具体说问题和修复方案:

核心问题:用户消息内容不符合多模态请求规范

Python代码里,用户消息是把文本和图片作为独立的内容段(分别对应text和image_url类型)提交的,这是GPT-4o处理多模态请求的标准方式。但你的.NET代码直接把图片的base64字符串拼在了文本消息里,相当于把图片内容当成纯文本发送,服务端无法识别这是图片,自然无法正确处理请求,最终导致超时卡住。

另外还有两个小细节可能影响请求稳定性:

  • 客户端初始化时混用了ApiKeyCredential,针对Azure OpenAI SDK,应该使用AzureKeyCredential
  • 没有指定API版本,Python里用了2024-05-01-preview,这个版本对多模态支持更完善

修复后的完整代码示例

using Azure;
using Azure.AI.OpenAI;
using OpenAI.Chat;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;

// Azure OpenAI client library for .NET - version 2.1.0

public class AzureOpenAiService : IAzureOpenAiService
{
    private static string endpoint = "https://xyz.openai.azure.com/";
    private static string deployment = "gpt-4o";
    private static string apiKey = "LFK";
    // 指定和Python一致的API版本,确保多模态支持
    private static string apiVersion = "2024-05-01-preview";

    public async Task<string> FindPrimarySubjectAsync(string imagePath)
    {
        try
        {
            string base64Image = EncodeImage(imagePath);

            // 正确初始化Azure OpenAI客户端
            var credential = new AzureKeyCredential(apiKey);
            var client = new AzureOpenAIClient(new Uri(endpoint), credential, new OpenAIClientOptions
            {
                ApiVersion = apiVersion
            });

            var chatMessages = new List<ChatMessage>
            {
                new SystemChatMessage("Analyze the uploaded image and return a single-word description of the main subject. The response should be only one word, representing the most general yet accurate category."),
                // 用多模态内容段构造用户消息,明确区分文本和图片
                new UserChatMessage(new List<ChatMessageContentPart>
                {
                    new TextContentPart("What is in this image?"),
                    new ImageContentPart(new Uri($"data:image/png;base64,{base64Image}"))
                })
            };

            var chatClient = client.GetChatClient(deployment);
            // 设置超时时间,避免无限等待
            var chatRequest = new ChatCompletionOptions
            {
                Timeout = TimeSpan.FromSeconds(30)
            };

            var response = await chatClient.CompleteChatAsync(chatMessages, chatRequest);

            return response.Value.Content[0].Text;
        }
        catch (Exception ex)
        {
            // 添加日志便于排查具体错误
            Console.WriteLine($"请求出错: {ex.Message}");
            throw;
        }
    }

    private static string EncodeImage(string imagePath)
    {
        byte[] imageBytes = File.ReadAllBytes(imagePath);
        return Convert.ToBase64String(imageBytes);
    }
}

关键修改点说明

  1. 多模态消息构造:用ChatMessageContentPart列表分别传递文本和图片内容,让服务端明确识别不同类型的输入
  2. 客户端初始化优化:使用AzureKeyCredential替代ApiKeyCredential,并指定与Python一致的API版本
  3. 添加超时设置:给ChatCompletionOptions设置超时时间,避免无限等待
  4. 返回值处理:正确获取响应中的文本内容(response.Value.Content[0].Text

额外排查建议

  • 确认你的Azure OpenAI资源部署的GPT-4o模型支持多模态功能(目前GPT-4o默认支持,可在Azure门户验证)
  • 检查API密钥和endpoint是否正确,避免权限或网络连接问题
  • 可以先通过Azure OpenAI Studio的聊天界面测试相同的图片和提示词,确认服务端能正常响应

备注:内容来源于stack exchange,提问作者S7H

火山引擎 最新活动