专栏名称: dotNET跨平台
专注于.NET Core的技术传播。在这里你可以谈微软.NET,Mono的跨平台开发技术。在这里可以让你的.NET项目有新的思路,不局限于微软的技术栈,横跨Windows,Linux 主流平台
目录
相关文章推荐
爱可可-爱生活  ·  【[40星]CORAL:一个大规模的对话式检 ... ·  昨天  
人工智能那点事  ·  一店铺未按要求彻夜亮灯被撬锁开灯?多方回应! ·  昨天  
黄建同学  ·  强化学习RL在DeepSeek的训练过程中非 ... ·  3 天前  
爱可可-爱生活  ·  【[100星]voidDB:一款为64位Li ... ·  5 天前  
51好读  ›  专栏  ›  dotNET跨平台

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

dotNET跨平台  · 公众号  ·  · 2025-01-19 08:00

正文

大家好,我是编程乐趣。

行业诸多大佬一直在说:“‌ 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 = $"{systemPrompt}{userQ}"; // 使用Tokenizer将文本编码为tokens var tokens = tokenizer.Encode(fullPrompt);
// 创建GeneratorParams对象,设置生成参数 var generatorParams = new GeneratorParams(model); // 设置最大生成长度 generatorParams.SetSearchOption("max_length", 2048); // 设置past和present是否共享缓冲区,这里设置为false generatorParams.SetSearchOption("past_present_share_buffer", false); // 设置输入序列 generatorParams.SetInputSequences(tokens);
// 创建Generator对象,用于生成文本






请到「今天看啥」查看全文