翻譯|使用教程|編輯:龔雪|2025-05-20 09:55:02.950|閱讀 125 次
概述:本文介紹如何用DevExpress Blazor的AI聊天組件構建一個大型語言模型聊天應用程序,歡迎下載最新版體驗!
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
DevExpress Blazor UI組件使用了C#為Blazor Server和Blazor WebAssembly創建高影響力的用戶體驗,這個UI自建庫提供了一套全面的原生Blazor UI組件(包括Pivot Grid、調度程序、圖表、數據編輯器和報表等)。
AI服務提供各種量身定制的模型來滿足用戶需求、偏好和資源限制,模型有優點和缺點——有些是為編碼任務而優化的,而另一些則更適合于創造性寫作或實時信息檢索。
為了選擇合適的模型,您通常需要平衡性能和成本。例如,像GPT-4.1這樣的高級模型可以提供出色的結果,但需要更多的計算資源。相比之下,GPT-4.1 Mini或Nano等較輕的模型提供更快的響應速度和更低的成本,使其成為追求效率和響應能力的理想選擇。
對于企業應用程序來說,連接到基于云的AI服務能力——可以選擇回退到在受限環境中運行的離線模型,這通常是必須的。
DevExpress技術交流群11:749942875 歡迎一起進群討論
在這篇文章中,我們將向您展示如何使用DevExpress Blazor AI Chat和ComboBox組件構建一個多llm(大型語言模型)聊天應用程序,您將學習如何實現IChatClient接口來管理多個聊天客戶端及其各自的會話歷史(以及如何使用DevExpress Blazor ComboBox在聊天會話期間切換llm)。
要開始您必須首先將DxAIChat組件集成到應用程序中(有關這方面的其他信息,請參閱官方指南):。
在本指南中,我們將使用兩個LLMs: 來自Azure OpenAI的GPT-4o和來自Ollama的本地運行的Phi4。
以下是從Program.cs代碼單元中為兩個聊天客戶端注冊的示例,請注意,我們將LLM憑據和設置存儲在應用程序配置文件(appSettings.Development.json)中,您可以修改以下代碼來滿足具體要求:
using Azure;
using Azure.AI.OpenAI;
using Microsoft.Extensions.AI;
...
var openAiServiceSettings = builder.Configuration.GetSection("OpenAISettings").Get<OpenAIServiceSettings>();
var ollamaSettings = builder.Configuration.GetSection("OllamaSettings").Get<OllamaSettings>();
IChatClient azureChatClient = new AzureOpenAIClient(
new Uri(openAiServiceSettings.Endpoint),
new AzureKeyCredential(openAiServiceSettings.Key))
.AsChatClient(openAiServiceSettings.DeploymentName);
IChatClient ollamaChatClient = new OllamaChatClient(
new Uri(ollamaSettings.Uri),
ollamaSettings.ModelName);
注意:要安裝、運行和下載Ollama模型,請參考幫助主題。
接下來,我們將實現用于跟蹤每個客戶端及其歷史記錄的基礎設施。
首先,聲明代表單個LLM會話的ChatClientSession類(包括用戶友好的模型/服務名稱,客戶端實例和消息歷史):
using Microsoft.Extensions.AI;
//...
public class ChatClientSession {
public string Name { get; set; }
public IChatClient Client { get; }
public List<BlazorChatMessage> Messages { get; set; }
public ChatClientSession(IChatClient client, string name) {
Name = name;
Client = client ?? throw new ArgumentNullException(nameof(client));
Messages = new List<BlazorChatMessage>();
}
}
接下來,定義CompositeChatClient類,該類實現了IChatClient接口,并充當多個聊天客戶端的容器。通過在單個接口實現中封裝多個客戶端,可以將此功能與DevExpress Blazor AI Chat組件(依賴于IChatClient接口)集成。
該類旨在支持LLM切換,同時保留個人對話歷史。主要考慮因素包括:
下面是實現:
using Microsoft.Extensions.AI;
//...
public class CompositeChatClient : IChatClient {
public List<ChatClientSession> AvailableChatClients { get; }
public ChatClientSession? SelectedSession { get; set; }
public CompositeChatClient(params ChatClientSession[] chatClients) {
AvailableChatClients = chatClients.ToList();
SelectedSession = AvailableChatClients[0];
}
public Task<ChatResponse> GetResponseAsync(IEnumerable<ChatMessage> messages, ChatOptions? options = null,
CancellationToken cancellationToken = new CancellationToken()) {
return SelectedSession?.Client.GetResponseAsync(messages, options, cancellationToken);
}
public IAsyncEnumerable<ChatResponseUpdate> GetStreamingResponseAsync(IEnumerable<ChatMessage> messages, ChatOptions? options = null,
CancellationToken cancellationToken = new CancellationToken()) {
return SelectedSession?.Client.GetStreamingResponseAsync(messages, options, cancellationToken);
}
public void Dispose() {
for (int i = 0; i < AvailableChatClients.Count; i++) {
AvailableChatClients[i].Client.Dispose();
AvailableChatClients[i].Messages.Clear();
}
}
public object? GetService(Type serviceType, object? serviceKey = null) {
throw new NotImplementedException();
}
}
最后,切換回Program.cs并注冊CompositeChatClient,如下所示:
// Register both clients within a single instance of the IChatClient var compositeChatClient = new CompositeChatClient( new ChatClientSession(azureChatClient, "Azure Open AI — GPT4o"), new ChatClientSession(ollamaChatClient, "Ollama — Phi 4")); builder.Services.AddScoped<IChatClient>((provider) => compositeChatClient); builder.Services.AddDevExpressAI();
為了允許LLM選擇,使用DxAIChat組件打開razor頁面,并添加DevExpress Blazor ComboBox。主要考慮因素包括:
下面是實現的一個片段:
@page "/"
@using DevExpress.AIIntegration.Blazor.Chat
@using DXBlazorChatSelector.Services
@using Microsoft.Extensions.AI
<div class="main-container">
<div class="top-container">
<DxComboBox Data="@ModelsList"
CssClass="selector-container-combo-editor"
TextFieldName="@nameof(ChatClientSession.Name)"
Value="ChatClientProvider.SelectedSession"
ValueChanged="@((ChatClientSession session) => OnModelChanged(session))"/>
</div>
<DxAIChat @ref="DxAiChat" CssClass="my-chat"></DxAIChat>
</div>
@code{
[Inject]
IChatClient? ChatClient { get; set; }
CompositeChatClient ChatClientProvider => ChatClient as CompositeChatClient;
DxAIChat? DxAiChat { get; set; }
List<ChatClientSession> ModelsList => ChatClientProvider?.AvailableChatClients;
private void OnModelChanged(ChatClientSession value) {
SaveLastAssistantMessage(DxAiChat.SaveMessages());
ChatClientProvider.SelectedSession = value;
DxAiChat.LoadMessages(ChatClientProvider.SelectedSession.Messages);
}
private void SaveLastAssistantMessage(IEnumerable<BlazorChatMessage> saveMessages) {
if(ChatClientProvider.SelectedSession != null) {
ChatClientProvider.SelectedSession.Messages.Clear();
ChatClientProvider.SelectedSession.Messages.AddRange(saveMessages);
}
}
}
要清除所選LLM的消息歷史記錄并開始新的聊天會話,我們將添加DxButton并將其放置在Index.razor頁面中的DxComboBox附近。主要考慮因素包括:
更新后的Index.razor頁面代碼:
@page "/"
@using DevExpress.AIIntegration.Blazor.Chat
@using DXBlazorChatSelector.Services
@using Microsoft.Extensions.AI
<div class="main-container">
<div class="top-container">
<DxButton RenderStyle="ButtonRenderStyle.Primary"
RenderStyleMode="ButtonRenderStyleMode.Contained"
IconCssClass="refresh"
IconPosition="ButtonIconPosition.BeforeText"
CssClass="refresh-button"
Text="Start New Chat"
Click="ClearHistory"/>
<DxComboBox Data="@ModelsList"
CssClass="selector-container-combo-editor"
TextFieldName="@nameof(ChatClientSession.Name)"
Value="ChatClientProvider.SelectedSession"
ValueChanged="@((ChatClientSession session) => OnModelChanged(session))"/>
</div>
<DxAIChat @ref="DxAiChat" CssClass="my-chat"></DxAIChat>
</div>
@code{
[Inject]
IChatClient? ChatClient { get; set; }
CompositeChatClient ChatClientProvider => ChatClient as CompositeChatClient;
DxAIChat? DxAiChat { get; set; }
List<ChatClientSession> ModelsList => ChatClientProvider?.AvailableChatClients;
private void ClearHistory() {
ChatClientProvider.SelectedSession.Messages.Clear();
DxAiChat.LoadMessages(ChatClientProvider.SelectedSession.Messages);
}
private void OnModelChanged(ChatClientSession value) {
SaveLastAssistantMessage(DxAiChat.SaveMessages());
ChatClientProvider.SelectedSession = value;
DxAiChat.LoadMessages(ChatClientProvider.SelectedSession.Messages);
}
private void SaveLastAssistantMessage(IEnumerable<BlazorChatMessage> saveMessages) {
if(ChatClientProvider.SelectedSession != null) {
ChatClientProvider.SelectedSession.Messages.Clear();
ChatClientProvider.SelectedSession.Messages.AddRange(saveMessages);
}
}
}
下面圖片展示了我們的實現:
更多產品資訊及授權,歡迎來電咨詢:023-68661681
慧都是?家?業數字化解決?案公司,專注于軟件、?油與?業領域,以深?的業務理解和?業經驗,幫助企業實現智能化轉型與持續競爭優勢。
慧都科技是DevExpress的中國區的合作伙伴,DevExpress作為用戶界面領域的優秀產品,幫助企業高效構建權限管理、數據可視化(如網格/圖表/儀表盤)、跨平臺系統(WinForms/ASP.NET/.NET MAUI)及行業定制解決方案,加速開發并強化交互體驗。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉載自:慧都網