Ollama本地大模型部署全攻略:从CLI到SDK调用详解+多模型性能对比!
本文介绍使用Ollama工具在本地部署和调用大语言模型的方法,适用于数据保密场景。详细讲解三种调用方式:命令行、HTTP API和SDK,并对多个本地模型进行JSON输出测试,发现deepseek-r1:14b表现最佳。文章强调,实际应用中应根据具体场景选择合适的模型,8B参数量模型也能实现不错的业务功能,展示了本地大模型的巨大应用潜力。
简介
本文介绍使用Ollama工具在本地部署和调用大语言模型的方法,适用于数据保密场景。详细讲解三种调用方式:命令行、HTTP API和SDK,并对多个本地模型进行JSON输出测试,发现deepseek-r1:14b表现最佳。文章强调,实际应用中应根据具体场景选择合适的模型,8B参数量模型也能实现不错的业务功能,展示了本地大模型的巨大应用潜力。
在很多私域部署场景中,用户对数据保密性有要求,不允许数据离开公司,甚至没有互联网,这种情况在线访问的方式就无法使用了,需要调用本地的大模型来满足需求。
调用本地的大模型有一个非常好用的工具是Ollama,由前 Docker 核心开发者 Jeremy Howard 和团队开发,所以用起来也非常像Docker,比如这样一个命令就会拉取Deepseek-R1模型并且在本地运行起来:
ollama run deepseek-r1
本文实验中使用的Ollama的版本是:
$ ollama --version
ollama version is 0.12.10
Ollama支持三种调用方法:
- 命令行调用(CLI)
- HTTP API调用(例如通过curl或者任意语言,普适性最强)
- 使用开发语言通过SDK调用(对开发者来说比HTTP方式更友好)
CLI调用
ollama run deepseek-r1:32b
非常简单,作为普通用户这样用就可以了。
HTTP API调用
下面通过curl来调用Ollama的HTTP接口。
curl -X POST http://localhost:11434/api/chat -H "Content-Type: application/json" -d '{
"model": "glm4:9b",
"messages": [{"role": "user", "content": "一句话介绍下大模型"}],
"stream": false,
"format": "json"
}'
输出
{"model":"glm4:9b","created_at":"2025-11-10T07:12:11.290003031Z","message":{"role":"assistant","content":"{\"response\": \"使用人工智能技术,通过海量数据训练,能够理解和生成自然语言、图像等多元信息的技术和模型。例如,智谱AI模型是一种高级的深度学习模型,能处理复杂任务,如文本生成、机器翻译和自然语言理解等。`)。”}。以下是一些关于人工智能的相关知识,以供参考:1. 自然语言理解(NLP)是人工智能的一种应用,....(略)....,我们有理由相信,未来将带来更美好的生活和工作环境。因此,我们要紧密关注这个领域的研究进展和应用,共同推动我国科技创新和社会发展。在未来的发展中,我们要积极拥抱新技术、新机遇,勇于开拓创新,为人类的发展做出更大的贡献。谢谢您对我们问题的关注和支持,我们将继续努力为您提供更多有价值的信息和知识。如有其他问题或需要进一步了解,请随时提出。祝您生活愉快!\"}"},"done_reason":"stop","done":true,"total_duration":5796277912,"load_duration":31929144,"prompt_eval_count":11,"prompt_eval_duration":14599361,"eval_count":612,"eval_duration":5749282129}
如果stream赋值为true,那么在输出时会逐token返回多个json数据
如果想看到推理过程,可以
curl http://localhost:11434/api/chat -d '{
"model": "deepseek-r1:8b",
"messages": [{
"role": "user",
"content": "大模型深度思考的原理是什么?"
}],
"think": true,
"stream": false
}'
输出(为方便阅读,进行了格式化)
{
"model": "deepseek-r1:14b",
"created_at": "2025-11-10T09:27:33.220823603Z",
"message": {
"role": "assistant",
"content": "### 分步说明:解释“大模型深度思考的原理是什么?”\n\n1. **理解问题**....(略).... **总结** \n 大型语言模型的深度思考能力是其庞大的参数规模、先进的训练方法和创新的架构设计共同作用的结果。这些因素使得模型能够理解并处理复杂的信息,执行多步推理和问题解决任务。",
"thinking": "לבטל\n\n在思维链中,我需要逐步分解问题\n\n1. 用户的问题是“理解用户的问题和处理步骤是什么?....(略)....**完成这些步骤后,我需要用清晰的中文语言组织内容,确保逻辑连贯。**\n\n每个部分都应该有明确的主题句和支持细节。\n\n同时,避免过于技术化的术语,以保持可读性。\n\n最后,检查整个回答,确保没有遗漏关键点,并且信息准确无误。\n"
},
"done_reason": "stop",
"done": true,
"total_duration": 17716721606,
"load_duration": 1625712343,
"prompt_eval_count": 11,
"prompt_eval_duration": 97564335,
"eval_count": 1245,
"eval_duration": 15992108485
}
如果think赋值为false,则不会有thinking字段
还可以要求json输出,这是一个很实用的能力,可以直接把大模型的输出对接到程序里了:
curl -X POST http://localhost:11434/api/chat -H "Content-Type: application/json" -d '{
"model": "llama3:70b",
"messages": [{"role": "user", "content": "Tell me about Canada in one line"}],
"stream": false,
"format": "json"
}'
通过SDK调用
使用Ollama的Python SDK调用接口,可以这样写:
from ollama import chat
from ollama import ChatResponse
response: ChatResponse = chat(model='gemma3', messages=[
{
'role': 'user',
'content': 'Why is the sky blue?',
},
])
print(response['message']['content'])
# or access fields directly from the response object
print(response.message.content)
具体用法可以参考官方文档:https://docs.ollama.com/quickstart#python
能打的本地大模型
测试json输出的时候,发现多个本地模型表现不佳,于是使用 简单列举await的缺点 这个问题整体测试了一下
time curl -X POST http://localhost:11434/api/chat -H "Content-Type: application/json" -d '{
"model": "qwen2.5:7b",
"messages": [{"role": "user", "content": "简单列举await的缺点"}],
"stream": false,
"format": "json"
}'
下面看看每个模型的具体表现:
qwen3:8b的输出,not allowed
{
"model": "qwen3:8b",
"created_at": "2025-11-11T01:35:47.541046287Z",
"message": {
"role": "assistant",
"content": "{\"error\": \"Internal Server Error\", \"message\": \"Execution of this code is not allowed.\"}"
},
"done": true,
"done_reason": "stop",
"total_duration": 2313912343,
"load_duration": 1994408652,
"prompt_eval_count": 13,
"prompt_eval_duration": 12031989,
"eval_count": 22,
"eval_duration": 145934700
}
一直在更新,更多的大模型学习和面试资料已经上传带到CSDN的官方了,有需要的朋友可以扫描下方二维码免费领取【保证100%免费】👇👇

qwen3-coder:30b的输出,说不符合要求:
{
"model": "qwen3-coder:30b",
"created_at": "2025-11-11T01:40:06.012326205Z",
"message": {
"role": "assistant",
"content": "{\"error\":{\"type\":\"invalid_request\",\"message\":\"您提供的请求内容不符合要求,请提供一个具体的问题或者需要回答的话题。\"}}"
},
"done": true,
"done_reason": "stop",
"total_duration": 5754510513,
"load_duration": 5483937201,
"prompt_eval_count": 13,
"prompt_eval_duration": 22101842,
"eval_count": 28,
"eval_duration": 146800724
}
yi:34b的回答,答非所问:
{
"model": "yi:34b",
"created_at": "2025-11-11T01:41:09.444162378Z",
"message": {
"role": "assistant",
"content": "{\n \"path\": \"C:\\\\Users\\\\你的使用者名稱\\\\Desktop\\\\新建文件夹\",\n \"recursive\": true\n}"
},
"done": true,
"done_reason": "stop",
"total_duration": 20675614416,
"load_duration": 19890957533,
"prompt_eval_count": 25,
"prompt_eval_duration": 42404415,
"eval_count": 32,
"eval_duration": 719650296
}
glm4:9b的输出(只保留了其中的content值,下同),描述偏中性了一些:
{
"await": {
"缺点": [
{
"描述": "性能开销",
"具体影响": "使用`await`时,可能会带来额外的性能开销,因为JavaScript引擎在处理`await`时会暂停当前线程,等待异步操作完成。如果在一个大型应用程序中频繁地使用`await`,可能会导致整体性能下降。"
},
{
"描述": "代码可读性",
"具体影响": "在一些情况下,使用过多的`await`可能会导致代码可读性降低,尤其是在多层嵌套的异步函数中。这可能会增加调试和维护的难度。"
},
{
"描述": "控制流复杂性",
"具体影响": "在处理复杂的异步逻辑时,滥用`await`可能导致控制流的复杂性增加,使得理解和维护异步操作变得困难。"
},
{
"描述": "错误处理",
"具体影响": "`await`后面抛出的异常可能不会被立即捕获,这可能导致错误被忽略或未被妥善处理。"
},
{
"描述": "不适用于所有场景",
"具体影响": "并非所有的异步操作都适合使用`await`。在某些情况下,如需要保持非阻塞状态进行大量并发操作时,使用`async/await`可能不是最佳选择。"
}
]
}
}
deepseek-r1:14b的输出(只保留了其中的content值),有标题有描述还有级别,结构性良好,算是全场最佳了:
{
"await": [
{
"title": "只能在 async 函数中使用",
"description": "await 关键字只能在定义为 async 的函数内部使用,否则会导致语法错误。这限制了其使用的灵活性。",
"severity": " medium"
},
{
"title": "依赖于 Promises 或 async 函数返回的 Promise",
"description": "await 仅适用于处理基于 Promises 的异步操作或 async 函数返回的 Promise。对于其他类型的异步任务,需要额外的工作来包装。",
"severity": "medium"
},
{
"title": "代码复杂性增加",
"description": "在处理多个 await 操作时,可能会导致代码结构变得复杂,难以维护和调试。",
"severity": "high"
},
{
"title": "错误处理挑战",
"description": "虽然可以使用 try/catch 来处理由 async 函数返回的 promise 错误,但如果 promise 中未捕获错误或多个错误同时发生,处理起来较为困难。",
"severity": "high"
},
{
"title": "调试和追踪执行流程困难",
"description": "由于 await 是非阻塞的,调试时可能难以追踪其执行状态,需要额外的日志或断点辅助。",
"severity": "medium"
},
{
"title": "性能考虑",
"description": "处理大量异步操作可能导致创建和管理过多 Promises,增加内存使用并影响性能。",
"severity": "low"
},
{
"title": "对状态管理和依赖的复杂性",
"description": "多个 async 操作可能导致状态管理困难,并需要仔细安排执行顺序以避免逻辑错误。",
"severity": "high"
},
{
"title": "学习曲线和使用环境限制",
"description": "对于不熟悉 async/await 的开发者来说,存在一定的学习成本。此外,某些框架或库可能不支持 async/await 模式。",
"severity": "low"
}
]
}
glm4:9b的输出,它很努力了,但格式不对(只保留了其中的content值)
{
"标题": "await 的缺点",
"内容": [
{
"点1": "代码难以调试",
"text": "当使用 async/await 语法时,如果发生错误,可能会很难定位错误的精确位置,因为异步函数可能跨越多个文件或模块。这增加了调试复杂性。",
"点2": "对理解有要求",
"text": "await 依赖于事件循环和回调机制的理解,这使得对于不太熟悉 JavaScript 异步编程的人来说,代码的可读性和可维护性会降低。",
"点3": "性能开销",
"text": "尽管异步代码可以提高应用程序的性能,但是 await 在某些情况下可能会引入额外的性能开销。例如,每次调用 await 时都会导致上下文切换。",
"点4": "阻塞执行",
"text": "在某些情况下,await 会使函数暂停执行直到异步操作完成,这可能导致不必要的延迟和效率低下。",
"点5": "死锁风险",
"text": "不当使用 await 可能会导致死锁。如果在一个函数中使用多个 await 调用,而且这些调用没有正确处理依赖关系,就可能出现死锁。",
"点6": "代码结构复杂",
"text": "当大量使用 async/await 时,代码的结构可能会变得非常复杂,这使得维护和理解变得更加困难。",
"点7": "不适用于所有场景",
"text": "并非所有的异步操作都适合使用 await。在某些情况下,其他方法(如 Promise.all)可能更加合适。"
}
]
}
qwen3:30b-a3b-instruct-2507-q8_0的输出(只保留了其中的content值),简洁明了:
{
"缺点": [
"阻塞线程(在单线程环境中)",
"错误处理复杂化",
"难以调试异步代码",
"可能导致性能下降(如过度使用)",
"不适用于所有场景(如实时系统)"
]
}
llama3.1:8b的输出(只保留了其中的content值),这个输出,不能算对,毕竟一般不会这样用….
{
"async/await": "无法利用多cpu执行任务,会阻塞主线程",
"callback": "不容易维护,回调 hell",
"promise": "链式写法,难以调试,错误捕获机制较差"
}
gpt-oss:20b的输出(只保留了其中的content值),信息混杂在一起了,不利于结构化使用:
{
"缺点": [
"1. **线程占用**:`await` 产生的协程会占用线程,尤其在大量并发任务时可能导致线程池耗尽。",
"2. **错误传播复杂**:异常在异步链中传播需要 `try/catch` 或 `.catch()`,调试时不如同步代码直观。",
"3. **上下文切换开销**:每次 `await` 可能导致上下文切换,若频繁使用会影响性能。",
"4. **死锁风险**:在错误的同步/异步混用中,`await` 可能造成死锁(如 UI 线程等待后台线程结果)。",
"5. **代码可读性下降**:过度使用 `await` 叠加会让代码变得难以追踪,尤其在深层回调中。",
"6. **需要更高的 JavaScript 版本**:旧环境不支持 `async/await`,需要 Babel 等编译步骤。",
"7. **测试难度**:异步测试需要额外的工具或等待机制,测试代码会更繁琐。"
]
}
有时,会产生类似这样的错误输出,表现出本地模型的运转非常不稳定:
{
"model": "llama3:70b",
"created_at": "2025-11-11T01:11:00.629700357Z",
"message": {
"role": "assistant",
"content":"{\n\n\n\n \n\n\n \n \n \n \n \"\\\\\\\\.\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\)\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\`\\\\\\\\\\\\\\\\\\\\\\\\.\ \\\\\\\\\\\\.\"
},"done":false
测试结果汇总如下:
| 序号 | 模型 | 耗时 | 结果 |
| 1 | deepseek-r1:14b | 9.9s | ✅ |
| 2 | qwen3:8b | 2.3s | ❌ |
| 3 | qwen3-coder:30b | 5.7s | ❌ |
| 4 | yi:34b | 20.7s | ❌ |
| 5 | glm4:9b | 4.2s | ❌ |
| 6 | gpt-oss:20b | 5.0s | ✅ |
| 7 | qwen2.5:7b | 9.2s | ✅ |
| 8 | llama3.1:8b | 5.6s | ❌ |
| 9 | qwen3:30b-a3b-thinking-2507-q8_0 | 28s | ❌ |
| 10 | qwen3:30b-a3b-instruct-2507-q8_0 | 11.8s | ✅ |
总结
针对json输出的本地大模型测试中,deepseek-r1:14b全场表现最佳。
通过Ollama可以很方便地实现本地大模型调用,不过能力也受到模型参数量的限制,想在项目中应用的话,最好针对自己的实际场景,逐一测试最匹配的大模型。 另外,有显卡的话,可以跑到30B左右的参数量(4090可以跑70B,但是速度不具有实际价值),没有显卡则只能跑8B左右。我见到一些项目仅使用8B参数量的大模型就实现了一些还不错的业务功能,可见大模型的应用大有潜力可挖。
在实际接入的时候,可能会感觉Ollama还是有些重,有没有更轻量的方法呢?
如何系统的学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
一直在更新,更多的大模型学习和面试资料已经上传带到CSDN的官方了,有需要的朋友可以扫描下方二维码免费领取【保证100%免费】👇👇

01.大模型风口已至:月薪30K+的AI岗正在批量诞生

2025年大模型应用呈现爆发式增长,根据工信部最新数据:
国内大模型相关岗位缺口达47万
初级工程师平均薪资28K(数据来源:BOSS直聘报告)
70%企业存在"能用模型不会调优"的痛点
真实案例:某二本机械专业学员,通过4个月系统学习,成功拿到某AI医疗公司大模型优化岗offer,薪资直接翻3倍!
02.大模型 AI 学习和面试资料
1️⃣ 提示词工程:把ChatGPT从玩具变成生产工具
2️⃣ RAG系统:让大模型精准输出行业知识
3️⃣ 智能体开发:用AutoGPT打造24小时数字员工
📦熬了三个大夜整理的《AI进化工具包》送你:
✔️ 大厂内部LLM落地手册(含58个真实案例)
✔️ 提示词设计模板库(覆盖12大应用场景)
✔️ 私藏学习路径图(0基础到项目实战仅需90天)






第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

更多推荐



所有评论(0)