Ollama 微调模型以及创建模型文件(Modelfile)
一、什么是ollama mainfest文件?
Ollama mainfest是一个配置文件,包含你已安装的 AI 模型的元数据、依赖关系和运行时的管理设置。
可以把它看作是一个配方,告诉 Ollama 运行环境某个模型所有需要的内容,以便正确执行某个特定模型。
当你用pull 类似的命令拉取模型时,Ollama 首先会获取这个 manifest文件。
mainfest 通常以YAML格式编写,详细说明构成模型的各个组件或“层”,
如模型权重、许可文件和参数配置。ollama pull llama3
这些层作为独立文件存储,通常称为“blobs”,存储在独立目录中。
本机为:
blobs:
C:\Users\king\.ollama\models\blobs
mainfest文件位置
C:\Users\king\.ollama\models\manifests\registry.ollama.ai\library
mainfest 文件本身不包含庞大的模型权重,而是通过安全哈希(SHA256摘要)指向这些blob。
这种分层的方法受Docker等容器技术启发,效率极高。它允许不同型号共享common layers(共用层),节省大量磁盘空间,
加快使用现有组件的新模型下载过程。每个模型标签(例如,llama3:8b, llama3:latest)都有自己的mainfest文件,
列出该版本所需的具体layers。
为什么mainfest是重要的?
Ollama manifest 的重要性在于其在模型管理、定制和可重复性中的核心作用。它作为Ollama的权威指南,确保模型每次运行一致且正确。
通过定义从基础模型到具体参数和提示模板的一切,manifest保证了你的 AI 环境是可预测且可靠的。
对于开发者和高级用户来说,清单解锁了更深层次的控制权。通过理解其结构,你可以自定义模型参数,调整CPU和内存等资源限制,
甚至定义环境变量,以针对特定任务调整模型行为。这对于微调模型或将其集成到复杂、可扩展的技术解决方案中尤其有用。
此外,mainfest系统对于排查问题至关重要。当出现错误时,mainefst通常是寻找线索的第一步,无论是语法错误、缺失的层,还是版本冲突。
掌握显现系统让你能够超越基础指令,真正利用Ollama发挥本地AI的全部潜力。
怎么寻找mainfest文件?
Ollama 存储他们是在一个隐藏的.ollama 目录,
当前我的Windows是
C:\Users\<YourUsername>\.ollama\models\manifests
Linux
/usr/share/ollama/.ollama/models/manifests
查找命令在windows power shell 执行
Get-ChildItem -Path $env:USERPROFILE -Filter "manifests" -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.FullName -like '*\.ollama*' }
二、模型文件(model file)
下面的内容很多来自 https://ollama.cadn.net.cn/modelfile.html 官方,但是官方讲解并不直观
1、查看某个模型的model file
执行下面的命令,可以查看llama3:latest模型的 modefile
PS D:\ollama源码-go> ollama show --modelfile llama3:latest # Modelfile generated by "ollama show" # To build a new Modelfile based on this, replace FROM with: # FROM llama3:latest FROM C:\Users\king\.ollama\models\blobs\sha256-6a0746a1ec1aef3e7ec53868f220ff6e389f6f8ef87a01d77c96807de94ca2aa 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 num_keep 24 PARAMETER stop <|start_header_id|> PARAMETER stop <|end_header_id|> PARAMETER stop <|eot_id|>
#其他部分删除掉,都是些许可文件信息
2、创建模型文件语法
1.一个模型文件类似下面这样 FROM llama3:latest # 设置 temperature 到1 [higher is more creative, lower is more coherent] PARAMETER temperature 1 # 设置上下文窗口 =4096, 可以一次产生多少个内容 PARAMETER num_ctx 4096 # 设置一个系统消息 SYSTEM You are Mario from super mario bros, acting as an assistant. 2.使用 2.1 把上面部分另存为文件 .Modelfile 2.2 在命令行下执行 ollama create -f ./Modelfile 3.3 在命令行下执行 ollama run llama3:latest
3、指令讲解
(一)指定模型有三种方法,都是利用FROM指令
1.语法:FROM <model name>:<tag>
例如: 从现有模型构建
FROM llama3.2:latest
2.从 Safetensors 模型构建
FROM <model directory>
#model directory 为模型目录
#例如:
#model 目录应包含受支持架构的 Safetensors 权重
3.从 GGUF 文件构建
FROM ./ollama-model.gguf
#GGUF 文件位置应指定为绝对路径或相对于Modelfile 位置。
(二)、PARAMETER指令 来定义模型参数,可以是多个 有效参数和值
例如:
PARAMETER num_ctx 4096 (是一对key:value)
PARAMETER temperature 1
| 参数 | 描述 | 值类型 | 示例用法 |
|---|---|---|---|
| mirostat | 启用 Mirostat 采样以控制困惑度。(默认值:0、0 = 禁用、1 = Mirostat、2 = Mirostat 2.0) | int | Mirostat 0 系列 |
| mirostat_eta | 影响算法响应生成文本的反馈的速度。较低的学习率将导致较慢的调整,而较高的学习率将使算法的响应速度更快。(默认值:0.1) | 浮 | mirostat_eta 0.1 |
| mirostat_tau | 控制输出的连贯性和多样性之间的平衡。较低的值将导致文本更集中、更连贯。(默认值:5.0) | 浮 | mirostat_tau 5.0 |
| num_ctx |
设置用于上下文窗口的大小(长度)。(默认值:2048) 这个参数和token直接相关 |
int | num_ctx 4096 |
| repeat_last_n | 设置模型回溯多长时间以防止重复。(默认值:64,0 = 禁用,-1 = num_ctx) | int | repeat_last_n 64 |
| repeat_penalty | 设置对重复项的惩罚强度。较高的值(例如 1.5)将更强烈地惩罚重复,而较低的值(例如 0.9)将更宽松。(默认值:1.1) | 浮 | repeat_penalty 1.1 |
| temperature |
模型的temperature。提高temperature将使模型更有创意地回答。(默认值:0.8)
1)对于 对于数据分析、技术文档或事实查询,请使用低温设置,即0.1-0.3之间 2)创意写作与头脑风暴(温度:0.8-1.2 ) 3) 平衡的一般对话(温度:0.6-0.8) 大多数对话式AI应用在适中的温度设置下工作效果最佳。 |
浮 | 温度 0.7 |
| seed | 设置用于生成的随机数种子。将此设置为特定数字将使模型为同一提示生成相同的文本。(默认值:0) | int | 种子 42 |
| stop | 设置要使用的停止序列。遇到此模式时,LLM 将停止生成文本并返回。可以通过指定多个单独的stop参数。 |
字符串 | 停止 “AI 助手:” |
| num_predict | 生成文本时要预测的最大令牌数。(默认值:-1,无限生成) | int | num_predict 42 |
| top_k | 降低产生无意义的可能性。较高的值(例如 100)将给出更多样化的答案,而较低的值(例如 10)将更保守。(默认值:40) | int | top_k 40 |
| top_p | 与 top-k 一起使用。较高的值(例如 0.95)将导致文本更加多样化,而较低的值(例如 0.5)将生成更集中和保守的文本。(默认值:0.9) | 浮 | top_p 0.9 |
| min_p | 替代top_p,旨在确保质量和多样性的平衡。参数 p 表示相对于最可能标记的概率,考虑标记的最小概率。例如,当 p=0.05 且最可能的标记的概率为 0.9 时,将筛选掉值小于 0.045 的 logit。(默认值:0.0) | 浮 | min_p 0.05 |
4.其他影响模型的办法
(一)、我们在测试模型时候,可以临时微调设置参数调整
curl localhost:11434/api/generate -d '{"model":"llama3:latest","options":{"temperature":0.7},"prompt":"Why is the sky?"}
(二) 在ollama启动的时候,在命令行交互的时候进行干预
# 启动lla模型微调参数配置如下,包括top-p、top-k、num-predict 等 ollama run llama3:latest --temperature 0.7 \ --top-p 0.9 \ --top-k 40 \ --repeat-penalty 1.1 \ --num-predict 256
5.我们从另外角度看下
从网上看,大家说的很粗糙,也经不过考验,问题很随意,导致很多问题真成了问题。
理解几个概念,在大模型中,Token 是理解大数据模型文本的最小处理单位。大模型(如 GPT、Claude、LLaMA)并不是直接理解“文字”或“句子”,而是将文本切分成一个个 Token,再进行处理。例如,句子“我喜欢猫”可能被拆分为“我”、“喜欢”、“猫”这几个 Token。通常情况下,一个中文词语或一个英文单词计为一个 Token,而一个英文字符大约等于 0.3 个 Token。所以一个token可以是一个单词,也可以是一个单词的一部分,甚至是单个字符或标点符号。每个大数据模型对token的使用和处理方式都不一样。
Token 的作用是将人类能理解的文字转换为模型可以处理的数字形式。
131,072 tokens ≈ 100K–130K words. 下面128k token代表的对应语言的k数
Spanish 73k
Portugues 72k
German 69k
Italian 69k
French 66k
Mandarin 54k
Cantonese 46k
Japanese 45k
Korean 41k
这意味着我们用西班牙语 128k token表达的内容,大约需要73k的英语单词
查看参数
PS D:\ollama源码-go> ollama list NAME ID SIZE MODIFIED mymodel:latest b00fc97c00a3 1.9 GB 3 hours ago qwen3-vl:2b 0635d9d857d4 1.9 GB 3 hours ago gemma3:latest a2af6cc3eb7f 3.3 GB 4 hours ago llama3:latest 365c0bd3c000 4.7 GB 11 hours ago deepseek-r1:8b 6995872bfe4c 5.2 GB 24 hours ago gemma3:4b a2af6cc3eb7f 3.3 GB 3 weeks ago
我们以llama3:latest为例
PS D:\ollama源码-go> ollama show llama3:latest Model architecture llama parameters 8.0B (80亿个参数,B代表亿) context length 8192 (context length/1024=8k Token数量,这个是容易产生比较大误区的地方,这里是表示的是模型最大能支持的上下文窗口大小,而不是当前使用的长度)
具体含义为模型在生成响应时,可以考虑的最大token数量,影响比较大的就是更大的上下文窗口大小,需要更多的内存支持,且可能会减慢处理速度,但是
如果你想设置更多,最大能达到8192,这个token数量,类似缓存或记忆体的数量,表示我只能记住这些,因为每次对话,你都会输入很
多内容,token要根据英文、中文以及其他语言等计算每次会话的token产生数量,不同模型context length是不一样的。
embedding length 4096 每个token或者单词代表4096个向量维度,这个长度是不可以更改的,是模型的基本特性
quantization Q4_0
Capabilities completion Parameters num_keep 24 stop "<|start_header_id|>" stop "<|end_header_id|>" stop "<|eot_id|>" License META LLAMA 3 COMMUNITY LICENSE AGREEMENT Meta Llama 3 Version Release Date: April 18, 2024 ...
6. 如何判断我的模型是否加载了正确的上下文大小( 即利用ollama ps 命令)
用qwen做实例,接着上面实验讲解
PS D:\pypi-server> ollama list NAME ID SIZE MODIFIED mymodel:latest b00fc97c00a3 1.9 GB 4 hours ago qwen3-vl:2b 0635d9d857d4 1.9 GB 4 hours ago gemma3:latest a2af6cc3eb7f 3.3 GB 4 hours ago llama3:latest 365c0bd3c000 4.7 GB 12 hours ago deepseek-r1:8b 6995872bfe4c 5.2 GB 25 hours ago gemma3:4b a2af6cc3eb7f 3.3 GB 3 weeks ago
当前模型允许的最大上下文窗口长度
PS D:\pypi-server> ollama show qwen3-vl:2b Model architecture qwen3vl parameters 2.1B context length 262144 (当前模型允许的最大上下文窗口长度 262144/1024=256k token数量) embedding length 2048 quantization Q4_K_M Capabilities completion vision tools thinking Parameters top_k 20 top_p 0.95 temperature 1 License Apache License Version 2.0, January 2004 ...
想查看ollama当前正在使用的上下文长度(当前加载的模型及其实际上下文长度),请先运行模型,注意
1.第一步 PS D:\ollama源码-go> ollama run qwen3-vl:2b >>> 韩国哪里最好玩 .... 运行中.... 2.马上打开另一个cmd窗口(注意: 如果你不输入内容,让qwen跑着,你ollama ps 是看不到内容的) PS D:\pypi-server> ollama ps NAME ID SIZE PROCESSOR CONTEXT UNTIL qwen3-vl:2b 0635d9d857d4 7.1 GB 100% CPU 4096 4 minutes from now
红色的部分 "CONTEXT" 列显示运行模型实际使用的上下文长度。
我们看下PROCESSOR列,目前是100% CPU ,代表?
“100% GPU”意味着模型完全加载到GPU里
“100% CPU”意味着模型完全加载在系统内存中
“48%/52% CPU/GPU”表示模型部分加载在两者上
7、有下面几种方式来修改 上下文窗口大小
(方法一)。更改是临时的,一旦退出,设置失效
1. 运行模型 PS D:\ollama源码-go> ollama run qwen3-vl:2b >>> /set parameter num_ctx 2048 Set parameter 'num_ctx' to '2048' >>> 韩国哪里好玩 ..... 开始运行...... PS D:\pypi-server> ollama ps NAME ID SIZE PROCESSOR CONTEXT UNTIL qwen3-vl:2b 0635d9d857d4 6.8 GB 100% CPU 2048 4 minutes from now 之前请看上一个实验,他的数值是4096,现在设置后变成了2048 模型允许的上下文窗口最大长度是256k
现在VRAM减少到了6.8g ,因为我减少了 2k大约会减少7.1g-0.3g=6.8g,

我们继续测试下,把num_ctx 提高到10240 ,即提升(10240-4096)/1024=6k,2k大约是0.3g会浮动,6k大约是0.9,(我是对标的第一次7.1g)
>>> /set parameter num_ctx 10240
>>> 1+1=?
PS D:\pypi-server> ollama ps
NAME ID SIZE PROCESSOR CONTEXT UNTIL
qwen3-vl:2b 0635d9d857d4 7.8 GB 100% CPU 10240 4 minutes from now

(方法二)。更改是临时的,一旦模型从内存中卸载就恢复到原来的设置
curl http://localhost:11434/api/generate -d '{
"model": "llama3.2",
"prompt": "Why is the sky blue?",
"options": {
"num_ctx": 8192
}
}'
8.永久性修改模型参数设置
要对上下文窗口大小做永久性更改,你需要创建一个新的自定义模型,并设置你想要的配置。这样每次运行模型时,它都能使用较长的上下文长度,而无需每次手动设置 /set parameter num_ctx 1.创建一个新的简单模型文件 在任何可以运行终端命令的目录里创建一个新的Modfile。你可以给它起不同的名字以避免混淆,比如 Modelfile.custom 2.在这个新文件中,你只需要两行: FROM qwen3-v1:2b #这告诉 Ollama 以你现有的 qwen3-v1:2b 模型作为起点。 PARAMETER num_ctx <value> #在这里设定新的上下文窗口长度。
6.我们看一个例子
options里面的key-value即模型的微调参数
curl http://localhost:11434/api/generate -d '{ "model": "llama3", "prompt": "Why is the sky blue?", "stream": false, "options": { "num_keep": 5, "seed": 42, "num_predict": 100, "top_k": 20, "top_p": 0.9, "min_p": 0.0, "tfs_z": 0.5, "typical_p": 0.7, "repeat_last_n": 33, "temperature": 0.8, "repeat_penalty": 1.2, "presence_penalty": 1.5, "frequency_penalty": 1.0, "mirostat": 1, "mirostat_tau": 0.8, "mirostat_eta": 0.6, "penalize_newline": true, "stop": ["\n", "user:"], "numa": false, "num_ctx": 1024, "num_batch": 2, "num_gpu": 1, "main_gpu": 0, "low_vram": false, "f16_kv": true, "vocab_only": false, "use_mmap": true, "use_mlock": false, "num_thread": 8 } }'
7.ollama 环境变量设置
PowerShell method [Environment]::SetEnvironmentVariable("OLLAMA_NUM_PARALLEL", "4", "User") [Environment]::SetEnvironmentVariable("OLLAMA_HOST", "0.0.0.0", "User")
常见问题
-
我如何在 Ollama 中检查该模型支持的最大上下文长度(context length)?
运行ollama show ,找“context length”字段。输出中的上下文长度值告诉你该模型在单次会话中能处理的最大token数。
PS D:\pypi-server> ollama show qwen3-vl:2b Model architecture qwen3vl parameters 2.1B context length 262144 embedding length 2048
-
我如何查看当前上下文长度在运行中的Ollama会话中被使用的大小?
使用 ollama ps,查看在被加载且运行中的模型context length。CONTEXT列显示当前会话的实际使用的上下文长度,可能小于该模型本身支持的最大上下文窗口长度。这只适用于模型已经在内存中运行的情况。(如果你的机器处理能力弱或内存小,则最好是提出一个问题后,马上进入另一个cmd窗口,查看ollama ps )
-
我怎样才能在Ollama中增加上下文窗口大小?
1)启动或运行模型时设置num_ctx参数。你可以通过如
PS D:\ollama源码-go> ollama run qwen3-vl:2b >>> /set parameter num_ctx在命令行 中添加 /set parameter num_ctx、将 OLLAMA_CONTEXT_LENGTH 设为环境变量、
2)或在 Ollama 图形界面中调整context length,
3)或者在 API 调用中传递“options”: {“num_ctx”: xxx} 来实现。 -
我如何在 Ollama 中让自定义 context length 保持持久化(永久生效)?
保存为新模型或在 Modelfile 中定义(Modefile名称可以是任意)。 使用 /set 参数 num_ctx 的会话更改是暂时的。要永久生效,要么在设置参数后运行 /save my-custom-model,要么创建带有 PARAMETER num_ctx 的 Modelfile 文件,并用 ollama create 构建。
-
在Ollama中,context length和embedding length有什么区别?
context length是模型能考虑多少标记,embedding length是token向量的大小。context length可调节至模型的最大值,影响记忆之前对话的多少。embedding length由架构固定,决定了token表示的维度。
参考:
https://markaicode.com/ollama-temperature-parameter-tuning-guide/
https://localllm.in/blog/local-llm-increase-context-length-ollama
https://markaicode.com/ollama-environment-variables-configuration-guide/
https://github.com/ollama/ollama/blob/main/envconfig/config.go (ollama 有哪些环境变量可以在这里查看)
https://notes.kodekloud.com/docs/Running-Local-LLMs-With-Ollama/Getting-Started-With-Ollama/Models-and-Model-Parameters
https://www.bolddata.org/blog/how-many-words-128k-tokens
https://thedeveloperstory.com/2024/08/04/genai-101-what-are-tokens-context-length-in-large-language-models-llms/
https://blog.csdn.net/m0_70486148/article/details/155352666
https://dev.to/odyash/tokens-vs-chunks-3p5d
网上不是很严谨的回答
https://zhuanlan.zhihu.com/p/719200177
中等文章
https://www.cnblogs.com/tangwc/p/18822984

浙公网安备 33010602011771号