我需要处理一批视频项目,对它们进行格式化,并调用一个异步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
是空字符串(""
)。
当我设置断点并调试时,可以看到空字符串 ""
。
看起来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.
这意味着技术上它不允许并发操作。