Я пытаюсь передать результаты вызова
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.
Что мне не хватает?





Пример кода
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 возвращает новый массив без изменения исходных данных.
А вы пробовали
chunks.Add(chunk);?