如何在本機端實作AI對話
一般在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其實是要記在資料庫裡的,這裡為了讓程式碼精簡,所以沒特別實作資料庫的部份,而底下是執行結果:
第二段
參考資料