LLMs技术 | 整合Ollama实现本地LLMs调用

Ollama 可以在 Windows 上运行了 阅读详情
AI摘要

本文介绍了Ollama大模型的安装、命令启动、接口访问和可视化UI等使用方法,还展示了C#整合Ollama的多种应用,如简单对话、多轮对话等。此外,作者分享了学习大模型的经验,提供了系统学习路线、视频教程等资料,鼓励大家学习大模型。

前言

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

Ollama

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

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

  • • 官网首页直接下载 https://ollama.com/

  • • Github Relase下载 https://github.com/ollama/ollama/releases

我的是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      \"符号\": \"🌤️\"\n    },\n    {\n      \"类型\": \"阴天\",\n      \"描述\": \"全天或大部分时间云量较多,几乎看不到阳光,光线较暗。\",\n      \"符号\": \"☁️\"\n    },\n    {\n      \"类型\": \"雨\",\n      \"子类型\": [\n        {\n          \"类型\": \"小雨\",\n          \"描述\": \"降水量不大,通常不会形成积水。\",\n          \"符号\": \"🌦️\"\n        },\n        {\n          \"类型\": \"中雨\",\n          \"描述\": \"降水量适中,可能会有局部积水。\",\n          \"符号\": \"🌧️\"\n        },\n        {\n          \"类型\": \"大雨\",\n          \"描述\": \"降水量大,可能伴有雷电和强风。\",\n          \"符号\": \"⛈️\"\n        }\n      ]\n    },\n    {\n      \"类型\": \"雪\",\n      \"子类型\": [\n        {\n          \"类型\": \"小雪\",\n          \"描述\": \"积雪较轻,地面可能仅局部有薄雪覆盖。\",\n          \"符号\": \"❄️\"\n        },\n        {\n          \"类型\": \"中雪\",\n          \"描述\": \"降雪量中等,地面和部分植被可能有积雪。\",\n          \"符号\": \"🌨️\"\n        },\n        {\n          \"类型\": \"大雪\",\n          \"描述\": \"降雪量很大,地面积雪深厚,交通和生活受严重影响。\",\n          \"符号\": \"❄️💨\"\n        }\n      ]\n    },\n    {\n      \"类型\": \"雾\",\n      \"描述\": \"大气中的水汽在地面或近地面凝结形成大量悬浮的微小水滴或冰晶的现象。\",\n      \"符号\": \"🌫️\"\n    },\n    {\n      \"类型\": \"雷阵雨\",\n      \"描述\": \"突然而短暂的强降雨伴有闪电和雷鸣,通常持续时间较短。\",\n      \"符号\": \"⚡🌧️\"\n    }\n  ]\n}\n```",  
    "done":true,  
    "done_reason":"stop",  
    "context":[  
    151644,  
    872,  
    198,  
    //...省略...  
    73594  
    ],  
    "total_duration":70172634700,  
    "load_duration":22311300,  
    "prompt_eval_count":19,  
    "prompt_eval_duration":151255000,  
    "eval_count":495,  
    "eval_duration":69997676000  
}

还有一种比较常用的操作就是大家比较关注的嵌入模型,通俗点就是对文本或者图片、视频等信息进行特征提取转换成向量的方式,这时候需要使用/api/embed接口,请求格式如下所示,这里使用的向量化模型是nomic-embed-text大家可以自行去用ollama pull这个模型

curl http://localhost:11434/api/embed -d '{  
  "model": "nomic-embed-text:latest",  
  "input": "我是中国人,我爱我的祖国"  
}'

嵌入接口返回的数据格式如下所示

{  
    "model":"nomic-embed-text:latest",  
    "embeddings":[  
        [  
        0.012869273,  
        0.015905218,  
        -0.13998738,  
        //...省略很多...  
        -0.035138983,  
        -0.03351391  
        ]  
    ],  
    "total_duration":619728100,  
    "load_duration":572422600,  
    "prompt_eval_count":12  
}

当然Ollama提供的接口还有很多,比如对话、模型管理等待,这里我们就不一一介绍了,有需要的同学可以自行查阅接口文档地址https://github.com/ollama/ollama/blob/main/docs/api.md

可视化UI

上面我们提到了两种方式访问Ollama服务,一种是命令行的方式,另一种是接口的方式。这两种虽然方式原始,但是并没有界面操作显得直观,如果你想通过界面的方式通过Ollama完成对话服务,官方Github推荐的也比较多,有兴趣的同学可以自行查看文档https://github.com/ollama/ollama?tab=readme-ov-file#web–desktop,我选用的是第一个Open WebUI,简单的方式是通过Docker直接运行

docker run -d -p 3000:8080 -e OLLAMA_BASE_URL=https://你的ollama服务ip:11434 -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main

亦或者可以通过构建源码的方式构建启动,按照下面的命令一步一步来

    1. git clone https://github.com/open-webui/open-webui.git
    1. cd open-webui/
    1. cp -RPp .env.example .env(复制一份.env.example文件重命名为.env。Windows系统的话使用copy .env.example .env)
    1. npm install
    1. npm run build
    1. cd ./backend
    1. conda create --name open-webui-env python=3.11(用conda创建一个名为pen-webui-env的虚拟环境)
    1. conda activate open-webui-env(激活虚拟环境)
    1. pip install -r requirements.txt -U(安装python依赖)
    1. bash start.sh( Windows操作系统的话直接启动start_windows)

如你所见,它是依赖NodeJs和Python的,还需要安装Conda

  • • 🐰 Node.js >= 20.10

  • • 🐍 Python >= 3.11

  • • conda我用的是24.5.0

启动成功后,在浏览器上输入http://localhost:8080/,注册一个用户名登陆进来之后界面如下所示

可以直接选择模型进行对话,类似ChatGPT那种对话风格。

C#整合Ollama

上面我们了解到了Ollama的基本安装和使用,明白了它的调用是基于Http接口来完成的。其实我也可以参考接口文档自行封装一套调用,但是没必要, 因为有很多现成的SDK可以直接使用。

使用Ollama Sdk

这里使用的C#的SDK就叫0llama,它的Github地址是https://github.com/tryAGI/Ollama, 为什么选择它呢,其实也很简单,因为它支持function call,这方便我们更早的体验新功能。安装它非常简单,相信同学们都会

dotnet add package Ollama --version 1.9.0
简单对话

简单的对话功能上手也没什么难度,都是简单代码

string modelName ="qwen2:7b";  
using var ollama =new OllamaApiClient(baseUri:new Uri("http://127.0.0.1:11434/api"));  
  
Console.WriteLine("开始对话!!!");  
string userInput ="";  
do  
{  
    Console.WriteLine("User:");  
    userInput =Console.ReadLine()!;  
    var enumerable = ollama.Completions.GenerateCompletionAsync(modelName, userInput);  
    Console.WriteLine("Agent:");  
    await foreach(var response in enumerable)  
    {  
        Console.Write($"{response.Response}");  
    }  
    Console.WriteLine();  
} while(!string.Equals(userInput,"exit",StringComparison.OrdinalIgnoreCase));  
Console.WriteLine("对话结束!!!");

模型名称是必须要传递的,而且默认的是流式输出,如果想一次返回同样的是设置stream为false。示例使用的是qwen2:7b模型。执行起来之后便可以直接对话,如下所示

整体来说国产模型里面qwen2:7b整体的效果还是不错的,至少还不是扭曲事实。

多轮对话

如果需要进行分角色的多轮对话,要换一个方式使用,使用提供的Chat方式,如下所示

string modelName = "glm4:9b";  
using var ollama = new OllamaApiClient(baseUri:new Uri("http://127.0.0.1:11434/api"));  
Console.WriteLine("开始对话!!!");  
string userInput = "";  
List<Message> messages = [];  
do  
{  
    //只取最新的五条消息  
    messages = messages.TakeLast(5).ToList();  
    Console.WriteLine("User:");  
    userInput =Console.ReadLine()!;  
    //加入用户消息  
    messages.Add(new Message(MessageRole.User, userInput));  
    var enumerable = ollama.Chat.GenerateChatCompletionAsync(modelName, messages, stream:true);  
    Console.WriteLine("Agent:");  
    StringBuilder builder =new();  
    await foreach(var response in enumerable)  
    {  
        string content = response.Message.Content;  
        builder.AppendLine(content);  
        Console.Write(content);  
    }  
    //加入机器消息  
    messages.Add(new Message(MessageRole.Assistant, builder.ToString()));  
    Console.WriteLine();  
  
}while(!string.Equals(userInput,"exit",StringComparison.OrdinalIgnoreCase));  
Console.WriteLine("对话结束!!!");

这次换了另一个国产模型glm4:9b, 多轮对话和完全对话使用的对象不同。

  • • 完全对话使用的是Completions对象,多轮对话使用的是Chat对象。

  • • 多轮对话需要用List<Message>存储之前的对话记录,这里模型才能捕获上下文。

运行起来,执行效果如下所示

第一次我问他会c#吗,它说了一堆表示会。第二句我让它写一个简单的示例,但是我并没有说写c#示例,但是它可以通过上面的对话了解到意图,所以直接用c#给我写了一个示例。

function call

高版本的Ollama支持function call,当然这也要求模型也必须支持,如果模型本身不支持,那也是没有效果的,其中llama3.1支持的比较好,美中不足是llama3.1对中文支持的不太好,所以我们简单的演示一下,这里使用的是llama3.1:8b模型,首先需要定义方法,这样和模型对话的时候,框架会把方法的元信息抽出来发给模型,让模型判断调用哪个,这里我简单定义了一个计算增删改查的接口,并实现这个接口。

//定义一个接口,提供元信息  
[OllamaTools]  
public interface IMathFunctions  
{  
    [Description("Add two numbers")]  
    int Add(int a, int b);  
    [Description("Subtract two numbers")]  
    int Subtract(int a, int b);  
    [Description("Multiply two numbers")]  
    int Multiply(int a, int b);  
    [Description("Divide two numbers")]  
    int Divide(int a, int b);  
}  
  
//实现上面的接口提供具体的操作方法  
public class MathService : IMathFunctions  
{  
    public int Add(int a, int b)=> a + b;  
    public int Subtract(int a, int b)=> a - b;  
    public int Multiply(int a, int b)=> a * b;  
    public int Divide(int a, int b)=> a / b;  
}

有了上面的接口和实现类之后,我们就可以通过Ollama使用它们了,使用方式如下

string modelName = "llama3.1:8b";  
using var ollama = new OllamaApiClient(baseUri:new Uri("http://127.0.0.1:11434/api"));  
var chat = ollama.Chat(  
    model: modelName,  
    systemMessage:"You are a helpful assistant.",  
    autoCallTools:true);  
  
//给Ollama注册刚才定义的类  
var mathService = new MathService();  
chat.AddToolService(mathService.AsTools(), mathService.AsCalls());  
  
while(true)  
{  
    try  
    {  
        Console.WriteLine("User>");  
        var newMessage = Console.ReadLine();  
        var msg = await chat.SendAsync(newMessage);  
        Console.WriteLine("Agent> "+ msg.Content);  
    }  
    finally  
    {  
        //打印本次对话的所有消息  
        Console.WriteLine(chat.PrintMessages());  
    }  
}

这里需要设置autoCallTools为true才能自动调用方法,PrintMessages()方法用来打印本轮会话中所有的消息, 一般自动调用function call的时候会产生多次请求,但是我们使用的时候是无感知的,因为框架已将帮我自动处理了,比如我的提示词是一个数学计算公式(12+8)*4/2=?,如下所所示

通过PrintMessages()方法打印的对话消息可知,虽然我只提供了一句提示词,但是Ollama SDK因为支持自动调用工具,llama3.1:8b将提示词算式(12+8)*4/2)进行了拆分,计算步骤如下所示

  • • 先拆分了括号里的逻辑12+8并调用Add方法得到结果20

  • • 然后第二步用上一步得到的结果调用Multiply计算20*4得到80

  • • 再用上一步的结果调用Divide计算80/2得到结果40

  • • 最后把Tools调用的步骤及结果一起在通过对话发送给llama3.1模型,模型得到最终的输出

如果我们不打印过程日志的话,模型只会输出

Assistant:  
The correct calculation is:  
(12+8)=20  
20*4=80  
80/2=40  
Therefore,the answer is:40.
嵌入模型

上面我们提到过Ollama不仅可以使用对话模型还可以使用嵌入模型的功能,嵌入模型简单的来说就是对文本、图片、语音等利用模型进行特征提起,得到向量数据的过程。通过Ollama SDK可以使用Ollama的嵌入功能,代码如下所示

string modelName = "nomic-embed-text:latest";  
HttpClient client = new HttpClient();  
client.BaseAddress = new Uri("http://127.0.0.1:11434/api");  
client.Timeout = TimeSpan.FromSeconds(3000);  
using var ollama = new OllamaApiClient(client);  
var embeddingResp = await ollama.Embeddings.GenerateEmbeddingAsync(modelName,"c#是一门不错的编程语言");  
Console.WriteLine($"[{string.Join(",", embeddingResp.Embedding!)}]");

得到的就是如下所示的向量信息

向量数据是可以计算相似度的,利用余弦夹角的概念可以计算向量的空间距离,空间距离越近,两个向量的相似度便越高。如果大家了解颜色表RGB的话就比较容易理解,举个例子(255, 0, 0)就是纯红色,(255, 10, 10)也是红色,但是不是纯红色。如果把(255, 0, 0)和(255, 10, 10)映射到一个三维的空间坐标图上它们的距离就很近,但是它们和纯蓝色(0, 0, 255)的空间距离就很远,因为一个贴近X轴,一个贴近Z轴。现在大家锁熟知的向量数据库,大概采用的就是类似的原理。也是现在流行的RAG检索增强生成的基础。

比如我把下面两句话嵌入模型得到向量值,然后通过计算余弦夹角来比较它们的相似度

var embeddingResp = await ollama.Embeddings.GenerateEmbeddingAsync(modelName,"c#是一门不错的编程语言");  
var embeddingResp2 = await ollama.Embeddings.GenerateEmbeddingAsync(modelName,"c#是很好的语言");  
Console.WriteLine("相似度:"+CosineSimilarity([.. embeddingResp.Embedding!],[.. embeddingResp2!.Embedding]));  
  
//计算余弦夹角  
public static double CosineSimilarity(double[] vector1, double[] vector2)  
{  
    if(vector1.Length!= vector2.Length)  
        throw new ArgumentException("向量长度必须相同");  
  
    double dotProduct =0.0;  
    double magnitude1 =0.0;  
    double magnitude2 =0.0;  
  
    for(int i =0; i < vector1.Length; i++)  
    {  
        dotProduct += vector1[i]* vector2[i];  
        magnitude1 += vector1[i]* vector1[i];  
        magnitude2 += vector2[i]* vector2[i];  
    }  
  
    magnitude1 =Math.Sqrt(magnitude1);  
    magnitude2 =Math.Sqrt(magnitude2);  
  
    if(magnitude1 ==0.0|| magnitude2 ==0.0)  
        return0.0;// 避免除以零  
    return dotProduct /(magnitude1 * magnitude2);  
}

上面的得到的相似度结果是

相似度:0.9413230998586363

因为它们两句话表达的含义差不多,所以相似度很高。但是如果我要计算下面的两句话的相似度

var embeddingResp =  await ollama.Embeddings.GenerateEmbeddingAsync(modelName, "c#是一门不错的编程语言");  
var embeddingResp2 = await ollama.Embeddings.GenerateEmbeddingAsync(modelName, "我喜欢吃芒果和草莓");

那么利用余弦值计算出来它们的相似度只有0.59,因为这两句话几乎没有任何关联。

相似度:0.5948448463206064
多模态模型

刚开始的对话模型都比较单一,都是简单的文本对话,随着不断的升级,有些模型已经支持多种格式的输入输出而不仅仅是单一的文本,比如支持图片、视频、语音等等,这些模型被称为多模态模型。使用Ollama整合llava模型体验一把,这里我是用的是llava:13b。我在网上随便找了一张图片存放本地

用这张图片对模型进行提问,代码如下所示

HttpClient client = new HttpClient();  
client.BaseAddress = new Uri("http://127.0.0.1:11434/api");  
client.Timeout = TimeSpan.FromSeconds(3000);  
using var ollama =new OllamaApiClient(client);  
string modelName = "llava:13b";  
string prompt = "What is in this picture?";  
System.Drawing.Image image = System.Drawing.Image.FromFile("1120.jpg");  
var enumerable = ollama.Completions.GenerateCompletionAsync(modelName, prompt, images:[BitmapToBase64(image)], stream:true);  
await foreach(var response in enumerable)  
{  
    Console.Write($"{response.Response}");  
}  
  
//Image转base64  
public static string BitmapToBase64(System.Drawing.Image bitmap)  
{  
    MemoryStream ms1 =newMemoryStream();  
    bitmap.Save(ms1,System.Drawing.Imaging.ImageFormat.Jpeg);  
    byte[] arr1 =newbyte[ms1.Length];  
    ms1.Position=0;  
    ms1.Read(arr1,0,(int)ms1.Length);  
    ms1.Close();  
    returnConvert.ToBase64String(arr1);  
}

我用提示词让模型描述图片里面的内容,然后把这张图片转换成base64编码格式一起发送给模型,模型返回的内容如下所示

确实够强大,描述的信息很准确,措词也相当不错,如果让人去描述图片中的内容,相信大部分人描述的也没这么好,不得不说模型越来越强大了。

使用SemanticKernel

除了整合Ollama SDK以外,你还可以用Semantic Kernel来整合Ollama,我们知道默认情况下Semantic Kernel只能使用OpenAI和Azure OpenAI的接口格式,但是其他模型接口并不一定和OpenAI接口格式做兼容,有时候甚至可以通过one-api这样的服务来适配一下。不过不用担心Ollama兼容了OpenAI接口的格式,即使不需要任何的适配服务也可以直接使用,我们只需要重新适配一下请求地址即可。

using HttpClient httpClient = new HttpClient(new RedirectingHandler());  
httpClient.Timeout = TimeSpan.FromSeconds(120);  
  
var kernelBuilder = Kernel.CreateBuilder()  
.AddOpenAIChatCompletion(  
       modelId:"glm4:9b",  
       apiKey:"ollama",  
       httpClient: httpClient);  
Kernel kernel = kernelBuilder.Build();  
  
var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();  
OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()  
{  
    ToolCallBehavior=ToolCallBehavior.AutoInvokeKernelFunctions  
};  
  
var history = newChatHistory();  
string? userInput;  
do  
{  
    Console.Write("User > ");  
    userInput =Console.ReadLine();  
    history.AddUserMessage(userInput!);  
  
    var result = chatCompletionService.GetStreamingChatMessageContentsAsync(  
        history,  
        executionSettings: openAIPromptExecutionSettings,  
        kernel: kernel);  
    string fullMessage ="";  
    System.Console.Write("Assistant > ");  
    await foreach(var content in result)  
    {  
        System.Console.Write(content.Content);  
        fullMessage += content.Content;  
    }  
    System.Console.WriteLine();  
  
    history.AddAssistantMessage(fullMessage);  
}while(userInput is not null);  
  
  
public class RedirectingHandler : HttpClientHandler  
{  
    protected override Task<HttpResponseMessage> SendAsync(  
        HttpRequestMessage request, CancellationToken cancellationToken)  
    {  
        var uriBuilder =new UriBuilder(request.RequestUri!){ Scheme="http",Host="localhost",Port=11434 };  
        //对话模型  
        if(request!.RequestUri!.PathAndQuery.Contains("v1/chat/completions"))  
        {  
            uriBuilder.Path="/v1/chat/completions";  
            request.RequestUri= uriBuilder.Uri;  
        }  
        //嵌入模型  
        if(request!.RequestUri!.PathAndQuery.Contains("v1/embeddings"))  
        {  
            uriBuilder.Path="/v1/embeddings";  
            request.RequestUri= uriBuilder.Uri;  
        }  
        return base.SendAsync(request, cancellationToken);  
    }  
}

这里我们使用的是国产模型glm4:9b,需要注意的是因为这里我们使用的是本地服务,所以需要适配一下服务的地址,通过编写RedirectingHandler类,并用其构造一个HttpClient实例传递给Kernel。细心的同学可能已经发现了,这里我转发的Ollama服务的路径也变成了和OpenAI服务一样的路径,但是上面我调用Ollama服务用的是/api/chat和/api/embed这种地址的接口。这是因为Ollama为了兼容OpenAI的标准,专门开发了一套和OpenAI路径和参数都一样的接口,这一点是需要注意的。当然Ollama暂时还没有全部兼容OpenAI接口的全部特征,有兴趣的同学可以去看一下https://github.com/ollama/ollama/blob/main/docs/openai.md文档地址,了解更详细的内容。

上面的服务运行起来,我们同样可以进行对话,效果如下所示

同样的你可以通过SemanticKernel使用嵌入模型的功能,如下所示

using HttpClient httpClient = new HttpClient(new RedirectingHandler());  
httpClient.Timeout = TimeSpan.FromSeconds(120);  
  
var kernelBuilder =Kernel.CreateBuilder()  
    .AddOpenAITextEmbeddingGeneration(  
       modelId:"nomic-embed-text:latest",  
       apiKey:"ollama",  
       httpClient: httpClient);  
Kernel kernel = kernelBuilder.Build();  
var embeddingService = kernel.GetRequiredService<ITextEmbeddingGenerationService>();  
var embeddings = await embeddingService.GenerateEmbeddingsAsync(["我觉得c#是一门不错的编程语言"]);  
Console.WriteLine($"[{string.Join(",", embeddings[0].ToArray())}]");

这里休要注意的是AddOpenAITextEmbeddingGeneration方法是评估方法,将来版本有可能会删除的,所以默认的用VS使用该方法会有错误提醒,可以在csproj的PropertyGroup标签中设置一下NoWarn来忽略这个提醒。

<PropertyGroup>  
   <OutputType>Exe</OutputType>  
   <TargetFramework>net8.0</TargetFramework>  
   <NoWarn>SKEXP0010;SKEXP0001</NoWarn>  
</PropertyGroup>

总结

本文介绍了如何通过`C#`结合`Ollama`实现本地大语言模型的部署与调用,重点演示了在`C#`应用中集成该功能的具体步骤。通过详细的安装指南与代码示例,帮助开发者快速上手。
  • • 首先我们介绍了Ollama的安装及基本设置和命令的使用。

  • • 然后介绍了如何通过Ollama调用大模型,比如使用命令行、Http接口服务、可视乎界面。

  • • 再次我们我们通过C#使用了Ollama SDK来演示了对话模式、文本嵌入、多模态模型如何使用,顺便说了一下相似度计算相关。

  • • 最后,我们展示了通过Semantic Kernel调用Ollama服务,因为Ollama对OpenAI的接口数据格式做了兼容,虽然还有部分未兼容,但是日常使用问题不大。

    通过本文希望没有了解过大模型的同学可以入门或者大概了解一下相关的基础,毕竟这是近两年或者未来几年都比较火的一个方向。即使我们不能深入的研究他,但是我们也得知道它了解它的基本原理与使用。我们为什么要持续学习,因为这些东西很多时候确实是可以给我们提供方便。接触它,了解它,才能真正的知道它可以帮助我解决什么问题。

​

如何学习大模型

现在社会上大模型越来越普及了,已经有很多人都想往这里面扎,但是却找不到适合的方法去学习。

作为一名资深码农,初入大模型时也吃了很多亏,踩了无数坑。现在我想把我的经验和知识分享给你们,帮助你们学习AI大模型,能够解决你们学习中的困难。

我已将重要的AI大模型资料包括市面上AI大模型各大白皮书、AGI大模型系统学习路线、AI大模型视频教程、实战学习,等录播视频免费分享出来,需要的小伙伴可以扫取。

一、AGI大模型系统学习路线

很多人学习大模型的时候没有方向,东学一点西学一点,像只无头苍蝇乱撞,我下面分享的这个学习路线希望能够帮助到你们学习AI大模型。

在这里插入图片描述

二、AI大模型视频教程

在这里插入图片描述

三、AI大模型各大学习书籍

在这里插入图片描述

四、AI大模型各大场景实战案例

在这里插入图片描述

五、结束语

学习AI大模型是当前科技发展的趋势,它不仅能够为我们提供更多的机会和挑战,还能够让我们更好地理解和应用人工智能技术。通过学习AI大模型,我们可以深入了解深度学习、神经网络等核心概念,并将其应用于自然语言处理、计算机视觉、语音识别等领域。同时,掌握AI大模型还能够为我们的职业发展增添竞争力,成为未来技术领域的领导者。

再者,学习AI大模型也能为我们自己创造更多的价值,提供更多的岗位以及副业创收,让自己的生活更上一层楼。

因此,学习AI大模型是一项有前景且值得投入的时间和精力的重要选择。

Ollama入门教程:从安装到运行的完整指南 随着人工智能(AI)技术的快速发展,大型语言模型(LLMs)逐渐成为了各行各业的重要工具。然而,使用这些强大模型的同时,数据隐私、处理效率和部署复杂度等问题也逐渐浮现。为了解决这些问题,Ollama 提供了一种创新的解决方案——通过本地化部署大型语言模型,不仅能够增强数据隐私性,还能提高模型的运行效率。本文将详细介绍如何下载和安装 Ollama,如何选择和运行不同的语言模型,以及 Ollama 的特点、适用场景、优缺点等内容,帮助大家深入了解这一平台。ollama官网🚪 ollama官方文档🚪 根据自己 阅读详情

相关推荐

Ollama:一个在本地部署、运行大型语言模型的工具

所谓自定义模型就是不适用Ollama官方模型库中的模型,理论可以使用其他各类经过转换处理的模型Ollama库中的模型可以通过提示进行自定义。python复制代码FROM llama3 # 设置温度参数 PARAMETER temperature 1 # 设置SYSTEM 消息 SYSTEM """作为AI智能助手,你将竭尽所能为员工提供严谨和有帮助的答复。"""Modelfile文档One-API是一个OpenAI接口管理 & 分发系统,支持各类大模型。这里使用Docker快速进行部署。拉取镜像。

2401_84495725的博客 6721

一文彻底整明白,基于Ollama工具的LLM大语言模型Web可视化对话机器人部署指南

在上一篇博文中,我们在本地部署了**Llama 3 8B**参数大模型,并用 Python 写了一个控制台对话客户端,基本能愉快的与 Llama 大模型对话聊天了。但控制台总归太技术化,体验不是很友好,我们希望能有个类似 ChatGPT 那样的 Web 聊天对话界面,本博文就安排起来……

老牛啊 1万+

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

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

c13_tianming的专栏 2171

ollama 设置API key

通过nginx的方式实现ollama API 一定程度(专业度不高,不敢说一定安全,但对于我这种小白来说够用了)的安全暴露。

xianciSele的博客 2万+

deepseek+ollama+maxkb部署自己的本地知识库详解【纯玩-详解】

deepseek+ollama+maxkb部署自己的本地知识库详解

python|大数据爱好者Alvin 1813

如何用C#整合Ollama实现本地LLMs调用?只需4步

Ollama是一个开源项目,它允许用户在本地部署和运行LLMs。这意味着你可以完全控制你的数据,并且不必担心因网络延迟或带宽限制而导致的性能问题。Ollama支持多种语言模型,如GPT系列、Bert等,并且提供了简单的RESTful API来访问这些模型。

java专栏 1655

.NET周刊【9月第3期 2024-09-15】

文章涉及对WindowsFormsSynchronizationContext的深入分析,尝试找到创建控件的具体线程,但只发现了主线程的同步上下文,没有如预期的两个上下文,显示出dump分析的复杂性。历史上,.NET曾因微软的闭源策略发展受限,尽管后来推出了跨平台的.NET Core,但市场接受度仍不高,主要应用于国有企业和传统行业。在现代微服务架构中,服务发现是关键功能,通过使用 Microsoft.Extensions.ServiceDiscovery 包,.NET 提供了实现服务发现的简便方式。

InCerry的博客 3589

新能源场站必看:一次调频与AGC/AVC的协同控制逻辑解析(含典型拓扑图)

本文深度解析了新能源场站中一次调频与AGC/AVC的协同控制逻辑。针对电网频率与电压稳定需求,详细阐述了三者在响应时序、控制目标上的分工与配合,并重点剖析了以RCL-0923装置为核心的指令融合架构与典型拓扑,为场站实现高效、稳定的协同运行提供了清晰的实践指导。

brown的博客 1062

整合Ollama实现本地LLMs调用

本文介绍了如何通过`C#`结合`Ollama`实现本地大语言模型的部署与调用,重点演示了在`C#`应用中集成该功能的具体步骤。通过详细的安装指南与代码示例,帮助开发者快速上手。• 首先我们介绍了Ollama的安装及基本设置和命令的使用。• 然后介绍了如何通过Ollama调用大模型,比如使用命令行Http接口服务可视乎界面。• 再次我们我们通过C#使用了Ollama SDK来演示了对话模式文本嵌入多模态模型如何使用,顺便说了一下相似度计算相关。• 最后,我们展示了通过调用Ollama服务,因为。

python1222_的博客 3340

VSAN 虚拟机丢失排查与恢复完整方案

VSAN虚拟机(含vCenter)显示无效 检查存储状态:登录ESXi Host Client,确认VSAN存储是否挂载。 若未挂载,通过SSH执行 手动挂载。 验证文件存在:检查虚拟机文件是否完整。 解除文件锁定:删除残留的 .lck 文件 手动注册虚拟机:强制注册虚拟机配置文件。 检查VSAN健康:验证集群节点在线、磁盘组状态正常,并测试节点间网络。 修复元数据:针对损坏对象,谨慎执行修复。 终极恢复:若数据丢失,从备份还原或联系VMware支持,提交日志

sido777的博客 2680

强化学习新手上路:用PPO-Clip轻松玩转Pendulum-v1(PyTorch保姆级教程)

本文提供了一份基于PyTorch的PPO-Clip算法实战教程,指导强化学习新手在Pendulum-v1环境中构建连续控制智能体。教程详细解析了PPO-Clip的核心机制,特别是其Clip机制如何限制策略更新幅度以确保训练稳定,并涵盖了从环境配置、策略网络设计、经验收集到完整训练框架搭建的全过程,是掌握连续动作空间强化学习的实用指南。

weixin_29062963的博客 271

【LLM大模型】C#整合Ollama实现本地LLMs调用

近两年AIGC发展的非常迅速,从刚开始的只有ChatGPT到现在的很百家争鸣。从开始的大参数模型,再到后来的小参数模型,从一开始单一的文本模型到现在的多模态模型等等。随着一起进步的不仅仅是模型的多样化,还有模型的使用方式。

huang9604的博客 2315

ROS2仿真抓取分拣案例,使用myCobot 280机械臂结合ROS2系统搭建机械分拣站

本案例展示了如何利用myCobot 280 urdf模型构建一个对象分类站,并在ROS2 jazzy中完成运动规划。

m0_71627844的博客 2125

如何通过C#来使用Ollama,实现本地LLMs调用

本文介绍了如何通过`C#`结合`Ollama`实现本地大语言模型的部署与调用,重点演示了在`C#`应用中集成该功能的具体步骤。通过详细的安装指南与代码示例,帮助开发者快速上手。首先我们介绍了Ollama的安装及基本设置和命令的使用。然后介绍了如何通过Ollama调用大模型,比如使用命令行Http接口服务可视乎界面。再次我们我们通过C#使用了Ollama SDK来演示了对话模式文本嵌入多模态模型如何使用,顺便说了一下相似度计算相关。最后,我们展示了通过调用Ollama服务,因为Ollama对。

z551646的博客 4192

使用C# HslCommunication库实现三菱PLC通信(含完整代码示例)

在工业自动化开发中,上位机与PLC的通信是关键环节。HslCommunication库是一个开源的.NET工业通信库,支持三菱、西门子、欧姆龙等多个品牌PLC的通信协议。本文将演示如何通过库实现C#程序与三菱PLC的通信,并提供完整的代码示例。

StevenChen的博客 2290

蓝桥杯第七届省赛试题--“模拟风扇控制系统”

题目要求 功能简述 “模拟风扇控制系统”能够模拟电风扇工作,通过按键控制风扇的转动速度和定时时间,数码管实时显示风扇的工作模式,动态倒计时显示剩余的定时时间,系统主要由数码管显示、单片机最小系统、按键输入和电机控制保护电路组成,系统框图如图 1 所示: 单总线驱动程序、CT107D 单片机考试平台电路原理图以及本题所涉及到的芯片数据手册,可参考计算机上的电子文档。程序流程图及相关工程文件请以考生...

qq_43280087的博客 2659

本地部署和运行大型语言模型(Large Language Models, LLMs)的工具Ollama

Ollama 是一个便于本地部署和运行大型语言模型(Large Language Models, LLMs)的工具。使用通俗的语言来说,如果你想在自己的电脑上运行如 GPT-3 这样的大型人工智能模型,而不是通过互联网连接到它们,那么 Ollama 是一个实现这一目标的工具。

西京刀客 3943

108、AWB 时间滤波器:帧间白平衡平滑,防止色彩跳变与过冲

摘要: 文章探讨了AWB(自动白平衡)时间滤波器的设计与优化,以解决帧间白平衡跳变和过冲问题。通过自适应状态机(STABLE/TRANSITION/JUMP)动态调整平滑系数alpha,结合帧率归一化和过冲保护(方向检测+限幅),实现场景切换快速响应与静态稳定性的平衡。作者分享了工程经验:避免固定阈值、联动AE/AF、真实场景验证,并推荐简化卡尔曼滤波替代IIR。最终方案在旗舰机前置摄像头中成功消除“闪白”现象,强调参数需动态适应光照与色温变化。

sundong_81的博客 64

OpenWebUI 整合 Ollama + DeepSeek 本地部署使用指南

OpenWebUI 是一款专为本地大语言模型(LLMs)设计的开源、可扩展且功能丰富的自托管 Web 用户界面,支持完全离线运行,适用于需要数据隐私和安全保障的场景。其核心目标是为开发者及企业提供便捷的模型调试、交互与管理工具,同时兼容多种模型运行框架(如 Ollama、OpenAI 兼容 API 等),降低大模型应用的技术门槛。

一等一焱的博客 5049

网表导入virtuoso后发现pg pin忘记connect_pg_net/globalNetConnect怎么办?

数模混合项目中经常需要一些需要到virtuoso去连接的线,比如IO上的pg和一些信号线,除了在pr工作中设置skip route之外还需要做好net的赋值,告诉工具虽然我没在物理上有连接,但是实际上应该连什么net,这部分提现在网表里。在Default Net Name中也填写net name,因为这个net需要做global操作,即在顶层定义这个net,所以需要在net name后加个!打开schematic,删除指定cell pin所接net的label。

m0_61544122的博客 969

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

AI大模型本地部署开源框架 Ollama 介绍

本文简单介绍了 Ollama 的特性、应用场景,本地安装和运行大模型的步骤。

pythonhy的博客 1510

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

大模型本地部署开源框架 Ollama 介绍,大模型入门到精通,收藏这篇就足够了!

Ollama 是一个本地部署大模型的开源框架,降低了本地部署和管理大模型的门槛,且提供了丰富的开源大模型库,值得开发者学习和使用。

huang9604的博客 1204

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: 面了 5 家知名企业的NLP算法岗(大模型方向),被问麻了。。。。。
下一篇: 大模型算法入行&转行?我建议你这样做!
冻感糕人~
博客等级 码龄3年 8926粉丝 2384原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值