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;
            });
        }
    }
}
相关推荐
qq_356448373 分钟前
机器学习基本概念与梯度下降
人工智能
天“码”行空23 分钟前
java面向对象的三大特性之一多态
java·开发语言·jvm
水如烟31 分钟前
孤能子视角:关系性学习,“喂饭“的小孩认知
人工智能
徐_长卿34 分钟前
2025保姆级微信AI群聊机器人教程:教你如何本地打造私人和群聊机器人
人工智能·机器人
XyX——37 分钟前
【福利教程】一键解锁 ChatGPT / Gemini / Spotify 教育权益!TG 机器人全自动验证攻略
人工智能·chatgpt·机器人
odoo中国1 小时前
Odoo 19 模块结构概述
开发语言·python·module·odoo·核心组件·py文件按
十二AI编程2 小时前
Anthropic 封杀 OpenCode,OpenAI 闪电接盘:AI 编程生态的 48 小时闪电战
人工智能·chatgpt
CCC:CarCrazeCurator2 小时前
从 APA 到 AVP:汽车自动泊车系统技术演进与产业发展深度研究
人工智能
代码N年归来仍是新手村成员2 小时前
【Java转Go】即时通信系统代码分析(一)基础Server 构建
java·开发语言·golang