文章目录
- 1. 硬件配置与模型选择
- 2. 模型参数配置
-
- 🧠 参数详解:为何这样配置你的10核+8GB显存
- 3. 本地API调用
-
- 3.1 模型驻留
-
- ⚙️ 工作原理
- 🛠️ 配置方式
- 💡 实用技巧
- 💡 最佳实践与注意事项
- ⚙️ 工作原理
- 3.2 流式输出
-
- 🔌 原理:它是如何工作的?
- ⚖️ 场景与效果对比
- ⚙️ 默认行为与语言SDK差异
- 🛠️ 实际应用示例
-
- 1. 流式 ([
stream: true\)](#1%5F%5Fstream%5Ftrue%5F143)
* 2. 非流式 ([stream: false\)](#2%5F%5Fstream%5Ffalse%5F168)
- 1. 流式 ([
- ✨ 高级特性:工具调用与思考过程
- 💡 最佳实践
- 🔌 原理:它是如何工作的?
- 3.3 思考模式
-
- 🧠 哪些模型支持思考?
- 🛠️ 如何设置`think`参数?
-
- 1. CLI (命令行界面)
* 2. API 调用
* 3. Modelfile 配置
* 4. 流式处理思考内容
- 1. CLI (命令行界面)
- 📊 何时用,何时不用?
- 🔗 与`keep_alive`、`stream`的协同
- 📊 核心参数与效果对比
- 🛠️ 示例:使用 `hide_thinking` 参数
- ⚠️ 注意事项
- 🧠 哪些模型支持思考?
- 4. ollama+agent
1. 硬件配置与模型选择
deepseek提供的模型参数量与推荐的硬件配置如下。
- 应该在满足运行条件的前提下,尽可能选择最大参数量的模型,因为模型参数量越大效果越好
- 如果模型参数量超过硬件配置的支持,可能导致运行缓慢,因为模型不能全在GPU跑,部分计算任务被调度到CPU

如果内存16GB,显存8GB,推荐模型参数量小于7b,如qwen3.5:4b
1ollama run qwen3.5:4b 2
2. 模型参数配置
建议输入自己的硬件配置信息和模型信息,让AI来帮忙确定
16GB内存,8GB显存,10核CPU推荐的qwen3.5:4b模型参数配置(Modelfile.txt):
1ollama create qwen3.5:4b-mine -f .\Modelfile.txt 2
1FROM qwen3.5:4b 2 3# ========== 硬件适配参数 ========== 4PARAMETER num_ctx 5120 5PARAMETER num_gpu 999 6PARAMETER num_thread 10 7 8# ========== 输出质量控制 ========== 9PARAMETER temperature 0.7 10PARAMETER top_k 40 11PARAMETER top_p 0.95 12
🧠 参数详解:为何这样配置你的10核+8GB显存
- 基础模型 (
FROM qwen3.5:4b):默认采用Q4_K_M量化,模型文件仅 3.4 GB。对于你的8GB显存来说,这留下了充裕的 KV Cache 空间。 - 上下文长度 (
num_ctx 5120):这是针对你8GB显存的 “极限甜点值”。- 估算显存占用:模型权重 (3.4GB) + 5120 上下文的 KV Cache (~4.0GB) ≈ 7.4GB。这个数值安全地卡在8GB显存上限以内,既利用了几乎全部显存资源,又留出了约 600MB 的缓冲地带,可以避免因显存波动导致的崩溃。
- 对比收益:相比我之前建议的
4096,这个值能让你一次性处理更长的代码文件,或维持更多轮的复杂对话记忆。
- GPU层数 (
num_gpu 999):强制将4B模型的全部层加载到你的8GB显存中运行,确保获得最高的推理速度。
通过以下命令可以查看ollama模型计算任务调度情况:
1ollama ps

- CPU线程数 (
num_thread 10):与你10核CPU精确匹配。这能优化模型首次加载时的权重解析速度,并在极少数显存压力大、需要CPU参与计算时,发挥CPU的最大多核效能。 - 温度参数 (
temperature 0.7):维持代码生成和创意对话之间的最佳平衡点。 - (
top_k=40):保留概率最高的 40 个词。这一步几乎保留了所有合理词汇(食物种类一般不超过40个),但绝对滤掉了“水泥”这类离谱词。 - (
top_p=0.95):在上一步的40个词中,继续累加概率至 95%。这一步会动态剪掉那些概率极低、可有可无的候选词(比如“泡面”、“炒饭”等,如果它们排在末尾的话)。
3. 本地API调用
3.1 模型驻留
keep_alive 是 Ollama API 中用于精细控制模型内存占用的参数,它的核心作用是定义模型在完成一次请求后,会在显存中继续“待命”多久。
理解这个参数,对优化本地 AI 应用的响应速度和资源管理至关重要。它的取值非常灵活:
- 立即释放 (
"0"或0):响应生成后立即卸载模型。适合显存紧张、用完即走的场景。 - 限时驻留 (
"5m"/"2h"/"24h"/300):Ollama 全局默认值为"5m"。可使用 “h”, “m”, “s” 为单位,或直接写秒数。 - 永久驻留 (
-1或"-1"等):让模型常驻显存。适合追求极速响应的开发或高频调用场景。
⚙️ 工作原理
keep_alive 的计时是 “滑动刷新” 的:
- 每一次请求完成,计时器都会重置,开始新一轮倒计时。
- 这意味着,只要你的请求间隔小于设定的
keep_alive值,模型就会一直保持在显存中,随时准备“热启动”响应。
🛠️ 配置方式
它有三种配置方式,优先级依次降低:
- API 调用时指定(最高优先级):在请求体中直接定义,拥有最高控制权。
- 启动时设置环境变量:设置
OLLAMA_KEEP_ALIVE环境变量,为所有模型定义默认行为。 - 服务端默认配置(最低优先级):默认值为 5分钟。
💡 实用技巧
- 预热模型:服务启动后,可发送
keep_alive: -1的空请求让模型常驻,避免首个真实请求的加载延迟。 - 主动卸载:发送
keep_alive: 0的空请求,立即释放资源。 - 监控状态:使用
ollama ps命令查看当前已加载的模型及其驻留时间。
💡 最佳实践与注意事项
keep_alive 的设置需要结合实际场景来权衡:
- 根据场景选择策略
- 高并发/生产环境:推荐设为
-1让模型常驻,以获得最低延迟和最高吞吐量。 - 间歇性使用/开发环境:设为
"1h"或"24h",在工作时段内保持热启动,同时避免长期占用资源。 - 资源受限/短期任务:设为
"5m"或更短,让系统自动管理,或主动用0释放显存。
- 高并发/生产环境:推荐设为
- 注意事项
- 监控显存:常驻大模型会持续占用大量显存,运行多程序时需监控避免冲突。
- 谨慎多模型共存:同时常驻多个模型会加剧显存压力,注意
OLLAMA_MAX_LOADED_MODELS的配置限制。 - 注意版本兼容:部分旧版库可能将
keep_alive视为布尔值,使用时请查阅所用 SDK 的文档。
掌握了 keep_alive 参数,你就可以精细地控制 Ollama 模型的内存驻留行为。你可以按需在“即时响应”和“释放资源”之间自由切换,从而构建出既高效又稳定的 AI 应用。
3.2 流式输出
stream参数是控制Ollama API响应方式的开关。它决定了模型是像真人打字一样逐词输出(stream: true),还是等待完整回答后一次性返回(stream: false)。
和keep_alive控制模型“驻留多久”不同,stream只控制结果“如何呈现”,并不影响模型在显存中的状态。
🔌 原理:它是如何工作的?
stream的两种模式对应着截然不同的数据传输方式。
| 参数值 | 响应格式 (Content-Type) | 数据传输方式 |
|---|---|---|
| true (流式) | application/x-ndjson | 服务器将生成的每个词或短语,作为一个独立的JSON对象,通过换行分隔的JSON (NDJSON) 流式发送。 |
| false (非流式) | application/json | 服务器在模型生成完所有内容后,将完整结果打包成一个标准的JSON对象一次性返回。 |
⚖️ 场景与效果对比
选择哪种模式,主要取决于你的应用场景。
| 特性 | 流式 (stream: true) | 非流式 (stream: false) |
|---|---|---|
| 响应速度 | 极低的感知延迟,可即时看到首个生成片段。 | 高感知延迟,用户需等待完整内容生成完毕。 |
| 适用场景 | 聊天机器人、实时文本生成、代码补全等注重交互体验的场景。 | 结构化数据提取、文本分类、单元测试等需要完整、可预测结果的场景。 |
| 开发复杂度 | 较高。需处理数据流、解析不完整JSON、累积片段并维护状态。 | 较低。一次请求即可获得完整、稳定的JSON,易于解析。 |
| 功能支持 | 完整支持常规对话、思考过程 (thinking) 和工具调用 (tool calling) 的流式输出。 | 不支持流式工具调用。如需使用tools参数,必须设置stream: false。 |
⚙️ 默认行为与语言SDK差异
了解不同环境下的默认设置,可以避免很多困惑。
| 调用方式 | stream 默认值 | 行为说明 |
|---|---|---|
| REST API | true | 直接调用 /api/generate 或 /api/chat 时,默认即为流式响应。 |
| Ollama 命令行 (CLI) | true | 在终端中运行 ollama run ... 时,默认就是打字机效果。 |
| 官方 Python SDK | false | 使用 ollama 库的 chat 或 generate 函数时,默认为非流式。 |
| 官方 JavaScript SDK | false | 与Python库一样,默认关闭流式传输,需手动开启。 |
🛠️ 实际应用示例
1. 流式 (stream: true)
- REST API (cURL)
1# 注意:无需显式设置stream: true,因为它是默认值 2curl http://localhost:11434/api/generate -d '{ 3 "model": "qwen3.5:4b", 4 "prompt": "解释一下什么是API。" 5}'
- Python SDK
1from ollama import chat 2stream = chat( 3 model='qwen3.5:4b-mine', 4 messages=[{'role': 'user', 'content': '解释一下什么是API。'}], 5 stream=True, # 必须显式开启 6) 7for chunk in stream: 8 print(chunk['message']['content'], end='', flush=True)
2. 非流式 (stream: false)
- REST API (cURL)
1curl http://localhost:11434/api/generate -d '{ 2 "model": "qwen3.5:4b", 3 "prompt": "将下面的句子翻译成中文:Hello World.", 4 "stream": false 5}'
- Python SDK
1from ollama import chat 2response = chat( 3 model='qwen3.5:4b-mine', 4 messages=[{'role': 'user', 'content': '将下面的句子翻译成中文:Hello World.'}], 5 # stream默认为False,可不写 6) 7print(response['message']['content'])
✨ 高级特性:工具调用与思考过程
对于支持高级功能的模型(如 qwen3),stream 参数能与工具调用和思考过程(thinking)无缝结合。
- 工具调用:在流式模式下,
tool_calls信息会分散在多个数据块中,需要在客户端进行累积和重组。 - 思考过程:支持思考的模型会在每个数据块中额外携带一个
thinking字段,用于展示模型的内部推理步骤。
💡 最佳实践
- 完整对话历史:在流式模式下,记得将分散的数据块累积起来,才能作为下一次请求的对话历史。
- 性能指标:流式响应的最后一个数据块(
done: true)会包含详细的性能指标,如total_duration(总耗时)、eval_count(生成的token数)等,是分析性能的重要依据。 - 结构化输出:当需要模型输出符合特定JSON格式的结果时,应将
stream设置为false,以便获取一个完整、合法的JSON对象。 - 超时设置:对于非流式请求,特别是可能生成大量文本的场景,务必设置一个足够长的客户端读取超时(如60秒),防止请求意外中断。
3.3 思考模式
think参数是Ollama为“推理模型”提供的“透明模式”开关,让你能窥见AI得出最终答案前的内部思考过程。
简单来说,think参数控制着推理模型在给出最终答案前,是否输出其内部思考过程。
think: true(慢思考):让模型先输出thinking字段内容,再输出content最终答案。这就像展示了AI的“思考草稿”或“解题步骤”,方便你debug或审计。think: false(快回答):强制模型跳过思考步骤,直接给出答案。这会显著加快响应速度,适合简单问答场景。
🧠 哪些模型支持思考?
并非所有模型都具备思考能力,目前主要支持以下几类(更多正在加入):
- Qwen 3 / 3.5:支持
true/false。若运行时思考过程过长,可通过启动参数--think=false或交互命令/set nothink关闭以提速。 - GPT-OSS:仅支持
"low"、"medium"、"high"三个等级控制思考深度,传入true/false无效。 - DeepSeek R1:支持
true/false。 - DeepSeek-v3.1:支持
true/false。
🛠️ 如何设置think参数?
Ollama提供了多种方式来控制思考模式,从命令行到API调用,一应俱全。
1. CLI (命令行界面)
- 单次运行:
1# 启用思考(默认为true) 2ollama run qwen3.5 --think "你的问题" 3# 禁用思考,快速回答 4ollama run qwen3.5 --think=false "你的问题" 5# 为GPT-OSS指定思考等级 6ollama run gpt-oss --think=high "你的问题"
- 交互模式:
1# 在交互对话中动态切换 2/set think # 启用思考 3/set nothink # 禁用思考
- 隐藏思考内容:若想使用思考模型但不想看到其内部过程,可使用
--hidethinking标志,它会在后台运行思考逻辑,最终只展示答案。
2. API 调用
/api/chat和/api/generate端点均支持think参数。
- Chat API 示例 (cURL):
1curl http://localhost:11434/api/chat -d '{ 2 "model": "qwen3.5", 3 "messages": [{"role": "user", "content": "如何实现一个单例模式?"}], 4 "think": true, 5 "stream": false 6}'
成功响应中,message对象将包含thinking和content两个字段,分别对应推理轨迹和最终答案。
- Python 示例:
1from ollama import chat 2response = chat( 3 model='qwen3.5', 4 messages=[{'role': 'user', 'content': '解释一下"多态"的概念。'}], 5 think=True, # 启用思考 6 stream=False 7) 8print("思考过程:", response['message']['thinking']) 9print("最终答案:", response['message']['content'])
3. Modelfile 配置
可以在Modelfile中预定义think行为,但实际测试发现部分模型可能不生效,最稳妥的方式还是在API调用时动态指定。
1FROM qwen3.5:4b 2PARAMETER think false # 尝试默认禁用思考 3
4. 流式处理思考内容
当启用流式响应(stream: true)时,思考过程会以数据块的形式先于答案到达。你需要根据message.thinking或message.content字段来区分它们。
📊 何时用,何时不用?
了解think参数的配置和用法后,核心在于如何选择。
| 场景 | 建议设置 | 原因 |
|---|---|---|
| 代码生成、复杂逻辑推理 | think: true | 模型会先规划、设计,生成的代码结构更清晰、健壮。 |
| 数学问题、数据分析 | think: true | 模型的思考轨迹包含了计算步骤,答案更可靠。 |
| 简单问答、闲聊、翻译 | think: false | 无需复杂推理,禁用思考可换取最快响应速度。 |
| 游戏NPC对话、实时交互 | think: false | 延迟是最重要的体验指标,快速响应比深度思考更重要。 |
| 模型调试、审计、教学 | think: true | 需要查看模型内部工作流程,以评估其决策路径。 |
🔗 与keep_alive、stream的协同
- 与
keep_alive:keep_alive管理模型在显存中的驻留,而think决定模型如何回答。两者互不干扰,可以自由组合。 - 与
stream:二者常结合使用。think: true开启思考,stream: true则能实时打印思考过程,极大提升交互感。
在Ollama的API调用中,让模型进行内部思考但不输出内容,有两种方式:
- 过滤响应数据:在客户端收到模型返回的完整数据后,选择只使用或显示
content字段,主动忽略thinking字段。 - 使用API参数组合(
"think": true+"hide_thinking": true):由服务端直接处理,API响应中只包含content字段,thinking字段完全不存在。这是更直接、更高效的方式。
📊 核心参数与效果对比
下表展示了在非流式 ("stream": false) 场景下,不同 think 和 hide_thinking 参数组合对响应内容的影响:
| think | hide_thinking | 响应内容 | 说明 |
|---|---|---|---|
| false | (不生效) | 只有 content 字段 | 模型不进行推理,响应最快。 |
| true | false (或不设置) | 包含 thinking 和 content 字段 | 可以查看推理轨迹,适合调试。 |
| true | true | 只有 content 字段 | 隐藏思考内容,模型内部推理,客户端仅显示最终答案。 |
🛠️ 示例:使用 hide_thinking 参数
该功能在Ollama的REST API、Python SDK和CLI中均可使用。
- REST API (cURL) 示例
1curl http://localhost:11434/api/chat -d '{ 2 "model": "qwen3.5:4b-mine", 3 "messages": [{"role": "user", "content": "什么是闭包?"}], 4 "stream": false, 5 "think": true, 6 "hide_thinking": true 7}'
在此响应中,message 对象将只包含 content 字段。
- Python SDK 示例
1from ollama import chat 2response = chat( 3 model='qwen3.5:4b-mine', 4 messages=[{'role': 'user', 'content': '什么是闭包?'}], 5 stream=False, 6 options={'think': True, 'hide_thinking': True} 7) 8print(response['message']['content']) # 只打印最终答案
- 命令行 (CLI) 示例
1ollama run qwen3.5:4b-mine --think --hidethinking "什么是闭包?"
⚠️ 注意事项
- Modelfile 限制:
think参数可在 Modelfile 中预设,但无法预设hide_thinking。它必须在每次API调用时动态设置。 - 与
stream: true配合:在流式模式下,此组合依然生效。模型不会发送thinking字段的数据块,客户端可直接处理content的流式数据,逻辑更简单。 - 模型支持:此功能适用于支持思考功能的模型,如 Qwen 3 系列、DeepSeek R1 和 DeepSeek-v3.1。
4. ollama+agent
- 执行以下命令安装agent-mini,建议安装到全局python环境,这样可以方便启动agent-min,自动完成一些任务
1pip install agent-mini 2
- 安装完成后,执行以下命令初始化配置信息
1agent-mini init 2

- 执行以下命令启动agent-mini,通过对话可以让ollama模型调用工具自动执行一些任务,比如文件与目录操作、网络搜索(无法使用,duckduckgo国内不支持)
1agent-mini chat 2


《【Ollama本地大模型】性能优化思考》 是转载文章,点击查看原文。
