文章介绍了在本地环境部署大语言模型的解决方案,重点讲解了Ollama工具的使用方法,包括命令行调用、HTTP API调用和SDK调用三种方式。作者通过测试多个本地模型在JSON输出方面的表现,发现deepseek-r1:14b表现最佳。文章指出,本地部署可根据硬件条件选择不同参数量的模型,8B参数量模型已能实现不错的业务功能,为数据敏感场景提供了可行方案。
前排提示,文末有大模型AGI-优快云独家资料包哦!
API访问大模型的方法,这种方法可以调用当今最强大的大语言模型。但是在很多私域部署场景中,用户对数据保密性有要求,不允许数据离开公司,甚至没有互联网,这种情况在线访问的方式就无法使用了,需要调用本地的大模型来满足需求。
调用本地的大模型有一个非常好用的工具是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
}
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还是有些重,有没有更轻量的方法呢? 毫无疑问,有,咱们下回再聊。
读者福利:倘若大家对大模型感兴趣,那么这套大模型学习资料一定对你有用。
针对0基础小白:
如果你是零基础小白,快速入门大模型是可行的。
大模型学习流程较短,学习内容全面,需要理论与实践结合
学习计划和方向能根据资料进行归纳总结
包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓


👉AI大模型学习路线汇总👈
大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
👉大模型实战案例👈
光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

👉大模型视频和PDF合集👈
这里我们能提供零基础学习书籍和视频。作为最快捷也是最有效的方式之一,跟着老师的思路,由浅入深,从理论到实操,其实大模型并不难。

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

1299

被折叠的 条评论
为什么被折叠?



