学术工具 / 本地部署大模型

在本机部署大模型

把模型装在自己的电脑上跑:论文内容不出你的机器,也不消耗平台积分。 这一页按最常见的两种电脑写了完整步骤——先下载两样东西,再用一个脚本把它跑起来, 最后回论文助手点一下「检测本机服务」。全程大约 30–60 分钟,大头是下载时间。

开始前请先看这一段。 本地模型的速度和质量完全取决于你的电脑。它适合离线润色、改写、摘要、翻译这类一段一段的活; 长文档评审、多步工具调用、联网检索请继续用平台托管模型。 装不进显存不是失败,只是会变慢——这不需要你换硬件,也不需要你调什么神秘参数。

1先弄明白:我们在装什么

只需要理解三样东西的关系,后面每一步都会说得通:

东西是什么打个比方
llama-server.exe 推理程序。从 llama.cpp 官方发布页下载压缩包,解压就有 播放器
*.gguf 文件 模型权重,几个 GB 大小,从 Hugging Face 下载 影片文件
论文助手 指挥播放器的那个"遥控器" 遥控器

所谓"部署",就是让播放器指着一个影片文件开着,在本机监听一个网址,例如 http://127.0.0.1:8080/v1。论文助手连的就是这个网址。 127.0.0.1 的意思是只有你这台电脑能访问,隔壁宿舍连不上——这正是我们要的效果。

论文助手不会替你下载、安装、启动或关闭任何模型程序。 播放器是你自己开的,关掉那个窗口服务就停了。应用只会告诉你"连不上",不会偷偷去重启或修改你的服务。

2判断你的电脑属于哪一种(2 分钟)

先看一眼自己的机器,然后决定走 A 路还是 B 路。

  1. 按 Ctrl + Shift + Esc 打开任务管理器 → 点性能标签。 左侧列表里有没有一项叫 GPU、并且名字写着 NVIDIA GeForce RTX / GTX? 只有 Intel UHD / Iris / AMD Radeon Graphics 这类的是核显,按"没有独显"算。
  2. 有独显的话,看同一个面板右上方的「GPU 内存」/「专用显存」是多少 GB; 再点左侧内存,看右上方「已安装」是多少 GB。

A 路 有 NVIDIA 独显,显存 6 GB 以上

RTX 3060 / 4060 / 4070 / 5060 这一大票游戏本和台式机都在这条线上。

建议模型:8B 量化版(约 5 GB),润色、改写、摘要都跟得上。

显存 12 GB 以上可以试 14B;想上 27B 请看进阶页。

B 路 没有独显(核显),内存 16 GB 以上

普通办公本、轻薄本,也就是没有独立显卡的那一大半机器。

建议模型:4B 量化版(约 2.5 GB);内存只有 8 GB 就选 1.7B(约 1.2 GB)。

能做什么:短句改写、翻译、摘要。出字明显慢,一次别喂太多内容。

你的机器走哪条建议模型上下文 -c真实体验
显存 12 GB 以上A8B 轻松,14B 可用8192–16384 日常润色、长摘要,等待感不明显
显存 6–10 GBA8B4096–8192 8B 顺畅;硬塞 14B 会溢出到内存,明显变慢
核显 + 16 GB 内存B4B4096 几十 token 等若干秒,适合不着急的任务
核显 + 8 GB 内存B1.7B2048–4096 只建议试水。这种机器上继续用平台托管模型更省心

顺带一提:论文助手的「模型服务设置 → 🔌 我的模型服务(自定义)→ ① 本机部署」里 已经写着你本机的实测内存 / 显卡 / 建议上下文,可以拿它对照这张表,不用自己算。

怎么读模型文件名?例如 Qwen3-8B-Q4_K_M.gguf:8B 是参数量(越大越聪明也越慢), Q4_K_M 是压缩程度(数字越低文件越小、越省内存,质量略降)。 新手一律选 Q4_K_M,它是质量和体积最稳的折中,别在 Q2/Q8 上纠结。

3下载两样东西

第 1 样:推理程序(llama.cpp)

  1. 打开 https://github.com/ggml-org/llama.cpp/releases,点最上面那条 Latest 发布,展开 Assets。 GitHub 国内可达性一般,需要代理或镜像请自行准备——我们不提供自建下载源。
  2. 按你的路线选一个压缩包:
    • A 路(有 N 卡):先按 Win + R 输入 cmd 回车,敲一行
      nvidia-smi
      看表头右侧的 CUDA Version: xx.x(这是驱动支持的上限,以它为准): ≥ 12.4 就下 llama-xxxxx-bin-win-cuda-12.4-x64.zip,≥ 13.3 可以下 13.3 那个。 同时必须一起下配套的 cudart-llama-bin-win-cuda-x-x64.zip,少了它一定报缺 dll。 完全没有 nvidia-smi(或它报错)就按 B 路下 CPU 包。
    • B 路(没独显):下 llama-xxxxx-bin-win-cpu-x64.zip,只有几十 MB。
  3. 解压到一个固定目录,不要让 exe 和 dll 分家(必须在同一个目录才加载得到):
    D:\llm\bin\        ← llama-server.exe 和一堆 ggml-*.dll、cudart64_*.dll 都放这里

第 2 样:模型权重(.gguf)

  1. 打开 Hugging Face;国内可用镜像 https://hf-mirror.com。
  2. 搜 Qwen3-8B-GGUF(A 路)或 Qwen3-4B-GGUF(B 路)。 任意带这个目录的仓库都行,进去点 Files and versions 标签。
  3. 只下载一个文件,不要整仓库拉(一个仓库里躺着十几个版本,全拉会下几十 GB):
    • A 路:Qwen3-8B-Q4_K_M.gguf(约 5 GB)
    • B 路:Qwen3-4B-Q4_K_M.gguf(约 2.5 GB);8 GB 内存选 Qwen3-1.7B-Q4_K_M.gguf
    文件名右侧有个下载小图标,点它即可;用命令行工具下载也一样。
  4. 放到统一目录:
    D:\llm\models\Qwen3-8B-Q4_K_M.gguf
为什么要统一目录?因为下一节的脚本会问你这两个文件放在哪。 路径其实随你定,只是越短越不容易打错,以后换模型也只用改一个文件名。

4用脚本检查并启动(推荐,不用自己拼命令)

这个脚本只做四件事,不下载任何东西、不修改你的文件、只监听 127.0.0.1:

  1. 读你的显卡和内存,算出该用的参数;
  2. 检查你填的 exe 和模型路径是否真的存在、配套 dll 齐不齐、模型是不是明显装不进显存;
  3. 检查端口有没有被本机别的程序占了;
  4. 打印完整启动命令,你确认后就把服务开起来。

4.1 保存并运行

  1. 把下面整段代码复制进记事本,另存为 D:\llm\start-local.ps1。 保存时两处要注意:「保存类型」选所有文件(否则会存成 start-local.ps1.txt); 右下角「编码」选 UTF-8(带 BOM),没有这一项就选 ANSI。 选错会得到一堆看不懂的乱码报错,这是 Windows PowerShell 读文件的老毛病,和你的操作无关。
  2. 打开 PowerShell,敲这一行运行(只对这次运行临时放行脚本,不改系统设置):
    powershell -ExecutionPolicy Bypass -Command "iex (Get-Content -Raw -Encoding UTF8 'D:\llm\start-local.ps1')"
    不建议用"右键 → 用 PowerShell 运行",因为一旦报错,窗口会一闪而过,你根本看不到原因。
# start-local.ps1 —— 检查硬件与文件,然后启动本机推理服务。不做任何下载。
$ErrorActionPreference = 'Stop'

function Ask-Path($prompt) { (Read-Host $prompt).Trim().Trim('"') }   # 兼容"复制为路径"带来的引号

function Test-Port($p) {
    try { $c = New-Object Net.Sockets.TcpClient; $c.Connect('127.0.0.1', $p); $c.Close(); return $true }
    catch { return $false }
}

Write-Host ''
Write-Host '== 本地推理服务启动助手 ==' -ForegroundColor Cyan

# 1) 读硬件
$os = Get-CimInstance Win32_OperatingSystem
$ramGB = [math]::Round($os.TotalVisibleMemorySize / 1MB, 1)

$vramGB = 0
$gpuName = ''
$nvsmi = Get-Command nvidia-smi -ErrorAction SilentlyContinue
if ($nvsmi) {
    $nv = & $nvsmi.Source --query-gpu=name,memory.total --format=csv,noheader,nounits 2>$null
    if ($LASTEXITCODE -eq 0 -and $nv) {
        $f = "$($nv | Select-Object -First 1)" -split ','
        $gpuName = $f[0].Trim()
        $vramGB = [math]::Round([double]$f[1].Trim() / 1024, 1)
    }
}
if (-not $gpuName) {
    $g = Get-CimInstance Win32_VideoController | Select-Object -First 1
    if ($g) { $gpuName = $g.Name }
}
Write-Host ("内存 {0} GB · 显卡 {1} · 显存 {2} GB" -f $ramGB, $gpuName, $vramGB)

$hasGpu = $vramGB -ge 1
$ngl = if ($hasGpu) { 99 } else { 0 }
$ctx = if ($vramGB -ge 12) { 16384 } elseif ($vramGB -ge 6) { 8192 } elseif ($hasGpu) { 4096 } elseif ($ramGB -ge 16) { 4096 } else { 2048 }
Write-Host ("按这台机器建议:-ngl {0} · -c {1}" -f $ngl, $ctx) -ForegroundColor DarkGray

# 2) 检查文件
$exe = Ask-Path 'llama-server.exe 的完整路径(资源管理器里 Shift+右键 exe → 复制为路径)'
$model = Ask-Path '模型 .gguf 的完整路径'
if (-not (Test-Path $exe))   { Write-Host "找不到程序:$exe" -ForegroundColor Red; exit 1 }
if (-not (Test-Path $model)) { Write-Host "找不到模型:$model" -ForegroundColor Red; exit 1 }

$binDir = Split-Path $exe -Parent
if (-not (Get-ChildItem $binDir -Filter 'ggml-*.dll' -File)) {
    Write-Host "这个目录里没有 ggml-*.dll,说明压缩包没有全部解压到一起:$binDir" -ForegroundColor Red
    exit 1
}
if ($hasGpu -and -not (Get-ChildItem $binDir -Filter 'ggml-cuda.dll' -File)) {
    Write-Host '目录里没有 ggml-cuda.dll,这个压缩包其实是 CPU 版;NVIDIA 显卡请改用 win-cuda-x64 那个包。' -ForegroundColor Yellow
}
if ($hasGpu -and -not (Get-ChildItem $binDir -Filter 'cudart64_*.dll' -File)) {
    Write-Host '如果启动时报缺 cudart64_*.dll,把配套的 cudart-llama-bin-win-cuda-*.zip 也解压进这个目录即可;本机已装完整 CUDA 时可以忽略这条。' -ForegroundColor DarkGray
}

$modelGB = [math]::Round((Get-Item $model).Length / 1GB, 1)
Write-Host ("模型 {0} GB" -f $modelGB) -ForegroundColor DarkGray
if ($hasGpu -and $modelGB -gt ($vramGB * 0.85)) {
    Write-Host ("模型比显存({0} GB)大,多出的层会留在内存执行,速度会明显下降。这是物理限制,不是配置错误。" -f $vramGB) -ForegroundColor Yellow
}
if ((-not $hasGpu) -and $modelGB -gt ($ramGB * 0.6)) {
    Write-Host ("内存只有 {0} GB,模型 {1} GB 加上运行占用很可能不够,建议换更小的模型。" -f $ramGB, $modelGB) -ForegroundColor Yellow
}

# 3) 检查端口:先看 8080 上跑的是不是"已经能用的同一个服务"
$port = 8080
if (Test-Port $port) {
    $isOpenAi = $false
    try {
        $r = Invoke-RestMethod -Uri "http://127.0.0.1:$port/v1/models" -TimeoutSec 5
        if ($r.data) { $isOpenAi = $true }
    } catch {
        $code = 0
        if ($_.Exception.Response) { $code = [int]$_.Exception.Response.StatusCode }
        if ($code -eq 401 -or $code -eq 403) { $isOpenAi = $true }   # 要求密钥,说明是 OpenAI 兼容服务
        elseif ($code -eq 0) { Write-Host '(8080 上那个程序几秒内没回话,可能正忙)' -ForegroundColor DarkGray }
    }

    if ($isOpenAi) {
        Write-Host ''
        Write-Host '127.0.0.1:8080 上已经有一个 OpenAI 兼容服务在跑了 —— 那多半就是你之前起的那个,不用再开第二个。' -ForegroundColor Green
        Write-Host '直接回论文助手:模型服务设置 → 🔌 我的模型服务(自定义)→ ① 本机部署 → 点「检测本机服务」。' -ForegroundColor Green
        Write-Host '想确认是谁在监听这一行端口: netstat -ano | findstr :8080 (最后一列 PID 拿到任务管理器"详细信息"里对名字)' -ForegroundColor DarkGray
        exit 0
    }

    $port = 18080
    Write-Host "127.0.0.1:8080 被本机别的程序占着(它没给出模型清单),本次改用 $port。" -ForegroundColor Yellow
    Write-Host '  Docker / WSL 经常成段转发 8080、8081,所以这里跳到一个明显不在它们区间里的端口。' -ForegroundColor DarkGray
}

# 4) 组装并执行
$argList = @('-m', $model, '--host', '127.0.0.1', '--port', "$port", '-ngl', "$ngl", '-c', "$ctx", '--jinja')

$key = Read-Host '要不要给服务加访问密钥?直接回车=不加(只监听本机时通常不用加)'
if ($key) { $argList += @('--api-key', $key.Trim()) }   # 只用于本次运行,不会写进脚本文件

Write-Host ''
Write-Host ('即将执行: llama-server.exe ' + ($argList -join ' ')) -ForegroundColor Green
Write-Host '这个窗口就是服务本身,要一直开着;关掉窗口 = 服务停止。' -ForegroundColor DarkGray
if ((Read-Host '现在开始吗?(Y/n)') -match '^[nN]') { exit 0 }

Set-Location $binDir
& $exe @argList
看到什么算成功?脚本跑到底之后,最后会出现类似 server: listening on 127.0.0.1:8080 的行,并且窗口停在这里不动了——服务就在跑了。 第一次载入权重可能要几十秒到几分钟(模型越大越久),这期间窗口像是卡住,是正常的,别关窗口。
脚本阶段常见的三种报错:
  • 找不到程序 / 找不到模型:路径打错了,或只复制了目录没带文件名。 最稳的做法是在资源管理器里 Shift + 右键那个文件 → 复制为路径,直接粘贴。
  • 窗口一闪就没:那是有报错。请用上面那条 powershell -ExecutionPolicy Bypass -Command "iex (Get-Content ...)" 在已打开的窗口里跑,报错才看得见。
  • 报一堆乱码语法错误:脚本存成了不带 BOM 的 UTF-8。重新按上面第 1 步选对编码, 或者直接用第 2 步那条带 -Encoding UTF8 的命令运行。
  • 缺 cudart64_13.dll 一类:CUDA 主包和配套的 cudart-llama-bin-... 包 必须解压到同一个目录;如果你的显卡其实跑不了 CUDA,就退回 CPU 包(会慢)。

4.2 想自己敲命令也行(不用脚本)

必须在 llama-server.exe 所在目录里执行,否则同目录的 ggml-*.dll 加载不了:

cd D:\llm\bin

.\llama-server.exe `
  -m "D:\llm\models\Qwen3-8B-Q4_K_M.gguf" `
  --host 127.0.0.1 `
  --port 8080 `
  -ngl 99 `
  -c 8192 `
  --jinja

三个参数记这点就够:-ngl 99 = 能放显存的全放显存(没有独显就写 -ngl 0); -c = 一次能看多少内容;--jinja = 打开工具调用能力,模型本身不支持时它也不报错、只是用不上。

4.3 验证服务活着

另开一个 PowerShell 窗口(原来那个是服务,别关):

curl http://127.0.0.1:8080/health
curl http://127.0.0.1:8080/v1/models
第一条返回 ok 或空响应、第二条返回一段带模型名的 JSON,就说明服务真的起来了。 如果你加过密钥,第二条要带 Key 才回 JSON,这属于正常现象。

5不想碰命令行:用带图形界面的工具

Ollama 和 LM Studio 会把"下模型 + 起服务"都替你点掉,最省事,代价是模型和参数不如 llama-server 可控。 这三个工具选一个就够,不要同时装一堆再互相排查。论文助手连它们的方式完全一样。

Ollama 命令行最简

  1. 到 https://ollama.com/download 下载 Windows 版并安装。
  2. 打开 PowerShell 拉一个模型(8 GB 内存的本子把 8b 换成 1.7b):
    ollama pull qwen3:8b
    
    # 冒烟测试:能正常出字就说明服务没问题
    ollama run qwen3:8b "用一句话解释什么是混合方法研究"
  3. 把上下文窗口设够。Ollama 默认窗口很小,不设的话长文会被反复截断, 论文助手里的 Agent 类功能会直接不可用。新建一个 Modelfile:
    # D:\llm\Modelfile 内容:
    FROM qwen3:8b
    PARAMETER num_ctx 8192
    PARAMETER temperature 0.5
    
    # 起一个带别名的模型,以后一直用它
    ollama create qwen3-8b-ctx -f Modelfile
  4. 验证(应返回一段 JSON):
    curl http://127.0.0.1:11434/v1/models
    论文助手里对应的地址是 http://127.0.0.1:11434/v1。

LM Studio 有图形界面

  1. 到 https://lmstudio.ai 下载安装。
  2. 在应用里搜索模型并下载(选 GGUF、8B 以内的量化版本)。
  3. 左侧 Developer / Server 面板点 Start Server,确认监听 127.0.0.1:1234。
  4. 验证:
    curl http://127.0.0.1:1234/v1/models
    论文助手里对应的地址是 http://127.0.0.1:1234/v1。
端口被别的程序占了怎么办? 8080 和 1234 都是开发常用端口,本机跑着 PHP / Node 服务时很容易撞车, Docker Desktop 也常常占着 8080(它会往 0.0.0.0 做端口转发)。 症状是:端口是通的,但 /v1/models 返回的是一段 HTML 报错页而不是一段 JSON。 想知道是谁占的,敲这一行,再拿最后那列 PID 到任务管理器的「详细信息」里对名字:
netstat -ano | findstr :8080
解决办法就是换端口:脚本发现 8080 上不是 OpenAI 兼容服务时会自动改用 18080 (Docker / WSL 常成段转发 8080、8081,所以避开这一片);Ollama 设环境变量 OLLAMA_HOST=127.0.0.1:11435;LM Studio 在服务面板直接改端口; llama-server 写 --port 18080。换了端口,论文助手里填的地址要跟着改。

6回论文助手里连上它

  1. 打开论文助手 → 首页「API设置」→ 页面上方「模型来源」,选 🔌 我的模型服务(自定义)。
  2. 点「① 本机部署」里的 🔍 检测本机服务。应用只会去 127.0.0.1 上探这三个端口: 8080(llama-server)、11434(Ollama)、1234(LM Studio)。 命中后会自动登记进「② 已配置的服务」并设为使用中,不消耗平台积分。
  3. 如果你的服务在别的端口上(比如脚本换成了 18080):点 + 新增服务,服务地址填 http://127.0.0.1:18080/v1,模型名点「检测连通与能力」自动带出, 保存后「设为当前服务」。本机服务和远程服务在列表里是同一类东西,只是地址一个在 127.0.0.1、一个不是。
能力是实测出来的,不是你勾出来的。 连上以后论文助手会在后台做一次真实请求,把工具调用 / 图片输入 / 思考输出 / 上下文长度 实测回填到设置页。所以小模型上显示"该端点未探测到工具调用能力"是正常的—— 它只能做纯文本的改写与摘要,联网检索、写文件、多步 Agent 那类功能在这个来源下不可用。 结论可以随时手动覆盖,但请以实测为准,否则只会在真正调用时才失败。 第一次连接会等得久,因为那本身就是一次生成。

7连不上时,三种提示分别是什么意思

论文助手说真实原因该怎么做
该端口要求密钥 你启动时加了 --api-key。llama.cpp 会保护除 /health 以外的所有接口, 没带 Key 的请求一律回 401 Invalid API Key——服务是活着的 在「③ 服务详情」或「+新增服务」的密钥框里填同一个 Key 再保存。 应用会同时用 Authorization: Bearer 和 x-api-key 两种请求头发出去
端口开着,但几秒内没回应 本地模型一次只处理一个请求,正在长时间生成时 /v1/models 也得排队 等它空闲再点一次。已经登记好的服务不受影响,可以照常继续用
在监听,但不是 OpenAI 兼容接口 这个端口被本机别的程序占了(PHP / Node 服务最常占 8080、1234) 给推理服务换个端口,再在「+新增服务」里手填新地址

还有一条通用排查顺序:先在浏览器或 curl 里确认 http://127.0.0.1:端口/v1/models 能返回 JSON,再回论文助手点检测。 网页上都连不通,应用里一定也连不通,问题在服务那边。

8安全与隐私(请务必看完)

9常见问题

很慢 / 一直超时

首次载入权重和建 CUDA graph 很慢,大模型可达数分钟,之后会快很多。 持续很慢通常是显存装不下、多出的层留在内存逐层执行——这属于物理限制, 真正有效的只有两件事:换更小的模型、把 -c 调小, 再顺手关掉占显存的程序(开了硬加速的浏览器、游戏、其它推理工具)。

输出乱码 / 反复说同一句话

本地端点的默认采样温度经常偏高。把温度控制在 0.3–0.7 (llama-server 加 --temp 0.5,Ollama 在 Modelfile 里写 PARAMETER temperature 0.5), 或换一个量化更保守的文件。如果你在用低比特模型,还要先确认没踩到 进阶页第 1 节写的格式坑。

上下文到底该设多大

上下文越大,显存/内存占用越高(KV 缓存按 token 线性增长),并不会更快。 按第 2 节表格的建议起步就行。真的超窗时,论文助手会读到端点上报的真实窗口并自动收紧重试, 同时提示你调大 -c 或改用平台托管模型。

为什么论文助手里的某些功能在这个模型下用不了

取决于模型本身,不是软件坏了。想要工具调用 / 图片输入 / 更强的长文能力, 就选带 agent 能力的模型(如 Qwen3 系列)并确保加 --jinja; 小尺寸模型基本只能做纯文本改写与摘要。

关掉服务、重启电脑之后,还要重新配置吗

不用。论文助手里的服务配置会一直留着,你只需要重新把服务起起来(再跑一次脚本), 然后回设置页点「检测本机服务」,或者直接切到那个已登记的服务。

能不能只试一次,看看效果再决定

可以。按 B 路下最小的 1.7B(约 1.2 GB)+ CPU 包(几十 MB),跑通一遍流程只要十几分钟, 不喜欢就删掉 D:\llm,系统里不会留下任何服务或后台进程。

10进阶与更多模型

本页教的是最普通的两种电脑 + 标准 GGUF 模型。显存不大却想要更大参数量的话,可以看低比特模型; 后续新增值得推荐的开源本地模型(新的量化格式、新的小显存友好模型)会一页一个持续加进这个系列, 不需要你重装论文助手。

页面内容最后核对时间:2026-10-21。涉及的下载地址、端口与参数均来自各工具官方发布页与其仓库文档, 版本更新后可能变化,请以官方说明为准。论文助手不托管、不分发任何模型权重与第三方二进制,也不自建下载源; 页面上的脚本只是把你本机的命令封装了一遍,是否运行完全由你决定。