首页 > 编程语言 >C#整合Ollama实现本地LLMs调用

C#整合Ollama实现本地LLMs调用

时间:2024-09-09 09:25:34浏览次数:10  
标签:Console C# ollama 模型 LLMs var new Ollama

前言

    近两年AIGC发展的非常迅速,从刚开始的只有ChatGPT到现在的很百家争鸣。从开始的大参数模型,再到后来的小参数模型,从一开始单一的文本模型到现在的多模态模型等等。随着一起进步的不仅仅是模型的多样化,还有模型的使用方式。大模型使用的门槛越来越低,甚至现在每个人都可以在自己的电脑上运行模型。今天我们要说的就是大模型工具中的佼佼者Ollama,并演示如何通过C#来使用Ollama

Ollama

    Ollama是一个开源的大语言模型(LLM)服务工具,它允许用户在本地PC环境快速实验、管理和部署大型语言模型。它支持多种流行的开源大型语言模型,如 Llama 3.1Phi 3Qwen 2GLM 4等,并且可以通过命令行界面轻松下载、运行和管理这些模型。Ollama的出现是为了降低使用大型语言模型的门槛,是让大型语言模型更加普及和易于访问。一言以蔽之就是Ollama让使用模型更简单。无论是CPU或是GPU都可以,算力高的话推理速度更快,算力不足的话推理的慢,而且容易胡言乱语。

安装

Ollama的安装方式常用的有两种,一种是去官网下载,另一种是去GitHub下载,可以选择对应的系统版本进行下载

我的是Windows操作系统,所以直接下载一路Next就可以,默认安装在C盘无法更改,强迫症的话可以通过mklink做链接,但是自动更新之后还是在C盘。自动升级这一块不用太担心,联网的情况,如果有新版本Ollama会推送更新。

安装完成之后可以修改常用的环境变量

  • 通过OLLAMA_MODELS环境变量设置模型下载的位置,默认是在C盘,可以换成其他地址。
  • 通过OLLAMA_HOST设置Ollama服务监听的端口,默认的是11434

安装完成之后通过version查看,如果显示版本号则安装成功。

ollama --version

比较常用的指令不多,也很简单

  • ollama list列出本地下载的模型
  • ollama ps查看正在运行的模型
  • ollama pull 模型标识下载模型到本地,比如我要下载qwen2 7b则使用ollama pull qwen2:7b
  • ollama run 模型标识运行模型,如果已下载则直接运行,如果没下载则先下载再运行。比如我要运行qwen2 7b可以直接运行ollama run qwen2:7b

也可以将本地已有的GGUF模型导入到Ollama中去,操作也很简单。

  1. 编写一个名为Modelfile的文件,写入以下内容
FROM 模型路径/qwen2-0_5b-instruct-q8_0.gguf
  1. 通过Ollama创建模型
ollama create qwen2:0.5b -f Modelfile
  1. 运行刚创建的模型
ollama run qwen2:0.5b

需要注意的是运行7B至少需要8GB的内存或显存,运行13B至少需要16GB内存或显存。我电脑的配置信息如下

型号: 小新Pro16 AI元启
CPU: AMD Ryzen 7 8845H
内存: 32.0 GB

AMD Ryzen 7 8845H内置NPU,整体算力还可以, 运行运行13B及以下的模型没太大问题。当然这种级别参数大小的模型不会是一个无所不能的模型,这种量级的模型运行成本相对较低,适合做一些特定场景的推理任务。如果需要无所不能的模型建议还是直接使用ChatGPT这种商业模型。

命令启动

下载模型完成之后可以测试运行,通过cmd运行指令,比如我运行起来qwen2:7b模型

这种方式比较简单,只能是文字对话的方式而且没有样式,简单粗暴。

接口访问

Ollama提供服务的本质还是http接口,我们可以通过http接口的方式来调用/api/generate接口

curl http://localhost:11434/api/generate -d '{
  "model": "qwen2:7b",
  "prompt": "请你告诉我你知道的天气有哪些?用json格式输出",
  "stream": false
}'
  • model设置模型的名称
  • prompt提示词
  • stream设置为false要求不要流式返回

因为是一次性返回所有内容,所以需要等待一会,如果需要流式输出可以设置为true。等待一会后接口返回的信息如下所示

{
    "model": "qwen2:7b",
    "created_at": "2024-09-04T06:13:53.1082355Z",
    "response": "```json\n{\n  \"常见天气\": [\n    {\n      \"类型\": \"晴\",\n      \"描述\": \"天空无云或有少量高薄云,日间阳光充足。\",\n      \"符号\": \"☀️\"\n    },\n    {\n      \"类型\": \"多云\",\n      \"描述\": \"大部分天空被云层覆盖,但能见蓝天,太阳时隐时现。\",\n      \"符号\": \"

标签:Console,C#,ollama,模型,LLMs,var,new,Ollama
From: https://www.cnblogs.com/wucy/p/18400124/csharp-ollama

相关文章

  • 【编程底层思考】理解控制反转Inverse of Control,IOC 和 依赖注入Dependency Injecti
    RodJohnson是第一个高度重视以配置文件来管理Java实例的协作关系的人,他给这种方式起了一个名字:控制反转(InverseofControl,IOC)。后来MartineFowler为这种方式起了另一个名称:依赖注入(DependencyInjection),因此不管是依赖注入,还是控制反转,其含义完全相同。当某个Java对象(......
  • GZOI2024 Day1 T3 coin
    coin(GZOI2024Day1T3)题目大意给你\(n\)个硬币,每个硬币有属性\(a_i,b_i,p_i\),表示有\(p_i\)的概率值为\(a_i\),有\(1-p_i\)的概率值为\(b_i\)。所有的\(a_i\)所有的\(b_i\)均不同。有\(q\)次询问,询问有两种:给定\(l,r,k\),问\([l,r]\)的硬币值都\(<\)第\(......
  • 什么是 Agentic 工作流?
    传统的人工智能自动化主要侧重于基于规则的系统和用于处理特定任务的狭义人工智能应用。虽然这些方法在许多情况下都很有效,但它们通常难以应对需要适应性和情境理解的复杂、多面流程。进入代理工作流—一个突破性的范例,有望将企业自动化推向新的高度。通过利用多个协同......
  • 【C#】命名规范
    文章目录C#命名规范使用Pascalcase使用Camelcase方法、属性、类命名见名知义LINQ查询变量使用有意义的名称如何声明成员变量和字段正确格式化和缩进代码如何撰写备注通用C#编码最佳实践如何将值与空字符串进行比较使用异常处理使用&&和||可获得更好的性能单一职责使......
  • 【JavaScript系列八】—讲述JS学习历程的知识分享!
    前言本篇主要讲述JS中较为重要的一环,函数的用法,深拷贝和浅拷贝的概念和区别,闭包和递归,包括一些案例:例如递归实现斐波那契数列,求阶乘等等一、关于函数定义函数的方式function关键字函数表达式(匿名函数)varfn=function(){}newfunction()函数的调用及其this指向普通函数—......
  • 【JavaScript系列九】—讲述JS学习历程的知识分享!
    前言本篇主要是讲述ES6的新增语法和相关运用一、ES6ES的全称是ECMAScript,它是由ECMA国际标准化组织,制定的一项脚本语言的标准化规范。泛指2015年6月之后发布的版本为什么使用ES6语言更加完善功能更加强大变量提升特性增加了程序运行时的不确定性语法过于......
  • cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?
    跨平台系列cross-plateform跨平台应用程序-01-概览cross-plateform跨平台应用程序-02-有哪些主流技术栈?cross-plateform跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?cross-plateform跨平台应用程序-04-ReactNative介绍cross-plateform跨平台应用程序-05-Flut......
  • 南沙信奥赛C++陈老师解一本通题: 1171:大整数的因子
    ​ 【题目描述】已知正整数k满足2≤k≤9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k。【输入】一个非负整数c,c的位数≤30。【输出】若存在满足 c%k==0的k,从小到大输出所有这样的k,相邻两个数之间用单个空格隔开;若没有这样的k,则输出"none"。【输入样......
  • python3 ModuleNotFoundError: No module named 'CommandNotFound'
    前言python3报错:ModuleNotFoundError:Nomodulenamed'CommandNotFound'这是linux安装多版本python时的一个遗留问题,如果修改了默认系统的/usr/bin/python的软连接到新安装的版本,然后在/usr/bin下将名为python3的软链接指向了新版本的python。因为Python版......
  • C#查漏补缺----值类型与引用类型,值类型一定分配在栈上吗?
    前言环境:.NET8.0系统:Windows11参考资料:《CLRviaC#》,《.NetCore底层入门》,《.NET内存管理宝典》栈空间与堆空间程序运行过程中,需要保存各种各样的数据。数据根据它们的生命周期从不同位置分配,每个线程都有独立的栈空间(StackSpace)。栈空间主要用于保存被调用方法......