从azure openai sdk API返回流的正确方法

ccrfmcuu  于 2023-05-23  发布在  其他
关注(0)|答案(1)|浏览(550)

我试图返回流结果从azure openai API,任何人都可以告诉,如果最后一行在下面的方法将返回完整的内容,或将错过的内容没有收到的api。.另外,这是从Azure OpenAI SDK流API返回流的正确方法吗?

public async Task<Stream> GetStreamResponse(CompletionsRequest rawAzureOpenAIRequest)
{
    rawAzureOpenAIRequest = new CompletionsRequest();
    rawAzureOpenAIRequest.ModelToUse = DefaultTextModelToUse;
    CompletionsOptions optns = new CompletionsOptions();
    optns.Prompts.Add("below is the summary of technical consultant role in software");

    var azResponse = await _openAIRepository
        .GetRawCompletionStreamingResponse(rawAzureOpenAIRequest.ModelToUse, optns,
        canToken);

    return azResponse.GetRawResponse().ContentStream;
}

下面是azure的方法描述,但我不清楚“对于没有内容的响应返回null”在这里是什么意思。是指还没取的内容吗?

我发现了另一种使用azure openai API产生返回的方法,但它是批量产生的,并且没有按预期工作。

public async IAsyncEnumerable<string> GetStreamResponse(CompletionsRequest rawAzureOpenAIRequest)
{
    rawAzureOpenAIRequest = new CompletionsRequest();
    rawAzureOpenAIRequest.ModelToUse = DefaultTextModelToUse;
    CompletionsOptions optns = new CompletionsOptions();
    optns.Prompts.Add("below is the summary of technical consultant role in software");

    var azResponse = await _openAIRepository.GetStreamingResponse(rawAzureOpenAIRequest.ModelToUse, optns,
                canToken);

    await foreach (var choice in azResponse.Value.GetChoicesStreaming())
    {
        await foreach (var message in choice.GetTextStreaming())
        {
            yield return message;
        }
    }
}

我尝试创建一个消费API,它似乎返回结果,但我认为我可能会使用方法1丢失一些数据。

jyztefdp

jyztefdp1#

  • 在第一种方法中,行return azResponse.GetRawResponse().ContentStream;将返回从Azure OpenAI API获得的流。
  • ContentStream property对于没有内容的响应返回null。

在Azure OpenAI SDK的上下文中,如果API响应没有任何要返回的内容,则ContentStream属性将为null。它不引用尚未获取的内容。

  • 对于使用第一种方法丢失的数据,您可以在返回ContentStream之前检查它是否为null。

处理ContentStream为null的情况的C#代码。

public async Task<Stream> GetStreamResponse(CompletionsRequest rawAzureOpenAIRequest)
{
    rawAzureOpenAIRequest = new CompletionsRequest();
    rawAzureOpenAIRequest.ModelToUse = DefaultTextModelToUse;
    CompletionsOptions optns = new CompletionsOptions();
    optns.Prompts.Add("below is the summary of technical consultant role in software");

    var azResponse = await _openAIRepository.GetRawCompletionStreamingResponse(rawAzureOpenAIRequest.ModelToUse, optns, canToken);
    if (azResponse.GetRawResponse().ContentStream != null)
    {
        return azResponse.GetRawResponse().ContentStream;
    }
    throw new Exception("No content available from the API response.");
}
  • 对于使用IAsyncEnumerable的第二种方法,它以批处理的方式给出结果,并在消息可用时返回每个消息。

有关详细信息,请参阅azure-sdk-for-net/ResponseSamples.cs at main- GitHubGithub Issue.

相关问题