并发调用OpenAI API返回空响应

我需要处理一批视频项目,对它们进行格式化,并调用一个异步API来获取YAML格式的额外数据。然而,尽管任务成功完成,API响应大多为空。以下是相关代码。

var fetchTasks = videos.Select(async item =>{    try    {        var formattedItem = new VideoItem        {            Title = item.Title,            Subtitle = _extractService.GetCleanSubtitle(item.Subtitle ?? ""),            Description = _extractService.GetCleanSubtitle(item.Description ?? ""),        };        if (string.IsNullOrEmpty(formattedItem.Subtitle) && string.IsNullOrEmpty(formattedItem.Description))        {            _logger.LogWarning($"Video {item.Id} has empty subtitle or description. Marking as not processed.");            item.NotProcess = true;            return new { item, processStatus = false, request = string.Empty, response = (string)null };        }        else        {            var builder = new RequestBuilder(formattedItem).WithYamlFormatPath(yamlPath);            var yamlRequest = builder.Build();            _logger.LogInformation($"Built YAML request: {yamlRequest}");            var response = await _apiService.CallApiAsync(yamlRequest);            _logger.LogInformation($"Response for video {item.Id}: {response}");            return new { item, processStatus = true, request = yamlRequest, response };        }    }    catch (Exception ex)    {        _logger.LogError($"Error fetching details for video {item.Id}: {ex.Message}");        return null;    }});var fetchedDetails = (await Task.WhenAll(fetchTasks)).Where(result => result != null);

CallApiAsync 方法

public async Task<string> CallApiAsync(string response){    try    {        var completionResult = await _openAiService.ChatCompletion.CreateCompletion(new ChatCompletionCreateRequest        {            Messages = new List<ChatMessage>            {                ChatMessage.FromSystem("You are a helpful assistant."),                ChatMessage.FromUser(response)            },            Model = Models.Gpt_3_5_Turbo,        });        if (completionResult.Successful)        {            Console.WriteLine(completionResult.Choices.First().Message.Content);            return completionResult.Choices.First().Message.Content;        }        return "";    }    catch (Exception ex)    {        // Log or handle exception as neede        Console.WriteLine($"Error calling ChatGPT API: {ex.Message}");        throw;    }}

在任务完成后处理响应。

foreach (var item in fetchedDetails){    var video = item.video;    var request = item.request;    var response = item.response;     var dbResponse = new Response     {         Request = request,         YtVideoId = item .Id,         Response = response     };}

在将响应保存到数据库时,我经常发现 item.response 是空字符串("")。

enter image description here

当我设置断点并调试时,可以看到空字符串 ""

看起来API调用已经开始,但在批处理中没有正确等待。任务似乎在没有等待来自 CallApiAsync 的响应的情况下就完成了。

这是否可能是问题所在

var completionResult = await _openAiService.ChatCompletion.CreateCompletion(new ChatCompletionCreateRequest

这段代码来自 https://github.com/betalgo/openai/blob/master/OpenAI.SDK/Managers/OpenAIChatCompletions.cs 可能是空响应的原因?

我该如何重构这段代码,以便正确等待外部API调用以获取响应,并并行处理?


回答:

响应中空值的原因是OpenAI本身造成的。

我在进行API调用时收到了以下错误,起初我没有注意到。

Rate limit reached for gpt-3.5-turbo in organization on tokens per min(TPM): Limit 60000, Used 57140, Requested 4647. Please try again in1.787s. Visit platform.openai.com/account/rate-limits to learn more.

这意味着技术上它不允许并发操作。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注