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)

  • 0.0-0.3:确定性、事实性回应
  • 0.4-0.7:创造力与准确性平衡
  • 0.8-1.5:创意、多样化的输出
  • 1.6-2.0:高度随机、实验性

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,

image

 

我们继续测试下,把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


image

 

(方法二)。更改是临时的,一旦模型从内存中卸载就恢复到原来的设置
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")

 

     常见问题

  1. 我如何在 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
  2. 我如何查看当前上下文长度在运行中的Ollama会话中被使用的大小?

    使用 ollama ps,查看在被加载且运行中的模型context length。CONTEXT列显示当前会话的实际使用的上下文长度,可能小于该模型本身支持的最大上下文窗口长度。这只适用于模型已经在内存中运行的情况。(如果你的机器处理能力弱或内存小,则最好是提出一个问题后,马上进入另一个cmd窗口,查看ollama ps )

  3. 我怎样才能在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}  来实现。

  4. 我如何在 Ollama 中让自定义 context length 保持持久化(永久生效)?

      保存为新模型或在 Modelfile 中定义(Modefile名称可以是任意)。 使用 /set 参数 num_ctx 的会话更改是暂时的。要永久生效,要么在设置参数后运行 /save my-custom-model,要么创建带有 PARAMETER num_ctx 的 Modelfile 文件,并用 ollama create 构建。

  5. 在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
     

posted @ 2025-12-01 20:19  jinzi  阅读(3)  评论(0)    收藏  举报