动手学Avalonia:基于SemanticKernel与硅基流动构建AI聊天与翻译工具

简介: 动手学Avalonia:基于SemanticKernel与硅基流动构建AI聊天与翻译工具

Avalonia是什么?

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

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

SemanticKernel是什么?

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

硅基流动介绍

硅基流动致力于打造大模型时代的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)
                {
                    // 这里是你要修改的 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如下所示:

<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>

界面效果如下所示:

构建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制作完成一个简易的小工具了。

目录
相关文章
|
8天前
|
人工智能 自然语言处理 搜索推荐
主动式智能导购AI助手构建解决方案测评
主动式智能导购AI助手构建解决方案测评
129 81
|
4天前
|
存储 人工智能 自然语言处理
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
ChatMCP 是一款基于模型上下文协议(MCP)的 AI 聊天客户端,支持多语言和自动化安装。它能够与多种大型语言模型(LLM)如 OpenAI、Claude 和 OLLama 等进行交互,具备自动化安装 MCP 服务器、SSE 传输支持、自动选择服务器、聊天记录管理等功能。
51 14
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
|
6天前
|
人工智能 自然语言处理 前端开发
Director:构建视频智能体的 AI 框架,用自然语言执行搜索、编辑、合成和生成等复杂视频任务
Director 是一个构建视频智能体的 AI 框架,用户可以通过自然语言命令执行复杂的视频任务,如搜索、编辑、合成和生成视频内容。该框架基于 VideoDB 的“视频即数据”基础设施,集成了多个预构建的视频代理和 AI API,支持高度定制化,适用于开发者和创作者。
59 9
Director:构建视频智能体的 AI 框架,用自然语言执行搜索、编辑、合成和生成等复杂视频任务
|
6天前
|
人工智能 缓存 异构计算
云原生AI加速生成式人工智能应用的部署构建
本文探讨了云原生技术背景下,尤其是Kubernetes和容器技术的发展,对模型推理服务带来的挑战与优化策略。文中详细介绍了Knative的弹性扩展机制,包括HPA和CronHPA,以及针对传统弹性扩展“滞后”问题提出的AHPA(高级弹性预测)。此外,文章重点介绍了Fluid项目,它通过分布式缓存优化了模型加载的I/O操作,显著缩短了推理服务的冷启动时间,特别是在处理大规模并发请求时表现出色。通过实际案例,展示了Fluid在vLLM和Qwen模型推理中的应用效果,证明了其在提高模型推理效率和响应速度方面的优势。
云原生AI加速生成式人工智能应用的部署构建
|
11天前
|
存储 人工智能 运维
AI导购革命:揭秘主动式智能导购AI助手的构建之道
本文基于《主动式智能导购AI助手构建》解决方案的实际部署体验,从引导与文档帮助、解决方案原理与架构理解、百炼大模型及函数计算应用明晰度、生产环境步骤指导四个方面进行了详细评估。指出尽管该方案具有创新性和实用性,但在文档详尽性、技术细节解释及生产环境适应性等方面仍有待提升。通过进一步优化,可增强解决方案的可用性和用户满意度。
79 31
|
13天前
|
人工智能 自然语言处理 前端开发
Lobe Vidol:AI数字人交互平台,可与虚拟人和3D模型聊天互动
Lobe Vidol是一款开源的AI数字人交互平台,允许用户创建和互动自己的虚拟偶像。该平台提供流畅的对话体验、丰富的动作姿势库、优雅的用户界面设计以及多种技术支持,如文本到语音和语音到文本技术。Lobe Vidol适用于娱乐互动、在线教育、客户服务、品牌营销和社交媒体等多个应用场景。
67 7
Lobe Vidol:AI数字人交互平台,可与虚拟人和3D模型聊天互动
|
14天前
|
人工智能 自然语言处理 JavaScript
Agent-E:基于 AutoGen 代理框架构建的 AI 浏览器自动化系统
Agent-E 是一个基于 AutoGen 代理框架构建的智能自动化系统,专注于浏览器内的自动化操作。它能够执行多种复杂任务,如填写表单、搜索和排序电商产品、定位网页内容等,从而提高在线效率,减少重复劳动。本文将详细介绍 Agent-E 的功能、技术原理以及如何运行该系统。
59 5
Agent-E:基于 AutoGen 代理框架构建的 AI 浏览器自动化系统
|
8天前
|
人工智能 弹性计算 自然语言处理
主动式智能导购AI助手构建评测
《主动式智能导购AI助手构建》评测报告,涵盖2024年12月至2025年1月。报告详细评估了部署体验、文档帮助、实践原理、架构理解、百炼大模型与函数计算的应用,以及生产环境部署指导。整体评价积极,建议增加初学者教程和定制化选项。
44 15
|
3天前
|
存储 人工智能 Serverless
AI助手测评 | 3步快速构建主动式智能导购AI助手
本文介绍了如何利用阿里云的百炼平台构建主动式智能导购AI助手。在当前经济形势下,企业通过AI技术可以有效降低成本并提升服务质量。主动式智能导购AI助手不仅具备专业知识和耐心,还能24小时不间断服务用户,帮助企业节省夜班客服费用。通过创建API-KEY、部署函数计算应用和集成百炼商品检索应用,企业可以在短短几步内快速构建这一智能系统。此外,文章还提供了详细的部署步骤和测评建议,确保企业在实际应用中能够顺利实施。
|
4天前
|
人工智能 前端开发 算法
主动式智能导购 AI 助手构建方案评测
《主动式智能导购 AI 助手构建方案评测》详细评估了该方案在部署体验、技术原理理解及生产环境应用指导等方面的表现。方案在智能导购领域展现出一定潜力,但文档的详细程度和技术细节的阐述仍有改进空间,特别是在复杂操作和高级功能的指导上。总体而言,该方案具备优势,但需进一步优化以更好地满足企业需求。
36 10