界面控件DevExpress Blazor中文教程:AI聊天 - 如何實現函數調用?

DevExpress?Blazor UI組件使用了C#為Blazor Server和Blazor WebAssembly創建高影響力的用戶體驗,這個UI自建庫提供了一套全面的原生Blazor UI組件(包括Pivot Grid、調度程序、圖表、數據編輯器和報表等)。

現代AI驅動的應用程序需要與外部系統或內部應用程序組件無縫交互,許多AI服務提供商現在支持函數調用(也稱為工具調用),這允許AI模型在運行時觸發函數。這種功能對于AI需要執行諸如獲取數據、調用API或在應用程序中啟動任務(從安排約會和修改數據庫信息到更新應用程序的外觀)等操作的代理工作流/應用程序特別有價值。

獲取DevExpress v24.2正式版下載

本文實例中的整個流程是這樣的:模型不是回復用戶消息,而是請求一個帶有指定參數的函數調用,然后聊天客戶端調用該函數并將結果返回給LLM。此時,LLM根據函數返回的值構造一個響應。

在本指南中,我們將探索如何在DevExpress?Blazor DxAiChat組件中啟用函數調用:

  • 來自Microsoft.Extensions.AI庫的IChatClient接口
  • 來自Microsoft語義內核的插件
開始

要開始,您必須首先將DxAiChat組件集成到應用程序中(請參閱我們的官方指南以獲取更多信息):Add AI Chat to a Project。

接下來注冊您的AI服務,在這個例子中我們將使用Azure OpenAI。下面是一個示例Program.cs設置:

using Azure.AI.OpenAI;
using Microsoft.Extensions.AI;
...
var builder = WebApplication.CreateBuilder(args);
...
// Replace with your endpoint, API key, and deployed AI model name
string azureOpenAIEndpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT");
string azureOpenAIKey = Environment.GetEnvironmentVariable("AZURE_OPENAI_API_KEY");
string deploymentName = string.Empty;
...
var azureChatClient = new AzureOpenAIClient(
new Uri(azureOpenAIEndpoint),
new AzureKeyCredential(azureOpenAIKey));IChatClient chatClient = azureChatClient.AsChatClient(deploymentName);builder.Services.AddDevExpressBlazor();
builder.Services.AddChatClient(chatClient);
builder.Services.AddDevExpressAI();

運行項目來確認您可以發送消息和接收AI響應。

使用IChatClient調用工具

首先,定義一個簡單的函數來檢索指定城市的天氣信息。在本例中,這是GetWeatherTool。為了幫助AI理解如何調用GetWeatherTool函數,請使用方法及其參數的System.ComponentModel.Description屬性。LLM使用參數找出最合適的方法調用,并規劃調用順序:

using System.ComponentModel;
using Microsoft.Extensions.AI;public class CustomAIFunctions
{
public static AIFunction GetWeatherTool => AIFunctionFactory.Create(GetWeather);
[Description("Gets the current weather in the city")]
public static string GetWeather([Description("The name of the city")] string city)
{
switch (city)
{
case "Los Angeles":
case "LA":
return GetTemperatureValue(20);
case "London":
return GetTemperatureValue(15);
default:
return $"The information about the weather in {city} is not available.";
}
}
static string GetTemperatureValue(int value)
{
var valueInFahrenheits = value * 9 / 5 + 32;
return $"{valueInFahrenheits}\u00b0F ({value}\u00b0C)";
}
}

修改聊天客戶端注冊,如下所示,來提供可用函數列表,并允許客戶端在回答用戶問題時調用函數。確保首先配置聊天客戶端選項,因為這里的方法調用順序至關重要:

using Azure;
using Azure.AI.OpenAI;
using Microsoft.Extensions.AI;
...
IChatClient chatClient = new ChatClientBuilder(azureChatClient)
.ConfigureOptions(opt =>
{
opt.Tools = [CustomAIFunctions.GetWeatherTool];
})
.UseFunctionInvocation()
.Build();builder.Services.AddChatClient(chatClient);

此時當用戶向AI服務詢問天氣時,該服務將自動觸發GetWeatherTool函數并將結果添加到其響應中。

界面控件DevExpress Blazor中文教程

集成語義內核插件

Microsoft語義內核允許開發人員將高級AI功能整合到應用程序中(包括推理、工作流編排和動態提示工程),Microsoft的框架通過允許應用程序與插件交互和更有效地管理內存來增強AI解決方案。

首先,將以下NuGet包添加到項目中:

  • Microsoft.SemanticKernel
  • Microsoft.SemanticKernel.Plugins.Core
  • Microsoft.SemanticKernel.Connectors.OpenAI?(或為您的AI提供商提供適當的連接器)

如果您已經在應用程序中使用語義內核,并且熟悉插件的概念,可以很容易地將它連接到DevExpress?Blazor DxAiChat控件。

由于DevExpress AI驅動的API使用IChatClient接口與llm一起操作,您需要手動實現接口并從語義內核調用IChatCompletionService方法:

using Microsoft.Extensions.AI;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
...
public class SemanticKernelPluginCallingChatClient : IChatClient {
private IChatCompletionService _chatCompletionService;
private Kernel _kernel;
private OpenAIPromptExecutionSettings _executionSettings;
public SemanticKernelPluginCallingChatClient(Kernel kernel)
{
_kernel = kernel;
_chatCompletionService = _kernel.GetRequiredService();
_executionSettings = new OpenAIPromptExecutionSettings() { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions };
}public async Task GetResponseAsync(IEnumerable chatMessages, ChatOptions? options = null, CancellationToken cancellationToken = default)
{
var history = GetChatHistory(chatMessages);
ChatMessageContent message = await _chatCompletionService.GetChatMessageContentAsync(history, _executionSettings, _kernel, cancellationToken);
return new ChatResponse(new ChatMessage(ChatRole.Assistant, message.Content));
}public async IAsyncEnumerable GetStreamingResponseAsync(IEnumerable chatMessages, ChatOptions? options = null, CancellationToken cancellationToken = default)
{
var history = GetChatHistory(chatMessages);
await foreach(var item in _chatCompletionService.GetStreamingChatMessageContentsAsync(history, _executionSettings, _kernel, cancellationToken)) {
yield return new ChatResponseUpdate(ChatRole.Assistant, item.Content);
}
}AuthorRole GetRole(ChatRole chatRole) {
if(chatRole == ChatRole.User) return AuthorRole.User;
if(chatRole == ChatRole.System) return AuthorRole.System;
if(chatRole == ChatRole.Assistant) return AuthorRole.Assistant;
if(chatRole == ChatRole.Tool) return AuthorRole.Tool;
throw new Exception();
}private ChatHistory GetChatHistory(IEnumerable chatMessages)
{
var history = new ChatHistory(chatMessages.Select(x => new ChatMessageContent(GetRole(x.Role), x.Text)));
return history;
}
...
}

實現一個類似于前面函數的語義內核插件,但是用Microsoft.SemanticKernel.KernelFunction屬性修飾main函數方法:

using Microsoft.SemanticKernel;
using System.ComponentModel;
...public class WeatherPlugin {
[KernelFunction]
[Description("Gets the current weather in the city")]
public static string GetWeather([Description("The name of the city")] string city) {
switch(city) {
case "Los Angeles":
case "LA":
return GetTemperatureValue(20);
case "London":
return GetTemperatureValue(15);
default:
return $"The information about the weather in {city} is not available.";
}
}
static string GetTemperatureValue(int value)
{
var valueInFahrenheits = value * 9 / 5 + 32;
return $"{valueInFahrenheits}\u00b0F ({value}\u00b0C)";
}
}

最后,在應用程序啟動時注冊語義內核和聊天客戶端:

using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Plugins.Core;
...var semanticKernelBuilder = Kernel.CreateBuilder();
semanticKernelBuilder.AddAzureOpenAIChatCompletion(
deploymentName,
azureOpenAIEndpoint,
azureOpenAIKey);// Add plugins from Microsoft.SemanticKernel.Plugins.Core
#pragma warning disable SKEXP0050
semanticKernelBuilder.Plugins.AddFromType<TimePlugin>(); // this is a built-in plugin
semanticKernelBuilder.Plugins.AddFromType<WeatherPlugin>(); // this is our custom plugin
#pragma warning restore SKEXP0050var globalKernel = semanticKernelBuilder.Build();
builder.Services.AddChatClient(new SemanticKernelPluginCallingChatClient(globalKernel));builder.Services.AddDevExpressAI();

一旦配置好,您的應用程序將使用Semantic Kernel插件來智能地處理請求:

界面控件DevExpress Blazor中文教程

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88459.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88459.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88459.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

github 上的php項目

github 上的php項目 項目的網址 &#xff08;Loong1996/LikeGirlSite: 情侶網站、情侶網頁、戀愛記錄網站&#xff09; # 修改 # admin/Config_DB.php//localhost 為數據庫地址 一般使用默認的即可 或&#xff08;127.0.0.1&#xff09; $db_address "mysql_php";/…

區間求最值問題高效解決方法

對于區間求最值場景&#xff0c;如果區間不定長度的&#xff0c;可以使用稀疏表進行求解&#xff0c;如果區間是固定長度的&#xff0c;則可以使用分塊的思想&#xff08;與稀疏表原理類似&#xff09;&#xff0c;都是通過壓縮狀態個數&#xff0c; 1 關于稀疏表的原理詳見&a…

Linux程序設計:什么時候選擇開發內核模塊?

最近看一個CPU使用率高的問題,從perf里看,是下面的一個占用的比較多是下面一個 Overhead Source:Line Symbol Shared Object - 8.48% [vdso][1129] 0x1129 B [.] 0x0000000000001129

OpenCV CUDA模塊設備層-----歐幾里得距離函數hypot()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 該函數用于計算兩個無符號字符向量&#xff08;uchar1&#xff09;的歐幾里得距離&#xff08;即直角三角形的斜邊長度&#xff09;&#xff0c;…

惠普HP LaserJet Pro P1106 打印機信息

基本信息 產品類型&#xff1a;黑白激光打印機。上市時間&#xff1a;2011 年。最大打印幅面&#xff1a;A4。網絡打印&#xff1a;不支持網絡打印。雙面打印&#xff1a;手動雙面打印。 性能參數 打印速度&#xff1a;黑白打印速度&#xff08;ISO&#xff0c;A4&#xff09;正…

通義靈碼智能體模式在企業級開發中的應用:以云效DevOps自動化流程為例

一、智能體模式的核心能力 通義靈碼的智能體模式區別于傳統代碼補全工具&#xff0c;具備&#xff1a; 語義級理解&#xff1a;解析業務需求、代碼上下文及錯誤日志。自主任務閉環&#xff1a;從問題診斷→ 代碼生成→ 測試覆蓋→ 文檔生成全流程自動化。環境感知&#xff1a…

SQL學習筆記2

DDL、DML、DQL、DCL基礎語法 1、DDL 查詢 查詢所有數據庫&#xff1a;show databases; show databases; 查詢當前數據庫&#xff1a;select database(); select database(); 數據庫創建 創建數據庫:create database [if not exist(若存在重名數據庫&#xff0c;則不創建…

VScode常用快捷鍵【個人總結】

注&#xff1a;快捷鍵以 Windows/Linux 為主&#xff0c;Mac 用戶將 Ctrl 替換為 Cmd&#xff0c;Alt 替換為 Option。 1. 編輯相關 快速復制與剪切 Alt Shift ↓&#xff1a;復制當前行到下方Alt Shift ↑&#xff1a;復制當前行到上方Ctrl X&#xff1a;剪切整行&…

數據結構與算法:線性表-順序表(順序存儲)

一、線性表的定義&#xff08;邏輯結構&#xff09; 線性表是由 n (n > 0) 個相同數據類型的數據元素組成的有限序列&#xff0c;其中 n 為線性表的表長&#xff0c;當 n 0 時&#xff0c;線性表為空表。如果用 L 命名線性表&#xff0c;那么一般表示為&#xff1a;L (a1…

從源碼到實踐:Java集合框架面試核心知識點全解析

在Java開發中&#xff0c;集合框架&#xff08;Java Collections Framework&#xff09;是最基礎也最常用的工具集。無論是處理業務邏輯時的數據暫存&#xff0c;還是高性能場景下的算法優化&#xff0c;集合的使用都貫穿始終。因此&#xff0c;Java集合相關的面試題幾乎是所有…

【深度學習新浪潮】空間計算的醫療應用技術分析(簡要版)

空間計算是一種通過融合計算機視覺、傳感器技術與三維渲染,將虛擬內容精準錨定到物理空間,實現數字世界與現實世界無縫交互的技術體系。其核心在于讓計算機理解真實環境的結構、位置和動態,從而支持自然交互(如手勢、語音、眼動)和沉浸式體驗。例如,蘋果Vision Pro通過實…

win電腦沒有xcode怎么上傳ipa

在上架IOS項目的時候&#xff0c;遇到一個問題&#xff0c;如下圖&#xff0c;在app store connect上架的時候&#xff0c;需要選擇一個構建版本&#xff0c;然后它在下方提示&#xff0c;點擊查看上傳工具后&#xff0c;會發現需要下載xcode或mac命令行等工具來上傳編譯后的文…

相機標定與3D重建技術通俗講解

一、什么是相機標定&#xff1f;能解決什么問題&#xff1f; 相機標定是計算機視覺中的基礎技術&#xff0c;簡單來說&#xff0c;就是確定相機從3D世界拍攝到2D圖像時的"轉換規則"。具體解決兩個核心問題&#xff1a; 相機內部屬性&#xff1a;如焦距&#xff08;…

DeepSeek-Reasoner推理模型示例

《DEEPSEEK原生應用與智能體開發實踐 王曉華 書籍 圖書》【摘要 書評 試讀】- 京東圖書 在之前講解的示例中&#xff08;指這個示例&#xff1a;通過Prompt提示構建思維鏈-CSDN博客&#xff09;&#xff0c;無論是進行日常對話還是調用特定工具&#xff0c;我們所依賴的底層技…

常說的電源芯片到底指什么?

電源芯片是電子系統中用于管理、轉換和分配電能的集成電路&#xff0c;根據功能和應用場景的不同&#xff0c;主要分為以下幾類&#xff1a; 一、線性穩壓器&#xff08;LDO, Low Dropout Regulator&#xff09; LDO內部的基本電路情況如下&#xff1a; LDO內部主要分為四大部…

【大模型學習】項目練習:套殼DeepSeek

這里是阿川的博客&#xff0c;祝您變得更強 ? 個人主頁&#xff1a;在線OJ的阿川 &#x1f496;文章專欄&#xff1a;AI入門到進階 &#x1f30f;代碼倉庫&#xff1a; 寫在開頭 現在您看到的是我的結論或想法&#xff0c;但在這背后凝結了大量的思考、經驗和討論 &#x1f4…

筆記03:布線-過孔的調用與添加

布線-過孔的調用與添加 &#xff08;1&#xff09;在進行PCB設計時&#xff0c;都必須使用到過孔&#xff0c;對走線進行換層處理。在走線進行打過孔之前&#xff0c;必須先要添加過孔&#xff0c;這樣在PCB布線時才可以使用過孔。 &#xff08;2&#xff09;需要使用pad des…

在vscode中,Python程序的內置對象、關鍵字、自定義函數名/類名、字符串進行著色,說明分別是什么顏色?

在 VS Code 中&#xff0c;Python 代碼的著色完全取決于你當前使用的主題。不同主題&#xff08;如 Dark, Monokai, Solarized Dark, Light, Quiet Light 等&#xff09;對不同類型的代碼元素會使用不同的顏色。 一、Default Dark&#xff08;默認的深色主題&#xff09; impo…

Visual Studio 中使用 AddressSanitizer 指南

Visual Studio 中使用 AddressSanitizer 指南 基于 Microsoft Visual Studio 2022&#xff0c;支持 MSVC 和 Clang 編譯器鏈&#xff0c;本文詳細說明如何在 VS 中配置和使用 AddressSanitizer&#xff0c;用于檢測內存誤用&#xff0c;如消息釋放后訪問、超界讀寫等類型錯誤。…

Flink Sink函數深度解析:從原理到實踐的全流程探索

在Flink的數據流處理體系中&#xff0c;Sink函數作為數據處理的最終出口&#xff0c;肩負著將處理后的數據寫入外部存儲引擎的關鍵使命。它如同數據旅程的終點站&#xff0c;決定著數據的最終歸宿與應用價值。深入理解Sink函數的工作原理、核心概念及實現方式&#xff0c;對構建…