WPF快速创建DeepSeek本地自己的客户端-基础思路版本

开发工具:VS 2015
开发环境:.Net 4.0
使用技术:WPF

本篇文章内容:
本地部署DeepSeek以后一般使用网页工具(如Chatbox)或者DOS窗口与其对话。本篇文章使用WPF创建一个基础版的对话工具。

一、搭建本地DeepSeek环境

我参考的是一下几个教程:
1、DeepSeek本地搭建部署+搭建知识库+智能体详细图文教程
2、【问题记录】DeepSeek本地部署遇到问题
3、公司数据不泄露,DeepSeek R1本地化部署+web端访问+个人知识库搭建与使用,喂饭级实操教程,老旧笔记本竟跑出企业级AI
4、【大语言模型】本地快速部署Ollama运行大语言模型详细流程

二、vs2015 创建WPF项目

三、相关代码如下

Windows窗口界面

<Window x:Class="DeepSeekAI2.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:DeepSeekAI2"mc:Ignorable="d"Title="MainWindow" Height="680" Width="800"><Grid Margin="10,0,15,5"><Grid.RowDefinitions><RowDefinition Height="8.5*"/><RowDefinition Height="1.5*"/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="750"/></Grid.ColumnDefinitions><!--第一个格子,AI对话格子--><Grid Grid.Row="0" Grid.Column="0"><ListBox Name="ChatListBox" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"><ListBox.ItemTemplate><DataTemplate><TextBlock Text="{Binding}" TextWrapping="Wrap" MaxWidth="730"/></DataTemplate></ListBox.ItemTemplate></ListBox></Grid><!--第二个格子,用户输入框--><Grid Grid.Row="1" Grid.Column="0"><Grid.ColumnDefinitions><ColumnDefinition Width="8*" /><ColumnDefinition Width="2*"/></Grid.ColumnDefinitions><!--输入信息框--><Grid Grid.Column="0"><TextBox Name="InputTextBox" HorizontalAlignment="Left" VerticalAlignment="Bottom" KeyDown="InputTextBox_KeyDown"Height="62" Width="522" Margin="61,0,0,14" /></Grid><!--发送信息按钮框--><Grid Grid.Column="1"><Button Name="SendButton" Content="Send" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0,0,58,20" Width="90" Height="50" Click="SendButton_Click" FontFamily="Arial Black" FontSize="13" Foreground="#FF424234"/></Grid><Grid Grid.Column="1"><Button Name="SendButton1" Content="new" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0,0,2,60" Width="30" Height="30" Click="SendButton_Click1" FontFamily="Cambria" Foreground="#FF424234" Background="#FFB6F5C2"/></Grid></Grid></Grid>
</Window>

后端代码

using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Input;
using System.Net;namespace DeepSeekAI2
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}/// <summary>/// 输入按钮框/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void InputTextBox_KeyDown(object sender, KeyEventArgs e){if (e.Key == Key.Enter){RunAI();//InputTextBox.Text = "";}}/// <summary>/// 确认发送按钮/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void SendButton_Click(object sender, RoutedEventArgs e){// 异步方法需在同步上下文中调用(需手动处理)RunAI();//InputTextBox.Text = "";}// 用于存储对话的历史记录static StringBuilder conversationHistory = new StringBuilder();static string apiUrl = "http://localhost:11434/api/generate";public void RunAI(){// 用户输入string userInput = InputTextBox.Text;// 如果输入不正确,不输出if (userInput.ToLower() == "" || userInput.ToLower() == "\n"){return;}// 用户输入添加到历史对话记录conversationHistory.AppendLine($"用户: {userInput}");ChatListBox.Items.Add("-----------用户:-----------");ChatListBox.Items.Add(userInput);var requestData = new{model = "deepseek-r1:1.5b",prompt = conversationHistory.ToString(),stream = true};string jsonContent = Newtonsoft.Json.JsonConvert.SerializeObject(requestData);byte[] byteArray = Encoding.UTF8.GetBytes(jsonContent);HttpWebRequest request = (HttpWebRequest)WebRequest.Create(apiUrl);request.Method = "POST";request.ContentType = "application/json";request.ContentLength = byteArray.Length;using (Stream dataStream = request.GetRequestStream()){dataStream.Write(byteArray, 0, byteArray.Length);}try{using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())using (Stream responseStream = response.GetResponseStream())using (StreamReader reader = new StreamReader(responseStream)){string line;string line2 = "";while ((line = reader.ReadLine()) != null){if (!string.IsNullOrEmpty(line)){dynamic result = Newtonsoft.Json.JsonConvert.DeserializeObject(line);if (result != null && result.response != null){//Console.Write(result.response);//Console.Out.Flush(); // 强制刷新控制台输出//ChatListBox.Items.Add(result.response);line2 += result.response;}}}// 处理AI回话// 去掉所有的换行符line2 = line2.Replace("\n\n", "");// 使用正则表达式去掉 <think> 和 </think> 标签line2 = Regex.Replace(line2, @"<\/?think>", "\n");// 去掉开头的换行符line2 = line2.TrimStart('\r', '\n');ChatListBox.Items.Add("-----------DeepSeek: -----------");//Console.WriteLine();  AI回话DeePSeek回话 line2ChatListBox.Items.Add(line2);conversationHistory.AppendLine($"DeepSeek: {line2}");line2 = "";}InputTextBox.Text = "";}catch (WebException ex){MessageBox.Show("请求异常: " + ex.Message);InputTextBox.Text = "";}}/// <summary>/// 开启新的对话/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void SendButton_Click1(object sender, RoutedEventArgs e){//1 清空历史记录conversationHistory.Clear();//2 清空 ListBox 的内容ChatListBox.Items.Clear();//3 清空输入框InputTextBox.Text = "";}}
}

四、内容介绍

static string apiUrl = "http://localhost:11434/api/generate";

其中这个代码是本地DeepSeek默认的调用接口,如果自己修改了相关内容将此修改就可以

model = "deepseek-r1:1.5b"

这串代码的意思是指定使用本地安装的某个DeepSeek版本。
在这里插入图片描述
因为7b的版本在我电脑上太慢。所以直接使用最快的模型。

五、完成效果如下

在这里插入图片描述
这样就搭建了基础的对话模型。大家可以不断优化,做一个自己的对话模型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/71375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VSCode本地python包“无法解析导入”

问题现象 在使用 VSCode 编写 Python 代码时&#xff0c;虽然程序能正常运行&#xff0c;但遇到“无法解析导入”的问题&#xff0c;导致代码无法高亮。 解决方法 配置 python.autoComplete.extraPaths 打开 VSCode 设置&#xff08;CtrlShiftP -> Preferences: Open Wo…

目标检测IoU阈值全解析:YOLO/DETR模型中的精度-召回率博弈与工程实践指南

一、技术原理与数学本质 IoU计算公式&#xff1a; IoU \frac{Area\ of\ Overlap}{Area\ of\ Union} \frac{A ∩ B}{A ∪ B}阈值选择悖论&#xff1a; 高阈值&#xff08;0.6-0.75&#xff09;&#xff1a;减少误检&#xff08;FP↓&#xff09;但增加漏检&#xff08;FN↑…

蓝桥杯备考:二分算法之木材加工

P2440 木材加工 - 洛谷 这种题我们就是把答案枚举出来&#xff0c;然后对答案进行二分&#xff0c;然后再进行判断 比如我们这道题&#xff0c;我们枚举切割的长度&#xff0c;然后由于切割长度越长切割段数越少 切割长度越短&#xff0c;切割段数越多的性质&#xff0c;我们…

Mongodb数据管理

Mongodb数据管理 1.登录数据库&#xff0c;查看默认的库 [rootdb51~]# mongo> show databases; admin 0.000GB config 0.000GB local 0.000GB> use admin switched to db admin > show tables system.version > admin库&#xff1a;admin 是 MongoDB 的管理…

QT基础七、用纯代码编写界面

终于迎来了界面开发的实战环节&#xff01;今天我们将通过纯代码的方式&#xff0c;亲手打造一个界面。如果你对 Qt 感兴趣&#xff0c;欢迎订阅我的 Qt 基础入门专栏 &#xff08;完全免费哦&#xff09;。虽然前面几篇文章主要是基础知识讲解&#xff0c;可能会显得稍微平淡&…

我用AI做数据分析之数据清洗

我用AI做数据分析之数据清洗 AI与数据分析的融合效果怎样&#xff1f; 这里描述自己在使用AI进行数据分析&#xff08;数据清洗&#xff09;过程中的几个小故事&#xff1a; 1. 变量名的翻译 有一个项目是某医生自己收集的数据&#xff0c;变量名使用的是中文&#xff0c;分…

C++11 thread

文章目录 C11 线程库线程对象的构造方式无参的构造函数调用带参的构造函数调用移动构造函数thread常用成员函数 this_thread命名空间join && detachmutex C11 线程库 线程对象的构造方式 无参的构造函数 1、调用无参的构造函数,调用无参的构造函数创建出来的线程对象…

List<Map<String, Object>> 如何对某个字段求和

在Java中&#xff0c;如果你有一个List<Map<String, Object>>的结构&#xff0c;并且你想要对某个特定字段进行求和&#xff0c;你可以使用Java 8的Stream API来简化这个过程。下面是一个示例代码&#xff0c;演示如何对某个字段进行求和。 假设你有一个List<M…

Linux 固定 IP 地址和网关

Linux 固定 IP 地址和网关 查看 IP ifconfig ifconfig eth0 ip addr ip addr show eth0 查看网关 ip route show route -n netstat -rn 设置固定 IP // 配置静态IP文件/etc/network/interfaces $ vi /etc/network/interfacesauto eth0 iface eth0 inet static addre…

移动通信发展史

概念解释 第一代网络通信 1G 第二代网络通信 2G 第三代网络通信 3G 第四代网络通信 4G 4g网络有很高的速率和很低的延时——高到500M的上传和1G的下载 日常中的4G只是用到了4G技术 运营商 移动-从民企到国企 联通-南方教育口有人 电信 铁通&#xff1a;成立于 2000 年…

进阶数据结构——树状数组

前言 看这篇文章前我建议你们先看这个视频还有这个视频&#xff0c;不然你们可能看不懂。 一、树状数组的核心思想与本质 核心思想&#xff1a;树状数组&#xff08;Fenwick Tree&#xff09;是一种用于高效处理前缀和查询和单点更新的数据结构。 本质&#xff1a;通过二进…

LabVIEW无刷电机控制器检测系统

开发了一种基于LabVIEW的无刷电机控制器检测系统。由于无刷电机具有高效率、低能耗等优点&#xff0c;在电动领域有取代传统电机的趋势&#xff0c;而无刷电机的核心部件无刷电机控制器产量也在不断增长。然而&#xff0c;无刷电机控制器的出厂检测仍处于半自动化状态&#xff…

STM32 CAN过滤器配置和应用方法介绍

目录 概述 一、CAN过滤器核心概念 二、过滤器配置步骤&#xff08;以标准ID为例&#xff09; 三、不同模式的配置示例 四、高级配置技巧 五、调试与问题排查 六、关键计算公式 总结 概述 在STM32微控制器中&#xff0c;CAN过滤器可以配置为标识符屏蔽模式和标识符列表模…

个人系统架构技术分享

架构技术 技术版本说明CentOS7.9操作系统Amoeba负责MySQL读写分离NFS分布式存储ISCSI块存储keepalived日志收集MySQL5.7数据库存储MinIO8.4.5对象存储Kubernetes1.23.15应用容器管理平台Redis7.0分布式缓存Elasticsearch7.17.3搜索引擎nacos3.3.4服务注册 后端技术 技术版本…

python进阶篇-面向对象

1.对象的定义 1.1 什么是对象 面向过程&#xff1a;将程序流程化 对象&#xff1a;就是“容器“&#xff0c;是用来存储数据和功能的&#xff0c;是数据和功能的集合体。 面向对象和面向过程没有优劣之分&#xff0c;它们只是使用的场景不同罢了。 1.2 为什么要有对象 有…

网络安全“挂图作战“及其场景

文章目录 一、网络安全挂图作战来源与定义1、网络安全挂图作战的来源2、网络安全挂图作战的定义 二、挂图作战关键技术三、挂图作战与传统态势感知的差异四、挂图作战主要场景五、未来趋势结语 一、网络安全挂图作战来源与定义 1、网络安全挂图作战的来源 网络安全挂图作战的…

【嵌入式Linux应用开发基础】read函数与write函数

目录 一、read 函数 1.1. 函数原型 1.2. 参数说明 1.3. 返回值 1.4. 示例代码 二、write 函数 2.1. 函数原型 2.2. 参数说明 2.3. 返回值 2.4. 示例代码 三、关键注意事项 3.1 部分读写 3.2 错误处理 3.3 阻塞与非阻塞模式 3.4 数据持久化 3.5 线程安全 四、嵌…

嵌入式八股文(四)计算机网络篇

第一章 基础概念 1. 服务 指网络中各层为紧邻的上层提供的功能调用,是垂直的。包括面向连接服务、无连接服务、可靠服务、不可靠服务。 2. 协议 是计算机⽹络相互通信的对等层实体之间交换信息时必须遵守的规则或约定的集合。⽹络协议的三个基本要素:语法、…

LabVIEW 天然气水合物电声联合探测

天然气水合物被认为是潜在的清洁能源&#xff0c;其储量丰富&#xff0c;预计将在未来能源格局中扮演重要角色。由于其独特的物理化学特性&#xff0c;天然气水合物的探测面临诸多挑战&#xff0c;涉及温度、压力、电学信号、声学信号等多个参数。传统的人工操作方式不仅效率低…

JAVA代码走查重构常用prompt

代码重构prompt&#xff1a; ## 主题&#xff1a; 代码重构 ## 角色扮演: 你是软件开发大师Martin Fowler&#xff0c;精通代码重构、面向对象编程、Clean Code和设计模式&#xff0c;且熟练掌握《重构&#xff0c;改善既有代码的设计》这本书中的重构思想和各种重构方法。 ## …