首页 > 其他分享 >DevExpress WinForms中文教程 - 如何在Grid控件中集成语义相似性搜索?

DevExpress WinForms中文教程 - 如何在Grid控件中集成语义相似性搜索?

时间:2024-07-09 10:09:32浏览次数:17  
标签:SmartComponents 控件 DevExpress LocalEmbeddings WinForms 搜索

许多用户都知道Microsoft的Daniel Roth和Steve Sanderson引入的.NET智能组件——AI驱动的UI控件,许多人都喜欢这个控件原因归结为以下几点:

  • 由于它的简单性,开发人员可以在本地“驾驭AI”,而无需获得Azure或OpenAI PhD - 智能功能使用单个NuGet包即可使用。
  • “智能搜索”是通过本地嵌入实现的,它的优点在于能够在本地运行,而不需要外部人工智能服务。
  • 相关的使用场景很有意义——许多业务线(LOB)应用程序可以立即从这个实现中受益。以语义相似度搜索为例:终端用户可以在使用DevExpress Data Grid、Lookup或其他数据感知控件时搜索“furniture”这个词,并且实现足够智能,可以返回“chair”、“table”、“sofa”、"wardrobe"等记录。

P.S:DevExpress WinForms拥有180+组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!

获取DevExpress WinForms v24.1正式版下载

DevExpress技术交流群10:532598169      欢迎一起进群讨论

问题/使用场景

上面提到的例子采用ASP. NET Core Blazor和MVC/Razor集成,在本文中我们将演示如何使用DevExpress WinForms数据网格轻松引入“智能搜索”,其他数据感知DevExpress UI控件的集成也类似——您只需要使用适当的事件来实现期望的结果。

DevExpress WinForms中文教程图集
实现细节

1. Microsoft的 SmartComponents.LocalEmbeddings NuGet(作为一个实验性的GitHub仓库)是我们“智能搜索”实现的核心——只是把它和DevExpress.Win.Grid包一起添加到WinForms项目中。

DevExpress WinForms中文教程图集

让我们仔细看看Microsoft的GitHub repo本地嵌入:

嵌入用于语义相似度搜索,自然语言字符串被转换成称为嵌入的数字向量。两个字符串在概念上越相关,它们的向量就越接近。虽然您可以使用外部AI服务来计算嵌入,但在许多情况下,可以简单地再服务器上本地计算它们(不需要GPU - CPU就可以正常工作)。SmartComponents.LocalEmbeddings是一个简化此操作的包,使用它您可以在一毫秒内计算嵌入,并在一位数毫秒内对数十万个候选项执行语义搜索。

SmartComponents.LocalEmbeddings NuGet包实际上不包含任何ML模型,但它被配置为在您第一次构建应用程序时下载一个模型,您可以配置下载哪个模型。

有关这方面的更多信息,请查看了解Understand embeddings in Azure OpenAI Service在web上搜索类似的文章。ONNX嵌入模型(由Microsoft.ML.OnnxRuntime.dll提供支持)会自动从SmartComponents.LocalEmbeddings NuGet包中添加到Bin文件夹中 - 它的大小为16MB。

DevExpress WinForms中文教程图集

2. 被绑定到一个Item记录的集合(ID, Name, Description),测试数据是人工智能生成的(节省时间)。我们处理网格的ColumnView.CustomRowFilter 事件来确定搜索字符串行的可见性(基于条目文本相似度—在本例中为Name和Description,可选),当处理键盘输入或更改搜索选项(如相似性阈值)时,也会触发过滤例程。

void OnCustomRowFilter(object sender, RowFilterEventArgs e) {
Item? item = ((ColumnView)sender).DataController.GetRowByListSourceIndex(e.ListSourceRow) as Item;
if(item == null)
return;
string filter = teFilter.Text;
if(string.IsNullOrEmpty(filter))
return;
float threshold = (float)tbThreshold.Value / 100;
e.Visible = SmartFilterProvider.IsSimilarTo(filter, item.Name, threshold);
if(!e.Visible && cbIncludeDescription.Checked)
e.Visible = SmartFilterProvider.IsSimilarTo(filter, item.Description, threshold);
e.Handled = true;
}

3. “智能搜索”是由SmartFilterProvider类实现的——它调用了SmartComponents. LocalEmbeddings API基于GitHub repo中发布的文档。

namespace SmartAIFilter.Provider {
using SmartComponents.LocalEmbeddings;

public static class SmartFilterProvider {
readonly static LocalEmbedder Embedder = new LocalEmbedder(caseSensitive: false);
readonly static ConcurrentDictionary<string, EmbeddingF32> cache =
new ConcurrentDictionary<string, EmbeddingF32>(StringComparer.OrdinalIgnoreCase);
public static bool IsSimilarTo(string filter, string text, float threshold = 0.75f) {
EmbeddingF32 eText = cache.GetOrAdd(text, x => Embedder.Embed(x));
EmbeddingF32 eFilter = cache.GetOrAdd(filter, x => Embedder.Embed(x));
return eFilter.Similarity(eText) > threshold;
}
}
}

上面的LocalEmbedder类使用ONNX运行时——它可以执行许多不同的CPU或GPU嵌入模型(通常,CPU对于这样小的模型工作得更快)。

SmartComponents.LocalEmbeddings NuGet包实际上不包含任何ML模型,但它被配置为在您第一次构建应用程序时下载一个模型。如前所述,您可以配置下载哪个模型。

作为一名开发人员,您可以根据特定用例场景/项目需求来调整这个示例。例如,您可以根据需要使用在线(OpenAI, Azure等)或离线模型(Ollama, ONNX)。

标签:SmartComponents,控件,DevExpress,LocalEmbeddings,WinForms,搜索
From: https://www.cnblogs.com/AABBbaby/p/18291172

相关文章

  • Qt 控件的简单实例化
    记录一个初学小白的学习过程,记录一些浅显的学习笔记GroupBoxGroupBox控件的作用是组织界面元素,将一组相关的控件组合在一起,并在顶部显示一个标题。基类:QWidget (第一部分是widget.h)(第二部分是widget.cpp)#ifndefWIDGET_H#defineWIDGET_H#include<QWidget>#inc......
  • [QT入门]标签控件(QLabel)
    一、概述QLabel是Qt中用于显示文本或图像的控件。它通常被用作标签或显示静态信息的区域。QLabel控件是图形用户界面(GUI)开发中的基础元素之一,广泛应用于各种Qt应用程序中。QLabel控件的灵活性和易用性使其成为开发过程中不可或缺的一部分。二、QLabel控件的基本属性和方法1.......
  • 将WPF内部绑定的控件和数据拉取出来
    一般最简单的ItemsControl的写法是<ItemsControlItemsSource="{BindingStudents}"><ItemsControl.ItemTemplate><DataTemplate><TextBlockText="{BindingName}"/>......
  • [QT入门]常用控件
    1.QPushButton(按钮)常用函数:setText(constQString&text):设置按钮上显示的文本。clicked(boolchecked=false)[signal]:按钮被点击时发出的信号。setIcon(constQIcon&icon):设置按钮上的图标。代码示例:QPushButton*button=newQPushButton("ClickMe!",th......
  • 【QT】显示类控件
    显示类控件显示类控件1.label-标签2.LCDNumber-显示数字的控件3.ProgressBar-进度条4.CalendarWidget-日历5.LineEdit-输入框6.TextEdit-多行输入框7.ComboBox-下拉框8.SpinBox-微调框9.DateEdit&TimeEdit-日期微调框10.Dial-旋......
  • WPF常见控件(包含materialDesign)与属性
    materialDesign:ColorZone:用于在应用界面中创建有色区域,增加层级感和视觉吸引力。materialDesign:DrawerHost:用于实现从屏幕一侧滑出的抽屉控件,经常与materialDesign:DrawerHost.LeftDrawerContent配套使用(这里的例子是设置左抽屉)。DockPanel:布局控件,用于将其子元素排列在特......
  • QT ui界面中对控件进行布局操作,无法改变内控控件大小
    QSizePolicy想象你有一个装满各种物品(窗口部件)的抽屉。QSizePolicy就像是给抽屉里的每个物品设定的规则,决定当抽屉变大时,每个物品如何变化尺寸。固定(Fixed):就像一个固定大小的盒子,不管抽屉变大还是变小,它总是保持原样。最小(Minimum):这就像一个可以伸缩的袋子,但它不能小于它......
  • Qt提升控件失败的解决办法
    在QtCreator中,通常是可以通过继承已有的类来创建新的子类的。如果您想要将QGraphicsView提升为新建的子类,可以按照以下步骤进行操作:打开QtCreator,并打开您的项目。打开包含QGraphicsView的头文件(例如mainwindow.h)。选择QGraphicsView类的声明,并右键单击该类。在弹......
  • WPF自定义控件与样式-自定义按钮(Button)
    一、前言程序界面上的按钮多种多样,常用的就这几种:普通按钮、图标按钮、文字按钮、图片文字混合按钮。本文章记录了不同样式类型的按钮实现方法。二、固定样式的按钮固定样式的按钮一般在临时使用时或程序的样式比较固定时才会使用,按钮整体样式不需要做大的改动。2.1普通按钮-......
  • 学懂C#编程:WPF应用开发系列——WPF之ComboBox控件的详细用法
    WPF(WindowsPresentationFoundation)中的ComboBox控件是一个下拉列表控件,允许用户从一组预定义的选项中选择一个选项。以下是ComboBox控件的详细用法,并附带示例说明。ComboBox的基本用法1.XAML定义:在XAML中定义一个ComboBox控件,并添加一些选项。<Windowx:Class="ComboBox......