Чат OpenAI_API возвращает ноль

Я пытаюсь передать результаты вызова

public async IAsyncEnumerable<string> Stream(string prompt) {
    var chat = api.Chat.CreateConversation(new ChatRequest() {
        Model = this.LanguageModel,
        Temperature = 0.1,
        MaxTokens = 50
    });
    chat.AppendUserInput(prompt);
    Console.WriteLine(String.Format("Querying with prompt: {0}", prompt));

    int i = 0;
    await foreach (var resp in chat.StreamResponseEnumerableFromChatbotAsync()) {
        Console.WriteLine(i++);
        Console.WriteLine(chat.MostResentAPIResult);
        yield return resp;
    }
    Console.WriteLine("Last");
    Console.WriteLine(chat.MostResentAPIResult);
}

Документация показывает это использование:

var chat = api.Chat.CreateConversation();
chat.AppendUserInput("How to make a hamburger?");

await foreach (var res in chat.StreamResponseEnumerableFromChatbotAsync())
{
    Console.Write(res);
}

К сожалению, когда я тестирую свою реализацию (без ведения журнала консоли), она возвращает пустую строку.

public async Task IntegrationTestPromptStream() {
    IConversation conv = new OpenAIConversation(OpenAI_API.Models.Model.GPT4);
    var response = conv.Stream("Repeat back this sentence \"This is a multi word example that should chunk\"");
    var chunks = new List<string>();
    await foreach (var chunk in response) {
        chunks.Append(chunk);
    }

    Assert.That(
        String.Join(" ", chunks),
        Is.EqualTo("This is a multi word example that should chunk"),
        "Didn't receive expected response from OpenAI chat");
}

Я добавил операторы ведения журнала консоли, чтобы определить, что вызывалось, и это результат.

Querying with prompt: Repeat back this sentence "This is a multi word example that should chunk"
0

NUnit Adapter 4.1.0.0: Test execution complete

Если я подключаю отладчик и пытаюсь проверить chat.MostResentAPIResult [sic], я могу увидеть объект, но, в частности, метод .ToString() выдает исключение нулевой ссылки.

Наконец, если я просто оставлю счетчик индекса hte, но удалю операторы для вывода последнего ответа, я получу это

Querying with prompt: Repeat back this sentence "This is a multi word example that should chunk"
0
1
2
3
4
5
6
7
8
9
Last

Таким образом, он будет перебирать пустые строки в течение всего дня, но попытка просмотреть ответ возвращает нуль или исключение NullReferenceException.

Что мне не хватает?

А вы пробовали chunks.Add(chunk);?

TechLoom 06.05.2023 15:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пример кода

using System.Collections;
using System.Collections.Generic;


List<string> strings = new List<string>();

void OutputAdd()
{
    Console.WriteLine("Output for Add Mehtod ...");


    for (int i = 0; i < 10; i++)
    {
        strings.Add($"Testing using Add {i}");
    }

    foreach (var line in strings)
    {
        Console.WriteLine(line);
    }
}

void OutputAppend()
{
    Console.WriteLine("Output for Append Mehtod ...");


    for (int i = 0; i < 10; i++)
    {
        strings.Append($"Testing using Append {i}");
    }

    foreach (var line in strings)
    {
        Console.WriteLine(line);
    }
}

void OutputAppendFixed()
{
    Console.WriteLine("Output for Append Fixed Mehtod ...");


    for (int i = 0; i < 10; i++)
    {
        strings = strings.Append($"Testing using Append with added code {i}").ToList();
    }

    foreach (var line in strings)
    {
        Console.WriteLine(line);
    }
}

OutputAdd();

OutputAppend();

OutputAppendFixed();

Если вы запустите это, вы увидите, что OutputAppend() будет показывать только то, что было добавлено из OutputAdd(). Затем, когда OutputAppendFixed() запустится, он добавит с помощью метода Append. Это связано с тем, что Append возвращает IEnumerable<T>.

Add изменяет исходные данные, а Append возвращает новый массив без изменения исходных данных.

Другие вопросы по теме