大家好,我是编程乐趣。

行业诸多大佬一直在说:“‌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将文本编码为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对象,用于生成文本
var generator = new Generator(model, generatorParams);
// 循环生成文本,直到生成完成
while (!generator.IsDone())
{
// 计算logits
generator.ComputeLogits();
// 生成下一个token
generator.GenerateNextToken();
// 获取当前生成的序列
var outputTokens = generator.GetSequence(0);
// 获取新生成的token
var 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

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

  1. Drupal8开发教程:模块开发——创建新页面

    之前我们已经通过<Drupal8开发教程:认识.info.yml文件>对模块的YAML文件有了了解,今天我们来看如何通过模块开发的方式添加一个新的页面. 在 Drupal 7 中,通过模块 ...

  2. ExtJS4 MVC开发教程:搭建开发环境

    原文地址:http://www.lihuai.net/qianduan/extjs/864.html 博主系列教程:http://www.lihuai.net/qianduan/extjs 在所有的J ...

  3. Django博客开发教程,Django快速开发个人blog

    学DjangoWEB框架,估计大部分的朋友都是从Blog开发开始入门的,Django中文网发布了一个Django开发教程,这个教程简单易懂,能让你快速的使用Django开发一个漂亮的个人blog,是D ...

  4. ASP.NET Aries 入门开发教程3:开发一个列表页面及操控查询区

    前言: Aries框架毕竟是开发框架,所以重点还是要写代码的,这样开发人员才不会失业,哈. 步骤1:新建html 建一个Html,主要有三步: 1:引入Aries.Loader.js 2:弄一个tab ...

  5. 鼎捷ERP二次开发教程 Tiptop GP开发资料大全 Tipto开发实战经验 鼎捷开发实战例子 Tiptop GP二次开发项目例子 4GL开发Demo 鼎捷二次开发完整例子 鼎捷ERP二次开发入门

    本人在ERP实施公司做顾问四五年,参与企业实施ERP十多个项目,非常熟悉企业ERP流程,在实施过程遇到众多问题,提出了不少根据企业具体情况的解决方案. 曾经参与鼎捷Tiptop GP实施十多个项目,具 ...

  6. C++开发的基于TCP协议的内网聊天工具

    项目相关地址 源码:https://github.com/easonjim/TCPChat bug提交:https://github.com/easonjim/TCPChat/issues

  7. ASP.NET Aries 入门开发教程4:查询区的下拉配置

    背景: 今天去深圳溜达了一天,刚回来,看到首页都是微软大法好,看来离.NET的春天就差3个月了~~ 回到正题,这篇的教程讲解下拉配置. 查询区的下拉配置: 1:查询框怎么配置成下拉? 在配置表头:格式 ...

  8. [转发]Gulp开发教程(翻译)

    Building With Gulp =================== 转载出处 原文地址 翻译出处 对网站资源进行优化,并使用不同浏览器测试并不是网站设计过程中最有意思的部分,但是这个过程中的 ...

  9. Gulp开发教程(翻译)

    Building With Gulp =================== 原文地址 翻译出处 原创翻译,有不当的地方欢迎指出.转载请指明出处.谢谢! 对网站资源进行优化,并使用不同浏览器测试并不是 ...

  10. Bran的内核开发教程(bkerndev)-03 内核初步

    目录 内核初步 内核入口 链接脚本 汇编和链接 PS: 下面是我自己写的 64位Linux下的编译脚本 内核初步   在这节教程, 我们将深入研究一些汇编程序, 学习创建链接脚本的基础知识以及使用它的 ...

随机推荐

  1. .NET操作Excel高效低内存的开源框架 - MiniExcel

    .Net平台上对Excel进行操作主要有两种方式.第一种,把Excel文件看成一个数据库,通过OleDb的方式进行读取与操作:第二种,调用Excel的COM组件.两种方式各有特点. 今天给大家介绍第三 ...

  2. ChatGPT:编程的 “蜜糖” 还是 “砒霜”?告别依赖,拥抱自主编程的秘籍在此!

    在当今编程界,ChatGPT 就像一颗耀眼却又颇具争议的新星,它对编程有着不可忽视的影响.但这影响就像一把双刃剑,使用不当,就可能让我们在编程之路上"受伤". 一.过度依赖 Cha ...

  3. CSP模拟58联测20 T3 注视一切的终结

    CSP模拟58联测20 T3 注视一切的终结 题面及数据范围 Ps:链接为衡水中学OJ. 去除重边以后是树,而我们需要使一个点到另外一个点的简单路径上相邻边的颜色尽可能不相同. 发现如果一条边有 \( ...

  4. WebLogic XMLDecoder反序列化漏洞

    目录 前言 XMLDecoder概述 XMLDecoder反序列化漏洞 漏洞复现 前言 上篇复现了T3反序列化漏洞,XMLDecoder反序列化在WebLogic中也是一类影响很大的反序化漏洞. XM ...

  5. 基于docker的常用服务搭建

    使用docker搭建相关服务: 1. MySQL服务 1) 拉取镜像 docker pull mysql:5.7 # 拉取 mysql 5.7 docker pull mysql # 拉取最新版mys ...

  6. 【邮件伪造】SPF与DKIM验证原理及实战解析(上)

    0x01 前言 大家好,我是VoltCary 本篇文章是系列邮件安全专题的第一篇,主要帮助大家掌握邮件安全的基础知识. 基础内容包括: SMTP协议 邮件安全验证原理与过程 SPF验证与DKIM签名验 ...

  7. Python 潮流周刊#80:Django 项目性能调优(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  8. Qt音视频开发31-Onvif抓拍图片

    一.前言 抓拍是个很重要的功能,比如在报警视频联动中需要一张实时的图片,很多SDK不提供抓拍功能,而通过预览抓图,得到的图片已不具有实时性,那如何得到实时的图片呢?现在的IPC基本上都支持ONVIF协 ...

  9. CentOS 安装NFS

    背景 Kubernetes 对 Pod 进行调度时,以当时集群中各节点的可用资源作为主要依据,自动选择某一个可用的节点,并将 Pod 分配到该节点上.在这种情况下,Pod 中容器数据的持久化如果存储在 ...

  10. AOP-Redis缓存

    我没有单独使用过Redis,细节我可能解释不到位.该文章是采用依赖注入实现AOP-Redis缓存功能的 . 之前有写实现Memory缓存的.异曲同工之妙. 使用Redis离不开安装get包:Stack ...