界面控件DevExpress中文教程 - 如何拓展具有AI功能的文本编辑器(一)

news2024/10/10 1:28:11

本文重点介绍了DevExpress在近年来最热门领域——人工智能(AI)和自然语言处理(NLP)的改进!

NLP是人工智能的一个分支,它允许计算机与人类语言进行交互,这包括以有意义/有用的方式理解、解释、生成和回应文本(和语音)的能力。基于NLP的功能允许更好的数据分析、个性化体验、高效的沟通,并导致更明智的决策和提高效率。例如:

  • 机器翻译
  • 文本摘要
  • 文本生成
  • 文本分类
  • 以及更多…

P.S:DevExpress拥有.NET开发需要的所有平台控件,包含600多个UI控件、报表平台、DevExpress Dashboard eXpressApp 框架、适用于 Visual Studio的CodeRush等一系列辅助工具。

获取DevExpress v24.1正式版下载(Q技术交流: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,您需要以下内容:
    1. 一个激活的OpenAI订阅。
    2. API 密钥
    3. OpenAI .NET SDK
  • 要使用Azure OpenAI,您需要以下内容:
    1. 一个激活的Azure订阅和Azure开放人工智能服务资源。
    2. Azure OpenAI .NET SDK
  • 要使用自托管模型,您需要以下内容:
    1. 安装Ollama
    2. 下载病运行一个Ollama模型:Models

下表列出了DevExpress AI相关的NuGet包:

界面控件DevExpress中文教程 - 如何拓展具有AI功能的文本编辑器

注册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支持的扩展:

界面控件DevExpress中文教程 - 如何拓展具有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模型时)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2200639.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESP32-C3实现GPIO输入-判断高低电平

在 ESP32-C3 上实现 GPIO 输入并判断电平状态相对简单。以下是如何在 Arduino IDE 中配置 GPIO 作为输入&#xff0c;并在循环中检查电平状态的步骤&#xff1a; 1. 定义 GPIO 管脚 首先&#xff0c;定义你将要使用的 GPIO 管脚号。 #define GPIO_INPUT_PIN 2 // 定义一个 GP…

DAMA数据管理知识体系(第13章 数据质量)

课本内容 13.1 引言 语境图 图13-1 语境关系图&#xff1a;数据质量业务驱动因素 1&#xff09;提高组织数据价值和数据利用的机会。2&#xff09;降低低质量数据导致的风险和成本。3&#xff09;提高组织效率和生产力。4&#xff09;保护和提高组织的声誉。 提机会、降成本、增…

django(三):创建第一个django的app和url的两种获取参数的方式

一.创建第一个django的app 1.1 在终端根目录下执行命令 ## 创建一个app python manage.py startapp <app名称>例&#xff1a;python manage.py startapp book1.2创建成功后生成文件如下 二.url两种获取参数的方式 book/views.py from django.shortcuts import …

HTB:Markup[WriteUP]

目录 连接至HTB服务器并启动靶机 1.What version of Apache is running on the targets port 80? 2.What username:password combination logs in successfully? 使用Yakit并使用TOP1000字典对密码进行爆破 3.What is the word at the top of the page that accepts use…

二叉搜索树(BST)简单讲解

概念&#xff1a; 二叉搜索树是一棵二叉树或者空树&#xff0c;又名二叉排序树&#xff0c;英文简写为 BST &#xff08;Binary Search Tree&#xff09; 性质&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xf…

使用C++写一个自己定义的图像格式,写入磁盘

看到OpenCV的Image类实例一副图像&#xff0c;觉得挺好玩&#xff0c;因此想自己定义一个自己的图像类&#xff0c;让后完成写盘&#xff0c;并且读取出来。没有办法&#xff0c;再利用一下OpenCV的imshow显示一下&#xff0c;看看和自己的预期是否一样。 首先要先定义一个图像…

养猫家庭有什么宠物空气净化器推荐吗?哪款吸毛效果最好?

不知道你们家的猫最近有没有大量掉毛&#xff1f;还是今早穿短袖感觉到有点冷&#xff0c;我才意识到秋天到了&#xff0c;新一轮的换毛季又来了。不仅和猫咪玩耍的时候可以“采摘”不少毛毛&#xff0c;而且家里的衣服上、地板上也被毛发入侵&#xff0c;感觉用不了多久&#…

Python基础之List列表用法

1、创建列表 names ["张三","李四","王五","Mary"] 2、列表分片 names[1]&#xff1a;获取数组的第2个元素。 names[1:3]&#xff1a;获取数组的第2、第3个元素。包含左侧&#xff0c;不包含右侧。 names[:3]等同于names[0:3]&…

DAY3 JAVA基本语法

了解注释 注释是写在程序中对代码进行解释说明的文字,方便自己和其他人查看,以便理解程序的。 注释不影响程序的运行,编译后的class文件夹没有内容 字面量 在Java中,字面量(literal)是用来表示源代码中常量值的符号。 这些字面量可以直接出现在Java源代码中,并且它们代…

搜狗翻译体验,2024四大翻译工具解析!

为了满足广大用户的需求&#xff0c;市面上涌现出了众多优秀的翻译工具&#xff0c;福昕在线翻译、福昕翻译客户端、海鲸AI翻译、搜狗翻译等。今天&#xff0c;我们就来对比一下这些翻译工具&#xff0c;看看它们各自的特点和优势。 福昕在线翻译&#xff1a;专业精准&#xf…

前端初识之一

网页 什么是网页 网站是指在因特网上根据一定的规则&#xff0c;使用 HTML等制作的用于展示特定内容相关的网页集合。 网页是网站中的一“页”&#xff0c;通常是HTML格式的文件&#xff0c;它要通过浏览器来阅读&#xff0c; 网页是构成网站的基本元素&#xff0c;它通常由…

【通过WSL2安装Ubuntu24.04系统及图形化界面】

WSL&#xff08;Windows Subsystem for Linux&#xff09;是一个为Windows用户设计的兼容层&#xff0c;它允许用户在Windows10和Windows11操作系统上直接运行GNU/Linux环境。WSL提供了一个微软开发的Linux兼容内核接口&#xff0c;使得用户可以在不启动虚拟机或使用双重启动设…

PostgreSQL的学习心得和知识总结(一百五十三)|[performance]将 OR 子句转换为 ANY 表达式

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

安装Unity3D并配置VisualStudio

安装Unity3D并配置VisualStudio 由于近期课程要求&#xff0c;需要在电脑上安装Unity3D并配置VisualStudio&#xff0c;所以顺便写了本篇博文 1.下载Unity Hub 首先我们找到Unity中文官网&#xff0c;下载Unity Hub&#xff0c;它可以帮助我们管理我们的Unity项目和版本&#…

vue3.x系列之封装响应式的hooks技巧

v3.x封装一个接口请求的hooks的&#xff0c;都应该很熟练了&#xff0c;那么要实现一个响应式的hooks该怎么做&#xff1f; 实现效果 代码实现 <template><div v-if"error">Oops! Error encountered: {{ error.message }}</div><div v-else-i…

【第2章 开始学习C++】C++语句

文章目录 导语声明语句和变量赋值语句cout的新花样使用cin类简介 导语 C 程序是一组函数&#xff0c; 而每个函数又是一组语句。 C 有好几种语句&#xff0c;例如&#xff1a;声明语句创建变量&#xff0c; 赋值语句给该变量提供一个值。 声明语句和变量 计算机是一种精确的…

selenium-Alert类用于操作提示框/确认弹框(4)

之前文章我们提到&#xff0c;在webdriver.WebDriver类有一个switch_to方法&#xff0c;通过switch_to.alert()可以返回Alert对象&#xff0c;而Alert对象主要用于网页中弹出的提示框/确认框/文本输入框的确认或者取消等动作。 Alert介绍 当在页面定位到提示框/确认框/文本录入…

集成学习和随机森林

集成学习 生活中的集成学习&#xff1a; 买东西找别推荐 import numpy as np import matplotlib.pyplot as pltfrom sklearn import datasetsX, y datasets.make_moons(n_samples500, noise0.3, random_state42)plt.scatter(X[y0,0], X[y0,1]) plt.scatter(X[y1,0], X[y1,1]…

OpenSource - License 开源项目 TrueLicense

文章目录 官网集成Demo 官网 https://truelicense.namespace.global/ https://github.com/christian-schlichtherle/truelicense 集成Demo https://github.com/christian-schlichtherle/truelicense-maven-archetype https://github.com/zifangsky/LicenseDemo https://git…

工厂车间|基于springBoot的工厂车间系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完…