一般在ChatGPT的對話中,是具有連續性的,但實際上在本機實作時,這種連續性的對話是要額外把對話存起來,在下一個提示詞夾帶進去。所以有在接觸Ollama的朋友就會發現,其實AI它是不會記得你上次說了什麼,也不記得回答了什麼。

幸好微軟的Microsoft.Extensions.AI套件,可以讓你輕鬆實作這一塊功能。

先來看程式碼,底下的程式碼示範如何記錄對話並讓AI知道上次的對話記錄:

async Task ChatingTest(IChatClient chatClient)
{
    List<Microsoft.Extensions.AI.ChatMessage> chatHistory = new List<Microsoft.Extensions.AI.ChatMessage>();

    ChatOptions chatOptions = new();
    chatOptions.ConversationId = Guid.NewGuid().ToString();
    string prompt= "請幫我列出咖啡店的廣告文宣。";
    Microsoft.Extensions.AI.ChatMessage chatMessage = new(Microsoft.Extensions.AI.ChatRole.User, prompt);
    chatHistory.Add(chatMessage);
    var chatCompletion = await chatClient.GetResponseAsync(chatHistory, chatOptions);
    Console.WriteLine($"Prompt:{prompt}");
    Console.WriteLine();
    foreach (var message in chatCompletion.Messages)
    {
        Console.Write(message.Text);
    }
    Console.WriteLine();
    chatHistory.Add(new Microsoft.Extensions.AI.ChatMessage(Microsoft.Extensions.AI.ChatRole.Assistant, chatCompletion.Text));

    prompt = "幫我把前述的文宣寫得精簡一點";
    chatMessage = new(Microsoft.Extensions.AI.ChatRole.User, prompt);
    chatHistory.Add(chatMessage);
    Console.WriteLine($"Prompt:{prompt}");
    Console.WriteLine("2nd response:");
    chatCompletion = await chatClient.GetResponseAsync(chatHistory, chatOptions);
    foreach (var message in chatCompletion.Messages)
    {
        Console.Write(message.Text);
    }
    Console.WriteLine();
}

從上面的程式碼,可以知道首先要利用Microsoft.Extensions.AI.ChatMessage物件來記錄每一段對話,並且明確標註是使用者還是AI,接著在送提示詞時,已經不是單純字串型態的prompt,而是List<Microsoft.Extensions.AI.ChatMessage>,當然這個List其實是要記在資料庫裡的,這裡為了讓程式碼精簡,所以沒特別實作資料庫的部份,而底下是執行結果:

第二段

參考資料