動手學Avalonia:基于SemanticKernel與硅基流動構建AI聊天與翻譯工具

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<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken){UriBuilder uriBuilder;switch (request.RequestUri?.LocalPath){case "/v1/chat/completions":uriBuilder = new UriBuilder(request.RequestUri){// 這里是你要修改的 URLScheme = "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如下所示:

<Window xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:vm="using:AvaloniaChat.ViewModels"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:views="clr-namespace:AvaloniaChat.Views"mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"x:Class="AvaloniaChat.Views.MainWindow"Icon="/Assets/avalonia-logo.ico"Title="AvaloniaChat"><Design.DataContext><!-- This only sets the DataContext for the previewer in an IDE,to set the actual DataContext for runtime, set the DataContext property in code (look at App.axaml.cs) --><vm:MainViewModel /></Design.DataContext><StackPanel><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="*" /><ColumnDefinition Width="*" /></Grid.ColumnDefinitions><Grid Grid.Column="0"><StackPanel><StackPanel Orientation="Horizontal"><Button Content="問AI" Margin="10"Command="{Binding AskCommand}"></Button><!--<Button Content="翻譯為:"></Button>--><Label Content="翻譯為:"HorizontalAlignment="Center"VerticalAlignment="Center"></Label><ComboBox ItemsSource="{Binding Languages}"SelectedItem="{Binding SelectedLanguage}"HorizontalAlignment="Center"VerticalAlignment="Center"></ComboBox><Button Content="翻譯" Margin="10"Command="{Binding TranslateCommand}"></Button></StackPanel>	   <TextBox Height="300" Margin="10"Text="{Binding AskText}"TextWrapping="Wrap"AcceptsReturn="True"></TextBox></StackPanel>    </Grid><Grid Grid.Column="1"><StackPanel><Button Content="AI回答" Margin="10"></Button><TextBox Height="300" 					 Margin="10"Text="{Binding ResponseText}"TextWrapping="Wrap"></TextBox></StackPanel>    </Grid>
</Grid>		</StackPanel>
</Window>

界面效果如下所示:

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制作完成一個簡易的小工具了。

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

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

相關文章

如何使用緩存提升SpringBoot性能(EhCache和Redis方式)

一、簡介 緩存是通過將頻繁訪問的數據存儲在內存中來提高Web應用程序性能的重要策略&#xff0c;從而減少對數據庫等較慢的存儲系統的重復進行數據檢索操作的需求。在這里將介紹如何使用流行的緩存實現&#xff08;如EhCache和Redis等&#xff09;&#xff0c;專門為Spring Bo…

使用 Smart-doc 記錄 Spring REST API

如果您正在使用 Spring Boot 開發 RESTful API&#xff0c;您希望讓其他開發人員盡可能容易地理解和使用您的 API。文檔是必不可少的&#xff0c;因為它為將來的更新提供了參考&#xff0c;并幫助其他開發人員與您的 API 集成。很長一段時間以來&#xff0c;記錄 REST API 的方…

java設計模式(十二)享元模式(Flyweight Pattern)

1、模式介紹&#xff1a; 享元模式是一種結構型設計模式&#xff0c;旨在通過共享對象來有效支持大量細粒度的對象。它通過將對象的狀態分為內部狀態&#xff08;可共享&#xff09;和外部狀態&#xff08;不可共享&#xff09;來減少內存消耗和提高性能。內部狀態存儲在享元對…

蘇東坡傳-讀書筆記九

我們論到蘇東坡&#xff0c;我們就不能避免“氣”這個字。因為每個文學批評家綜括蘇東坡的個性&#xff0c;必用孟子所說的這個“氣”字。 在《孟子》里&#xff0c;“氣”是哲學的概念&#xff0c;類似柏格森所說的“生氣勃勃”&#xff0c;是人格上的“元氣”。使偉人和匹夫顯…

419. 甲板上的戰艦

419. 甲板上的戰艦 題目鏈接&#xff1a;419. 甲板上的戰艦 代碼如下&#xff1a; class Solution { public:int countBattleships(vector<vector<char>>& board) {int res0;int rowboard.size(),colboard[0].size();for(int i0;i<row;i){for(int j0;j&l…

深度學習中的Logits處理:InvalidScoreLogitsProcessor詳解

深度學習中的Logits處理&#xff1a;InvalidScoreLogitsProcessor詳解 基礎概念InvalidScoreLogitsProcessor為什么需要這個處理器&#xff1f;使用示例進階&#xff1a;自定義LogitsProcessor結論 在自然語言處理(NLP)任務中,特別是在使用大型語言模型(LLM)進行文本生成時,我們…

【 2024!深入了解 大語言模型(LLM)微調方法(總結)】

引言 眾所周知&#xff0c;大語言模型(LLM)正在飛速發展&#xff0c;各行業都有了自己的大模型。其中&#xff0c;大模型微調技術在此過程中起到了非常關鍵的作用&#xff0c;它提升了模型的生成效率和適應性&#xff0c;使其能夠在多樣化的應用場景中發揮更大的價值。 那么&…

《C++20設計模式》橋接模式經驗分享

文章目錄 一、前言二、探討一個類有多個抽象父類的情況&#xff08;為什么會有橋接&#xff09;三、橋接模式3.1 UML類圖3.2 實現 四、最后 一、前言 怎么判斷你是否理解橋接模式了呢&#xff1f;&#x1f9d0; 試著回答下面這個問題吧&#xff01;&#x1f60b; 橋接模式到底…

Current request is not a multipart request

看了許多博客的解決方法&#xff0c;感覺還是不太懂&#xff0c;看了這個解決了問題。 從源碼角度詳細解析

【數據庫】范式

文章目錄 1. 第一范式&#xff08;1NF&#xff09;2. 第二范式&#xff08;2NF&#xff09;3. 第三范式&#xff08;3NF&#xff09;4. 巴斯-科德范式&#xff08;BCNF&#xff09;5. 第四范式&#xff08;4NF&#xff09;6. 第五范式&#xff08;5NF&#xff0c;又稱完美范式&…

heic格式轉化jpg有沒有免費軟件?2024年頂尖的7款heic轉jpg工具請收好!

heic格式轉化jpg有沒有免費軟件&#xff1f;heic格式雖然在分辨率上優于jpg&#xff0c;但由于并非所有設備的默認圖片格式&#xff0c;許多用戶并不太喜歡它。這并不奇怪&#xff0c;因為在非蘋果設備上打開HEIC文件可能會遇到困難。因此&#xff0c;人們更傾向于尋找能夠免費…

FlinkSQL 開發經驗分享

作者&#xff1a;湯包 最近做了幾個實時數據開發需求&#xff0c;也不可避免地在使用 Flink 的過程中遇到了一些問題&#xff0c;比如數據傾斜導致的反壓、interval join、開窗導致的水位線失效等問題&#xff0c;通過思考并解決這些問題&#xff0c;加深了我對 Flink 原理與機…

監控與安全服務

kali 系統 nmap掃描 網段的掃描 使用腳本掃描 使用john破解密碼 哈希算法是一種單向加密的算法&#xff0c;也就是將原始數據生成一串“亂碼”只能通過原始數據&#xff0c;生成這串“亂碼”&#xff0c;但是不能通過“亂碼”回推出原始數據相同的原始數據&#xff0c;生成的亂…

sql優化-單表優化

文章目錄 0、索引優化原則1、在docker內部連接mysql2、數據準備3、創建表 dept 和 emp4、插入50萬數據到 emp 表中4.1、創建函數4.2、存儲過程4.3、調用存儲過程 5、查找姓名以"abc"開頭的員工信息5.1、執行計劃 select * from emp where name like abc%;5.2、sql優化…

React+TS前臺項目實戰(二十四)-- 全局常用繪制組件Qrcode封裝

文章目錄 前言Qrcode組件1. 功能分析2. 代碼詳細注釋3. 使用方式4. 效果展示(pc端 / 移動端) 總結 前言 今天要封裝的Qrcode 組件&#xff0c;是通過傳入的信息&#xff0c;繪制在二維碼上&#xff0c;可用于很多場景&#xff0c;如區塊鏈項目中的區塊顯示交易地址時就可以用到…

無線領夾麥克風哪個品牌好,推薦口碑最好的麥克風品牌

在5G網絡普及的浪潮下&#xff0c;短視頻平臺的興起帶動了一股全民創作的熱潮。無論是城市街頭還是鄉間小徑&#xff0c;人們紛紛拿起手機&#xff0c;記錄生活中的點點滴滴。領夾式麥克風憑借其精準的拾音特性和穩定的信號傳輸&#xff0c;無論是在靜止狀態還是在移動過程中&a…

Android什么是OSD層圖形?

在Android開發中&#xff0c;OSD&#xff08;On-Screen Display&#xff09;層圖形指的是在屏幕上直接顯示特定信息的技術&#xff0c;這些信息可以是文字、圖標、進度條等&#xff0c;主要用于展示應用程序狀態、提示信息、操作指引等。從技術難點、面試官關注點以及回答吸引力…

制作一個靜態庫

1. 準備工作 # 目錄結構 add.c div.c mult.c sub.c -> 算法的源文件, 函數聲明在頭文件 head.h # main.c中是對接口的測試程序, 制作庫的時候不需要將 main.c 算進去 . ├── add.c ├── div.c ├── include │ └── head.h ├── main.c ├── mult.c └── s…

Node.js適合什么場景下使用

Node.js是一個基于Chrome V8 JavaScript引擎構建的開源運行時環境&#xff0c;它允許開發者使用JavaScript在服務器端運行代碼。Node.js具有高性能、輕量級、事件驅動和非阻塞I/O等特性&#xff0c;這些特性使得它在多種場景下具有廣泛的應用。以下是Node.js適合使用的幾個主要…