并发调用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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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