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

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

时间:2025-01-19 18:28:16浏览次数:3  
标签:Phi Console C# 模型 生成 AI 聊天工具 3.5 var

大家好,我是编程乐趣。

行业诸多大佬一直在说:“‌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

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

标签:Phi,Console,C#,模型,生成,AI,聊天工具,3.5,var
From: https://blog.csdn.net/daremeself/article/details/145230992

相关文章

  • Maui学习笔记-CommunityToolkit.Maui动画案例
    动画元素在CommunityToolkit.Maui工具包中提供了AnimationBehavior和BaseAnimation类。AnimationBehavior作用在视图UI元素,并用作动画的容器。BaseAnimation是实现动画逻辑的基类。下面这个案例是使一个按钮实现淡入淡出的效果在主页的隐藏文件中创建一个类继承Ba......
  • 【后利用】Maestro:滥用 Intune 在 C2 上进行横向移动
    Maestro是一种后利用工具,旨在通过用户工作站上的C2代理与Intune/EntraID进行交互,而无需了解用户的密码或Azure身份验证流程、令牌操作和基于Web的管理控制台。Maestro使从C2与Intune和EntraID(以及可能的其他Azure服务)的交互变得更加容易,因为操作员无需获取用户的......
  • Weblogic - Gerneral - 弱口令 & 任意文件读取漏洞
    0x01:漏洞简介首先需要说明,本文并不是介绍了Weblogic某一CVE漏洞,而是提供了一种通用的测试思路。0x0101:弱口令漏洞弱口令漏洞主要是由于用户安全意识淡薄,为了便于记忆,设置了强度过低的密码,甚至直接使用系统默认密码。这使得攻击者能够轻易地猜测或破解密码,从而引发安全问......
  • 以太网三大链路类型对比:如何选择Access、Trunk或Hybrid?
    以太网链路类型指的是不同的链路连接模式,这些模式决定了交换机与交换机、交换机与路由器、交换机与终端设备之间如何交换数据。理解这些链路类型有助于优化网络结构,提高数据传输效率,确保网络的稳定性和安全性。在以太网中,链路类型分为三种:Access链路、Trunk链路和Hybrid链......
  • 华为HCIE-BigData认证学习资料分享(考试大纲、培训教材、实验手册等等)
    大家好,作为一名大数据技术爱好者,我最近完成了华为HCIE-BigData认证考试,今天想和大家分享一下我的备考经验、考试过程中的挑战以及如何高效规划备考时间,希望对正在备考的小伙伴们有所帮助。 【点赞+关注】私我领取华为大数据认证考试复习资料/题库一、华为HCIE-BigData认证......
  • webWorker 开启javascript另外的线程
    javascript是一个单线程语音,因此所有执行代码放在一个线程里面因此javascriot是从上到小执行代码的,但是遇到大量切繁重的任务例如图形计算请求,轮询等需要耗时的任务虽然可以使用异步来避免造成页面渲染的阻塞,但是异步任务完成后还要对数据进行处理因此也会导致页面的卡顿,因此......
  • 应用"懒加载"模式,优化@Transactional事务性能
    背景在项目开发中,使用@Transactional注解来管理事务非常方便,且优雅。但是也存在一个问题:长事务问题很多被@Transactional标记的方法,实际上并不需要进行数据库操作,或者说,它们在执行的很长一段时间内都不会真正触发数据库访问。举个例子,我们的业务逻辑可能如下:@Servicepu......
  • Ubuntu 安装Miniconda
    1.下载Miniconda安装脚本访问Miniconda官方下载页面,找到适合Linux的安装脚本链接。使用wget下载最新版本的Miniconda安装脚本:wgethttps://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh2.安装Miniconda运行安装脚本:bashMiniconda3-la......
  • 龙哥量化:通达信macd背离的形态怎么选股,怎么找到macd标准背离的股票
    如果您需要代写技术指标公式,请联系我。龙哥QQ:591438821龙哥微信:Long622889也可以把您的通达信,文华技术指标改成TB交易开拓者、金字塔、文华8的自动交易量化策略 macd的背离,底背离是下跌行情中抄底的信号,很多朋友的思路都是抄底对了,就吃一波段的利润,抄底错了,立马止损,盈亏......
  • AtCoder Beginner Contest 389
    A-9x9题意一位数的乘法思路模拟代码点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongtypedefpair<int,int>pii;constintmxn=1e6+5;voidsolve(){ strings; cin>>s; cout<<(s[0]-'0')......