本文重点介绍了DevExpress在近年来最热门领域——人工智能(AI)和自然语言处理(NLP)的改进!
NLP是人工智能的一个分支,它允许计算机与人类语言进行交互,这包括以有意义/有用的方式理解、解释、生成和回应文本(和语音)的能力。基于NLP的功能允许更好的数据分析、个性化体验、高效的沟通,并导致更明智的决策和提高效率。例如:
- 机器翻译
- 文本摘要
- 文本生成
- 文本分类
- 以及更多…
P.S:DevExpress拥有.NET开发需要的所有平台控件,包含600多个UI控件、报表平台、DevExpress Dashboard eXpressApp 框架、适用于 Visual Studio的CodeRush等一系列辅助工具。
DevExpress技术交流群10:532598169 欢迎一起进群讨论
开始使用DevExpress AI支持的扩展
先决条件
DevExpress AI APIs允许您在WinForms、WPF或Blazor应用程序中注册和使用多个AI服务,DevExpress的抢先体验预览版(v24.2.1)支持以下AI服务:
- OpenAI
- Azure OpenAI
- Ollama
本文中描述的AI服务和DevExpress AI扩展遵循"bring your own key" 原则,DevExpress不提供REST API,也不提供任何内置的LLMs/SLMs。您需要有一个激活的Azure/Open AI订阅来获取REST API端点、密钥和模型部署名称,这些变量必须在应用程序启动时指定,来注册AI客户端并在应用程序中启用DevExpress AI-Powered扩展。
在开始之前,您需要满足以下先决条件:
- .NET 8 SDK 或 .NET Framework v4.7.2
- 激活DevExpress Universal 或 DevExpress DXperience授权(下载Early Access Preview v24.2 build)。
-
要使用Open AI,您需要以下内容:
- 一个激活的OpenAI订阅。
- API 密钥
- OpenAI .NET SDK
-
要使用Azure OpenAI,您需要以下内容:
- 一个激活的Azure订阅和Azure开放人工智能服务资源。
- Azure OpenAI .NET SDK
- 要使用自托管模型,您需要以下内容:
下表列出了DevExpress AI相关的NuGet包:
注册AI客户端
要在控制台应用程序中使用DevExpress AI-Powered扩展,您需要安装以下DevExpress包中的一个并注册AI客户端:
- DevExpress.AIIntegration
- DevExpress.AIIntegration.OpenAI, DevExpress.AIIntegration.Azure.OpenAI, or DevExpress.AIIntegration.Ollama(基于您的参数)
DevExpress AI-Powered扩展在AIExtensionsContainerDefault容器中运行,该容器管理已注册的AI客户端,以便DevExpress UI组件可以自动利用AI服务。
下面的代码片段注册了一个Azure OpenAI客户端:
using Azure.AI.OpenAI; using DevExpress.AIIntegration; ... //Modify the following lines to obtain and pass your personal Azure OpenAI credentails to the Register* method. string AzureOpenAIEndpoint { get { return Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT"); } } string AzureOpenAIKey { get { return Environment.GetEnvironmentVariable("AZURE_OPENAI_APIKEY"); } } string DeploymentName { get { return Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENTNAME"); } } AIExtensionsContainerDefault defaultAIContainer; ... static void Main() { defaultAIContainer = new AIExtensionsContainerDefault(); defaultAIContainer.RegisterChatClientOpenAIService( new AzureOpenAIClient(new Uri(AzureOpenAIEndpoint), new System.ClientModel.ApiKeyCredential(AzureOpenAIKey)), DeploymentName ); }
要使用离线的Ollama模型,请调用RegisterChatClientOllamaAIService方法。这个方法注册一个Ollama客户端,在这个方法中,第一个参数是默认的Ollama API Endpoint,第二个参数指定模型名称:
defaultAIContainer.RegisterChatClientOllamaAIService("http://localhost:11434/api/chat", "llama3.1");
一旦您注册了一个AI客户端,可以使用DevExpress AI驱动的扩展如下(DevExpress AI驱动的扩展如下所示):
var result = await defaultAIContainer.TranslateAsync(new TranslateRequest(textToTranslate, language)); //OR var translateExtension = defaultAIContainer.CreateTranslateExtension(); TranslateRequest request = new TranslateRequest(textToTranslate, language); var result = await translateExtension.ExecuteAsync(request, CancellationToken.None);
管理长输入文本和AI响应
处理大型文本块可能具有挑战性,但我们已经覆盖了。DevExpress AI-Powered扩展自动将大型内容拆分为可管理的块(包括段落、句子、单词、标点符号和其他文本元素),以确保准确处理,以下是如何管理大型文本块和处理AI服务响应的方法:
public async Task<string> GetTranslation(string textToTranslate, string language) { TextResponse result = await defaultAIContainer.TranslateAsync(new TranslateRequest(textToTranslate, language)); if(result.IsCompleted) return result.Response; if(!result.IsRestrictedOrFailed) { string translatedText = result.Response; while(result.IsContinuationRequired){ await result.ContinueAsync(); translatedText += result.Response } return translatedText; } //Something unexpected happened switch (result.Status) { case ResponseStatus.MaxTokenLimitExceeded: case ResponseStatus.InputSizeLimitExceeded: return "The text you're trying to send within a request is too long and exceeds the allowed limit."; case ResponseStatus.ContentFiltered: return "Potentially harmful content was detected in your request."; case ResponseStatus.Error: return "An error occurred while processing the request."; } throw new NotSupportedException(); }
重要的响应包括:
- MaxTokenLimitExceeded — 指示AI服务响应被截断,因为它超过了允许的限制(特别是来自模型)。当输入大小(请求)和输出(响应)的组合超过了模型在一次交互中可以处理的令牌的最大数量时,就会出现这种情况。例如,GPT-4o LLM根据所选择的计划具有8K-128K令牌的上下文窗口,而微软的小语言模型(SLM),如Phi-3 Mini,可以处理最多4K令牌。
- InputSizeLimitExceeded — 表示AI服务响应被我们的“引擎”截断,以防止过度的资源消耗,这允许您避免用户可能因提交过大的文本请求而无意中消耗所有Azure积分的情况。要修改这个限制,您可以显式地设置ChatMaxTokensDefault属性,使其与公司策略和模型上下文窗口大小保持一致。
使用以下设置来配置文本内容和图像的大小限制:
public static partial class AIIntegration { //Specifies the maximum number of tokens that can be processed by a model request. Applies to all DevExpress AI-Powered extensions. public static int? ChatMaxTokensDefault { get; set; } = null; //Specifies the default temperature for chat-based AI-Powered extensions. //To learn more please visit https://ai.stackexchange.com/questions/32477/what-is-the-temperature-in-the-gpt-models public static float? ChatTemperatureDefault { get; set; } = null; //Specifies the maximum allowed size of the text buffer per request, in bytes. public static int TextBufferMaxSize { get; set; } = 64 * 1024;//64kb //Specifies the maximum allowed size of the image buffer per request, in bytes. public static int ImageBufferMaxSize { get; set; } = 2 * 1024 * 1024;//2mb //Specifies the maximum allowed chunk length, in characters. public static int ChunkMaxLength { get; set; } = 6000; }
DevExpress AI-Powered扩展
DevExpress EAP v24.2附带以下AI支持的扩展:
这些扩展以类似聊天的方式工作 - 其中请求通过内置提示发送到OpenAI/Ollama模型。
除了提供对托管在Azure和Ollama中的AI模型的访问外,我们还实现了与Azure AI语言服务交互的API,包括Azure AI Translator和Azure AI Language(文本摘要)。服务的选择取决于您的预算,但是请注意,在调用以下方法时,文本翻译和摘要请求将专门发送到Azure AI语言服务:
string azureTranslatorEndpoint = GetEnvironmentVariable("AZURE_TRANSLATOR_ENDPOINT"); string azureTranslatorKey = GetEnvironmentVariable("AZURE_TRANSLATOR_API_KEY"); //Register an Azure.TextAnalytics client. defaultAIContainer.RegisterTranslatorAzureAIService(new TextTranslationClient(new AzureKeyCredential(azureTranslatorKey), new Uri(azureTranslatorEndpoint))); //Register an Azure.TextAnalytics client. string azureTextAnalyticsEndpoint = GetEnvironmentVariable("AZURE_TEXT_ANALYTICS_ENDPOINT"); string azureTextAnalyticsKey = GetEnvironmentVariable("AZURE_TEXT_ANALYTICS_API_KEY"); defaultAIContainer.RegisterTextAnalyticsAzureAIService(new TextAnalyticsClient(new Uri(azureTextAnalyticsEndpoint), new AzureKeyCredential(azureTextAnalyticsKey)));
自定义和扩展DevExpress AI-Powered的扩展
DevExpress AI驱动的扩展具有预先构建的提示,可以根据需要进行定制:
1. AI驱动的扩展中派生并覆盖GetSystemPrompt方法:
public class WilliamShakespeareStyleExtension : RewriteStyleExtension { public WilliamShakespeareStyleExtension(IServiceProvider serviceProvider) : base(serviceProvider) { } protected override string GetSystemPrompt(RewriteStyleRequest request) { return "Rewrite this text in the William Shakespeare style."; } }
2. 在默认容器中注册您的扩展(这将覆盖内置扩展):
defaultAIContainer.Register<RewriteStyleRequest, WilliamShakespeareStyleExtension>();
当您调用RewriteStyleAsync方法时,自定义提示将与用户输入一起发送到AI服务。
在这个阶段,DevExpress AI相关的API的另一个重要元素开始发挥作用:AIExtensionsContainerLocal类。与默认扩展容器类似,AIExtensionsContainerLocal类存储了您手动实现和注册的ai支持的扩展,而无需替换DevExpress内置扩展。
关键的区别在于这个容器中包含的扩展不会被DevExpress UI组件自动使用,这允许您为应用程序的不同部分实现不同的行为。下面的代码片段实现了一个自定义的AI驱动的扩展(注意如何使用基类):
public class AuthoredStyleExtension : ChangeTextExtension<AuthoredStyleRequest> { public AuthoredStyleExtension(IServiceProvider serviceProvider) : base(serviceProvider) { } protected override string GetSystemPrompt(AuthoredStyleRequest request) { return $"Rewrite this text in the {request.Author} style"; } } //A custom request that processes text. public class AuthoredStyleRequest : TextRequest { public AuthoredStyleRequest(string Author, string Text) : base(Text) { this.Author = Author; } public string Author { get; init; } } public static class CustomAIIntegration { public static AuthoredStyleExtension CreateAuthoredStyleExtension(this IAIExtensionsContainer container){ return (AuthoredStyleExtension)container.GetExtension(typeof(AuthoredStyleRequest));
您可以实现自己的TextRequest后代,以便在构造提示符时向AI模型提供额外的信息。示例包括内置的ChangeTone和RewriteStyle扩展,它们获得用于指定语气(例如,Casual, Friendly, Confident)和风格(例如,Formal, Conversational)的枚举值。要在运行时调用自定义扩展,请使用以下代码片段:
var localContainer = new AIExtensionsContainerLocal(defaultAIContainer); localContainer.Register<AuthoredStyleRequest, AuthoredStyleExtension>(); AuthoredStyleExtension extension = localContainer.CreateAuthoredStyleExtension(); var request = new AuthoredStyleRequest("Mark Twain", textToModify); //Here you can also set up the Temperature variable that will be used to execute this particular model request request.Options.Temperature = 0.9f; string result = await extension.ExecuteAsync(request, CancellationToken.None);
本地化
DevExpress AI-Powered扩展支持本地化,这有助于确保AI驱动的功能对于不同地区的用户都是可访问和相关的。通过本地化人工智能扩展,您可以调整用户界面和任何预定义的内容,以满足最终用户的语言和文化偏好,您也可以根据区域偏好定制提示(例如,当使用单语言AI模型时)。
更多产品需求,欢迎咨询“在线客服”~
更多DevExpress线上公开课、中文教程资讯请上中文网获取
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果
转载请注明:文章转载自:DevExpress控件中文网 [https://www.devexpresscn.com/]
本文地址:https://www.devexpresscn.com/post/4870.html