Ollama本地函数调用发布72小时,我替你试完了 用Ollama跑Qwen3.8-27B做本地函数调用面向想把轻量模型 工具调用跑在自己机器上的工程师。全文命令可复现显卡门槛低至单张 24GB。一、为什么用 27B 而不是 70B/744B不是所有 Agent 都需要旗舰模型。比如内部工单分类、日志初筛、表单自动填充这类任务延迟比智商上限重要得多。Qwen3.8-27B 在 Q4 量化后权重约 16–18 GB一张 24GB 的 4090/3090 就能常驻推理成本接近零。据 multiple 模型榜单交叉验证27B 级别在中文函数调用tool-call评测上已经能稳定输出合规 JSON足够撑起大部分本地自动化。Ollama 的价值在于它把下载—量化—起服务—函数调用收敛成几条命令省去手搓 vLLM 多卡编排的复杂度。你牺牲的是极限吞吐换来的是十分钟内从零跑通。二、安装与拉模型# macOS / Linux 一键安装 curl -fsSL https://ollama.com/install.sh | sh # 拉取 Qwen3.8-27B 的 Q4 量化版本约 17GB ollama pull qwen3.8:27b-instruct-q4_K_M # 后台常驻服务默认 11434 端口OpenAI 兼容 ollama serve如果官方 tag 里没有你想要的量化档可以用 Modelfile 自己指 GGUFFROM ./qwen3.8-27b-q4.gguf PARAMETER num_ctx 8192 PARAMETER num_gpu 99 TEMPLATE {{ if .System }}|im_start|system\n{{ .System }}|im_end|\n{{ end }}{{ if .Prompt }}|im_start|user\n{{ .Prompt }}|im_end|\n{{ end }}|im_start|assistant\n{{ .Response }}num_gpu 99是把层数尽量塞进 GPU避免 CPU offload 拖慢首 tokennum_ctx 8192给函数调用留足上下文比如工具返回一长串 JSON 时不会截断。三、定义工具并跑通第一轮调用Ollama 的 OpenAI 兼容接口原生支持 tools。下面用官方ollamaPython 库演示一个查天气 写日历的最小 Agentimport ollama, json, datetime tools [{ type: function, function: { name: get_weather, description: 查询指定城市的当前天气, parameters: { type: object, properties: {city: {type: string}}, required: [city], }, } }] messages [{role: user, content: 上海今天适合户外团建吗}] resp ollama.chat( modelqwen3.8:27b-instruct-q4_K_M, messagesmessages, toolstools, ) msg resp[message] print(msg.get(tool_calls)) # 模型会输出结构化调用如果tool_calls为空先别怀疑模型——八成是description写得太含糊或者参数required没标全。比如把查询天气和查温度拆成两个函数时模型容易乱选明确每个工具的边界能让命中率明显提升。四、把工具结果回灌凑成 Agent 循环函数调用的本质是模型出计划 → 本地执行 → 结果回灌 → 模型再决策。一个最小循环def run_agent(prompt, max_steps5): messages [{role: user, content: prompt}] for _ in range(max_steps): r ollama.chat(modelqwen3.8:27b-instruct-q4_K_M, messagesmessages, toolstools) m r[message] if not m.get(tool_calls): return m[content] # 没有工具调用 最终回答 for call in m[tool_calls]: fn call[function] result dispatch(fn[name], fn[arguments]) messages.append(m) # 先把模型的 tool_call 消息留下 messages.append({ # 再把执行结果以 tool 角色回灌 role: tool, content: json.dumps(result, ensure_asciiFalse), name: fn[name], }) return 超过最大步数注意messages.append(m)这一步不能省很多人在回灌时只 append 了 tool 结果漏掉模型的 tool_call 消息Ollama 会因上下文结构不连续直接报tool_calls格式错误。回灌顺序永远是模型的 assistant(tool_calls) → 你的 tool 结果成对出现。五、踩坑实录返回非法 JSONQ4 量化偶发把参数写成单引号或中文引号。务必json.loads加 try/except失败就让模型重新输出严格 JSON。ctx 爆了却不报错num_ctx太小长工具结果被静默截断模型拿到的数据不全、开始瞎编。比如返回 5 千字日志时先把文本做摘要再回灌更稳。循环停不下来模型反复调用同一个工具。加max_steps硬上限并在 system prompt 里写清拿到结果就直接回答不要再次调用。首 token 慢27B Q4 在 CPU offload 下 prefill 极慢确认nvidia-smi里显存真的吃满而不是在吃内存。六、辩证小模型 Agent 的天花板本地 27B 不是银弹。比如需要跨文档长程推理、或调用几十个复杂工具时小模型的函数选择准确率会明显下降这时该上云端大模型而非硬撑。另一个常被忽视的点本地化意味着你放弃了公有 API 那层安全护栏模型若被诱导调用危险工具比如rm -rf类后果完全自己扛。所以本地 Agent 一定要在工具层做白名单——只允许明确无害的函数进入循环而不是把 shell 直接交给模型。轻量与自主从来都要用一道护栏来交换。互动提问你会在生产里用 27B 本地 Agent还是直接上云端大模型欢迎在评论区聊聊取舍本地函数调用最让你头疼的坑是什么是 JSON 解析还是上下文截断把 shell 这类危险工具交给本地模型你觉得该不该做白名单限制数据与事件来源Ollama 官方文档模型拉取、Modelfile 参数、tools 调用协议Qwen 官方模型卡与 GGUF 量化发布说明27B 规格与 Q4 量化档多平台函数调用tool-call评测榜单交叉验证27B 级别中文 tool-call 合规率