码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 动手学Avalonia:基于SemanticKernel与硅基流动构建AI聊天与翻译工具


    本文介绍了在Avalonia中如何基于SemanticKernel与硅基流动构建AI聊天与翻译工具。
    合集 - C#(78)
    1.使用C#将几个Excel文件合并去重分类2023-11-152.C#使用SqlSugar操作MySQL数据库实现简单的增删改查2023-11-163.C#中的类和继承2023-11-174.C#中的virtual和override关键字2023-11-175.C#中的属性2023-11-206.C#winform中使用SQLite数据库2023-11-237.C#简化工作之实现网页爬虫获取数据2023-11-278.C#中的委托(一)2023-11-299.C#中的ref关键字2023-11-2910.C#中out关键字2023-11-2911.C#中内置的泛型委托Func与Action2023-12-0412.在winform blazor hybrid中绘图2023-12-1313.使用C#如何监控选定文件夹中文件的变动情况?2023-12-2814.C#设计模式之策略模式01-0215.由浅入深理解C#中的事件01-0416.C#设计模式之观察者模式01-0417.C#设计模式之单例模式01-0818.C#基于ScottPlot进行可视化01-1319.C#使用MiniExcel导入导出数据到Excel/CSV文件02-1020.winform实现最小化至系统托盘02-1921.C#使用Bogus生成测试数据02-2722.SemanticKernel如何基于自有数据聊天03-0523.在winform中如何嵌入第三方软件窗体✨03-0724.在winform中如何实现双向数据绑定?03-1825.自己动手做一个批量doc转换为docx文件的小工具03-2026.WPF中动画教程(DoubleAnimation的基本使用)04-0127.WPF动画教程(PointAnimationUsingPath的使用)04-0328.C#使用PaddleOCR进行图片文字识别✨04-0929.WPF基础:在Canvas上绘制图形04-1630.WPF/C#:让绘制的图形可以被选中并将信息显示在ListBox中04-1931.使用归一化盒过滤器对图像进行平滑处理04-2032.WPF/C#:如何显示具有层级关系的数据04-2233.将彩色图转化为灰度图及其原理介绍04-2334.WPF/C#:ProgressBar的基本使用05-0835.在VB.NET项目中使用C#编写的代码05-2136.WPF/C#:理解与实现WPF中的MVVM模式05-2837.SemanticKernel:添加插件06-0638.Avalonia:一个.NET跨平台UI框架06-1039.WPF/C#:异常处理06-1240.WPF/C#:程序关闭的三种模式06-1241.wpfui:一个开源免费具有现代化设计趋势的WPF控件库06-1342.WPF/C#:如何将数据分组显示06-1743.WPF/C#:更改界面的样式06-1744.LiveCharts2:简单灵活交互式且功能强大的.NET图表库06-1845.WPF/C#:显示分组数据的两种方式06-1946.WPF/C#:在DataGrid中显示选择框06-2047.WPF/C#:数据绑定到方法06-2148.WPF/C#:BusinessLayerValidation06-2549.WPF/C#:如何实现拖拉元素06-2750.WPF在.NET9中的重大更新:Windows 11 主题07-0151.ONNX Runtime入门示例:在C#中使用ResNet50v2进行图像识别07-02
    52.动手学Avalonia:基于SemanticKernel与硅基流动构建AI聊天与翻译工具07-03
    53.Avalonia应用在基于Linux的国产操作deepin上运行07-0454.如何让其他模型也能在SemanticKernel中调用本地函数07-0555.大语言模型的应用探索—AI Agent初探!07-0856.动手学Avalonia:基于硅基流动构建一个文生图应用(一)07-1057.WPF/C#:在WPF中如何实现依赖注入07-1158.ScreenToGif:一款开源免费且好用的录屏转Gif软件07-1259.WPF/C#:实现导航功能07-1860.关于学习.NET的历程回顾与今后的探索实践方向07-2461.入门Vue+.NET 8 Web Api记录(一)07-2562.SemanticKernel/C#:检索增强生成(RAG)简易实践08-0163.SemanticKernel/C#:使用Ollama中的对话模型与嵌入模型用于本地离线场景08-0264.SemanticKernel/C#:实现接口,接入本地嵌入模型08-0665.EF Core连接PostgreSQL数据库08-0766.基于SiliconCloud快速体验GraphRag.Net08-0867.AvaloniaChat:一个基于大语言模型用于翻译的简单应用08-1668.最佳实践:在AvaloniaChat中接入SiliconCloud08-1669.AvaloniaChat—从源码构建指南08-1870.SimpleRAG:基于WPF与Semantic Kernel实现的一个简单的RAG应用08-1971.Semantic Kernel/C#:接入智谱AI的两种方式08-2172.AvaloniaChat-v0.0.2:兼容智谱AI 快速使用指南08-2173.使用SiliconCloud快速体验SimpleRAG(手把手教程)08-2274.使用Ollama本地离线体验SimpleRAG(手把手教程)08-2375.Semantic Kernel/C#:一种通用的Function Calling方法,文末附经测试可用的大模型08-2976.在SimpleRAG中使用SiliconCloud快速测试Function Calling08-2977.SimpleTranslationAIAgent:基于C#与LLM的翻译AI Agent08-3178.SimpleTranslationAIAgent借助SiliconCloud API 构建自己的专属翻译助手08-31
    收起

    Avalonia是什么?

    Avalonia是一个跨平台的UI框架,专为.NET开发打造,提供灵活的样式系统,支持Windows、macOS、Linux、iOS、Android及WebAssembly等多种平台。它已成熟并适合生产环境,被Schneider Electric、Unity、JetBrains和GitHub等公司采用。

    许多人认为Avalonia是WPF的继任者,它为XAML开发人员提供了一种熟悉且现代的跨平台应用开发体验。尽管与WPF相似,但Avalonia并非完全复制,而包含了许多改进。

    image-20240703120741584

    SemanticKernel是什么?

    Semantic Kernel是一个SDK,它可以将大型语言模型(如OpenAI、Azure OpenAI和Hugging Face)与常规编程语言(如C#、Python和Java)整合。特殊之处在于,Semantic Kernel通过允许定义和链式调用插件,能够自动调度并组合这些AI模型。其功能是,用户可以向LLM提出个性化目标,由Semantic Kernel的规划器生成实现目标的计划,然后由系统自动执行这份计划。

    image-20240703121053734

    硅基流动介绍

    硅基流动致力于打造大模型时代的AI基础设施,通过算法、系统和硬件的协同创新,跨数量级降低大模型应用成本和开发门槛,加速AGI普惠人类。

    SiliconCloud是集合主流开源大模型的一站式云服务平台,为开发者提供更快、更便宜、更全面、体验更丝滑的模型API。

    目前,SiliconCloud已上架包括DeepSeek-Coder-V2、Stable Diffusion 3 Medium、Qwen2、GLM-4-9B-Chat、DeepSeek V2、SDXL、InstantID在内的多种开源大语言模型、图片生成模型,支持用户自由切换符合不同应用场景的模型。同时,SiliconCloud提供开箱即用的大模型推理加速服务,为生成式AI应用带来更高效的用户体验。

    我们知道在国内使用OpenAI不太方便同时成本也比较高。现在已经有很多开源的大模型了,但是对于个人开发者而言,部署它们的一大难点是硬件资源。没有显卡,也能部署一些参数少一些的开源大模型,但是推理速度肯定是很慢的,这里选择硅基流动的原因是第一,之前注册送了42元的额度,该额度不会过期,可以一直使用,第二,试了一下推理速度真的很快,第三(也是最重要的一点)(白嫖),硅基流动宣布:SiliconCloud平台的Qwen2(7B)、GLM4(9B)、Yi1.5(9B)等顶尖开源大模型免费使用。

    构建什么样的工具

    最近在学习Avalonia,动手做一个小工具实现自己的需求是一个很好的开始。同时对SemanticKernel也比较感兴趣,所以选择从最基本的制作一个基于大模型的聊天应用开始。个人对大模型的一大需求就是翻译,在查看英文网站时,遇到不太理解的地方,总喜欢问大模型,将某某某翻译为中文。因此选择构建解决自己这个需求的Avalonia练手小工具。该工具的效果如下所示:

    聊天

    英译中

    中译英

    开始实践

    在SemanticKernel中使用SiliconCloud提供的API服务

    要解决的第一个问题就是如何在SemanticKernel中使用SiliconCloud提供的服务。

    SemanticKernel中并没有告诉我们如何连接其他的大模型,但由于SiliconCloud提供的接口是与OpenAI兼容的,因此可以通过在发送请求时,改变发送请求的地址来实现。

    添加OpenAIHttpClientHandler类:

    public class OpenAIHttpClientHandler : HttpClientHandler
    {
        protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            UriBuilder uriBuilder;
            switch (request.RequestUri?.LocalPath)
            {
                case "/v1/chat/completions":
                    uriBuilder = new UriBuilder(request.RequestUri)
                    {
                        // 这里是你要修改的 URL
                        Scheme = "https",
                        Host = "api.siliconflow.cn",
                        Path = "v1/chat/completions",
                    };
                    request.RequestUri = uriBuilder.Uri;
                    break;
            }
        
            HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
          
            return response;
        }
    }
    

    kernel通过这种方式构建:

    var handler = new OpenAIHttpClientHandler();
    var builder = Kernel.CreateBuilder()
    .AddOpenAIChatCompletion(
       modelId: "Qwen/Qwen1.5-7B-Chat",
       apiKey: "你的apikey",
       httpClient: new HttpClient(handler));
    _kernel = builder.Build();
    

    _kernel为全局私有变量:

    private Kernel _kernel;
    

    构建页面

    axaml如下所示:

    
    	
    		
    		
    	
    	
    		
        
            
            
        
    
        
    		
    			
    				 
    				 
    				 
    				 
    			     
    				   
    	        
    		    
        
    
        
           
    		    
    	        
    		    
        
    		
    	
    
    

    界面效果如下所示:

    image-20240703134726518

    构建ViewModel

    ViewModel如下所示:

    public partial class MainViewModel : ViewModelBase
    {  
        private Kernel _kernel;
    
        [ObservableProperty]
        private string askText;
    
        [ObservableProperty]
        private string responseText;
    
        [ObservableProperty]
        private string selectedLanguage;
    
        public string[] Languages { get; set; }
    
        public MainViewModel()
        {
            var handler = new OpenAIHttpClientHandler();
            var builder = Kernel.CreateBuilder()
            .AddOpenAIChatCompletion(
               modelId: "Qwen/Qwen1.5-7B-Chat",
               apiKey: "你的apikey",
               httpClient: new HttpClient(handler));
            _kernel = builder.Build();
            AskText = " ";
            ResponseText = " ";
            SelectedLanguage = " ";
            Languages = new string[] { "中文","英文"};
        }
    
        [RelayCommand]
        private async Task Ask()
        {   
            if(ResponseText != "")
            {
                ResponseText = "";
            }
            await foreach (var update in _kernel.InvokePromptStreamingAsync(AskText))
            {
                ResponseText += update.ToString();         
            }     
        }
    
        [RelayCommand]
        private async Task Translate()
        {
            string skPrompt =   """
                                {{$input}}
    
                                将上面的输入翻译成{{$language}},无需任何其他内容
                                """;
        
            if (ResponseText != "")
            {
                ResponseText = "";
            }
            await foreach (var update in _kernel.InvokePromptStreamingAsync(skPrompt, new() { ["input"] = AskText,["language"] = SelectedLanguage }))
            {
                ResponseText += update.ToString();
            }
        }
    }
    
    

    使用流式返回

    [RelayCommand]
    private async Task Ask()
    {   
        if(ResponseText != "")
        {
            ResponseText = "";
        }
        await foreach (var update in _kernel.InvokePromptStreamingAsync(AskText))
        {
            ResponseText += update.ToString();         
        }     
    }
    

    实现效果如下:

    写提示

    当我们需要翻译功能的时候,只需要翻译文本,其他的内容都不要,简易的模板如下:

     string skPrompt =   """
                         {{$input}}
    
                         将上面的输入翻译成{{$language}},无需任何其他内容
                         """;
    

    {{$input}}与{{$language}}是模板里的参数,使用时会被替换,如下所示:

     await foreach (var update in _kernel.InvokePromptStreamingAsync(skPrompt, new() { ["input"] = AskText,["language"] = SelectedLanguage }))
     {
         ResponseText += update.ToString();
     }
    

    通过以上这几个步骤,我们就使用Avalonia制作完成一个简易的小工具了。

  • 相关阅读:
    uniapp 小程序实现图片宽度100%、高度自适应的效果
    C# 队列(Queue)
    Java并发编程-前期准备知识-上
    go-cqhttp权限管理
    nuxt3正确使用keepalive页面缓存组件缓存
    前端模块化
    token详细介绍及实现登录
    【计算机图形学】期末考试课后习题重点复习(第3-4章)
    优化编译速度&包优化
    「MySQL高级篇」MySQL之MVCC实现原理&&事务隔离级别的实现
  • 原文地址:https://www.cnblogs.com/mingupupu/p/18281546
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号