C#创建AI项目

文章目录

申请模型

阿里平台申请模型

先登录

创建apikey

这是deepseek所有模型

创建.net8.0的WPF项目

nuget包

Microsoft.SemanticKernel 1.44.0

编写AI类

代码中apikey需要用你自己的

csharp 复制代码
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WpfApp1
{
    /// <summary>
    /// ai 类
    /// </summary>
    public class AI
    {
        public AI()
        {
            IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
#pragma warning disable SKEXP0010
            kernelBuilder.AddOpenAIChatCompletion("deepseek-v3", new Uri("https://dashscope.aliyuncs.com/compatible-mode/v1"), "apikey");//阿里平台
            Kernel = kernelBuilder.Build();
            ChatHistory = new ChatHistory();
            ChatHistory.AddSystemMessage("你是一个乐于解答各种问题的助手,你的任务是为用户提供专业、准确、有见地的建议。");
        }
        public Kernel Kernel { get; set; }

        /// <summary>
        /// 聊天记录
        /// </summary>
        public ChatHistory ChatHistory { get; set; }

        /// <summary>
        /// 向AI提问
        /// </summary>
        /// <param name="questions">问题</param>
        /// <param name="action">字符流回调函数(委托中string代表的是AI回答的字符)</param>
        /// <returns></returns>
        public async Task<string> AskAIQuestions(string questions, Action<string> action)
        {
            ChatHistory.AddUserMessage(questions);
            return await AskAIQuestions(ChatHistory, action);
        }
        /// <summary>
        /// 向AI提问
        /// </summary>
        /// <param name="chatHistory">聊天记录</param>
        /// <param name="action">字符流回调函数</param>
        /// <returns></returns>
        public async Task<string> AskAIQuestions(ChatHistory chatHistory, Action<string> action)
        {
            //task.Result可以拿值
            var chatService = Kernel.GetRequiredService<IChatCompletionService>();
            string msg = "";
            await foreach (StreamingChatMessageContent chatUpdate in chatService.GetStreamingChatMessageContentsAsync(chatHistory))
            {
                if (chatUpdate.Content is { Length: > 0 })
                {
                    msg += chatUpdate.Content;
                    action(chatUpdate.Content);
                    Thread.Sleep(10);
                }
            }
            return msg;
        }
    }
}

编写一个简单的交互界面

MainWindow.xaml

xml 复制代码
<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <TextBlock Height="400" x:Name="textBlock1" Text="{Binding Path=Text, Mode=OneWay}" />
        <Grid Grid.Row="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>
            <TextBox x:Name="textBox1" Text="{Binding Path=Text, Mode=TwoWay}" />
            <Button Grid.Column="1" x:Name="button1" Content="发送" Click="button1_Click" />
        </Grid>
    </Grid>
</Window>

MainWindow.xaml.cs

csharp 复制代码
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            string text = textBox1.Text;
            textBox1.Text = "";
            textBlock1.Text = "";
            AI aI = new AI();
            aI.AskAIQuestions(text, (string str) =>
            {
                textBlock1.Text += str;
            });
        }
    }
}
相关推荐
Highcharts.js1 小时前
缺失数据可视化图表开发实战|Highcharts创建人员出生统计面积图表示例
开发语言·前端·javascript·信息可视化·highcharts·图表开发
测试员周周6 小时前
【Appium 系列】第16节-WebView-H5上下文切换 — 混合应用的自动化难点
运维·开发语言·人工智能·功能测试·appium·自动化·测试用例
K姐研究社8 小时前
怎么用AI制作电商口播视频,开拍APP一键生成
人工智能·音视频
LaughingZhu8 小时前
Product Hunt 每日热榜 | 2026-05-21
前端·人工智能·经验分享·chatgpt·html
杜子不疼.8 小时前
【C++ AI 大模型接入 SDK】 - DeepSeek 模型接入(上)
开发语言·c++·chatgpt
加号38 小时前
【C#】 串口通信技术深度解析及实现
开发语言·c#
传说故事8 小时前
【论文阅读】MotuBrain: An Advanced World Action Model for Robot Control
论文阅读·人工智能·具身智能·wam
北京耐用通信9 小时前
全域适配工业场景耐达讯自动化Modbus TCP 转 PROFIBUS 网关轻松实现以太网与现场总线互通
网络·人工智能·网络协议·自动化·信息与通信
火山引擎开发者社区9 小时前
TRAE × 火山引擎 Supabase:为你的 AI 应用装上“数据引擎”
人工智能
sycmancia9 小时前
Qt——编辑交互功能的实现
开发语言·qt