Phi小模型开发教程:用C#开发本地部署AI聊天工具,只需CPU,不需要GPU,3G内存就可以运行,不输GPT-3.5

大家好,我是编程乐趣。

行业诸多大佬一直在说:“‌2025年将是AI应用元年‌”,虽然说大佬的说法不一定对,但AI趋势肯定没错的。

对于我们程序员来说,储备AI应用开发技能,不管对找工作、接项目、创业肯定是不错的选择。

从今天开始,我将会学习和研究Phi小模型,并基于此模型开发一些小Demo,也作为我的学习笔记,欢迎大家关注收藏!

下面先用C#开发一个调用本地模型的示例,一起来感受下Phi的魅力。

什么是Phi?

Phi模型是微软推出的一系列小型语言开源模型,刚刚发布了最新版本:Phi-4。

在GPQA研究生水平、MATH数学基准测试中,超过了OpenAI的GPT-4o,也超过了同类顶级开源模型Qwen 2.5 -14B和Llama-3.3-70B。

在美国数学竞赛AMC的测试中phi-4更是达到了91.8分,超过了Gemini Pro 1.5、GPT-4o、Claude 3.5 Sonnet、Qwen 2.5等知名开闭源模型,甚至整体性能可以与4050亿参数的Llama-3.1媲美。

图片

模型下载地址

微软在HuggingFace开源这款超强的小参数模型,并且支持MIT许可证下商业用途。

当前最新版本开源地址:

https://huggingface.co/microsoft/phi-4

图片

C#源码开发示例

1、下载ONNX

ONNX(Open Neural Network Exchange)是由微软和Facebook等科技巨头于2017年联合推出的一种开放格式。

ONNX 已经对接了多种深度学习框架和多种推理引擎。因此,ONNX 被当成了深度学习框架到推理引擎的桥梁。

ONNX Runtime提供了简单易用的API,支持Python、C++、C#和Java等多种编程语言,方便开发者将其集成到现有应用中。

微软针对Phi-3版本,已经为我们提供了onnx文件,我们这里下载的是Phi-3版本的,因为Phi-4还没有onnx文件。

下载地址:

https://huggingface.co/collections/microsoft/phi-3-6626e15e9585a200d2d761e3

图片

onnx提供了CPU、GPU版本,我这边使用的是CPU版本,把以下文件下载到本地。

图片

下载后的本地文件如下:

图片

2、创建控制台应用

创建控制台应用,我这边使用的是.Net 9。

图片

安装依赖库:

Microsoft.ML.OnnxRuntimeGenAI

官方为我们提供多个套件,不同套件针对不同的硬件加速需求和环境进行优化,后面在详细介绍,这边我们使用的CPU模型,安装Microsoft.ML.OnnxRuntimeGenAI就行。

图片

3、代码示例

using Microsoft.ML.OnnxRuntimeGenAI;// 指定模型路径
var modelPath = @"F:\Model";
// 创建Model对象,加载模型
var model = new Model(modelPath);
// 创建Tokenizer对象,用于文本的编码和解码
var tokenizer = new Tokenizer(model);// 设置系统提示,定义AI助手的行为风格
//“您是一个帮助人们查找信息的AI助手。请使用直接的风格回答问题。不要分享用户未请求的额外信息。”
var systemPrompt = "You are an AI assistant that helps people find information. Answer questions using a direct style. Do not share more information that the requested by the users.";// 提示用户输入问题,空字符串退出
Console.WriteLine(@"Ask your question. Type an empty string to Exit.");// 循环等待用户输入问题
while (true)
{Console.WriteLine();Console.Write(@"Q: ");var userQ = Console.ReadLine();// 如果用户输入为空字符串,则退出循环if (string.IsNullOrEmpty(userQ)){break;}// 显示AI助手的回答前缀Console.Write("Phi3: ");// 构建完整的提示文本,包括系统提示、用户问题和AI助手的开始标记var fullPrompt = $"<|system|>{systemPrompt}<|end|><|user|>{userQ}<|end|><|assistant|>";// 使用Tokenizer将文本编码为tokensvar tokens = tokenizer.Encode(fullPrompt);// 创建GeneratorParams对象,设置生成参数var generatorParams = new GeneratorParams(model);// 设置最大生成长度generatorParams.SetSearchOption("max_length", 2048);// 设置past和present是否共享缓冲区,这里设置为falsegeneratorParams.SetSearchOption("past_present_share_buffer", false);// 设置输入序列generatorParams.SetInputSequences(tokens);// 创建Generator对象,用于生成文本var generator = new Generator(model, generatorParams);// 循环生成文本,直到生成完成while (!generator.IsDone()){// 计算logitsgenerator.ComputeLogits();// 生成下一个tokengenerator.GenerateNextToken();// 获取当前生成的序列var outputTokens = generator.GetSequence(0);// 获取新生成的tokenvar newToken = outputTokens.Slice(outputTokens.Length - 1, 1);// 解码新生成的token为文本var output = tokenizer.Decode(newToken);// 输出生成的文本Console.Write(output);}// 换行,准备下一轮输入Console.WriteLine();
}

4、运行效果如下

初始化界面:

图片

输入问题:

图片

回答结果:

图片

Phi是使用英文作为训练材料的,所以用英文提问效果会比较好点。

5、占用资源如下

测试环境:Intel i7处理器。

图片

这样就完成一个小Demo了。

好了,今天就分享到这边了,此系列会持续更新,欢迎关注我!

以上相关模型、源码示例,我也打包好了,https://pan.quark.cn/s/53f3e932e9bf

- End -

更多开源项目: https://github.com/bianchenglequ/NetCodeTop

我是编程乐趣,一个.Net开发经验老程序员,欢迎“关注”我,每天为你分享开源项目和编程知识。
也欢迎加入【.Net技术编程交流社区】,和大家共同学习交流!,
点击加入:https://bbs.csdn.net/topics/613465368

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

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

相关文章

python-leetcode-存在重复元素 II

219. 存在重复元素 II - 力扣&#xff08;LeetCode&#xff09; class Solution:def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:seen set()for i, num in enumerate(nums):if num in seen:return Trueseen.add(num)if len(seen) > k:seen.remove…

如何将本地 Node.js 服务部署到宝塔面板:完整的部署指南

文章简介&#xff1a; 将本地开发的 Node.js 项目部署到线上服务器是开发者常见的工作流程之一。在这篇文章中&#xff0c;我将详细介绍如何将本地的 Node.js 服务通过宝塔面板&#xff08;BT 面板&#xff09;上线。宝塔面板是一个强大的服务器管理工具&#xff0c;具有简洁的…

1月15学习

[SWPUCTF 2018]SimplePHP phar反序列化的三个前提条件 可以上传phar文件 有可以利用的魔术方法 文件操作函数的参数可控 网站中有两个功能&#xff1a;查看文件和上传文件&#xff0c;利用查看文件将源码都先弄下来进行PHP代码审计。 可以看到存在任意文件读取漏洞&#xff0…

【网络 MAC 学习专栏 -- 如何理解 PHY 的 Link Up】

请阅读【嵌入式开发学习必备专栏 Cache | MMU | AMBA BUS | CoreSight | Trace32 | CoreLink | ARM GCC | CSH】 文章目录 OverviewClause 22/Clause 45Clause 22Clause 45 PHY Link 状态的软件实现 转自&#xff1a; 开心果 Need Car 2022年10月20日 09:50 上海 Overview PHY…

慧集通(DataLinkX)iPaaS集成平台-系统管理之用户及权限

系统用户 通过左侧菜单栏【系统管理】→【用户及权限】→【系统用户】进入到系统用户维护的主界面&#xff0c;在该界面我们可以看到已经维护好的系统用户&#xff0c;以及一些关于系统用户的功能按钮&#xff0c;有新建、编辑、删除、停用、启用、解锁等。 新建&#xff1a;在…

【机器学习实战入门】基于深度学习的乳腺癌分类

什么是深度学习&#xff1f; 作为对机器学习的一种深入方法&#xff0c;深度学习受到了人类大脑和其生物神经网络的启发。它包括深层神经网络、递归神经网络、卷积神经网络和深度信念网络等架构&#xff0c;这些架构由多层组成&#xff0c;数据必须通过这些层才能最终产生输出。…

Spring Boot + Apache POI 实现 Excel 导出:BOM物料清单生成器(支持中文文件名、样式美化、数据合并)

目录 引言 Apache POI操作Excel的实用技巧 1.合并单元格操作 2.设置单元格样式 1. 创建样式对象 2. 设置边框 3. 设置底色 4. 设置对齐方式 5. 设置字体样式 6.设置自动换行 7. 应用样式到单元格 3. 定位和操作指定单元格 4.实现标签-值的形式 5.列宽设置 1. 设…

[每周一更]-(第132期):AI工具集对比

文章目录 1.问答互动类&#xff08;31个&#xff09;2.图像类**简要对比说明**&#xff1a; **总结**&#xff1a; 3.代码类WindsurfCursor AIGithub Copilot 4.大模型**AlphaFold 的独特性与优势****AlphaFold 的局限性****主要大模型对比** AI的核心目标是通过模拟人类智能来…

PortSwigger靶场练习---第二关-查找和利用未使用的 API 端点

第二关&#xff1a;Finding and exploiting an unused API endpoint 实验&#xff1a;查找和利用未使用的 API 端点 PortSwigger靶场地址&#xff1a; Dashboard | Web Security Academy - PortSwigger 题目&#xff1a; 官方提示&#xff1a; 在 Burp 的浏览器中&#xff0c…

python_在钉钉群@人员发送消息

python_在钉钉群人员发送消息 1、第一种 企业内部机器人群聊实现人接入指南&#xff0c;适用于群机器人接收消息&#xff0c;处理完一系列的动作之后&#xff0c;将消息返回给发消息的人员&#xff0c;同时该人员。 需要在企微后台新建一个自建应用&#xff0c;在自建应用里…

天机学堂5-XxlJobRedis

文章目录 梳理前面的实现&#xff1a;Feign点赞改进 day07-积分系统bitmap相关命令签到增加签到记录计算本月已连续签到的天数查询签到记录 积分表设计签到-->发送RabbitMQ消息&#xff0c;保存积分对应的消费者&#xff1a;**消费消息 用于保存积分**增加积分查询个人今日积…

【Block总结】Conv2Former的Block,结合卷积网络和Transformer的优点|即插即用

背景与动机 Conv2Former是一种新型的卷积神经网络&#xff08;ConvNet&#xff09;&#xff0c;旨在结合卷积网络和Transformer的优点&#xff0c;以提升视觉识别任务的性能。传统的卷积神经网络在处理局部特征提取方面表现优异&#xff0c;但在建模全局信息和长距离依赖关系时…

智能化植物病害检测:使用深度学习与图像识别技术的应用

植物病害一直是农业生产中亟待解决的问题&#xff0c;它不仅会影响作物的产量和质量&#xff0c;还可能威胁到生态环境的稳定。随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;尤其是深度学习和图像识别技术的应用&#xff0c;智能化植物病害检测已经成为一…

【TCP】rfc文档

tcp协议相关rfc有哪些 TCP&#xff08;传输控制协议&#xff09;是一个复杂的协议&#xff0c;其设计和实现涉及多个RFC文档。以下是一些与TCP协议密切相关的RFC文档列表&#xff0c;按照时间顺序排列&#xff0c;涵盖了从基础定义到高级特性和优化的各个方面&#xff1a; 基…

机器学习皮马印第安人糖尿病数据集预测报告

目录 1.项目选题与设计方案 1.1项目选题 1.2设计方案 2.功能实现 2.1 主要功能介绍 2.2 开发环境及平台介绍 2.3 实现过程 2.3.1数据分析 2.3.2算法设计 2.3.3 python代码 3.个人心得体会 1.项目选题与设计方案 1.1项目选题 我国的糖尿病患者初诊时约&#xff18;&a…

HTML5+Canvas实现的鼠标跟随自定义发光线条源码

源码介绍 HTML5Canvas实现的鼠标跟随自定义发光线条特效源码非常炫酷&#xff0c;在黑色的背景中&#xff0c;鼠标滑过即产生彩色变换的发光线条效果&#xff0c;且线条周围散发出火花飞射四溅的粒子光点特效。 效果预览 源码如下 <!DOCTYPE html PUBLIC "-//W3C//D…

Dart语言

基础篇&#xff1a; 第 1 部分&#xff1a;Dart 的基础语法 1.1 Dart 程序的结构 一个简单的 Dart 程序通常包含一个 main() 函数&#xff0c;这是程序的入口点。所有 Dart 程序都会从 main() 函数开始执行。 void main() {print(Hello, Dart!); } void 表示 main() 函数没…

通过idea创建的springmvc工程需要的配置

在创建的spring mvc工程中&#xff0c;使用idea开发之前需要配置文件包括porm.xml、web.xml、springmvc.xml 1、porm.xml 工程以来的spring库&#xff0c;主要包括spring-aop、spring-web、spring-webmvc&#xff0c;示例配置如下&#xff1a; <project xmlns"http:/…

Ansible实战:如何正确选择 command 和shell模块?

在使用Ansible进行自动化运维时&#xff0c;command 和 shell 模块是我们执行命令的好帮手。虽然它们看起来很相似&#xff0c;但在功能特性和适用场景上其实有着明显的不同。正确选择合适的模块不仅能够提高任务的效率&#xff0c;还能帮助我们规避一些潜在的风险。在这篇文章…

【STM32-学习笔记-4-】PWM、输入捕获(PWMI)

文章目录 1、PWMPWM配置 2、输入捕获配置3、编码器 1、PWM PWM配置 配置时基单元配置输出比较单元配置输出PWM波的端口 #include "stm32f10x.h" // Device headervoid PWM_Init(void) { //**配置输出PWM波的端口**********************************…