• [深度学习] 大模型学习8上-推理部署框架llama.cpp与Ollama使用指北


    随着大语言模型(Large Language Model,LLM)全面步入实际应用阶段,推理部署框架成为模型落地进程中必不可少的重要组成部分。不同框架在性能优化方式、部署复杂度以及适用场景上差异较大,在实际工程选型中往往需要先理解其基本定位与使用方式。关于模型推理部署基础概念的介绍,可参考:大模型学习6-模型量化与推理部署

    本文将对当前常见的LLM推理框架进行简要梳理,并聚焦于本地推理场景中极具代表性的llama.cpp与Ollama,介绍它们的核心原理及基础用法。另一广泛使用的生产级框架vLLM,作为面向高吞吐环境的推理方案,内容相对独立且较为丰富,将留待下一篇文章专门展开。

    1 推理框架概述

    常见LLM推理框架

    近年来,随着LLM的持续发展,推理部署框架在模型落地中的作用日益重要。作为连接模型能力与实际应用场景的关键基础设施,其设计与性能直接影响部署效率与最终效果。目前,业界已涌现出多种具有代表性的推理框架,常见的包括以下几类:

    1. llama.cpp
      llama.cpp是一个由开源社区维护的轻量级LLM推理框架,采用纯C/C++实现,并结合多种量化技术,具有很强的硬件兼容性和较低的资源占用。它支持CPU与GPU混合推理,尤其适合边缘设备、普通电脑,以及需要离线运行模型的个人开发者。

    2. Ollama
      Ollama是一个面向本地部署的轻量级推理平台,主要在llama.cpp推理能力之上提供统一的运行与管理接口,致力于降低LLM本地运行的门槛。它支持一键下载、运行和管理多种主流模型,适合个人开发者、研究人员以及本地快速验证场景。

    3. vLLM
      vLLM是由加州大学伯克利分校团队开发的开源推理框架,主要解决LLM服务中的显存占用和吞吐量问题。其核心创新包括PagedAttention(分页注意力)和Continuous Batching(连续批处理):前者借鉴操作系统的分页机制提升显存利用率,后者通过动态调度请求批次显著提升推理效率。vLLM目前已成为生产环境中应用较广的推理引擎之一。

    4. SGLang
      SGLang由加州大学伯克利分校团队开发,是一款专注于提升推理吞吐量、降低响应延迟的推理引擎,同时提供更灵活的编程接口。其核心技术RadixAttention通过高效的前缀缓存机制,大幅提升共享上下文场景下的推理效率,在结构化输出和复杂工作流等高并发任务中表现突出。

    5. TensorRT-LLM
      TensorRT-LLM是NVIDIA推出的官方推理引擎,基于TensorRT深度优化,专为LLM设计。它通过算子融合、模型量化和分布式推理等技术,能够充分释放NVIDIA GPU性能,是追求高吞吐和低延迟场景的重要选择。

    6. XInference
      XInference是一款高性能分布式推理框架,专注于简化各类AI模型的部署、运行和集成。它支持多种模型类型和异构硬件,具备较强的扩展能力,适合大规模分布式部署场景。

    7. LightLLM
      LightLLM是一个基于Python的轻量级LLM推理与服务框架,以架构简洁、扩展性强和推理速度快为特点。其模块化设计提供了较高的定制灵活性,适合需要深入定制推理流程的开发者。

    学习路线建议

    上述框架覆盖从本地推理到分布式服务的多种技术路线,但全部掌握并不现实。如果希望以最低学习成本入门LLM推理部署并理解核心机制,通常只需沿一条主线学习即可。

    本地推理阶段可选择llama.cpp或Ollama,用于理解模型在单机环境中的加载与运行方式,建立对模型如何运行的基础认知。其中,llama.cpp偏底层实现,强调推理细节与资源控制;Ollama在其基础上做了封装,使用更简单直观。二者本质属于同一层级工具,选择其一即可。完成本地推理的理解后,再学习vLLM,可进一步掌握推理服务化的核心机制,如并发请求处理与显存优化,从而形成从单机运行到多用户服务的完整认知闭环。

    其余框架更多面向特定工程优化或场景需求,不影响对核心原理的理解。详细的框架介绍可参阅: 一文梳理主流大模型推理部署框架

    基于这一路径,本文将重点介绍llama.cpp和Ollama的核心使用方式,vLLM将在下一篇文章中结合服务化部署进行讲解。

    2 llama.cpp快速入门

    本部分将展示如何使用llama.cpp在本地机器上运行模型,默认在Linux环境下使用C++编译器进行本地编译,Windows用户请参考llama.cpp仓库的说明:llama.cpp

    2.1 部署准备

    2.1.1 环境准备

    本地编译需要安装C++编译器和构建工具。可在Linux终端中输入以下命令检查是否已安装:

    cc --version
    cmake --version
    

    若已安装,终端将显示配置信息,即可直接使用。若出现错误提示,则需先安装相关工具,Ubuntu下的安装命令如下:

    sudo apt install build-essential gcc cmake
    

    完成环境准备后,先克隆仓库并进入目录:

    git clone https://github.com/ggml-org/llama.cpp
    cd llama.cpp
    

    然后使用CMake进行编译。第一条命令会检查本地环境,确定要包含的后端和功能;第二条命令实际执行编译(不加-j 16也可以正常编译,加上则可利用CPU多核并行加速),使用纯CPU编译命令如下:

    cmake -B build
    cmake --build build --config Release -j 16
    

    如果需要启用NVIDIA GPU加速,可以在配置阶段添加CUDA选项:

    cmake -B build -DGGML_CUDA=ON
    cmake --build build --config Release -j 16
    

    编译完成后,运行程序位于llama.cpp仓库的build/bin/目录中。

    2.1.2 模型准备

    使用llama.cpp进行本地推理,本质上遵循一个相对固定的流程:首先准备运行环境与可执行程序,其次获取GGUF格式的模型文件,最后根据需求选择运行方式进行推理。其中,llama.cpp提供llama-cli用于本地命令行交互,同时提供llama-server用于服务化部署与API调用。

    llama.cpp仅支持GGUF格式模型,因此在使用前必须确认模型格式是否符合要求。GGUF是llama.cpp定义的统一模型格式,用于以轻量化方式将模型权重、配置以及tokenizer等信息打包为单一文件。

    https://levelup.gitconnected.com/train-your-ai-fine-tuning-llm-and-converting-to-gguf-a-complete-guide-70ab5e05b288

    如果当前模型已经是GGUF格式,可以直接使用;如果来源是Hugging Face(如safetensors或bin格式),则需通过llama.cpp仓库提供的转换工具完成格式转换:

    python convert_hf_to_gguf.py
    

    可在Hugging Face、ModelScope或Unsloth搜索开源模型的GGUF版本。虽然Unsloth并非官方模型发布方,但其提供的量化GGUF模型在实际使用中兼容性较好、量化效果好,因此较为常见。关于Unsloth框架的进一步介绍,可阅读:大模型学习5-高效微调框架Unsloth使用指北

    以Unsloth发布的Qwen系列为例,可通过搜索以.GGUF结尾的仓库名查找所需模型。如文件名Qwen3.5-0.8B-Q4_K_M.gguf中,0.8B表示模型参数规模约为8亿(适合入门级硬件),Q4_K_M表示4位量化中的Medium级别,在模型体积与输出质量之间取得平衡,是较为常用的量化选择。该模型整体体积约500–600MB,因此即使在普通CPU环境下也可以较为流畅地运行。

    可以通过ModelScope下载GGUF模型至llama.cpp根目录下的model文件夹:

    modelscope download --model unsloth/Qwen3.5-0.8B-GGUF Qwen3.5-0.8B-Q4_K_M.gguf --local_dir ./model
    

    上述命令使用的是unsloth提供的Q4_K_M量化版本。量化技术让LLM能够在普通电脑上运行,在尽量保持精度的前提下显著降低显存占用。不同量化版本在精度与资源消耗上有所取舍,常见版本如下:

    量化版本 精度损失 适用场景
    UD-Q4_K_XL 极小 精度损失极小,整体平衡较好
    Q4_K_M 经典4-bit量化,兼容性最好
    UD-Q2_K_XL 可接受 极致节省显存,适合低显存设备
    Q8_0 几乎无 精度最高,资源消耗较高

    2.2 llama-cli使用

    llama-cli是llama.cpp提供的命令行交互工具,用于直接与LLM进行推理与对话。在完成llama.cpp编译后,可在其构建目录中直接调用llama-cli运行模型。若想快速了解基本用法,可参考llama.cpp使用指南Qwen3.5本地部署指南

    https://medium.com/@kalyanks/the-new-router-mode-in-llama-cpp-server-27f4e3606be9

    2.2.1 参数说明

    从整体设计来看,llama-cli的参数体系可以划分为三大类:模型与上下文控制、生成策略控制、会话与模板系统。这一划分对应了模型运行的三个核心阶段:加载什么模型、如何生成内容、以及如何组织对话结构。

    1️⃣模型与上下文控制

    这一类参数决定模型的运行资源分配与上下文能力,是影响性能与显存占用的核心部分。

    -m <model.gguf>
    -hf <repo>
    -ngl <N>
    -t <threads>
    -c <ctx>
    -b <batch>
    --no-context-shift
    
    参数 说明
    -m 字符串,本地GGUF格式模型文件的路径
    -hf 字符串,Hugging Face仓库名称
    -ngl 整数,加载到GPU的模型层数。值越大,GPU占用越高、推理越快;设为0表示纯CPU运行
    -t 整数,CPU线程数。值越大,CPU推理越快;默认为物理核心数
    -c 整数,上下文窗口长度。值越大,模型能记住的对话越多,但显存消耗也越大
    -b 整数,单次批处理的token数量。值越大,吞吐量越高,但显存占用也越大
    --no-context-shift 布尔标志,禁用上下文滚动移位,超限时直接截断

    📌实践建议:显存不足时优先降低-c-b,通常比降低-ngl更稳定。

    2️⃣生成控制(采样策略)

    这一组参数直接影响输出质量、随机性与稳定性,本质上控制模型如何说话。

    -n <tokens>
    --temp <float>
    --top-k <int>
    --top-p <float>
    --repeat-penalty <float>
    --presence-penalty <float>
    --frequency-penalty <float>
    
    参数 说明
    -n 整数,最多生成的token数量。值越大,回复越长
    --temp 浮点数(0~2),控制生成的随机性。值越大,输出越具创造性;值越小,输出越保守确定
    --top-k 整数,仅从概率最高的K个token中采样。值越小,输出越集中(1等价于贪婪采样)
    --top-p 浮点数(0~1),仅从累计概率达到P的token中采样。值越小,截断越明显
    --repeat-penalty 浮点数,值越大,越能抑制重复内容
    --presence-penalty 浮点数,值越大,越鼓励模型讨论新话题
    --frequency-penalty 浮点数,值越大,越能减少相同词的反复出现

    常见经验组合:

    • 稳定输出:temp=0.2~0.5
    • 平衡模式:top-k=20~50,top-p=0.9~0.95
    • 创意模式:提高temp并放宽top-p

    3️⃣会话与模板系统

    这一部分决定模型如何理解对话格式与上下文结构,本质上是在规定输入内容的组织方式,构造成模型可解析的指令序列。

    -p "prompt"
    --system-prompt ""
    --reverse-prompt ""
    --jinja
    --chat-template-file <file>
    --reasoning off
    --color
    --log-disable
    
    参数 说明
    -p 字符串,初始提示词
    --system-prompt 字符串,设置系统级前置指令
    --reverse-prompt 字符串,遇到该内容时停止生成,用于控制多轮对话
    --jinja 布尔标志,启用Jinja聊天模板
    --chat-template-file 字符串,自定义聊天模板文件的路径
    --reasoning off 最新版关闭模型的思考输出。旧版需用--chat-template-kwargs '{"enable_thinking": false}' --jinja
    --color 布尔标志,启用彩色输出
    --log-disable 布尔标志,关闭日志输出

    其中--jinja对于LLM尤为重要,例如Qwen、Llama3等都依赖结构化的聊天模板chat template,否则容易出现格式错乱。

    2.2.2 推理与交互

    下面通过一系列示例,逐步演示如何使用llama-cli

    1️⃣简单推理测试

    最基础用法是直接输入prompt,然后生成回答结果:

    ./build/bin/llama-cli -m ./model/Qwen3.5-0.8B-Q4_K_M.gguf -p "hello world" -n 100
    
    • -m:指定本地模型文件
    • -p:初始提示词
    • -n 100:最多生成100个token

    直接运行上述命令会进入交互界面,按Ctrl+C退出。

    模型加载方式有两种:

    • 使用-hf Qwen/model表示从Hugging Face Hub获取模型文件
    • 使用-m xxx.gguf表示从本地路径加载模型文件

    实际使用过程中若出现异常,可通过调整生成及上下文相关参数进行优化调试。以下仅列举部分示例,QwQ-32B高效运行教程提供了更详细的解决方案:

    • 长文本重复:可增加--repeat-penalty 1.2~1.5
    • 上下文遗忘:由-c决定,例如-c 4096表示模型的记忆长度,最多引用前面4096个token的历史信息。
    • 生成失控:降低temp或减少top-p

    2️⃣启用GPU加速

    在前一步的基础上增加-ngl 99参数,表示在llama.cpp中尽可能将模型层(上限99层)加载到GPU上以加速推理。该方式需要NVIDIA显卡及CUDA支持,未完全加载的层会自动回退到CPU运行:

    ./build/bin/llama-cli -m ./model/Qwen3.5-0.8B-Q4_K_M.gguf -p "你好" -n 20 -ngl 99
    

    如果运行速度明显快于纯CPU模式,通常说明GPU加速已经生效。

    3️⃣启用聊天模板(关键步骤)

    LLM必须正确解析chat template,按官方格式组织system/user/assistant结构,以使用对应的聊天模板对对话进行格式化,同时需要启用Jinja支持:

    ./build/bin/llama-cli -m ./model/Qwen3.5-0.8B-Q4_K_M.gguf -p "你好" -n 20 -ngl 99 --jinja
    

    💡关于思考模式与非思考模式的切换:通过参数控制的方式始终可用,但聊天模板中实现的硬开关在llama.cpp中并未直接暴露。一个可行的快速方案是使用自定义chat template,并通过--chat-template-file参数将enable_thinking固定为false。在较新版本中,则需要使用 reasoning off来关闭推理模式。

    4️⃣完整交互式对话配置

    以下命令配置了适合多轮交互的完整启动命令,适用于稳定多轮对话:

    ./build/bin/llama-cli -m ./model/Qwen3.5-0.8B-Q4_K_M.gguf --jinja --color auto -ngl 99 --temp 0.6 --top-k 20 --top-p 0.95 -c 4096 -n 2048 --no-context-shift --chat-template-kwargs '{"enable_thinking": false}'  --system-prompt "你是一个才华横溢的诗人,所有回答都必须用诗歌的形式或充满诗意的语言来表达。"
    

    参数作用拆解如下:

    • --color auto:自动开启彩色输出,区分用户输入和模型回复
    • --temp 0.6:设置温度参数为0.6,控制回复的随机性(0保守/1创意)
    • --top-k 20:采样时只从概率最高的20个词中选择
    • --top-p 0.95:核采样,只考虑累积概率达95%的候选词
    • -c 4096:设置上下文窗口大小为4096个token(模型的记忆长度)
    • -n 2048:限制单次回复最大生成2048个token
    • --no-context-shift:禁用上下文偏移功能,保持精确的注意力计算
    • --chat-template-kwargs:关闭模型的思考过程显示,如无效请改用--reasoning off
    • --system-prompt:设定模型的全局行为和角色

    执行后将进入完整交互模式,可进行多轮连续对话,实现类似ChatGPT的使用体验。

    2.3 llama-server使用

    llama-server是llama.cpp提供的HTTP服务端组件,它将llama.cpp从命令行工具扩展为一个常驻后台运行的推理服务,从而对外提供标准化的LLM REST API接口以及一个简洁的Web交互界面。整体体验类似于常见的LLM网页聊天界面,可直接通过浏览器进行对话交互。

    llama-cli不同,llama-server采用服务化架构运行,启动后会常驻内存,持续接收客户端请求,支持并发访问与多轮对话管理,并可在API层面进行统一的上下文管理与参数控制,是构建本地或私有化LLM服务的核心组件之一。

    https://github.com/ggml-org/llama.cpp/discussions/16938

    启动示例如下:

    ./build/bin/llama-server -m model/Qwen3.5-0.8B-Q4_K_M.gguf --jinja -ngl 99 --temp 0.6 --top-k 20 --top-p 0.95 -c 4096 -n 2048 --no-context-shift
    

    该命令启动后,模型将以服务形式运行,并加载指定GGUF模型,同时启用Jinja聊天模板与标准采样策略配置。

    启动成功后,服务默认监听以下地址:

    • Web界面:http://localhost:8080/
    • OpenAI兼容API:http://localhost:8080/v1/

    其中:

    • Web界面用于可视化对话测试与调试
    • /v1/接口提供与OpenAI API风格兼容的调用方式,便于接入现有应用或框架

    对于端口与网络配置,可通过以下参数调整服务监听行为:

    • --host:绑定IP地址(如0.0.0.0用于局域网访问)
    • --port:指定端口号

    例如,将服务绑定到所有网络接口(0.0.0.0)并监听8081端口,使其可在局域网或远程设备上访问:

    --host 0.0.0.0 --port 8081
    

    3 Ollama快速入门

    3.1 环境准备

    Ollama是基于llama.cpp构建的LLM推理框架,集成了推理、量化与硬件加速能力。用户通过简单命令即可下载、运行和管理模型,支持文本生成、翻译、代码编写等任务。

    相较于侧重底层推理与硬件优化的llama.cpp,Ollama更强调开箱即用,适用于快速原型开发、本地AI助手和轻量级部署。支持Windows、Linux、macOS和Docker,无GPU也可运行模型,有GPU时推理性能更高。Ollama功能丰富,本节仅介绍基础用法,更多内容请参考官方文档:Ollama官方文档

    官方下载地址:Ollama下载。进入官方下载页面后,可根据所使用的操作系统选择对应安装包。下面以Linux环境为例说明安装流程。在需要长期运行模型或进行开发测试时,Linux通常是更常见的部署环境。

    在终端中执行以下安装脚本:

    curl -fsSL https://ollama.com/install.sh | bash
    

    部分环境可能需要追加sudo权限。如果下载速度较慢,可参考这篇文章中的方法进行优化:解决Ollama官方下载过慢的问题

    安装完成后,可通过以下命令检查版本信息:

    ollama --version
    

    若成功输出版本号,则表明安装已完成。

    通常情况下,安装脚本会自动完成Ollama服务注册并启动。若需要手动管理服务,可使用:

    sudo systemctl status ollama   # 查看服务状态
    sudo systemctl start ollama    # 启动服务
    sudo systemctl enable ollama   # 设置开机自启
    

    https://bishalkshah.com.np/blog/running-local-ai-agents-ollama-guide

    3.2 Ollama基本使用

    3.2.1 核心命令

    Ollama能够实现开箱即用,核心原因在于其内置官方模型仓库:Ollama模型库。所有模型均统一托管于远程仓库中。当运行某个模型时,系统会自动检查本地是否存在对应文件;若不存在,则自动下载并在完成后立即加载运行。

    这些模型大多来自开源生态,例如Meta的Llama系列、Mistral AI的Mistral系列,以及阿里云推出的Qwen系列等。Ollama会统一完成GGUF格式转换、默认推理参数配置以及聊天模板适配,从而实现直接运行。Ollama本身并不负责模型训练,而是作为模型分发与运行平台存在。关于Ollama的基本入门用法,可参考Ollama教程

    为实现快速调用,Ollama提供了一套完整的命令行工具,用于本地模型的下载、运行与管理,其基本格式如下:

    ollama <command> [args]
    

    可以通过以下命令查看Ollama支持的所有指令:

    ollama --help
    

    在实际使用中,常见操作主要包括模型拉取、运行、查看以及删除等。最核心的命令是:

    ollama run <model>
    

    该命令首次执行时会自动下载模型,随后进入交互式对话模式。在此模式下,可以直接输入问题与模型对话,结束时输入/bye或按Ctrl+D即可退出。因此,大多数场景下只需使用run这一个命令即可完成从下载到运行的完整流程。

    例如:

    ollama run qwen3.5:0.8b
    

    如果只需要执行一次推理,而不进入交互模式,可以使用:

    ollama generate <model> ""
    

    也可以从文件中读取prompt,将其作为单条用户输入发送给模型完成推理,并在输出结果后立即结束进程。

    ollama run <model> < input.txt
    

    3.2.2 交互模式常用命令

    进入交互界面后,操作对象已经不再是命令行,而是模型会话本身。此时可使用以下快捷指令:

    分类 命令 示例 功能说明
    参数设置 /set parameter ... /set parameter top_p 0.5 设置模型参数
    参数设置 /set system /set system 你是专家 设置系统提示词
    参数设置 /set format json /set format json 强制JSON输出
    参数设置 /set noformat /set noformat 关闭格式限制
    参数设置 /set verbose /set verbose 显示统计信息
    参数设置 /set quiet /set quiet 关闭统计信息
    参数设置 /set think /set think 显示思考过程
    参数设置 /set nothink /set nothink 隐藏思考过程
    信息查看 /show info /show info 查看模型详情
    信息查看 /show modelfile /show modelfile 查看模型配置
    信息查看 /show parameters /show parameters 查看当前参数
    信息查看 /show system /show system 查看系统提示词
    信息查看 /show template /show template 查看Prompt模板
    会话管理 /clear /clear 清空上下文
    会话管理 /bye /bye 退出会话
    帮助 /help /help 显示帮助信息

    除了直接运行模型,Ollama还可以查看模型的元数据和参数信息:

    ollama show <model>
    

    查看当前正在运行的模型及其状态:

    ollama ps
    

    如果希望只下载模型而不立即运行,可以使用:

    ollama pull <model>
    

    下载完成后,可通过以下命令查看本地已安装的模型:

    ollama list
    

    当模型不再需要时,可以使用以下命令将其删除以释放磁盘空间:

    ollama rm <model>
    

    关于本地存储,模型默认保存在以下目录中:

    cd ~/.ollama/models
    

    其目录结构通常如下:

    models/
    ├── blobs/
    ├── manifests/
    

    Ollama并不会直接保存完整的.gguf文件,而是将模型拆分为多个基于内容寻址的Blob数据块。这种设计能够支持断点续传、数据去重以及完整性校验,并在运行时根据manifests中的索引动态组装模型。

    https://docs.weaviate.io/weaviate/model-providers/anyscale

    3.2.3 Python SDK调用模型

    Ollama提供了Python SDK,可直接在本地调用模型实现文本生成、流式输出以及多轮对话。安装SDK并拉取模型:

    pip install ollama
    ollama pull qwen3.5:0.8b
    

    单轮对话

    最基础的用法是使用generate接口进行单轮文本生成,适用于简单问答或文本补全场景:

    import ollama
    
    response = ollama.generate(
        model="qwen3.5:0.8b",
        prompt="你能做什么?"
    )
    
    print(response["response"])
    

    若需要实时输出生成内容,可以启用流式模式。流式模式会逐块返回生成结果,更适合终端交互或Web前端展示场景:

    from ollama import chat
    
    stream = chat(
        model="qwen3.5:0.8b",
        messages=[{"role": "user", "content": "写一个Python冒泡代码"}],
        stream=True
    )
    
    for chunk in stream:
        print(chunk["message"]["content"], end="", flush=True)
    

    多轮对话

    对于需要上下文记忆的场景,可通过messages维护完整历史记录:

    from ollama import chat
    
    # 初始化对话历史(可包含系统设定)
    history = [
        {"role": "system", "content": "你是一个编程助手,请用中文回答"}
    ]
    
    # 第一轮:用户提问
    history.append({"role": "user", "content": "推荐一本适合初学Python编程的书"})
    response = chat(model="qwen3.5:0.8b", messages=history, think=False)
    print(response.message.content)
    
    # 将模型的回复加入历史
    history.append({"role": "assistant", "content": response.message.content})
    
    # 第二轮:基于历史继续提问
    history.append({"role": "user", "content": "这本书大概需要多久能学完?"})
    response = chat(model="qwen3.5:0.8b", messages=history, think=False)
    print(response.message.content)
    

    chat接口本身不保存上下文,每次请求都必须传入完整history。开发者需要自行维护对话列表,每轮把用户输入和模型回复追加进去,再在下一轮整体传回。通过列表管理对话,结构清晰直观,支持system角色设定,也便于调试和排查问题。

    3.3 Ollama自定义使用

    3.3.1 Modelfile配置

    基础配置

    在掌握模型下载与运行之后,可进一步通过Modelfile机制构建自定义模型,实现对模型行为、输出格式以及推理方式的长期控制。与一次性prompt不同,Modelfile会在模型运行阶段自动注入配置,因此更适合构建稳定、可复用的模型能力。关于Modelfile的详细介绍,见官方文档:Modelfile官方文档

    https://medium.com/@ctrlcvprogrammer/modelfile-the-solution-for-pre-instructed-model-6e496cd02d37

    首先创建一个Modelfile:

    touch Modelfile
    

    然后在文件中写入基础配置,例如:

    FROM qwen3.5:0.8b
    SYSTEM "回答必须以[分析]/[执行]开头,并用步骤1、步骤2输出;先结果;禁止废话"
    

    其中:

    • FROM用于指定基础模型;
    • SYSTEM用于定义长期生效的系统规则。

    完成基础配置后,可以直接构建模型:

    ollama create my-model -f ./Modelfile
    

    命令执行完成后,会生成一个名为my-model的自定义模型。此时可以直接运行:

    ollama run my-model
    

    输入任意问题,模型输出会自动遵循该配置规则。

    常用Modelfile指令如下:

    • FROM:指定基础模型或GGUF文件
    • SYSTEM:定义系统提示词
    • TEMPLATE:定义Prompt模板
    • PARAMETER:设置推理参数
    • ADAPTER:指定LoRA适配器
    • MESSAGE:提供Few-shot示例
    • REQUIRES:指定最低Ollama版本
    • LICENSE:声明许可证

    高级配置

    除基础系统提示词外,还可以进一步配置推理参数与输出结构,但是修改后需要重新构建模型并再次运行:

    FROM qwen3.5:0.8b
    
    SYSTEM """
    你是一个专业顾问,回答必须严格遵守:
    1. 只输出最终答案
    2. 不展示任何思考、推理、分析过程
    3. 禁止输出  或中间步骤
    4. 内容直接、简洁、有结论
    5. 总字数不超过150字
    
    固定输出格式:
    	结论:一句话核心答案
    
    	要点:
    	- 要点1
    	- 要点2
    	- 要点3
    
    	潜在问题:一句话最大潜在问题
    
    	总结:不超过两行
    """
    
    PARAMETER temperature 0.6
    PARAMETER top_p 0.8
    PARAMETER top_k 20
    PARAMETER num_ctx 4096
    PARAMETER repeat_penalty 1.5
    PARAMETER num_predict 1000
    
    TEMPLATE """{{ if .System }}{{ .System }}
    
    {{ end }}用户:{{ .Prompt }} 
    助手:"""
    

    Modelfile并非简单固化prompt,而是将零散的Prompt Engineering转化为结构化配置体系,这些部分共同构成完整的模型行为控制机制:

    • SYSTEM定义行为规则;
    • PARAMETER控制生成特性;
    • TEMPLATE决定输入输出结构;
    • ADAPTER用于扩展模型能力。

    3.3.2 导入自有模型

    如果希望在Ollama中使用已有模型文件,需要注意:Ollama不支持直接运行任意格式的模型文件,模型必须为GGUF格式。如果使用的是.pt.binsafetensors格式的文件,需要先转换为GGUF格式,可以使用llama.cpp提供的convert.pyconvert_hf_to_gguf.py工具进行转换。

    准备好GGUF模型文件后,在同一目录下创建Modelfile,声明模型来源,同时需要正确配置TEMPLATETEMPLATE用于定义用户、系统和助手消息的拼接方式,从而让模型能够按照训练时的对话格式正确理解输入。

    以下模板适用于Qwen3.5系列模型,完整模板说明可参考Qwen3.5 Ollama完整ChatML模板

    FROM ./mymodel.gguf
    
    TEMPLATE """
    {{- if .System }}
    <|im_start|>system
    {{ .System }}
    <|im_end|>
    {{- end }}
    
    {{- range .Messages }}
    <|im_start|>{{ .Role }}
    {{ .Content }}
    <|im_end|>
    {{- end }}
    
    <|im_start|>assistant
    
    """
    
    PARAMETER stop "<|im_end|>"
    PARAMETER stop "<|im_start|>"
    PARAMETER temperature 0.7
    

    随后执行:

    ollama create mymodel -f Modelfile
    

    命令执行成功后模型即完成注册,注册后使用ollama run mymodel运行模型,通过ollama list查看已注册模型列表。若输出类似mymodel xxx xxxGB,说明本地模型已成功接入并可正常使用。

    3.3.3 Ollama API

    Ollama核心是一个本地常驻服务,本质为HTTP API Server,默认监听地址为127.0.0.1:11434。所有模型加载、文本生成、上下文管理以及对话请求,均通过该服务统一处理。在使用ollama run运行模型时,Ollama会自动检查服务状态。若服务未启动,则自动在后台拉起服务进程,因此通常无需手动管理。

    在服务器部署、脚本调用或独立API服务场景下,也可以手动启动服务:

    ollama serve
    

    服务启动后,还可通过HTTP API进行模型调用。

    默认API地址:

    http://localhost:11434/api
    

    常用接口如下:

    • /api/generate:文本生成
    • /api/chat:对话接口(支持流式返回)
    • /api/pull:拉取模型
    • /api/tags:查询本地模型列表

    调用示例如下:

    curl http://localhost:11434/api/generate -d '{"model":"qwen3.5:0.8b","prompt":"hello"}'
    

    3.3.4 Ollama聊天界面

    Ollama负责本地模型的下载、管理和运行,支持命令行或API调用,但默认不提供网页聊天界面。如需浏览器中的对话体验,可以搭配OpenWebUI使用。OpenWebUI负责提供聊天窗口、历史记录、模型选择等界面功能,底层的模型推理仍然由Ollama完成。

    整体关系可以理解为:

    浏览器
      ↓
    OpenWebUI(聊天界面)
      ↓
    Ollama API( http://localhost:11434 )
      ↓
    本地LLM
    

    https://docs.openwebui.com/

    Ollama环境准备

    在使用OpenWebUI之前,需要先确保Ollama服务已启动:

    ollama serve
    

    Ollama默认监听地址为:

    http://localhost:11434
    

    可通过以下命令检查Ollama是否正常运行:

    curl http://localhost:11434/api/tags
    

    若能返回模型列表,说明Ollama服务已启动成功。

    安装并启动OpenWebUI

    可通过pip安装OpenWebUI:

    pip install open-webui
    

    安装完成后启动服务:

    open-webui serve
    

    启动成功后,在浏览器中访问:

    http://localhost:8080
    

    首次进入OpenWebUI时,需要创建一个本地管理员账户,该账户仅用于当前OpenWebUI系统的登录和管理。

    连接Ollama

    通常情况下,若Ollama和OpenWebUI运行在同一台电脑上,OpenWebUI会自动识别本机的Ollama服务。如果OpenWebUI没有自动识别,可以进入OpenWebUI的设置页面,手动填写Ollama地址:

    http://localhost:11434
    

    配置完成后,OpenWebUI即可调用Ollama中的本地模型。

    在OpenWebUI中选择模型

    进入OpenWebUI聊天页面后,可以在页面顶部或输入框附近找到模型选择框。如果Ollama本地已下载多个模型,例如:

    qwen3.5:0.8b
    llama3.1
    mistral
    

    这些模型会出现在OpenWebUI的模型列表中。使用时只需选择对应模型,然后输入问题即可。如果想更换模型,无需重启Ollama或OpenWebUI,直接在聊天页面的模型选择框中切换即可继续提问。如果某个模型不再使用,可以通过Ollama的rm命令删除。删除后刷新OpenWebUI页面,模型列表也会随之更新。

    4 参考

  • 相关阅读:
    进程的概念、组成、特征、组织
    《网络协议》07. 其他协议
    DirectX11 With Windows SDK--37 延迟渲染:光源剔除
    C++指针与引用(Pointers OR References)
    业内人士真心话:只会测试没有前途的,我慌了......
    Springboot毕设项目物业管理系统35n2kjava+VUE+Mybatis+Maven+Mysql+sprnig)
    RabbitMq启用TLS
    驱动开发day2
    Java异常try{}catch{}中的return机制
    微服务调用链路追踪
  • 原文地址:https://www.cnblogs.com/luohenyueji/p/20067008