6、使用one-api管理统一管理大模型,并开始使用本地大模型

文章目录

  • 本节内容介绍
  • 集中接入:将大模型统一管理起来
    • 当使用了大模型代理
    • 大模型代理示例
  • 开源模型:如何使用Hugging Face上的模型
    • modelscope
    • 使用 pipeline 调用模型
    • 用底层实现调用模型
    • 流式输出
  • 如何在项目中使用开源模型
    • 使用 LangChain
    • 使用集中接入
    • 开始使用ollama

本节内容介绍

在本节中,我们一起来使用one-api来模拟openai,给应用提供对应的sk;并尝试使用各种方式来使用本地的大模型,尤其是最近deepseek爆火,你更需要学习使用ollama上面提供的多个deepseek模型了

集中接入:将大模型统一管理起来

集中接入,就是把大模型的接入统一到一个地方管理起来,下面这张图可以很好地帮我们理解集中接入:

在这里插入图片描述

从这个图上,你已经看出来了,所谓的集中接入,其实就是构建了一个代理,我们后面就称它为大模型代理。

到这里,你可能产生这样的疑问:我直接用大模型不好吗?为什么还要在中间加上一层代理呢?

集中接入是一种架构上的调整,顾名思义,我需要是一个服务,才会有架构调整的说法。如果只是像前面几讲,如果在本地就可以运行起来的一些程序,确实没有必要在中间加入一层。但在真实的项目中,我们往往是要构建一个服务,这时集中接入的价值就体现出来了。

之所以要有一个中间层,最直接的一个问题就是限流问题。大模型服务本身资源消耗很大,提供大模型服务的供应商为了保证尽可能多的用户享受到正常的服务,所以,它对单用户实施了限流。以 OpenAI API 为例,下面就是它的限流标准,其中 RPM 是 requests per minute(每分钟请求数),TPM 是 tokens per minute(每分钟 Token 数)。

如果我们是一个人或是规模比较小的服务,这个限流标准大概是够用的,但如果我们要对外提供服务,这个标准大概率是不够用的。解决这个问题最简单的办法就是多申请一些账号,形成一个号池,这样限流标准对我们来说就大幅度提高了,但随之而来的一个问题就是如何管理号池。

稍微仔细想一下,你就会发现,实现一个还不错的号池管理还是比较麻烦的。比如,按什么方式在不同的账号之间进行选择,怎样管理失效的账号等等。真的要实现好一个号池,就等于实现了一个完整的运维工具,可是,你的应用目标是做一个 AI 应用。与其自己实现这么一套完整的功能,还不如用已有的工具来完成这个目标。是的,已经有一些现成的工具可以完成这个目标。

当使用了大模型代理

在介绍具体的工具之前,我们先来看看如果把接入管理独立出来之后,会产生怎样的变化。

首先肯定是解决了多账号管理的问题。所有的账号都配置在这个代理上,而对于我们自己的应用而言,只配置一个账号就好。这个大模型代理通常会采用 OpenAI 兼容的 API,也就是说,你完全可以用 OpenAI API 的使用方式使用它,一般来说,我们只要替换一下 API_BASE 和 API_KEY,而其它的代码可以完全保持不变。这也是我们代理能够平滑接入的原因。

有了大模型代理之后,我们还可以有一些其它的变化。一个典型的应用场景就是接入不同的供应商。虽然我们一直在讲 OpenAI API,但由于众所周知的原因,我们并不能直接访问 OpenAI API。

一个常见的解决办法是,通过一些供应商来进行访问。一般来说,我们并不会依赖于一家供应商,所以,配置多个供应商也是很常见的。有了大模型代理之后,这些复杂性就从我们的应用中剥离出去了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不同的供应商上提供的 API 可能会有所差异。比如,微软的 Azure 也提供了 OpenAI 的服务,但接口略有差异。如果是自己的代码,我们就需要自己管理这种差异。有了大模型代理,我们就可以把这种复杂性交给代理,而让我们的代码采用统一的接口进行访问。

前面讨论的还都是 OpenAI 的模型。既然有了大模型代理,我们完全可以再进一步,通过它访问不同的模型。事实上,很多供应商就提供了类似的能力,比如 OpenRouter 就提供了许多不同模型的访问能力,而它们都是基于 OpenAI 兼容接口的。通过大模型代理,我们也可以访问不同的大模型。

不仅仅是使用别人的服务,我们甚至可以访问自己本地部署的大模型。后面我们讲到本地部署大模型时,我们会谈到如何利用大模型代理访问本地大模型。

总之,有了大模型代理之后,各种接入问题的复杂度就完全交给它了。在应用端来看,接入就完全简化成一个 OpenAI 的接入接口。这也是我们前面重点介绍 OpenAI API 接口的原因。另外,我们前面说过,LangChain 在一些场景下是不适用的,其中的一个原因就是它提供的一些抽象在某些情况下是失效的。有了大模型代理,LangChain 提供的模型抽象就显得没有必要了。

好了,现在你已经了解大模型代理在我们的应用中扮演的角色,下面我们就来看如何使用搭建一个大模型代理。

大模型代理示例

能够提供大模型代理的工具有很多,下面我以 One-API 为例介绍一下基本的用法。One-API 就是一个典型的大模型代理,它提供了以 OpenAI API 接口访问各种大模型的能力。我们常见的一些大模型在 One-API 中都得到了支持,比如,GPT、Claude、文心一言、通义千问等等。它在行业内得到了很广泛地使用,所以,它在能力上也得到了很多扩展,比如,计费管理、渠道管理等等。

安装 One-API 最简单的方式是使用 Docker,比如:

docker run --name one-api -d --restart always -p 3000:3000 -e SQL_DSN="root:123456741852q@+@tcp(101.42.44.178:2881)/oneapi" -e TZ=Asia/Shanghai -v /home/zeng/soft/data/one-api:/data justsong/one-api

在实际使用中,我们会根据自己的实际情况修改数据库配置(SQL_DSN),如果配置了 SQL_DSN,One-API 会使用 MySQL 作为数据库。此外需要调整的配置就是映射目录,这个目录里存放的是数据和日志:

-v /home/zeng/soft/data/one-api:/data

启动之后,访问对应的地址,比如,在本地启动就是访问 http://localhost:3000/,你就会看到它的界面。要想看到更多的配置项,需要进行登录。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里面的重点是渠道,这对应的就是我们前面提到的服务供应商。我们可以添加新的渠道(使用root/123456登录后才可配置渠道),这里主要的几个选项是:

  • 类型:它决定了在转发过程中采用什么 API 接入到后端的模型上,比如,OpenAI 就会采用 OpenAI API。
  • 模型:这个渠道支持的模型,比如,gpt-4o-mini。每个渠道可以配置很多的模型。
  • 连接信息:接入地址(代理)和 API Key(密钥),如果是同一个供应商的多个账号,可以采用批量创建的方式,输入多个 API Key。

在这里插入图片描述

在这个配置里,有一个比较有意思的配置是模型重定向,就是把一个模型名称转换成另外一个模型的名称。一种典型的用法是,把一个比较昂贵的模型用另外一个便宜的模型代替。比如,早期的 GPT-4 价格是很高的,而后期的 GPT-4o 价格就要便宜不少,而且性能会更强大。我们就可以在这里做一个映射,让应用请求过来的 GPT 4,而真正请求到后端都是 GPT-4o。

还有一种用法是,给模型起一个新名称。这样一来,我们的应用提供给用户的是一个自定义的名称,请求到代理上之后,再转成真正的模型发出去,以此屏蔽掉后端真正的模型。我们在不少应用上见到的所谓自己的模型,都可以这么实现出来。

如果配置了多个渠道之后,我们可以在渠道列表看到后面截图里的选项。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里我们可以做一些运维类的工作,比如,禁用失效的渠道。还有一个点是优先级,它是用来确定访问顺序的。比如,多个渠道都提供了 gpt-4o-mini 这个模型,我们会访问优先级高的渠道。

设置了模型之后,我们还需要添加 API Key,也就是这里的令牌。我们可以根据自己的需要设置相应的权限。

在这里插入图片描述

具体的 API Key 是自动生成的。我们创建好令牌之后,可以在令牌列表中找到。只要在这里复制就可以得到所需的 API Key 了。

在这里插入图片描述

后面的操作我们都很熟悉了,就是把 One API 的访问地址和 API Key 配置到我们的代码里,和平时使用 OpenAI API 是一样的。

这里只讲了 One API 最基本的用法。这个工具已经开发了一段时间,功能还是比较多的,比如,可以设置访问失败时自动禁用渠道,出现问题时通知运维人员等等。你如果有需要可以去更多的探索。

开源模型:如何使用Hugging Face上的模型

在传统开发中,如果为这些企业服务,一个重要的议题就是私有化部署,但像 OpenAI 这样的服务显然是无法满足私有化部署的需求。在这种情况下,一个能够运行在本地的大模型就显得至关重要了,之所以我们可以在本地运行模型,是因为有人把已经做好的模型开放了出来,这就是开源的力量。

modelscope

如今的 Hugging Face 主要除了可以分享模型(model),还可以分享数据集(dataset),还有部署起来的应用(Space)。模型也不止是语言模型,而是其它各式各样的模型,比如图像生成模型、语音生成模型等等。为了让用户更好地使用其服务,Hugging Face 还提供了很多的工具,比如简化模型使用的 transformers 程序库、简化 AI 应用开发和部署的 Gradio 等等。

modelscope号称国内的Hugging Face,由于网络限制,所以下面都是使用modelscope作为示例

使用 pipeline 调用模型

调用 modelscope 模型有两种方式:高层接口和底层接口。高层接口相当于是对底层接口做了封装,让代码使用起来更容易,相对而言,底层接口则有更大的灵活性。在高层接口里,我们核心要知道的一个概念就是管道(pipeline)。和软件领域所有叫管道的概念一样,它要做的就是一步一步地进行处理,一个阶段完成之后,交给下一个阶段,我们来看一个例子:

# 首先使用命令将模型下载到本地:
# modelscope download --model Qwen/Qwen2.5-3B-Instruct --local_dir ./Qwen2.5-3B-Instructimport torch
from transformers import pipelinedevice = "cuda" if torch.cuda.is_available() else "cpu"messages = [{"role": "user", "content": "请写一首赞美秋天的五言绝句"},
]
# 使用本地的
pipe = pipeline("text-generation", model="/home/zeng/llm/model/Qwen2.5-3B-Instruct", device=device, max_new_tokens=100)
result = pipe(messages)
print(result[-1]['generated_text'][-1]['content'])

这段代码的核心就是这两句:

pipe = pipeline("text-generation", model="/home/zeng/llm/model/Qwen2.5-3B-Instruct", device=device,
result = pipe(messages)

先构建了一个管道,第一个参数指定了它的用途,这里是文本生成(text-generation), pipeline 会根据不同的用途进行不同的管道配置。第二个参数是模型,在这个例子里面,我们使用的模型是阿里的通义千问(Qwen),引用模型的方式就是“用户名 / 模型名”,在这里就是“Qwen/Qwen2.5-3B-Instruct”。

构建好了管道,就可以调用模型了,我们把消息传给模型,它就会给我们产生一个结果。下面是我一次执行的结果:

秋风送爽至,落叶铺金地。
丰收稻谷香,丰收喜悦起。

前面说了,pipeline 模型的第一个参数指定了用途。除了像大模型做文本生成,modelscope 提供了大量的不同模型,可以帮助我们完成其它的工作。具体请到modelscope模型库观看:https://www.modelscope.cn/models

用底层实现调用模型

前面我们已经了解了管道的概念,对高层接口有了基本的了解。不过,管道封装起来的流程是什么样的呢?这就需要我们了解一下底层实现。

下面就是一个使用底层的实现,它实现的功能与上一段代码完全一样,理解了它的实现,你就基本上知道 pipeline 是怎样实现的了。

from transformers import AutoTokenizer, AutoModelForCausalLMtokenizer = AutoTokenizer.from_pretrained("/home/zeng/llm/model/Qwen2.5-3B-Instruct")
model = AutoModelForCausalLM.from_pretrained("/home/zeng/llm/model/Qwen2.5-3B-Instruct")messages = [{"role": "user", "content": "请写一首赞美春天的诗,要求不包含春字"},
]text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)generated_ids = model.generate(**model_inputs,max_new_tokens=512
)
generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)

从代码上看,它的流程复杂多了。但实际上,只要我们理解了大模型的处理过程,这段代码就很容易理解了。这个过程的核心就是三步。

第一步,把输入转换成 Token。

text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)

第二步,大模型根据输入生成相应的内容。

generated_ids = model.generate(**model_inputs,max_new_tokens=512
)

第三步,生成的结果是 Token,还需要把它转成文本。

generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]

基本上就是这样一个过程。因为过程中涉及到了 Token 和文本之间的转换,所以,这里还有一个 Tokenizer,它就是负责转换的模型。一般来说,大模型都要和对应的 Tokenizer 一起使用,所以,你会看到它俩往往给出的是同一个模型名字:

tokenizer = AutoTokenizer.from_pretrained("/home/zeng/llm/model/Qwen2.5-3B-Instruct")
model = AutoModelForCausalLM.from_pretrained("/home/zeng/llm/model/Qwen2.5-3B-Instruct")

流式输出

前面实现的功能都是由大模型一次性生成的。在聊天模式下,我们还需要使用流式输出。在 Hugging Face 的 API 里,我们可以使用 Streamer 来实现这一点,从名字上就可以知道,它是用来处理流式输出的。下面就是一个演示了流式输出的例子:

from transformers import AutoTokenizer, AutoModelForCausalLM, TextStreamertokenizer = AutoTokenizer.from_pretrained("/home/zeng/llm/model/Qwen2.5-3B-Instruct")
model = AutoModelForCausalLM.from_pretrained("/home/zeng/llm/model/Qwen2.5-3B-Instruct")messages = [{"role": "user", "content": "请写一首赞美秋天的五言绝句"},
]text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)streamer = TextStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)
generated_ids = model.generate(**model_inputs,max_new_tokens=512,streamer=streamer,
)

在这个例子里,我们用到了 TextStreamer,它会直接把生成结果输出到控制台上。如果我们要实现一个控制台应用,它是可以用的。但更多的情况下,我们需要拿到输出结果,再去做相应的处理,比如,服务端把生成的内容发送给客户端。这种情况下,我们可以使用 TextIteratorStreamer,下面是一个例子:

from transformers import AutoTokenizer, AutoModelForCausalLM, TextStreamer, TextIteratorStreamer
from threading import Threadtokenizer = AutoTokenizer.from_pretrained("/home/zeng/llm/model/Qwen2.5-3B-Instruct")
model = AutoModelForCausalLM.from_pretrained("/home/zeng/llm/model/Qwen2.5-3B-Instruct")messages = [{"role": "user", "content": "请写一首赞美秋天的五言绝句"},
]text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
streamer = TextIteratorStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)
generation_kwargs = dict(model_inputs, streamer=streamer, max_new_tokens=20)
thread = Thread(target=model.generate, kwargs=generation_kwargs)
thread.start()for text in streamer:print(text)

与之前最大的不同是,这段代码启用了多线程,这样一来,生成和输出是异步处理的,不会彼此阻塞,更符合真实代码中的处理。正如 TextIteratorStreamer 这个名字所显示的,它实现了 Iterator,所以,我们可以在其上进行迭代。

有了对 Streamer 的理解,我们就可以回到 pipeline 上,给 pipeline 增加流式输出的能力:

import torch
from transformers import pipeline, TextIteratorStreamerdevice = "cuda" if torch.cuda.is_available() else "cpu"messages = [{"role": "user", "content": "请写一首赞美秋天的五言绝句"},
]pipe = pipeline("text-generation", model="/home/zeng/llm/model/Qwen2.5-3B-Instruct", device=device, max_new_tokens=100)streamer = TextIteratorStreamer(pipe.tokenizer, skip_prompt=True, skip_special_tokens=True)generation_kwargs = dict(text_inputs=messages, streamer=streamer)
thread = Thread(target=pipe, kwargs=generation_kwargs)
thread.start()for text in streamer:print(text)

至此,我们对如何调用 Hugging Face 上的模型有了一个初步的了解,有了这个基础,下面我们来看看如何在项目中使用这些模型。

如何在项目中使用开源模型

前面我们讲了如何使用 Hugging Face 上的开源模型。这一讲,我们看看如何在实际的项目中使用这些模型。

这一讲,我们就来谈谈两种常见的封装:使用 LangChain 和使用集中接入。

使用 LangChain

LangChain 的模型就是 LangChain 给我们提供的一层封装,屏蔽掉了不同大模型之间的差异,让我们可以方便地在不同大模型之间进行切换。任何想要接入 LangChain 体系的大模型,只要实现了相应的接口,就可以无缝地嵌入到 LangChain 的体系中去,Hugging Face 的模型就是这么做的。

我们之所以要把 Hugging Face 模型嵌入到 LangChain 的体系中,主要是因为我们希望使用 LangChain 提供的其它抽象。

要使用 Hugging Face 相关的代码,首先需要安装相应的包:

pip install langchain-huggingface

langchain-huggingface 是 Hugging Face 和 LangChain 共同维护的一个包,其目标是缩短将 Hugging Face 生态的新功能带给 LangChain 用户的时间。它里面包含了很多功能:

  • 有各种模型的实现,比如聊天模型和 Embedding 模型;
  • 有数据集的实现,它实现成了 DocumentLoader;
  • 有工具的实现,比如文本分类、文本转语音等。

从提供的内容上来看,这个包封装了 Hugging Face 上的主要能力——模型和数据集。其中,不同的模型因为能力上的差异做了不同归结:属于大语言模型的,就归结到了 LangChain 模型上,而无法归结的,就以工具的形式提供。

有了最基本的了解,我们来实现一个简单的功能:

import torch
from langchain_huggingface import HuggingFacePipeline, ChatHuggingFacedevice = 0 if torch.cuda.is_available() else -1llm = HuggingFacePipeline.from_model_id(model_id="/home/zeng/llm/model/Qwen2.5-3B-Instruct",task="text-generation",device=device,pipeline_kwargs=dict(max_new_tokens=512,return_full_text=False,),
)chat_model = ChatHuggingFace(llm=llm)result = chat_model.invoke("写一首赞美秋天的五言绝句。")
print(result.content)

这里我们也是先构建了一个管道,通过上一讲的学习,这个构建管道的过程我们其实并不陌生,无非就是设定模型 ID、模型用途(task)以及其它一些配置参数。虽然从命名上看,我们是在构建一个管道,但这里的 HuggingFacePipeline 是一个 LangChain 的 LLM 类型。

有了 HuggingFacePipeline,我们再把它转成一个 ChatModel,实际上就是做了一层封装:

chat_model = ChatHuggingFace(llm=llm)

ChatModel 我们之前已经谈了很多,有了 ChatModel,接下来它就可以与我们熟悉的那些 LangChain 抽象配合在一起了。在我们的示例里,我们就是直接调用它。

result = chat_model.invoke("写一首赞美秋天的五言绝句。")
print(result.content)

前面我们说过,在 LangChain 的体系下,有 ChatModel 和 LLM 两种抽象都可以处理大模型。我们这里定义出的 HuggingFacePipeline 就是 LLM,它也完全可以拿过来单独使用。

llm.invoke("写一首赞美秋天的五言绝句。")

在我写下这段文字的时候,langchain-huggingface 这个包的发布时间并不算很长,实现上还有一些不够完善的地方。比如,ChatHuggingFace 的流式应答支持得就不算特别好。在 langchain-community 这个包里,还有一个旧版的 ChatHuggingFace,它本身提供了流的支持,只不过,它需要与旧的一套代码配合使用,而这套代码都处于被舍弃的状态(Deprecated)。

虽然我们可以在代码中支持不同模型的封装,但其实我们还有另外一种选择,就是采用集中接入的方案,彻底摆脱在代码中集成模型。

使用集中接入

我们继续以一开始的 One-API 为例。在创建新渠道的时候,类型是有很多选项的,它决定着后端会接入到哪个供应商的模型上。其中的一个选项是 Ollama:

在这里插入图片描述

ollama是一个可以在本地运行大模型的轻量级框架。同我们在本地运行代码访问大模型类似,它可以在本地启动一个服务,我们可以通过这个服务去使用相应的大模型。类似的东西也有不少,比如 vllm、gpt4all 等。

有一个运行在本地的大模型,我们就可以做很多的事情了。比如,搭建一个属于自己的聊天机器人,尝试不同的大模型,还有一些新的 AI 编码工具,也是可以接入到本地的大模型。单纯从一个用户的角度,我也推荐每个程序员尝试着在本地运行大模型,做一些不同的事情,它会加深你对大模型的理解。

开始使用ollama

下面我就以 Ollama 为例,介绍一下基本的用法。安装 Ollama 只要找到对应的安装包即可,如果是 Linux,我们可以通过命令行进行安装:

curl -fsSL https://ollama.com/install.sh | sh

理解 Ollama 的使用,可以类比于 Docker,所以,在 Ollama 的命令中,我们会看到 pull、push、run 等命令。要想使用大模型,我们首先要把大模型拉到本地:

ollama pull qwen2.5

同一个模型会有多个不同的版本,比如,通义千问 2.5 就有 0.5B、1.5B、3B、7B、14B、32B、72B 等不同规模的版本。即便是同一个规模,还会有不同配置的版本。在 Ollama 中,这些不同的版本是通过 Tag 区分的,比如,如果我们想使用 0.5B 版本的,可以这样拉取。

ollama pull qwen2.5:0.5b

如果想做一些简单的测试,我们可以直接在本地把它运行起来。

ollama run qwen2.5

启动之后,就是一个命令行版的对话框,对于程序员来说,这就比较熟悉了。

>>> 写一首诗
春风吹绿江南岸,芳草萋萋野花开。
千帆过尽江心月,独坐闲庭听流水。风送花香满庭院,鸟语花香醉晚晴。
时光荏苒如白驹,岁月静好待人来。

启动 Ollama 实际上是启动了一个服务,所以,我们也可以通过 API 访问这个服务。Ollama 提供了两类 API,一类是它自身定义的 API,另一类就是 OpenAI 兼容 API。下面就是通过它自身 API 访问服务的示例。

curl http://127.0.0.1:11434/api/chat -d '{"model": "qwen2.5","messages": [{"model": "qwen2.5","prompt": "写一首关于AI的诗"}]
}'

我们可以通过 list 命令查看已经安装的模型。

ollama listNAME                                               ID              SIZE      MODIFIED
qwen2.5:0.5b                                       a8b0c5157701    397 MB    16 hours ago
qwen2.5-coder:32b                                  4bd6cbf2d094    19 GB     2 days ago
qwen2.5:latest                                     845dbda0ea48    4.7 GB    7 days ago
llama3.2:latest                                    a80c4f17acd5    2.0 GB    8 days ago

在 One API 中填写的就是这里的 NAME 字段,比如,我们在配置中添加了 qwen2.5:0.5b。配置好之后,我们就可以在代码中直接指定模型名为 qwen2.5:0.5b。

completion = client.chat.completions.create(model="qwen2.5:0.5b",messages=self.messages,temperature=0
)

你看到了,这里我们用到 OpenAI 的程序库,但我在这里指定的模型是 qwen2.5:0.5b,并不是 OpenAI 提供的模型。这也是我们集中接入采用 OpenAI 兼容 API 的意义所在。我们在代码层面上,不用考虑模型的差异,因为集中接入层做了这层封装,把不同的供应商屏蔽了,从而保证了我们代码的稳定性。

顺便说一下,Ollama 本身也提供了一个程序库,LangChain 也提供了 Ollama 的封装。如果有需要,可以自行查看

细心的同学可能发现了,我们在讨论 Ollama 的过程中,并没有提到 Hugging Face。Ollama 相当于本身提供了一个仓库,我们是从 Ollama 的仓库里拉取的模型。但说到模型的丰富程度,肯定是 Hugging Face 更胜一筹的。我们可以使用 Hugging Face 的模型吗?答案是可以。

在 Ollama 上使用模型,运行的命令是后面这样。

ollama run hf.co/{username}/{repository}

不过,有一点要说明一下,并不是所有的模型都可以使用 Ollama 运行的。为了确认这一点,你可以在模型的说明页上查看一下。点击 “Use this model”,如果下拉菜单中有 Ollama,那就是可以使用,你可以复制相应的命令去执行;否则,这个模型可能无法直接使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/69489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Winform开发框架(蝇量级) MiniFramework V2.1

C/S框架网与2022年发布的一款蝇量级开发框架,适用于开发Windows桌面软件、数据管理应用系统、软件工具等轻量级软件,如:PLC上位机软件、数据采集与分析软件、或企业管理软件,进销存等。适合个人开发者快速搭建软件项目。 适用开发…

【漫话机器学习系列】087.常见的神经网络最优化算法(Common Optimizers Of Neural Nets)

常见的神经网络优化算法 1. 引言 在深度学习中,优化算法(Optimizers)用于更新神经网络的权重,以最小化损失函数(Loss Function)。一个高效的优化算法可以加速训练过程,并提高模型的性能和稳定…

傅里叶公式推导(一)

文章目录 三角函数系正交证明图观法数学证明法计算当 n不等于m当 n等于m(重点) 其它同理 首先要了解的一点基础知识: 三角函数系 { sin ⁡ 0 , cos ⁡ 0 , sin ⁡ x , cos ⁡ x , sin ⁡ 2 x , cos ⁡ 2 x , … , sin ⁡ n x , cos ⁡ n x ,…

1. 构建grafana(版本V11.5.1)

一、grafana官网 https://grafana.com/ 二、grafana下载位置 进入官网后点击downloads(根据自己的需求下载) 三、grafana安装(点击下载后其实官网都写了怎么安装) 注:我用的Centos,就简略的写下我的操作步…

macOS 上部署 RAGFlow

在 macOS 上从源码部署 RAGFlow-0.14.1:详细指南 一、引言 RAGFlow 作为一款强大的工具,在人工智能领域应用广泛。本文将详细介绍如何在 macOS 系统上从源码部署 RAGFlow 0.14.1 版本,无论是开发人员进行项目实践,还是技术爱好者…

快速集成DeepSeek到项目

DeepSeek API-KEY 获取 登录DeekSeek 官网,进入API 开放平台 2. 创建API-KEY 复制API-KEY进行保存,后期API调用使用 项目中集成DeepSeek 这里只展示部分核心代码,具体请查看源码orange-ai-deepseek-biz-starter Slf4j AllArgsConstructo…

保姆级教程Docker部署Zookeeper模式的Kafka镜像

目录 一、安装Docker及可视化工具 二、Docker部署Zookeeper 三、单节点部署 1、创建挂载目录 2、命令运行容器 3、Compose运行容器 4、查看运行状态 5、验证功能 四、部署可视化工具 1、创建挂载目录 2、Compose运行容器 3、查看运行状态 一、安装Docker及可视化工…

Docker容器访问外网:启动时的网络参数配置指南

在启动Docker镜像时,可以通过设置网络参数来确保容器能够访问外网。以下是几种常见的方法: 1. 使用默认的bridge网络 Docker的默认网络模式是bridge,它会创建一个虚拟网桥,将容器连接到宿主机的网络上。在大多数情况下,使用默认的bridge网络配置即可使容器访问外网。 启动…

白话文实战Nacos(保姆级教程)

前言 上一篇博客 我们创建好了微服务项目,本篇博客来体验一下Nacos作为注册中心和配置中心的功能。 注册中心 如果我们启动了一个Nacos注册中心,那么微服务比如订单服务,启动后就可以连上注册中心把自己注册上去,这过程就是服务注册。每个微服务,比如商品服务都应该注册…

C语言基础08:运算符+流程控制总结

运算符 算术运算符 结果:数值 、-、*、\、%、(正)、-(负)、、-- i和i 相同点:i自身都会增1 不同点:它们运算的最终结果是不同的。i:先使用,后计算;i&am…

Node.js开发属于自己的npm包(发布到npm官网)

在 Node.js 中开发并发布自己的 npm 包是一个非常好的练习,可以帮助我们更好地理解模块化编程和包管理工具,本篇文章主要阐述如何使用nodejs开发一个属于自己的npm包,并且将其发布在npm官网。在开始之前确保已经安装了 Node.js 和 npm。可以在…

如何在RTACAR中配置IP多播(IP Multicast)

一、什么是IP多播 IP多播(IP Multicast)是一种允许数据包从单一源地址发送到多个目标地址的技术,是一种高效的数据传输方式。 多播地址是专门用于多播通信的IP地址,范围从 224.0.0.0到239.255.255.255 与单播IP地址不同&#x…

12.翻转、对称二叉树,二叉树的深度

反转二叉树 递归写法 很简单 class Solution { public:TreeNode* invertTree(TreeNode* root) {if(rootnullptr)return root;TreeNode* tmp;tmproot->left;root->leftroot->right;root->righttmp;invertTree(root->left);invertTree(root->right);return …

网络安全行业的冬天

冬天已经来了,春天还会远吗?2022年10月28日,各个安全大厂相继发布了财报,纵观2022年前三季度9个月,三六零亏了19亿,奇安信亏了11亿,深信服亏了6亿,天融信亏了4亿,安恒亏了…

MYSQL索引与视图

一、新建数据库 mysql> create database mydb15_indexstu; mysql> use mydb15_indexstu; 二、新建表 (1)学生表Student mysql> create table Student(-> Sno int primary key auto_increment,-> Sname varchar(30) not null unique,-…

深度优先搜索(DFS)——八皇后问题与全排列问题

( ^ _ ^ ) 数据结构好难哇(哭 1.BFS和DFS 数据结构空间性质DFSstackO(h)不具有最短性质BFSqueueO(2^h)具有最短路性质 空间上DFS占优势,但是BFS具有最短性 (若所有权重都是1,则BFS一定最短)&…

Flink 内存模型各部分大小计算公式

Flink 的运行平台 如果 Flink 是运行在 yarn 或者 standalone 模式的话,其实都是运行在 JVM 的基础上的,所以首先 Flink 组件运行所需要给 JVM 本身要耗费的内存大小。无论是 JobManager 或者 TaskManager ,他们 JVM 内存的大小都是一样的&a…

Vue07

一、Vuex 概述 目标:明确Vuex是什么,应用场景以及优势 1.是什么 Vuex 是一个 Vue 的 状态管理工具,状态就是数据。 大白话:Vuex 是一个插件,可以管理 Vue 通用的数据 (多组件共享的数据)。例如:购物车数…

Linux 安装 Ollama

1、下载地址 Download Ollama on Linux 2、有网络直接执行 curl -fsSL https://ollama.com/install.sh | sh 命令 3、下载慢的解决方法 1、curl -fsSL https://ollama.com/install.sh -o ollama_install.sh 2、sed -i s|https://ollama.com/download/ollama-linux|https://…

Docker Desktop无法安装报错(求助记录中)

之前Docker Desktop无法使用,报了一个注册表的错误(忘记截图)我想着更新安装下应该就好了,结果Docker Desktop一直无法安装,花了几天都没解决。同时我的window11更新也出现下载错误 - 0x80040154异常,启动或关闭Window…