Ollama(3)模型迁移和API使用
目录
1. Ollama模型迁移
1.1 ollama模型文件models目录
1.2 blobs 文件夹
1.3 manifests 文件夹
1.4 迁移步骤
2. Ollama服务REST API
2.1 /api/generate 接口
2.1.1 请求参数
2.1.2 response 参数
1. Ollama模型迁移
上一章节我们详细介绍了ollama中模型环境变量,其中涉及到模型位置存储的配置。
Ollama(2)安装配置GPU运行-CSDN博客文章浏览阅读398次,点赞7次,收藏8次。Ollama是在Github上的一个开源项目,其项目定位是:一个本地运行大模型的集成框架,目前主要针对主流的LLaMA架构的开源大模型设计,通过将模型权重、配置文件和必要数据封装进由Modelfile定义的包中,从而实现大模型的下载、启动和本地运行的自动化部署及推理流程。此外,Ollama内置了一系列针对大模型运行和推理的优化策略,目前作为一个非常热门的大模型托管平台,基本主流的大模型应用开发框架如LangChain、AutoGen、Microsoft GraphRAG及热门项目AnythingLLM、Ophttps://blog.csdn.net/yilvqingtai/article/details/149564191
那么如何把原来Ollama下载的模型迁移到新的位置
1.1 ollama模型文件models目录
Ollama的blobs
和manifests
文件夹是模型存储的核心组件,分别用于存放二进制文件和模型元数据。
(base) root@xxx:/home/ollama# tree
.
└── models├── blobs│ ├── sha256-31df23ea7daa448f9ccdbbcecce6c14689c8552222b80defd3830707c0139d4f│ ├── sha256-369ca498f347f710d068cbb38bf0b8692dd3fa30f30ca2ff755e211c94768150│ ├── sha256-4cd576d9aa16961244012223abf01445567b061f1814b57dfef699e4cf8df339│ ├── sha256-5e9a45d7d8b98eb61a65815d36008bfef6fd6ebad6f0be432fb61d83b70550f8│ ├── sha256-6e4c38e1172f42fdbff13edf9a7a017679fb82b0fde415a3e8b3c31c6ed4a4e4│ ├── sha256-970aa74c0a90ef7482477cf803618e776e173c007bf957f635f1015bfcfef0e6│ ├── sha256-a85fe2a2e58e2426116d3686dfdc1a6ea58640c1e684069976aa730be6c1fa01│ ├── sha256-aabd4debf0c8f08881923f2c25fc0fdeed24435271c2b3e92c4af36704040dbc│ ├── sha256-c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4│ ├── sha256-ce4a164fc04605703b485251fe9f1a181688ba0eb6badb80cc6335c0de17ca0d│ └── sha256-f4d24e9138dd4603380add165d2b0d970bef471fac194b436ebd50e6147c6588└── manifests└── registry.ollama.ai└── library├── deepseek-r1│ ├── 1.5b│ └── 70b└── nomic-embed-text└── latest8 directories, 14 files
1.2 blobs 文件夹
存放模型的二进制文件(如.bin
、.data
等格式),每个文件对应模型库中特定模型的标识(如sha256-aabd4debf0c8f08881923f2c25fc0fdeed24435271c2b3e92c4af36704040dbc
)。标识可通过访问官网模型页复制获取,用于匹配本地文件。
1.3 manifests 文件夹
包含模型的元数据(如manifest.json
),记录文件列表、哈希值等关键信息。迁移时需完整复制对应模型的manifests
目录结构,确保元数据与blobs
中的文件对应。
1.4 迁移步骤
- 联网下载模型:使用
ollama pull
命令获取模型,或从官网手动下载blobs
和manifests
文件夹。 - 离线传输:将
blobs
和对应模型的manifests
文件夹复制到目标设备(如另一台电脑或服务器)。 - 验证模型:在目标设备运行
ollama list
,若显示模型名称则迁移成功。
2. Ollama服务REST API
Ollama 服务启动后会提供一系列原生 REST API
端点。通过这些Endpoints
可以在代码环境下与ollama
启动的大模型进行交互、管理模型和获取相关信息。其中两个endpoint
是最重要的,分别是:
- POST /api/generate
- POST /api/chat
- POST /api/create
- POST /api/tags
- POST /api/show
- POST /api/copy
- DELETE /api/delete
- POST /api/pull
- POST /api/push
- POST /api/embed
- GET /api/ps
2.1 /api/generate 接口
该接口使用提供的模型为给定提示生成响应。这是一个流式端点,因此会有一系列响应。最终响应对象将包括统计信息和请求中的其他数据。其中比较重要的参数我做了标红处理,大家重点理解。
2.1.1 请求参数
常规参数
参数名 | 类型 | 描述 |
---|---|---|
model | (必需) | 模型名称,必须遵循 model:tag 格式,如果不提供,则将默认为 latest 。 |
prompt | (必需) | 用于生成响应的提示。 |
suffix | (可选) | 模型响应后的文本。 |
images | (可选) | base64 编码图像的列表(适用于多模态模型,如 llava)。 |
高级参数 (可选)
参数名 | 类型 | 描述 |
---|---|---|
format | (可选) | 返回响应的格式。格式可以是 json 或 JSON 模式。最主要的问题是避免产生大量空格 |
options | (可选) | 文档中列出的其他模型参数,例如 temperature 。 |
system | (可选) | 系统消息,用于覆盖 Modelfile 中定义的内容。 |
template | (可选) | 要使用的提示模板,覆盖 Modelfile 中定义的内容。 |
stream | (可选) | 如果为 false ,响应将作为单个响应对象返回,而不是对象流。 |
raw | (可选) | 如果为 true ,则不会对提示应用格式。 |
keep_alive | (可选) | 控制模型在请求后保持加载的时间(默认:5分钟)。 |
context | (可选) | (已弃用) 从先前请求返回的上下文参数,用于保持简短的对话记忆。 |
其中,Options参数详细解释如下,同样我对重点参数做了标红处理,大家重点理解。
参数名 | 描述 | 值类型 | 示例用法 |
---|---|---|---|
mirostat | 启用 Mirostat 采样以控制困惑度。(默认:0,0 = 禁用,1 = Mirostat,2 = Mirostat 2.0) | int | mirostat 0 |
mirostat_eta | 影响算法对生成文本反馈的响应速度。较低的学习率会导致调整较慢,而较高的学习率会使算法更具响应性。(默认:0.1) | float | mirostat_eta 0.1 |
mirostat_tau | 控制输出的连贯性和多样性之间的平衡。较低的值会导致更集中和连贯的文本。(默认:5.0) | float | 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) | float | repeat_penalty 1.1 |
temperature | 模型的温度。增加温度会使模型的回答更具创造性。(默认:0.8) | float | temperature 0.7 |
seed | 设置用于生成的随机数种子。将其设置为特定数字将使模型对相同提示生成相同的文本。(默认:0) | int | seed 42 |
stop | 设置使用的停止序列。当遇到此模式时,LLM 将停止生成文本并返回。可以通过在 modelfile 中指定多个单独的停止参数来设置多个停止模式。 | string | stop "AI assistant:" |
num_predict | 生成文本时要预测的最大标记数。(默认:-1,无限生成),影响模型最大可以生成的 token 数量。 | int | num_predict 42 |
top_k | 降低生成无意义文本的概率。较高的值(例如 100)会给出更多样化的答案,而较低的值(例如 10)会更保守。(默认:40) | int | top_k 40 |
top_p | 与 top-k 一起工作。较高的值(例如 0.95)会导致更具多样性的文本,而较低的值(例如 0.5)会生成更集中和保守的文本。(默认:0.9) | float | top_p 0.9 |
min_p | top_p 的替代方案,旨在确保质量和多样性之间的平衡。参数 p 表示考虑标记的最小概率,相对于最可能标记的概率。例如,p=0.05 时,最可能的标记概率为 0.9,值小于 0.045 的 logits 会被过滤掉。(默认:0.0) |
num_ctx / num_predict详细解释说明
num_ctx
和 num_predict
参数都是需要放置在 options
参数中的,其中:
-
num_ctx
该参数指的是大模型在一次对话中能够"看到"和"记住"的最大上下文长度,默认配置 2048,相当于一次只能向模型输入 2ktoken
,超过 2k 模型就无法记住。当prompt
特别长时往往会出现问题。并且现在开源模型往往支持长上下文,默认配置会严重限制本地模型能力。 -
num_predict
参数指的是模型响应返回的最大 token 数据量。
import requests # type: ignore
import json# 设置 API 端点
generate_url = "http://192.168.11.103:11434/api/generate" # 这里需要根据实际情况进行修改# 示例数据
generate_payload = {"model": "deepseek-r1:32b", # 这里需要根据实际情况进行修改"prompt": "请生成一个关于人工智能的简短介绍。", # 这里需要根据实际情况进行修改"stream": False, # 默认使用的是True,如果设置为False,则返回的是一个完整的响应,而不是一个流式响应"options": {# "num_ctx": 7, 慎用,可能会导致Ollama服务不稳定,建议选择 1024 及以上"num_predict": 10}
}# 调用生成接口
response_generate = requests.post(generate_url, json=generate_payload)
if response_generate.status_code == 200:generate_response = response_generate.json()print("生成响应:", json.dumps(generate_response, ensure_ascii=False, indent=2))
else:print("生成请求失败:", response_generate.status_code, response_generate.text)
2.1.2 response 参数
响应参数
参数名 | 描述 |
---|---|
total_duration | 单次响应花费的总时间 |
load_duration | 加载模型花费的时间 |
prompt_eval_count | 提示中的token数 |
prompt_eval_duration | 评估提示所花费的时间(以纳秒为单位) |
eval_count | 响应中的token数 |
eval_duration | 生成响应的时间(以纳秒为单位) |
context | 在此响应中使用的对话的编码,可以在下一个请求中发送以保持对话记忆 |
response | 空响应是流的,如果未流式传输,则将包含完整的响应 |
generate_response["response"]# 提取 <think> 标签中的内容
think_start = generate_response["response"].find("<think>")
think_end = generate_response["response"].find("</think>")if think_start != -1 and think_end != -1:think_content = generate_response["response"][think_start + len("<think>"):think_end].strip()
else:think_content = "No think content found."# 提取正常的文本内容
normal_content = generate_response["response"][think_end + len("</think>"):].strip()# 打印结果
print("思考内容:\n", think_content)
print("\n正常内容:\n", normal_content)# 打印每个参数的值
print("Model:", generate_response["model"])
print("Created At:", generate_response["created_at"])
print("Response:", generate_response["response"])
print("Done:", generate_response["done"])
print("Done Reason:", generate_response["done_reason"])
print("Context:", generate_response["context"])
print("Total Duration:", generate_response["total_duration"])
print("Load Duration:", generate_response["load_duration"])
print("Prompt Eval Count:", generate_response["prompt_eval_count"])
print("Prompt Eval Duration:", generate_response["prompt_eval_duration"])
print("Eval Count:", generate_response["eval_count"])
print("Eval Duration:", generate_response["eval_duration"])
2.2 /api/chat 接口
该接口使用提供的模型在聊天中生成下一条消息。与 /api/generate
的参数基本一致,但是在请求的参数上会根据聊天场景进行调整。主要调整的是:
- 不再使用
prompt
参数,而是使用messages
参数。 - 新增了
tools
参数,用于支持工具调用。
2.2.1 请求参数
常规参数
参数名 | 类型 | 描述 |
---|---|---|
model | (必需) | 模型名称。 |
messages | (必需) | 聊天的消息,用于保持聊天记忆。 |
tools | (可选) | JSON 中的工具列表,供模型使用(如果支持)。 |
消息对象字段
字段名 | 描述 |
---|---|
role | 消息的角色,可以是 system 、user 、assistant 或 tool 。 |
content | 消息的内容。 |
images | (可选) 要在消息中包含的图像列表(适用于多模态模型,如 llava)。 |
tool_calls | (可选) 模型希望使用的 JSON 中的工具列表。 |
高级参数 (可选)
参数名 | 描述 |
---|---|
format | 返回响应的格式。格式可以是 json 或 JSON 模式。 |
options | 文档中列出的其他模型参数,例如 temperature 。 |
stream | 如果为 false ,响应将作为单个响应对象返回,而不是对象流。 |
keep_alive | 控制模型在请求后保持加载的时间(默认:5分钟)。 |
其中,Options参数说明:
参数名 | 描述 | 值类型 | 示例用法 |
---|---|---|---|
mirostat | 启用 Mirostat 采样以控制困惑度。(默认:0,0 = 禁用,1 = Mirostat,2 = Mirostat 2.0) | int | mirostat 0 |
mirostat_eta | 影响算法对生成文本反馈的响应速度。较低的学习率会导致调整较慢,而较高的学习率会使算法更具响应性。(默认:0.1) | float | mirostat_eta 0.1 |
mirostat_tau | 控制输出的连贯性和多样性之间的平衡。较低的值会导致更集中和连贯的文本。(默认:5.0) | float | 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) | float | repeat_penalty 1.1 |
temperature | 模型的温度。增加温度会使模型的回答更具创造性。(默认:0.8) | float | temperature 0.7 |
seed | 设置用于生成的随机数种子。将其设置为特定数字将使模型对相同提示生成相同的文本。(默认:0) | int | seed 42 |
stop | 设置使用的停止序列。当遇到此模式时,LLM 将停止生成文本并返回。可以通过在 modelfile 中指定多个单独的停止参数来设置多个停止模式。 | string | stop "AI assistant:" |
num_predict | 生成文本时要预测的最大标记数。(默认:-1,无限生成),影响模型最大可以生成的 token 数量。 | int | num_predict 42 |
top_k | 降低生成无意义文本的概率。较高的值(例如 100)会给出更多样化的答案,而较低的值(例如 10)会更保守。(默认:40) | int | top_k 40 |
top_p | 与 top-k 一起工作。较高的值(例如 0.95)会导致更具多样性的文本,而较低的值(例如 0.5)会生成更集中和保守的文本。(默认:0.9) | float | top_p 0.9 |
min_p | top_p 的替代方案,旨在确保质量和多样性之间的平衡。参数 p 表示考虑标记的最小概率,相对于最可能标记的概率。例如,p=0.05 时,最可能的标记概率为 0.9,值小于 0.045 的 logits 会被过滤掉。(默认:0.0) | float | min_p 0.05 |
2.2.2 响应参数
参数名 | 描述 |
---|---|
total_duration | 单次响应花费的总时间 |
load_duration | 加载模型花费的时间 |
prompt_eval_count | 提示中的token数 |
prompt_eval_duration | 评估提示所花费的时间(以纳秒为单位) |
eval_count | 响应中的token数 |
eval_duration | 生成响应的时间(以纳秒为单位) |
context | 在此响应中使用的对话的编码,可以在下一个请求中发送以保持对话记忆 |
response | 空响应是流的,如果未流式传输,则将包含完整的响应 |
- message
/chat
接口中,返回的模型响应结果存放在 message
中, 同样对于 DeepSeek-R1
模型,response
字段中包含 标签和正常文本, 标签用于表示模型的思考过程或内部推理,而正常的文本则是模型生成的实际输出内容。注意:非推理类模型的返回结果中没有标识。