Ollama完整教程:本地LLM管理、WebUI对话、Python/Java客户端API应用
<p>老牛同学在前面有关大模型应用的文章中,多次使用了<strong>Ollama</strong>来管理和部署本地大模型(包括:<strong>Qwen2</strong>、<strong>Llama3</strong>、<strong>Phi3</strong>、<strong>Gemma2</strong>等),但对<strong>Ollama</strong>这个非常方便管理本地大模型的软件的介绍却很少。</p><p>目前,清华和智谱 AI 联合发布开源的<strong>GLM4-9B</strong>大模型也能支持<strong>Ollama</strong>进行本地部署了(本地部署 GLM-4-9B 清华智谱开源大模型方法和对话效果体验),<strong>Ollama</strong>支持的大模型越多越普及,对于的应用也就越多。为了降低大家查阅资料等学习时间,老牛同学今天尝试着对 Ollama 进行一次详细完整介绍。毕竟老牛同学也在不断学习中,若有疏漏或者错误之处,还请各位朋友多多指正,谢谢大家。</p>
<p>本文将分为以下章节对 Ollama 进行介绍:</p>
<ol>
<li>Ollama 基本介绍,它的作用是什么</li>
<li>Ollama 软件安装、一些常用的系统参数设置</li>
<li>Ollama 管理本地已有大模型(包括终端对话界面)</li>
<li>Ollama 导入模型到本地的三种方式:直接从 Ollama 远程仓库拉取、通过 GGUF 模型权重文件导入到本地、通过 safetensors 模型权限文件导入到本地</li>
<li>基于 WebUI 部署 Ollama 可视化对话界面</li>
<li>Ollama 客户端 API 应用,包括 Python API 和 Java API 接口应用</li>
</ol>
<h2 id="ollama-是什么它与-llama-有什么关系">Ollama 是什么,它与 Llama 有什么关系?</h2>
<p><strong>Ollama</strong>官网:https://ollama.com/,官方网站的介绍就一句话:<strong>Get up and running with large language models.</strong> (开始使用大语言模型。)</p>
<p><strong>Ollama</strong>是一个开源的 LLM(大型语言模型)服务工具,用于简化在本地运行大语言模型、降低使用大语言模型的门槛,使得大模型的开发者、研究人员和爱好者能够在本地环境快速实验、管理和部署最新大语言模型,包括如<strong>Qwen2</strong>、<strong>Llama3</strong>、<strong>Phi3</strong>、<strong>Gemma2</strong>等开源的大型语言模型。</p>
<p><strong>Ollama</strong>支持的大语言模型列表,可通过搜索模型名称查看:https://ollama.com/library</p>
<p><strong>Ollama</strong>官方 GitHub 源代码仓库:https://github.com/ollama/ollama/</p>
<p><strong>Llama</strong>是 Meta 公司开源的备受欢迎的一个通用大语言模型,和其他大模型一样,<strong>Llama</strong>可以通过<strong>Ollama</strong>进行管理部署和推理等。</p>
<p>因此,<code>Ollama</code>与<code>Llama</code>的关系:<code>Llama</code>是大语言模型,而<code>Ollama</code>是大语言模型(不限于<code>Llama</code>模型)便捷的管理和运维工具,它们只是名字后面部分恰巧相同而已!</p>
<p><img src="https://ntopic.cn/p/2024071001/01.png"></p>
<h2 id="ollama-安装和常用系统参数设置">Ollama 安装和常用系统参数设置</h2>
<p>在官网首页,我们可以直接下载<strong>Ollama</strong>安装程序(支持 Windows/MacOS/Linux):https://ollama.com/</p>
<p><strong>Ollama</strong>的安装过程,与安装其他普通软件并没有什么两样,安装完成之后,有几个常用的系统<strong>环境变量</strong>参数建议进行设置:</p>
<ol>
<li><strong>OLLAMA_MODELS</strong>:模型文件存放目录,默认目录为当前用户目录(Windows 目录:<code>C:\Users%username%.ollama\models</code>,MacOS 目录:<code>~/.ollama/models</code>,Linux 目录:<code>/usr/share/ollama/.ollama/models</code>),如果是 Windows 系统<strong>建议修改</strong>(如:D:\OllamaModels),避免 C 盘空间吃紧</li>
<li><strong>OLLAMA_HOST</strong>:Ollama 服务监听的网络地址,默认为<strong>127.0.0.1</strong>,如果允许其他电脑访问 Ollama(如:局域网中的其他电脑),<strong>建议设置</strong>成<strong>0.0.0.0</strong>,从而允许其他网络访问</li>
<li><strong>OLLAMA_PORT</strong>:Ollama 服务监听的默认端口,默认为<strong>11434</strong>,如果端口有冲突,可以修改设置成其他端口(如:<strong>8080</strong>等)</li>
<li><strong>OLLAMA_ORIGINS</strong>:HTTP 客户端请求来源,半角逗号分隔列表,若本地使用无严格要求,可以设置成星号,代表不受限制</li>
<li><strong>OLLAMA_KEEP_ALIVE</strong>:大模型加载到内存中后的存活时间,默认为<strong>5m</strong>即 5 分钟(如:纯数字如 300 代表 300 秒,0 代表处理请求响应后立即卸载模型,任何负数则表示一直存活);我们可设置成<strong>24h</strong>,即模型在内存中保持 24 小时,提高访问速度</li>
<li><strong>OLLAMA_NUM_PARALLEL</strong>:请求处理并发数量,默认为<strong>1</strong>,即单并发串行处理请求,可根据实际情况进行调整</li>
<li><strong>OLLAMA_MAX_QUEUE</strong>:请求队列长度,默认值为<strong>512</strong>,可以根据情况设置,超过队列长度请求被抛弃</li>
<li><strong>OLLAMA_DEBUG</strong>:输出 Debug 日志标识,应用研发阶段可以设置成<strong>1</strong>,即输出详细日志信息,便于排查问题</li>
<li><strong>OLLAMA_MAX_LOADED_MODELS</strong>:最多同时加载到内存中模型的数量,默认为<strong>1</strong>,即只能有 1 个模型在内存中</li>
</ol>
<h2 id="ollama-管理本地已有大模型">Ollama 管理本地已有大模型</h2>
<p>【展示本地大模型列表:<code>ollama list</code>】</p>
<pre><code class="language-shell">>ollama list
NAME ID SIZE MODIFIED
gemma2:9b c19987e1e6e2 5.4 GB7 days ago
qwen2:7b e0d4e1163c58 4.4 GB10 days ago
</code></pre>
<p>可以看到,老牛同学本地有 2 个大模型,它们的名称(<strong>NAME</strong>)分别为<strong>gemma2:9b</strong>和<strong>qwen2:7b</strong>。</p>
<p>【删除单个本地大模型:<code>ollama rm 本地模型名称</code>】</p>
<pre><code class="language-shell">>ollama rm gemma2:9b
deleted 'gemma2:9b'
>ollama list
NAME ID SIZE MODIFIED
qwen2:7b e0d4e1163c58 4.4 GB10 days ago
</code></pre>
<p>老牛同学通过<code>rm</code>命令删除了<strong>gemma2:9b</strong>大模型之后,再次通过<code>list</code>命令查看,本地只有<strong>qwen2:7b</strong>一个大模型了。</p>
<p>【启动本地模型:<code>ollama run 本地模型名</code>】</p>
<pre><code class="language-shell">>ollama run qwen2:0.5b
>>>
</code></pre>
<p>启动成功之后,就可以通过终端对话界面进行对话了(本命令下面也会讲到,其他详细暂且忽略)</p>
<p>【查看本地运行中模型列表:<code>ollama ps</code>】</p>
<pre><code class="language-shell">>ollama ps
NAME ID SIZE PROCESSOR UNTIL
qwen2:0.5b 6f48b936a09f 693 MB100% CPU 4 minutes from now
</code></pre>
<p>通过<code>ps</code>命名可以看到,老牛同学本地<strong>qwen2:0.5b</strong>大模型正在运行中。</p>
<p>【复制本地大模型:<code>ollama cp 本地存在的模型名 新复制模型名</code>】</p>
<pre><code class="language-shell">>ollama cp qwen2:0.5b Qwen2-0.5B
copied 'qwen2:0.5b' to 'Qwen2-0.5B'
>ollama list
NAME ID SIZE MODIFIED
Qwen2-0.5B:latest 6f48b936a09f 352 MB4 seconds ago
qwen2:0.5b 6f48b936a09f 352 MB29 minutes ago
qwen2:7b e0d4e1163c58 4.4 GB10 days ago
</code></pre>
<p>上面<code>cp</code>命令,老牛同学把本地<strong>qwen2:0.5b</strong>复制了一份,新模型名为<strong>Qwen2-0.5B</strong></p>
<p>下面老牛同学介绍三种通过 Ollama 下载到本地大模型方式:</p>
<ol>
<li>方式一:直接通过 Ollama 远程仓库下载,这是最直接的方式,也是最推荐、最常用的方式</li>
<li>方式二:如果已经有 GGUF 模型权重文件了,不想重新下载,也可以通过 Ollama 把该文件直接导入到本地(不推荐、不常用)</li>
<li>方式三:如果已经有 safetensors 模型权重文件,也不想重新下载,也可以通过 Ollama 把该文件直接导入到本地(不推荐、不常用)</li>
</ol>
<h2 id="方式一ollama-从远程仓库下载大模型到本地">方式一:Ollama 从远程仓库下载大模型到本地</h2>
<p>【下载或者更新本地大模型:<code>ollama pull 本地/远程仓库模型名称</code>】</p>
<p>本<code>pull</code>命令从 Ollama 远程仓库完整下载或增量更新模型文件,模型名称<strong>格式</strong>为:<strong>模型名称:参数规格</strong>;如<code>ollama pull qwen2:0.5b</code> 则代表从 Ollama 仓库下载<strong>qwen2</strong>大模型的<strong>0.5b</strong>参数规格大模型文件到本地磁盘:</p>
<p><img src="https://ntopic.cn/p/2024071001/02.png"></p>
<p>如果参数规格标记为<code>latest</code>则代表为默认参数规格,下载时<strong>可以</strong>不用指定,如<strong>Qwen2</strong>的<strong>7b</strong>被标记为<code>latest</code>,则<code>ollama pull qwen2</code>和<code>ollama pull qwen2:7b</code>这 2 个命令的意义是一样的,都下载的为<strong>7b</strong>参数规格模型。为了保证后续维护方便、避免误操作等,老牛同学<strong>建议</strong>不管是否为默认参数规格,我们下载命令中均明确参数规格。</p>
<p>值得一提的是,今天开始<strong>GLM4</strong>支持 Ollama 部署和推理,老牛同学特意列出它的下载命令:<code>ollama pull glm4:9b</code>(和其他模型相比,其实并没有特殊支出)。需要注意的是:Ollama 最低版本为<strong>0.2.0</strong>才能支持<strong>GLM4</strong>大模型!</p>
<p><img src="https://ntopic.cn/p/2024071001/03.png"></p>
<pre><code class="language-shell">>ollama pull qwen2:0.5b
pulling manifest
pulling manifest
pulling manifest
pulling manifest
pulling manifest
pulling 8de95da68dc4... 100% ▕████████████████████████▏ 352 MB
pulling 62fbfd9ed093... 100% ▕████████████████████████▏182 B
pulling c156170b718e... 100% ▕████████████████████████▏11 KB
pulling f02dd72bb242... 100% ▕████████████████████████▏ 59 B
pulling 2184ab82477b... 100% ▕████████████████████████▏488 B
verifying sha256 digest
writing manifest
removing any unused layers
success
>ollama list
NAME ID SIZE MODIFIED
qwen2:0.5b 6f48b936a09f 352 MB9 minutes ago
qwen2:7b e0d4e1163c58 4.4 GB10 days ago
</code></pre>
<p>若本地不存在大模型,则<strong>下载</strong>完整模型文件到本地磁盘;若本地磁盘存在该大模型,则<strong>增量</strong>下载大模型更新文件到本地磁盘。</p>
<p>从上面最后的<code>list</code>命令结果可以看到,老牛同学本地存在了<strong>qwen2:0.5b</strong>这个名称的大模型。</p>
<p>【下载且运行本地大模型:<code>ollama run 本地/远程仓库模型名称</code>】</p>
<pre><code class="language-shell">>ollama run qwen2:0.5b
>>>
</code></pre>
<p>若本地不存在大模型,则<strong>下载</strong>完整模型文件到本地磁盘(类似于<code>pull</code>命令),然后<strong>启动</strong>大模型;若本地存在大模型,则直接启动(不进行更新)。</p>
<p>启动成功后,默认为终端对客界面:</p>
<p><img src="https://ntopic.cn/p/2024071001/04.png"></p>
<ol>
<li>若需要输入多行文本,需要用<strong>三引号</strong>包裹,如:<code>"""这里是多行文本"""</code></li>
<li><code>/clear</code>清除对话上下文信息</li>
<li><code>/bye</code>则退出对话窗口</li>
<li><code>/set parameter num_ctx 4096</code>可设置窗口大小为 4096 个 Token,也可以通过请求设置,如:<code>curl <http://localhost:11434/api/generate> -d '{ "model": "qwen2:7b", "prompt": "Why is the sky blue?", "options": { "num_ctx": 4096 }}'</code></li>
<li><code>/show info</code>可以查看当前模型详情:<br>
,</li>
</ol>
<pre><code class="language-plaintext">>>> /show info
Model
arch qwen2
parameters 494.03M
quantization Q4_0
context length 32768
embedding length 896
Parameters
stop "<|im_start|>"
stop "<|im_end|>"
License
Apache License
Version 2.0, January 2004
</code></pre>
<h2 id="方式二ollama-导入-gguf-模型文件到本地磁盘">方式二:Ollama 导入 GGUF 模型文件到本地磁盘</h2>
<p>若我们已经从 HF 或者 ModeScope 下载了 GGUF 文件(文件名为:<strong>Meta-Llama-3-8B-Instruct.Q4_K_M.gguf</strong>),在我们存放<code>Llama3-8B</code>的 GGUF 模型文件目录中,创建一个文件名为<code>Modelfile</code>的文件,该文件的内容如下:</p>
<pre><code class="language-shell">FROM ./Meta-Llama-3-8B-Instruct.Q4_K_M.gguf
</code></pre>
<p>然后,打开终端,执行命令导入模型文件:<code>ollama create 模型名称 -f ./Modelfile</code></p>
<pre><code class="language-shell">>ollama create Llama-3-8B -f ./Modelfile
transferring model data
using existing layer sha256:647a2b64cbcdbe670432d0502ebb2592b36dd364d51a9ef7a1387b7a4365781f
creating new layer sha256:459d7c837b2bd7f895a15b0a5213846912693beedaf0257fbba2a508bc1c88d9
writing manifest
success
</code></pre>
<p>导入成功之后,我们就可以通过<code>list</code>命名,看到名为<strong>Llama-3-8B</strong>的本地模型了,后续可以和其他模型一样进行管理了。</p>
<h2 id="方式三ollama-导入-safetensors-模型文件到到本地磁盘">方式三:Ollama 导入 safetensors 模型文件到到本地磁盘</h2>
<p>官方操作文档:https://ollama.fan/getting-started/import/#importing-pytorch-safetensors</p>
<p>若我们已经从 HF 或者 ModeScope 下载了 safetensors 文件(文件目录为:<strong>Mistral-7B</strong>),</p>
<pre><code class="language-shell">git lfs install
git clone https://www.modelscope.cn/rubraAI/Mistral-7B-Instruct-v0.3.git Mistral-7B
</code></pre>
<p>然后,我们转换模型(结果:<code>Mistral-7B-v0.3.bin</code>):</p>
<pre><code class="language-shell">python llm/llama.cpp/convert.py ./Mistral-7B --outtype f16 --outfile Mistral-7B-v0.3.bin
</code></pre>
<p>接下来,进行量化量化:</p>
<pre><code class="language-shell">llm/llama.cpp/quantize Mistral-7B-v0.3.bin Mistral-7B-v0.3_Q4.bin q4_0
</code></pre>
<p>最后,通过 Ollama 导入到本地磁盘,创建<code>Modelfile</code>模型文件:</p>
<pre><code class="language-shell">FROM Mistral-7B-v0.3_Q4.bin
</code></pre>
<p>执行导入命令,导入模型文件:<code>ollama create 模型名称 -f ./Modelfile</code></p>
<pre><code class="language-shell">>ollama create Mistral-7B-v0.3 -f ./Modelfile
transferring model data
using existing layer sha256:647a2b64cbcdbe670432d0502ebb2592b36dd364d51a9ef7a1387b7a4365781f
creating new layer sha256:459d7c837b2bd7f895a15b0a5213846912693beedaf0257fbba2a508bc1c88d9
writing manifest
success
</code></pre>
<p>导入成功之后,我们就可以通过<code>list</code>命名,看到名为<strong>Mistral-7B-v0.3</strong>的本地模型了,后续可以和其他模型一样进行管理了。</p>
<h2 id="基于-webui-部署-ollama-可视化对话界面">基于 WebUI 部署 Ollama 可视化对话界面</h2>
<p><strong>Ollama</strong>自带控制台对话界面体验总归是不太好,接下来部署 Web 可视化聊天界面:</p>
<ol>
<li>下载并安装 Node.js 工具:https://nodejs.org/zh-cn</li>
<li>下载<code>ollama-webui</code>工程代码:<code>git clone https://github.com/ollama-webui/ollama-webui-lite ollama-webui</code></li>
<li>切换<code>ollama-webui</code>代码的目录:<code>cd ollama-webui</code></li>
<li>设置 Node.js 工具包镜像源(下载提速):<code>npm config set registry http://mirrors.cloud.tencent.com/npm/</code></li>
<li>安装 Node.js 依赖的工具包:<code>npm install</code></li>
<li>最后,启动 Web 可视化界面:<code>npm run dev</code></li>
</ol>
<p><img src="https://ntopic.cn/p/2024071001/05.jpg"></p>
<p>如果看到以上输出,代表 Web 可视化界面已经成功了!</p>
<p>浏览器打开 Web 可视化界面:http://localhost:3000/</p>
<p><img src="https://ntopic.cn/p/2024071001/06.png"></p>
<h2 id="ollama-客户端http-访问服务">Ollama 客户端:HTTP 访问服务</h2>
<p>Ollama 默认提供了<code>generate</code>和<code>chat</code>这 2 个原始的 API 接口,使用方式如下:</p>
<ol>
<li><code>generate</code>接口的使用样例:</li>
</ol>
<pre><code class="language-shell">curl http://localhost:11434/api/generate -d "{
'model': 'qwen:0.5b',
'prompt': '为什么天空是蓝色的?'
}"
</code></pre>
<ol start="2">
<li><code>chat</code>接口的使用样例:</li>
</ol>
<pre><code class="language-shell">curl http://localhost:11434/api/chat -d '{
"model": "qwen:7b",
"messages": [
{ "role": "user", "content": "为什么天空是蓝色的?" }
]
}'
</code></pre>
<p>接下来的<strong>Python</strong>和<strong>Java</strong>客户端应用,都是对这 2 个接口的封装。</p>
<h2 id="ollama-客户端python-api-应用">Ollama 客户端:Python API 应用</h2>
<p>我们把 Ollama 集成到 Python 应用中,只需要以下简单 2 步即可:</p>
<p><strong>第一步</strong>,安装 Python 依赖包:</p>
<pre><code class="language-shell">pip install ollama
</code></pre>
<p><strong>第二步</strong>,使用 Ollama 接口,<code>stream=True</code>代表按照流式输出:</p>
<pre><code class="language-python">import ollama
# 流式输出
def api_generate(text:str):
print(f'提问:{text}')
stream = ollama.generate(
stream=True,
model='qwen:7b',
prompt=text,
)
print('-----------------------------------------')
for chunk in stream:
if not chunk['done']:
print(chunk['response'], end='', flush=True)
else:
print('\n')
print('-----------------------------------------')
print(f'总耗时:{chunk['total_duration']}')
print('-----------------------------------------')
if __name__ == '__main__':
# 流式输出
api_generate(text='天空为什么是蓝色的?')
# 非流式输出
content = ollama.generate(model='qwen:0.5b', prompt='天空为什么是蓝色的?')
print(content)
</code></pre>
<h2 id="ollama-客户端java-api-应用springboot-应用">Ollama 客户端:Java API 应用(SpringBoot 应用)</h2>
<p>我们也可以把 Ollama 集成到 SpringBoot 应用中,只需要以下简单 3 步即可:</p>
<p><strong>第一步</strong>,在总<code>pom.xml</code>中新增 SpringBoot Starter 依赖:</p>
<pre><code class="language-xml"><dependency>
<groupId>io.springboot.ai</groupId>
<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
</code></pre>
<p><strong>第二步</strong>,在 SpringBoot 配置文件<code>application.properties</code>中增加 Ollama 配置信息:</p>
<pre><code class="language-properties">server.port=8088
spring.application.name=NTopicBootX
spring.ai.ollama.base-url=http://localhost:11434
spring.ai.ollama.chat.options.model=qwen:0.5b
</code></pre>
<p>配置文件指定了 Ollama API 地址和端口,同时指定了默认模型<strong>qwen:0.5b</strong>(注意:模型需要在本地已经存在)</p>
<p><strong>第三步</strong>,使用<code>OllamaChatClient</code>进行文字生成或者对话:</p>
<pre><code class="language-java">import org.springframework.ai.chat.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.ollama.OllamaChatClient;
import org.springframework.ai.ollama.api.OllamaOptions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class OllamaClientController {
@Autowired
@Qualifier("ollamaChatClient")
private OllamaChatClient ollamaChatClient;
/**
* http://localhost:8088/ollama/chat/v1?msg=天空为什么是蓝色的?
*/
@GetMapping("/ollama/chat/v1")
public String ollamaChat(@RequestParam String msg) {
return this.ollamaChatClient.call(msg);
}
/**
* http://localhost:8088/ollama/chat/v2?msg=人为什么要不断的追求卓越?
*/
@GetMapping("/ollama/chat/v2")
public Object ollamaChatV2(@RequestParam String msg) {
Prompt prompt = new Prompt(msg);
ChatResponse chatResponse = ollamaChatClient.call(prompt);
return chatResponse;
}
/**
* http://localhost:8088/ollama/chat/v3?msg=你认为老牛同学的文章如何?
*/
@GetMapping("/ollama/chat/v3")
public Object ollamaChatV3(@RequestParam String msg) {
Prompt prompt = new Prompt(
msg,
OllamaOptions.create()
.withModel("qwen:0.5b")
.withTemperature(0.4F));
ChatResponse chatResponse = ollamaChatClient.call(prompt);
return chatResponse.getResult().getOutput().getContent();
}
}
</code></pre>
<p>以上是 Java 客户端的简单样例,我们可以通过<code>OllamaChatClient</code>访问 Ollama 接口,既可以使用默认大模型,也可以在参数指定模型名称!</p>
<hr>
<p>基于 Qwen2/Lllama3 等大模型,部署团队私有化 RAG 知识库系统的详细教程(Docker+AnythingLLM)</p>
<p>使用 Llama3/Qwen2 等开源大模型,部署团队私有化 Code Copilot 和使用教程</p>
<p>本地部署 GLM-4-9B 清华智谱开源大模型方法和对话效果体验</p>
<p>玩转 AI,笔记本电脑安装属于自己的 Llama 3 8B 大模型和对话客户端</p>
<p>ChatTTS 开源文本转语音模型本地部署、API 使用和搭建 WebUI 界面</p>
<p><img src="https://ntopic.cn/WX-21.png"></p>
</div>
<div id="MySignature" role="contentinfo">
<p>本文作者:<b>奔跑的蜗牛</b>,转载请注明原文链接:https://ntopic.cn</p><br><br>
来源:https://www.cnblogs.com/obullxl/p/18295202/NTopic2024071001
頁:
[1]