使用ollama创建长上下文的LLM

编写 Modelfile

# cat Modelfile
FROM qwen2.5:7b

# set the temperature to 1 [higher is more creative, lower is more coherent]
PARAMETER temperature 0.3
PARAMETER top_p 0.8
PARAMETER repeat_penalty 1.1
PARAMETER top_k 20
PARAMETER num_ctx 131072
PARAMETER repeat_last_n 512

TEMPLATE """{{ if .Messages }}
{{- if or .System .Tools }}<|im_start|>system
{{ .System }}
{{- if .Tools }}

# Tools

You are provided with function signatures within <tools></tools> XML tags:
<tools>{{- range .Tools }}
{"type": "function", "function": {{ .Function }}}{{- end }}
</tools>

For each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:
<tool_call>
{"name": <function-name>, "arguments": <args-json-object>}
</tool_call>
{{- end }}<|im_end|>
{{ end }}
{{- range $i, $_ := .Messages }}
{{- $last := eq (len (slice $.Messages $i)) 1 -}}
{{- if eq .Role "user" }}<|im_start|>user
{{ .Content }}<|im_end|>
{{ else if eq .Role "assistant" }}<|im_start|>assistant
{{ if .Content }}{{ .Content }}
{{- else if .ToolCalls }}<tool_call>
{{ range .ToolCalls }}{"name": "{{ .Function.Name }}", "arguments": {{ .Function.Arguments }}}
{{ end }}</tool_call>
{{- end }}{{ if not $last }}<|im_end|>
{{ end }}
{{- else if eq .Role "tool" }}<|im_start|>user
<tool_response>
{{ .Content }}
</tool_response><|im_end|>
{{ end }}
{{- if and (ne .Role "assistant") $last }}<|im_start|>assistant
{{ end }}
{{- end }}
{{- else }}
{{- if .System }}<|im_start|>system
{{ .System }}<|im_end|>
{{ end }}{{ if .Prompt }}<|im_start|>user
{{ .Prompt }}<|im_end|>
{{ end }}<|im_start|>assistant
{{ end }}{{ .Response }}{{ if .Response }}<|im_end|>{{ end }}"""

# set the system message
SYSTEM """You are data enginner, created by Smart Data. You are a helpful assistant."""

上述模版文件(Modelfile)定义了一个基于 Qwen-2.5 模型的配置,用于设置模型的行为参数以及定义输入输出的格式。下面是对该文件中关键内容的详细解释:

1. 模型来源

FROM qwen2.5:7b

这一行指定了使用的模型基础为 Qwen-2.5,大小为 7 B(即 70 亿参数)。

2. 参数设置

接下来几行定义了模型运行时的一些重要参数:

  • temperature: 控制输出的随机性,值越高,输出越随机;值越低,输出越确定。这里设置为 0.3,意味着输出相对较为确定。
  • top_p: 核采样比例,控制从概率最高的词汇中选择下一个词的概率。设置为 0.8 表示从概率最高的 80%词汇中选择。
  • repeat_penalty: 重复惩罚系数,用于减少重复单词或短语的出现频率。设置为 1.1 意味着对于已经出现过的单词或短语,其再次被选中的概率会被适当降低。
  • top_k: 核采样的另一个形式,直接指定选择下一个词时考虑的最高概率词汇的数量。这里设置为 20。
  • num_ctx: 上下文窗口大小,决定了模型在生成新内容时能记住的历史信息量。设置为 131072(约 128 KB)。
  • repeat_last_n: 设置模型在生成过程中避免重复最后多少个 token。这里设置为 512。

3. 模板定义

模板部分定义了如何根据不同的输入格式化输出。它使用了 Go 语言的模板语法:

  • 系统消息和工具定义

    {{- if or .System .Tools }}
    ...
    {{- end }}
    

    如果存在系统消息或工具定义,则这部分会被包含在内。系统消息通常用于给模型提供背景信息或指示其行为方式。工具定义则允许模型调用外部函数或服务。

  • 消息循环

    {{- range $i, $_ := .Messages }}
    ...
    {{- end }}
    

    遍历所有消息,根据消息的角色(用户、助手或工具)来决定如何格式化输出。

创建自定义模型

原模型上下文是 32 k:

# ollama show qwen2.5:7b
Model
  architecture        qwen2
  parameters          7.6B
  context length      32768
  embedding length    3584
  quantization        Q4_K_M

System
  You are Qwen, created by Alibaba Cloud. You are a helpful assistant.

License
  Apache License
  Version 2.0, January 2004

创建:

# ollama create qwen2.5_7b_128k -f Modelfile
transferring model data
using existing layer sha256:2bada8a7450
using existing layer sha256:832dd9e00a68dd
creating new layer sha256:9bebd78bf5bc92d41d5f
creating new layer sha256:91fa2d221c96837826e2
creating new layer sha256:f3599d242073531df0
creating new layer sha256:7af5a1b7098c58f9
writing manifest
success

可以再次执行 show 命令,可以看到参数部分是我们自定义的:

# ollama show qwen2.5_7b_128k
Parameters
num_ctx           131072
repeat_last_n     512
repeat_penalty    1.1
temperature       0.3
top_k             20
top_p             0.8

一般而言,对于英语文本,1个token大约是3~4个字符;而对于中文文本,则大约是1.5~1.8个汉字。据此估算,所谓支持 20 万字长上下文就是 128 k 的 tokens。

由于 Qwen 模型是因果语言模型,理论上整个序列只有一个长度限制。然而,由于在训练中通常存在打包现象,每个序列可能包含多个独立的文本片段。模型能够生成或完成的长度最终取决于具体的应用场景,以及在这种情况下,预训练时每份文档或后训练时每轮对话的长度。

Qwen2 模型可以处理 32K 或 128K token 长的文本,其中 8K 长度可作为输出。

在这里插入图片描述

代码测试

import ollama

with open('./file-name.md', 'r', encoding='utf-8') as file:
    file_content = file.read()

response = ollama.generate(
    model='qwen2.5_7b_128k',
    prompt=f'文件内容:{file_content},简要回答这个文件讲了什么?然后基于文件内容提取出50个复关键词',
)

print(response['response'])

传入的文章内容为 19 万字,测试结果正常输出。

<think>好的,用户想调整Ollama上下文长度限制或参数配置。首先,我需要回忆一下Ollama的配置方式。根据之前的引用[1],里面提到在设置中可以调整参数,比如Temperature、Max Tokens等,其中Max Tokens需要小于等于模型的上下文窗口。这可能涉及到模型本身的配置或运行时的参数。 然后,用户可能已经知道在Ollama中可以通过命令行参数或者Modelfile来设置参数。引用[1]中的配置路径提到Max Tokens在Settings > LLM下,但Ollama的具体实现可能不同。可能需要检查Ollama的文档,看看是否支持直接通过命令行启动时指定参数,比如--num_ctx来设置上下文长度。 另外,引用[2]提到LoRA微调时调整模型结构中的参数,但用户可能不想微调模型,只是想调整运行时参数。所以应该优先考虑Ollama本身的配置选项,而不是修改模型结构。 用户可能遇到的问题是如何找到正确的参数名称和可接受的范围。例如,某些模型可能有最大上下文限制,比如4096,但有些模型可能支持更大的窗口。需要确认模型是否支持调整上下文长度,否则即使设置了也可能无效。 还可能要考虑生成配置文件,比如Modelfile,使用FROM指令指定基础模型,然后通过PARAMETER设置num_ctx参数。例如: FROM llama2 PARAMETER num_ctx 4096 然后创建模型并运行。这可能需要用户了解如何创建使用Modelfile。 同时,引用[3]提到强制模型以特定方式开始响应,但用户的问题不涉及响应格式,所以这部分可能暂时不需要考虑。 总结步骤:1. 检查Ollama文档确认支持的参数;2. 使用命令行参数或Modelfile设置num_ctx;3. 构建并运行自定义模型;4. 验证上下文长度是否生效。此外,提醒用户注意模型本身的限制,避免设置超出模型支持的数值。</think>### 调整Ollama上下文长度限制的方法 要修改Ollama模型的上下文长度限制(即上下文窗口大小),可以通过以下两种方式实现: --- #### **方法一:通过Modelfile配置** 1. **创建Modelfile** 新建一个`Modelfile`文件,指定基础模型并添加`num_ctx`参数控制上下文长度: ```modelfile FROM llama2 # 基础模型名称 PARAMETER num_ctx 4096 # 设置上下文窗口为4096 tokens ``` - `num_ctx`的取值范围需≤模型支持的上下文窗口大小(例如Llama2默认4096,Qwen-72B支持32k) 2. **构建自定义模型** 执行命令构建新模型: ```bash ollama create my_model -f ./Modelfile ``` 3. **运行模型** ```bash ollama run my_model ``` --- #### **方法二:通过启动命令直接修改** 在运行模型时通过`--options`添加参数: ```bash ollama run llama2 --options num_ctx 8192 ``` --- #### **关键注意事项** 1. **模型限制** 上下文长度不能超过模型架构的原始设计(例如Llama2最大为4096)[^1]。 2. **性能影响** 增大上下文窗口会显著增加显存占用,建议根据硬件调整: - 4096 tokens约需16GB显存 - 8192 tokens约需32GB显存 --- #### **验证配置是否生效** 通过API调用检查配置: ```bash curl http://localhost:11434/api/show -d '{"name": "my_model"}' ``` 输出中应包含: ```json "parameters": { "num_ctx": 4096 } ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1024点线面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值