【AI-Ollama入门】Ollama自定义模型【初尝试】

写在前面 / 链接存档

ollama自定义模型【初尝试】

Ollama 是什么,它与 Llama 有什么关系?

  • Ollama是一个开源的 LLM(大型语言模型)服务工具,用于简化在本地运行大语言模型、降低使用大语言模型的门槛

  • Llama是 Meta 公司开源的备受欢迎的一个通用大语言模型,和其他大模型一样,Llama可以通过Ollama进行管理部署和推理等

  • 总结

    OllamaLlama的关系:

    Llama是大语言模型,

    Ollama是大语言模型(不限于Llama模型)便捷的管理和运维工具

    它们只是名字后面部分恰巧相同而已

Ollama 安装后的常用系统参数设置

安装完成之后,有几个常用的系统环境变量参数建议进行设置:

  1. OLLAMA_MODELS:模型文件存放目录,默认目录为当前用户目录(Windows 目录:C:\Users%username%.ollama\models,MacOS 目录:~/.ollama/models,Linux 目录:/usr/share/ollama/.ollama/models),如果是 Windows 系统建议修改(如:D:\OllamaModels),避免 C 盘空间吃紧
  2. OLLAMA_HOST:Ollama 服务监听的网络地址,默认为127.0.0.1,如果允许其他电脑访问 Ollama(如:局域网中的其他电脑),建议设置0.0.0.0,从而允许其他网络访问
  3. OLLAMA_PORT:Ollama 服务监听的默认端口,默认为11434,如果端口有冲突,可以修改设置成其他端口(如:8080等)
  4. OLLAMA_ORIGINS:HTTP 客户端请求来源,半角逗号分隔列表,若本地使用无严格要求,可以设置成星号,代表不受限制
  5. OLLAMA_KEEP_ALIVE:大模型加载到内存中后的存活时间,默认为5m即 5 分钟(如:纯数字如 300 代表 300 秒,0 代表处理请求响应后立即卸载模型,任何负数则表示一直存活);我们可设置成24h,即模型在内存中保持 24 小时,提高访问速度
  6. OLLAMA_NUM_PARALLEL:请求处理并发数量,默认为1,即单并发串行处理请求,可根据实际情况进行调整
  7. OLLAMA_MAX_QUEUE:请求队列长度,默认值为512,可以根据情况设置,超过队列长度请求被抛弃
  8. OLLAMA_DEBUG:输出 Debug 日志标识,应用研发阶段可以设置成1,即输出详细日志信息,便于排查问题
  9. OLLAMA_MAX_LOADED_MODELS:最多同时加载到内存中模型的数量,默认为1,即只能有 1 个模型在内存中

从Ollama远程仓库下载

  • ollama pull 本地/远程仓库模型名称

从GGUF导入(GGUF是什么??)(这种方式不推荐)

步骤一:创建Modelfile

  • 创建一个名为Modelfile.txt的文件,其中包含要导入的模型的本地文件路径的指令,例如:
1
FROM ./vicuna-33b.Q4_0.gguf

步骤二:在Ollama中创建模型

1
ollama create example -f Modelfile

这样就创建了基于本地vicuna-33b.Q4_0.gguf模型、名为example的自定义模型

步骤三:运行模型

1
ollama run example

然后就可以正常对话了

这个example自定义模型在基座模型的基础上,更精准地根据自定义内容进行回答

启动模型后的对话操作

  1. 若需要输入多行文本,需要用三引号包裹,如:"""这里是多行文本"""
  2. /clear清除对话上下文信息
  3. /bye则退出对话窗口
  4. /set parameter num_ctx 4096可设置窗口大小为 4096 个 Token,也可以通过请求设置,如:curl <http://localhost:11434/api/generate> -d '{ "model": "qwen2:7b", "prompt": "Why is the sky blue?", "options": { "num_ctx": 4096 }}'
  5. /show info可以查看当前模型详情
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> /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

实例操作1:Mario

github仓库地址: modelfile-mario

第一步:拉取基座模型

  • 教程用的llama3.2,所以第一步操作是拉取模型:
1
ollama pull llama3.2
  • 但是项目要求用qwen,所以苯人选择qwen2.5:7b
1
ollama pull qwen2.5

如果之前已经pull了这个model,再次拉取会直接显示success

第二步:创建模型文件Model File

  • 在目录下创建Modelfile.txt

带注释版本

1
2
3
4
5
6
7
8
9
FROM qwen2.5

# set the temperature to 1 [higher is more creative, lower is more coherent]
PARAMETER temperature 1

# set the system message
SYSTEM """
You are Mario from Super Mario Bros. Answer as Mario, the assistant, only.
"""

(中文版解释)

temperature参数:控制模型生成内容的方向,接近1→更有创造力 ;接近0→更保守、符合问题

system message:给模型的Prompt?(

不带注释版本

1
2
3
4
5
FROM qwen2.5
PARAMETER temperature 1
SYSTEM """
You are Mario from Super Mario Bros, acting as an assistant.
"""

第三步:根据Model File自定义模型

1
ollama create mario -f ./Modelfile.txt

第四步:运行自定义模型mario

1
ollama run mario

自定义模型mario运行结果截图

如何更改模型行为

  • 修改Prompt

  • 修改Model file的参数

  • 修改基座模型

  • 修改之后:

    • ollama create NAME -f ./Modelfile
    • ollama run NAME
  • 可以一直修改,直到获得满意的结果

Ollama Model file

Ollama中Model fileの写

Modelfile的格式(Format)

指令描述
FROM(必需)定义需要使用的基础模型
PARAMETER设置Ollama如何运行模型的参数(例如temperature)
TEMPLATE要发送到模型的完整提示模板
SYSTEM指定将在模板中设置的系统消息
ADAPTER定义要应用于模板的(Q)LoRA适配器
LICENSE指定合法许可证
MESSAGE指定消息历史记录

例子:Mario

创建 mario Modelfile蓝图的示例

1
2
3
4
5
6
7
8
9
10
FROM llama3.2

# sets the temperature to 1 [higher is more creative, lower is more coherent]
PARAMETER temperature 1

# sets the context window size to 4096, this controls how many tokens the LLM can use as context to generate the next token
PARAMETER num_ctx 4096

# sets a custom system message to specify the behavior of the chat assistant
SYSTEM You are Mario from super mario bros, acting as an assistant.

查看给定模型的 Modelfile

  • 使用命令ollama show --modelfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
> ollama show --modelfile llama3.2

# Modelfile generated by "ollama show"
# To build a new Modelfile based on this one, replace the FROM line with:
# FROM llama3.2:latest
FROM /Users/pdevine/.ollama/models/blobs/sha256-00e1317cbf74d901080d7100f57580ba8dd8de57203072dc6f668324ba545f29
TEMPLATE """{{ if .System }}<|start_header_id|>system<|end_header_id|>

{{ .System }}<|eot_id|>{{ end }}{{ if .Prompt }}<|start_header_id|>user<|end_header_id|>

{{ .Prompt }}<|eot_id|>{{ end }}<|start_header_id|>assistant<|end_header_id|>

{{ .Response }}<|eot_id|>"""
PARAMETER stop "<|start_header_id|>"
PARAMETER stop "<|end_header_id|>"
PARAMETER stop "<|eot_id|>"
PARAMETER stop "<|reserved_special_token"
  • 代码解释版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
FROM /Users/pdevine/.ollama/models/blobs/sha256-00e1317cbf74d901080d7100f57580ba8dd8de57203072dc6f668324ba545f29    # 指定了基础镜像的路径(这个例子中,基础镜像是从本地路径下的一个特定的哈希值标识的文件中加载的,这个哈希值唯一地标识了基础模型的版本
# (通义的扩展:类似于Dockerfile中的FROM指令,用于指定基础镜像)


# 定义模型输入和输出的模板(模板使用了Go语言的模板语法)
TEMPLATE """{{ if .System }}<|start_header_id|>system<|end_header_id|>
# {{ if .System }}...{{ end }}:如果存在系统消息(.System),则会生成相应的格式

# <|start_header_id|> 和 <|end_header_id|>:这些是特殊的标记符,用于标识不同部分的开始和结束


# <|eot_id|>:这是结束标记符,表示一个部分的结束
{{ .System }}<|eot_id|>{{ end }}{{ if .Prompt }}<|start_header_id|>user<|end_header_id|> # {{ .Prompt }}:用户输入的提示

{{ .Prompt }}<|eot_id|>{{ end }}<|start_header_id|>assistant<|end_header_id|>

# {{ .Response }}:模型生成的响应
{{ .Response }}<|eot_id|>"""

# PARAMETER 行
# 这些行定义了模型生成过程中需要停止生成的特殊标记符。当模型生成的文本中遇到这些标记符之一时,生成过程会停止
PARAMETER stop "<|start_header_id|>"
PARAMETER stop "<|end_header_id|>"
PARAMETER stop "<|eot_id|>"
PARAMETER stop "<|reserved_special_token>"
  1. 基础镜像

    指定了模型的基础镜像路径

  2. 模板

    定义了模型输入和输出的格式,包括系统消息、用户提示和模型响应的格式

  3. 停止标记

    定义了生成过程中需要停止生成的特殊标记符,以防止生成不必要的文本

Modelfile的提示(Instructions)

FROM(Required)

定义创建模型时要使用的基本模型

1
FROM <model name>:<tag>
从现有模型构建
1
FROM llama3.2

可用基本型号列表:https://github.com/ollama/ollama#model-library

其他型号可在以下位置找到:https://ollama.com/library

从 Safetensors 模型构建(不推荐、不常用)
1
FROM <model directory>

model 目录应包含受支持架构的 Safetensors 权重

  • 当前支持的模型架构:
    • Llama (including Llama 2, Llama 3, and Llama 3.1)
    • Mistral (including Mistral 1, Mistral 2, and Mixtral)
    • Gemma (including Gemma 1 and Gemma 2)
    • PHI3
Build from a GGUF file(不推荐、不常用)
1
FROM ./ollama-model.gguf

GGUF 文件位置应指定为绝对路径或相对于该位置

Modelfile的参数(PARAMETER)

1
PARAMETER <parameter> <parametervalue>

有效参数和值

参数描述值类型示例用法
mirostat启用 Mirostat 采样以控制困惑度。(默认值:0、0 = 禁用、1 = Mirostat、2 = Mirostat 2.0)intmirostat 0
mirostat_eta影响算法响应生成文本的反馈的速度。较低的学习率将导致较慢的调整,而较高的学习率将使算法的响应速度更快。(默认值:0.1)floatmirostat_eta 0.1
mirostat_tau控制输出的连贯性和多样性之间的平衡。较低的值将导致文本更集中、更连贯。(默认值:5.0)floatmirostat_tau 5.0
num_ctx设置用于生成下一个标记的上下文窗口的大小。(默认值:2048)intnum_ctx 4096
repeat_last_n设置模型回溯多长时间以防止重复。(默认值:64,0 = 禁用,-1 = num_ctx)intrepeat_last_n 64
repeat_penalty设置对重复项的惩罚强度。较高的值(例如 1.5)将更强烈地惩罚重复,而较低的值(例如 0.9)将更宽松。(默认值:1.1)floatrepeat_penalty 1.1
temperature模型的温度。提高温度会使模型更有创意地回答。(默认值:0.8)floattemperature 0.7
seed设置用于生成的随机数种子。将此设置为特定数字将使模型为同一提示生成相同的文本。(默认值:0)intseed 42
stop设置要使用的停止序列。遇到此模式时,LLM 将停止生成文本并返回。可以通过在模型文件中指定多个单独的参数来设置多个停止模式stringstop “AI assistant:”
tfs_z无尾采样用于减少输出中可能性较小的标记的影响。较高的值(例如 2.0)将减少更多影响,而值 1.0 将禁用此设置。(默认值:1)floattfs_z 1
num_predict生成文本时要预测的最大token数。(默认值:128,-1 = 无限生成,-2 = 填充上下文)intnum_predict 42
top_k降低产生无意义的可能性。较高的值(例如 100)将给出更多样化的答案,而较低的值(例如 10)将更保守。(默认值:40)inttop_k 40
top_p与 top-k 一起使用。较高的值(例如 0.95)将导致文本更加多样化,而较低的值(例如 0.5)将生成更集中和保守的文本。(默认值:0.9)floattop_p 0.9
min_p替代top_p,旨在确保质量和多样性的平衡。参数 p 表示相对于最可能标记的概率,考虑标记的最小概率。例如,当 p=0.05 且最可能的标记的概率为 0.9 时,将筛选掉值小于 0.045 的 logit。(默认值:0.0)floatmin_p 0.05

Modelfile的模板(Template)

  • 完整提示模板可能包括:
    • (可选)系统消息
    • 用户消息
    • 来自模型的响应
  • 注意:语法可能特定于模型
  • 模板使用 Go 模板语法

模板变量

变量描述
{ { .System } }用于指定自定义行为的系统消息
{ { .Prompt } }用户提示消息
{ { .Response } }来自模型的响应。生成响应时,将省略此变量后的文本
1
2
3
4
5
6
TEMPLATE """{{ if .System }}<|im_start|>system
{{ .System }}<|im_end|>
{{ end }}{{ if .Prompt }}<|im_start|>user
{{ .Prompt }}<|im_end|>
{{ end }}<|im_start|>assistant
"""

SYSTEM

  • 该指令指定要在模板中使用的系统消息
1
SYSTEM """<system message>"""

ADAPTER

  • ADAPTER说明指定了应应用于基本模型的微调 LoRA适配器
  • 适配器的值应该是绝对路径或相对于 Modelfile的路径
  • 基本模型应通过FROM说明指定。
  • 如果基本模型与调整适配器的基本模型不同,则行为将不稳定

Safetensor adapter适配器

1
ADAPTER <path to safetensor adapter>
  • 当前支持的Safetensor适配器:
    • Llama (including Llama 2, Llama 3, and Llama 3.1)
    • Mistral (including Mistral 1, Mistral 2, and Mixtral)
    • Gemma (including Gemma 1 and Gemma 2)

GGUF adapter适配器

1
ADAPTER ./ollama-lora.gguf

LICENSE / 许可证

  • 指定共享或分发与此 Modelfile 一起使用的模型的合法许可
1
2
3
LICENSE """
<license text>
"""

MESSAGE

  • 该指令允许您为模型指定响应时使用的消息历史记录
  • 使用 MESSAGE命令的多次迭代来构建对话,这将指导模型以类似的方式回答
1
MESSAGE <role> <message>

Valid roles

有效角色

RoleDescription
system为模型提供 SYSTEM 消息的另一种方法
user用户可能询问的内容的示例消息
assistant模型应如何响应的示例消息

Example conversation

1
2
3
4
5
6
MESSAGE user Is Toronto in Canada?
MESSAGE assistant yes
MESSAGE user Is Sacramento in Canada?
MESSAGE assistant no
MESSAGE user Is Ontario in Canada?
MESSAGE assistant yes

Notes

  • Modelfile 不区分大小写。在示例中,使用大写指令来更容易将其与参数区分开来。
  • 说明可以按任何顺序排列。在示例中,FROM指令首先是为了使其易于阅读

CLI参考(命令行操作参考)

创建模型

1
ollama create mymodel -f ./Modelfile

拉取模型

1
ollama pull llama3.2

此命令还可用于更新本地模型。只会拉取 diff

删除模型

1
ollama rm llama3.2

复制模型

1
ollama cp llama3.2 my-model

多行输入

1
2
3
4
>>> """Hello,
... world!
... """
I'm a basic program that prints the famous "Hello, world!" message to the console.

多模态模型

1
2
ollama run llava "What's in this image? /Users/jmorgan/Desktop/smile.png"
The image features a yellow smiley face, which is likely the central focus of the picture.

将Prompt作为参数传递

1
2
$ ollama run llama3.2 "Summarize this file: $(cat README.md)"
Ollama is a lightweight, extensible framework for building and running language models on the local machine. It provides a simple API for creating, running, and managing models, as well as a library of pre-built models that can be easily used in a variety of applications.

显示模型信息

1
ollama show llama3.2

列出计算机上的已有模型列表

1
ollama list

列出当前加载的模型

1
ollama ps

停止当前正在运行的模型

1
ollama stop llama3.2

启动Ollama

1
ollama serve

Building / 搭建

运行本地构建

  • 启动本地服务器
1
./ollama serve
  • 然后在单独的shell中运行一个模型
1
./ollama run llama3.2

REST API

Ollama 有一个用于运行和管理模型的 REST API

生成回答

1
2
3
4
curl http://localhost:11434/api/generate -d '{
"model": "llama3.2",
"prompt":"Why is the sky blue?"
}'

和模型对话

1
2
3
4
5
6
curl http://localhost:11434/api/chat -d '{
"model": "llama3.2",
"messages": [
{ "role": "user", "content": "why is the sky blue?" }
]
}'

基于WebUI部署Ollama可视化对话界面

这个要搞一下

  1. 下载并安装 Node.js 工具:https://nodejs.org/zh-cn
  2. 下载ollama-webui工程代码:git clone https://github.com/ollama-webui/ollama-webui-lite ollama-webui
  3. 切换ollama-webui代码的目录:cd ollama-webui
  4. 设置 Node.js 工具包镜像源(下载提速):npm config set registry http://mirrors.cloud.tencent.com/npm/
  5. 安装 Node.js 依赖的工具包:npm install
  6. 最后,启动 Web 可视化界面:npm run dev

Ollama 客户端:HTTP 访问服务

  • Ollama 默认提供了generatechat这 2 个原始的 API 接口

generate接口的使用样例

要求模型生成内容

1
2
3
4
curl http://localhost:11434/api/generate -d "{
'model': 'qwen:0.5b',
'prompt': '为什么天空是蓝色的?'
}"

chat接口使用样例

与模型进行对话

1
2
3
4
5
6
curl http://localhost:11434/api/chat -d '{
"model": "qwen:7b",
"messages": [
{ "role": "user", "content": "为什么天空是蓝色的?" }
]
}'

Ollama 客户端:Python API 应用

第一步:安装Python依赖包

1
pip install ollama

第二步:使用Ollama接口,stream=True代表按照流式输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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)

Ollama 客户端:Java API 应用(SpringBoot 应用)

第一步:新增SpringBoot Starter 依赖

在总pom.xml中新增 SpringBoot Starter 依赖

1
2
3
4
5
<dependency>
<groupId>io.springboot.ai</groupId>
<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>

第二步:在SpringBoot配置文件中添加Ollama配置信息

在 SpringBoot 配置文件application.properties中增加 Ollama 配置信息

1
2
3
4
server.port=8088
spring.application.name=NTopicBootX
spring.ai.ollama.base-url=http://localhost:11434
spring.ai.ollama.chat.options.model=qwen:0.5b
  • 配置文件指定了 Ollama API 地址和端口,同时指定了默认模型qwen:0.5b(注意:模型需要在本地已经存在)

第三步:进行文字生成或对话

使用OllamaChatClient进行文字生成或者对话

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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();
}
}
  • 可以通过OllamaChatClient访问 Ollama 接口,既可以使用默认大模型,也可以在参数指定模型名称

完整API另附文

  • Copyrights © 2024-2025 brocademaple
  • 访问人数: | 浏览次数:

      请我喝杯咖啡吧~

      支付宝
      微信