使用llama.cpp在本地部署GGUF大模型:从零搭建私有AI推理API 这次我们来看一个能让你的本地电脑跑起大语言模型的开源方案llama.cpp。它不是一个具体的AI助手应用而是一个高效的C推理框架核心价值在于让你能在没有高端显卡的普通电脑上运行那些动辄数十亿参数的GGUF格式大模型。对于想低成本体验本地大模型、开发AI助手应用或者需要将模型能力集成到现有系统中的开发者来说这是一个绕不开的工具。它的核心特点非常直接纯CPU也能跑对GPU显存要求极低支持GGUF模型格式这是当前社区最流行的量化模型格式资源丰富提供HTTP API服务方便你将模型能力封装成接口供其他应用调用。这意味着你完全可以在自己的笔记本或台式机上部署一个私有的、可定制的AI大脑用于聊天、写作、编程辅助或数据分析整个过程完全离线数据不出本地。本文将带你完成从零开始使用llama.cpp对接本地GGUF大模型的全过程。我们会重点解决几个实际问题如何准备一个可运行的GGUF模型文件如何在Windows/Linux/macOS上编译或获取llama.cpp的可执行文件如何以服务器模式启动并暴露标准的HTTP API最后如何用Python或curl等工具调用这个API构建你自己的AI助手前端或集成到现有工作流中。无论你是想测试模型效果还是为下一步开发做准备这篇文章都能提供一条清晰的路径。1. 核心能力速览在深入部署细节前我们先通过一个表格快速了解llama.cpp的核心能力和门槛这有助于你判断它是否适合你的需求。能力项说明项目定位高性能的C大语言模型推理框架专注GGUF格式。核心优势极低的硬件门槛。优先支持CPU推理GPUCUDA、Metal为加速选项无需高端显卡。模型格式GGUF。这是llama.cpp主导的格式已成为社区量化模型的事实标准HuggingFace上有海量资源。显存/内存需求取决于模型参数量及量化等级。例如7B参数的Q4量化模型在纯CPU模式下约需4-6GB内存使用GPU层卸载可大幅降低内存占用。支持平台Windows, Linux, macOS (包括Apple Silicon)。启动方式主要通过命令行启动。可启动为交互式聊天CLI、HTTP API服务器或一次性推理任务。接口能力内置完善的HTTP API服务器(--server)提供OpenAI API兼容的聊天和补全端点便于集成。批量任务支持通过API并发处理请求服务器本身可处理队列。也可通过脚本循环调用API实现批量处理。适合场景1.本地开发与测试低成本验证模型效果。2.私有化部署对数据安全有要求的场景。3.边缘设备集成在资源受限的设备上运行AI能力。4.AI助手后端为自定义前端如聊天机器人、写作工具提供模型能力。2. 适用场景与使用边界了解一个工具能做什么、不能做什么比盲目开始更重要。llama.cpp最适合谁个人开发者与爱好者想在个人电脑上不花钱体验各种开源大模型。隐私敏感型应用开发者需要确保用户对话数据完全留在本地不经过任何第三方服务器。嵌入式或边缘计算开发者需要在算力有限的设备如工控机、某些服务器上集成语言模型。学习与研究AI推理的学生或研究人员希望深入理解模型加载、推理、量化的底层过程。它能解决什么问题低成本接入大模型为你自己的Python、Java、Go或Node.js应用提供一个本地的、类OpenAI的模型API。模型效果快速验证下载不同量化等级、不同参数的GGUF模型快速在本地测试其回答质量、推理速度和资源占用为项目选型提供依据。构建离线AI工具开发完全离线的文档总结工具、代码助手、个人知识库问答系统等。它的局限性是什么并非开箱即用的AI应用llama.cpp是“引擎”不是“汽车”。你需要自己准备模型、启动服务、开发或适配前端界面。功能相对基础主要提供文本生成补全和聊天的核心推理能力。复杂的多模态、语音、图像生成等功能需要结合其他工具链。性能与精度权衡量化模型会损失少量精度以换取速度和内存优势。最高精度的FP16模型对硬件要求依然很高。依赖社区生态模型文件需要从HuggingFace等社区平台下载其质量、安全性和合规性需自行甄别。合规与安全边界提醒模型版权确保你下载和使用的GGUF模型遵守其原始开源许可证如MIT, Apache 2.0。商用前务必核实。生成内容责任本地部署不代表生成内容不受约束。你需对基于该模型开发的应用所产生的内容负责避免生成有害、侵权或违法信息。数据安全虽然数据本地处理提升了隐私性但仍需做好服务器端的安全配置防止未授权的API访问。3. 环境准备与前置条件开始之前请确保你的系统满足以下基本条件。整个过程不强制需要GPU。操作系统Windows 10/11, Linux (如Ubuntu 20.04), 或 macOS (Intel/Apple Silicon)。本文命令以Linux/macOS的bash和Windows的PowerShell为例。内存RAM这是最重要的条件。建议至少16GB。运行7B模型至少需要4-6GB可用内存13B模型需要8-12GB更大模型依此类推。磁盘空间预留10-20GB空间用于存放llama.cpp编译产物和GGUF模型文件一个7B的Q4模型约4GB。编译环境可选如果你想从源码编译以获得最佳性能或特定功能如CUDA支持需要准备Linux/macOS:gcc/clang,cmake,git。Windows: Visual Studio 2019或更高版本的构建工具或使用MSYS2、WSL2环境。模型文件你需要提前下载一个GGUF格式的模型文件。这是整个教程的“燃料”。推荐从 Hugging Face 社区下载例如搜索“Qwen2.5-7B-Instruct-GGUF”或“Llama-3.2-3B-Instruct-GGUF”选择.gguf后缀的文件。4. 安装部署与启动方式你有两种主要方式获取llama.cpp直接下载预编译的二进制文件或者从源码编译。对于大多数只想快速上手的用户方案一下载二进制是最佳选择。4.1 方案一下载预编译二进制推荐这是最快捷的方式适合Windows、macOS和部分Linux用户。访问发布页面打开llama.cpp的GitHub仓库的 Releases 页面。选择对应版本找到最新的稳定版本如bXXXX。根据你的系统下载对应的压缩包Windows: 下载llama-bXXXX-bin-win-avx2-x64.zip(主流Intel/AMD CPU)。macOS (Intel): 下载llama-bXXXX-bin-macos-x64.zip。macOS (Apple Silicon/M系列): 下载llama-bXXXX-bin-macos-arm64.zip。Linux: 下载llama-bXXXX-bin-linux-x64.tar.xz。解压并放置模型将下载的压缩包解压到一个目录例如D:\llama.cpp或~/llama.cpp。将你下载的GGUF模型文件例如qwen2.5-7b-instruct-q4_k_m.gguf也放入此目录或单独的models/子目录下方便管理。4.2 方案二从源码编译如果你需要CUDA、Metal或特定优化或者想体验最新功能可以编译源码。# 1. 克隆仓库 git clone https://github.com/ggerganov/llama.cpp cd llama.cpp # 2. 编译 (Linux/macOS通用流程) # 基础CPU版本 make # 如果需要CUDA支持 (确保已安装CUDA Toolkit) # make LLAMA_CUDA1 # 如果需要macOS Metal加速 (Apple Silicon) # make LLAMA_METAL1 # 3. 编译完成后当前目录会生成 main 和 server 可执行文件。 # 在Windows下通常使用CMake GUI或Visual Studio打开项目进行编译。4.3 启动HTTP API服务器无论通过哪种方式获得可执行文件后启动API服务是关键一步。我们使用server程序。打开终端Windows用PowerShell或CMD进入你的llama.cpp目录。基本启动命令# Linux/macOS ./server -m ./models/qwen2.5-7b-instruct-q4_k_m.gguf -c 2048 --host 0.0.0.0 --port 8080 # Windows (PowerShell) .\server.exe -m .\models\qwen2.5-7b-instruct-q4_k_m.gguf -c 2048 --host 0.0.0.0 --port 8080参数解释-m 模型路径: 指定GGUF模型文件的路径。-c 2048: 设置上下文长度token数。根据模型能力设置常见为2048、4096、8192等。--host 0.0.0.0: 监听所有网络接口。如果只允许本机访问可改为127.0.0.1。--port 8080: 服务端口可自定义确保不被占用。高级启动选项按需添加-ngl 20: 将20个模型层卸载到GPUNVIDIA运行加速推理。数值越大GPU负载越重内存占用越低。-t 6: 设置使用的CPU线程数通常设为物理核心数。-b 512: 设置批处理大小token数影响吞吐量。--cont-batching: 启用连续批处理提升多请求并发时的效率。启动成功后终端会显示加载模型的进度条最后输出类似HTTP server listening on http://0.0.0.0:8080的信息。此时一个功能完整的模型API服务就已经在本地运行起来了。5. 功能测试与效果验证服务启动后我们通过几种方式来验证它是否工作正常并测试其核心功能。5.1 测试1使用内置的Web聊天界面最直观llama.cpp的server模式自带一个简单的Web UI。直接在浏览器中访问http://localhost:8080(如果你设置的host是0.0.0.0也可以用本机IP访问)。你会看到一个简洁的聊天界面。在底部的输入框发送消息模型会进行回复。这是最快速的验证方式可以直观感受模型的对话能力、响应速度。验证点页面是否能正常打开输入问题后如“你好请介绍一下你自己”模型是否能在几秒到十几秒内返回连贯的回答观察终端是否有推理过程的日志输出5.2 测试2使用cURL命令测试API关闭Web界面我们用更“工程化”的方式——直接调用API来测试。打开一个新的终端。测试聊天补全接口OpenAI兼容格式curl http://localhost:8080/v1/chat/completions \ -H Content-Type: application/json \ -d { model: gpt-3.5-turbo, messages: [ {role: system, content: 你是一个乐于助人的AI助手。}, {role: user, content: 用Python写一个快速排序函数并加上注释。} ], stream: false, max_tokens: 500 }参数解释model: 字段可任意填写llama.cpp的server默认不校验此字段但建议保持为模型名。messages: 对话历史system设置角色user是用户输入。stream:false表示非流式输出一次性返回全部结果。max_tokens: 限制生成的最大token数。预期输出你会收到一个JSON响应其中choices[0].message.content字段包含了模型生成的代码和注释。如果看到完整的Python函数说明API工作正常。5.3 测试3使用Python脚本进行集成测试在实际项目中我们通常用代码调用API。下面是一个Python示例。import requests import json # API服务器地址 API_BASE http://localhost:8080/v1 def test_chat_completion(): 测试聊天补全功能 url f{API_BASE}/chat/completions headers {Content-Type: application/json} payload { model: local-model, # 模型名server端不强制校验 messages: [ {role: user, content: 中国的首都是哪里} ], stream: False, max_tokens: 100 } try: response requests.post(url, headersheaders, datajson.dumps(payload), timeout30) response.raise_for_status() # 检查HTTP错误 result response.json() # 提取回复内容 reply result[choices][0][message][content] print(模型回复:, reply) print(本次消耗token数:, result.get(usage, {})) return True except requests.exceptions.RequestException as e: print(fAPI请求失败: {e}) return False except (KeyError, json.JSONDecodeError) as e: print(f解析响应失败: {e}) print(原始响应:, response.text) return False if __name__ __main__: success test_chat_completion() if success: print(✅ API连接与功能测试通过) else: print(❌ 测试失败请检查服务器状态和网络。)运行与验证确保你的Python环境已安装requests库 (pip install requests)。运行此脚本。观察输出。如果成功会打印出模型对“中国首都”问题的回答以及本次请求消耗的token数统计。5.4 测试4长文本与上下文测试测试模型是否能利用完整的上下文长度。def test_long_context(): 测试长上下文理解 url f{API_BASE}/chat/completions headers {Content-Type: application/json} # 构建一个长上下文对话 long_story 这是一个很长的故事开头 * 50 # 模拟长文本 messages [ {role: system, content: 你是一个故事总结者。}, {role: user, content: f{long_story}\n\n请用一句话总结上面的故事开头。} ] payload { model: local-model, messages: messages, stream: False, max_tokens: 50 } try: response requests.post(url, headersheaders, datajson.dumps(payload), timeout60) result response.json() summary result[choices][0][message][content] print(总结:, summary) # 关键验证回复是否与长故事开头相关如果回复是乱码或无关内容可能是上下文溢出或模型处理失败。 if len(summary.strip()) 5 and 故事 in summary: print(✅ 长上下文处理正常。) else: print(⚠️ 长上下文处理可能异常回复内容过短或无关联。) except Exception as e: print(f长文本测试失败: {e}) # 在主函数中调用 test_long_context()6. 接口API与批量任务llama.cpp的HTTP服务器实现了OpenAI API的部分兼容接口这极大方便了集成。我们来详细看看如何利用这些接口。6.1 核心API端点启动server后主要提供以下端点GET /: 根目录返回服务器基本信息。POST /v1/chat/completions:(最常用)用于聊天对话格式与OpenAI Chat API兼容。POST /v1/completions: 用于文本补全非对话模式。POST /v1/embeddings: 生成文本嵌入向量需要模型支持且编译时启用。GET /v1/models: 列出已加载的模型通常返回一个模拟的列表。6.2 构建一个简单的批量处理脚本假设你有一个文本文件questions.txt每行是一个问题你需要用模型批量回答并保存结果。import requests import json import time from concurrent.futures import ThreadPoolExecutor, as_completed API_BASE http://localhost:8080/v1 INPUT_FILE questions.txt OUTPUT_FILE answers.jsonl MAX_WORKERS 2 # 并发数根据服务器性能调整 def ask_model(question, question_id): 向模型提问单个问题 url f{API_BASE}/chat/completions payload { model: local-model, messages: [{role: user, content: question}], stream: False, max_tokens: 300, temperature: 0.7, } try: response requests.post(url, jsonpayload, timeout120) response.raise_for_status() result response.json() answer result[choices][0][message][content].strip() return { id: question_id, question: question, answer: answer, usage: result.get(usage, {}) } except Exception as e: print(f处理问题ID {question_id} 时出错: {e}) return { id: question_id, question: question, answer: fERROR: {str(e)}, usage: {} } def batch_process(): 批量处理问题 # 读取问题 with open(INPUT_FILE, r, encodingutf-8) as f: questions [line.strip() for line in f if line.strip()] print(f共读取到 {len(questions)} 个问题。) results [] # 使用线程池进行并发请求 with ThreadPoolExecutor(max_workersMAX_WORKERS) as executor: future_to_id { executor.submit(ask_model, q, idx): idx for idx, q in enumerate(questions) } for future in as_completed(future_to_id): q_id future_to_id[future] try: result future.result() results.append(result) print(f已完成问题 {q_id1}/{len(questions)}) except Exception as e: print(f问题 {q_id} 的未来对象出错: {e}) # 保存结果到JSON Lines格式 with open(OUTPUT_FILE, w, encodingutf-8) as f: for res in results: f.write(json.dumps(res, ensure_asciiFalse) \n) print(f批量处理完成结果已保存至 {OUTPUT_FILE}) # 打印简单统计 success sum(1 for r in results if not r[answer].startswith(ERROR)) print(f成功: {success}, 失败: {len(questions)-success}) if __name__ __main__: batch_process()脚本使用说明在同目录下创建questions.txt每行一个问题。根据服务器性能调整MAX_WORKERS并发过高可能导致服务器过载或OOM内存溢出。运行脚本结果将按行保存在answers.jsonl中便于后续分析。此脚本包含了简单的错误处理和进度提示适合生产环境下的基础批量任务。6.3 流式输出Streaming接口调用对于需要实时显示生成结果的场景如聊天界面可以使用流式接口。import requests import json def stream_chat_response(user_input): 调用流式聊天接口实时打印输出 url f{API_BASE}/chat/completions headers {Content-Type: application/json} payload { model: local-model, messages: [{role: user, content: user_input}], stream: True, # 关键参数开启流式 max_tokens: 500, } print(模型回复: , end, flushTrue) full_response try: with requests.post(url, headersheaders, jsonpayload, streamTrue, timeout60) as response: response.raise_for_status() for line in response.iter_lines(): if line: line line.decode(utf-8) if line.startswith(data: ): data line[6:] # 去掉 data: 前缀 if data [DONE]: break try: chunk json.loads(data) delta chunk[choices][0][delta] if content in delta: content delta[content] print(content, end, flushTrue) full_response content except json.JSONDecodeError: continue print() # 换行 return full_response except requests.exceptions.RequestException as e: print(f\n流式请求失败: {e}) return None # 调用示例 stream_chat_response(请写一首关于春天的五言绝句。)7. 资源占用与性能观察本地部署大模型监控资源占用是必不可少的环节。这能帮助你了解模型的“胃口”并优化部署参数。7.1 如何观察资源占用Linux/macOS: 在终端中使用htop、top或ps aux | grep server命令。Windows: 使用任务管理器查看“详细信息”选项卡中server.exe进程的“内存专用工作集”和GPU占用。启动服务器时观察启动server命令后终端首先会显示模型加载进度。加载完成后会打印模型的基本信息包括上下文大小、总参数、层数等。此时模型已驻留在内存中。记下此时的内存占用作为基础内存占用。推理时观察发送一个请求通过Web UI或API观察进程的内存和CPU使用率是否有瞬时飙升。流式生成时占用会持续到生成结束。7.2 影响性能的关键参数上下文长度 (-c): 设置越大模型能处理的对话历史或文档越长但会线性增加内存占用。请根据实际需要设置不要盲目设大。GPU层卸载 (-ngl): 这是最重要的性能调优参数。将模型层放到GPU上运行能极大加速推理。你可以尝试不同的值如10, 20, 40在终端使用nvidia-smi(Linux/Windows) 或Activity Monitor(macOS GPU History) 观察GPU显存占用和利用率找到一个速度和显存占用的平衡点。对于7B模型-ngl 20通常是个不错的起点。批处理大小 (-b): 增大此值可以提升在处理多个并发请求时的吞吐量但也会增加单次推理的内存峰值。对于单用户或低并发场景默认值或较小值即可。CPU线程数 (-t): 设置为你的物理核心数通常能获得较好性能。过多的线程可能因资源争用导致性能下降。7.3 一个典型的资源占用示例估算假设场景在16GB内存的笔记本上运行Qwen2.5-7B-Instruct-Q4_K_M.gguf模型。启动参数:./server -m model.gguf -c 2048 -ngl 20加载后内存占用: 约3-4 GB(模型权重加载)。GPU显存占用 (如果有NVIDIA GPU): 由于-ngl 20约2-3 GB显存被占用。处理一个1024 token的请求时峰值内存: 可能增加0.5-1 GB。总结: 在该配置下系统至少需要6-8 GB的可用内存RAM显存才能稳定运行。纯CPU模式(-ngl 0)则需要约5-6 GB内存但推理速度会慢很多。重要提示以上为估算值实际占用因模型、量化等级、上下文长度、请求内容差异很大。务必在你的实际环境中进行测试。7.4 性能优化建议从低量化等级开始: 首次尝试使用Q4_K_M或Q5_K_M在速度和精度间取得较好平衡。逐步增加GPU层数: 从-ngl 10开始测试逐步增加直到显存用满或性能不再显著提升。使用连续批处理: 如果编译的server支持启动时加入--cont-batching参数能更高效地处理突发并发请求。监控与日志: 关注server终端输出的每个请求的处理时间eval time这是衡量性能的直接指标。8. 常见问题与排查方法部署过程中遇到问题很正常。下表汇总了常见问题及其解决方法。问题现象可能原因排查方式解决方案启动server时提示error loading model1. 模型文件路径错误。2. 模型文件损坏或不完整。3. 模型格式不被支持非GGUF。1. 检查-m参数后的路径是否正确。2. 重新下载模型文件核对文件大小。3. 使用file命令或尝试用main程序加载模型看报错。1. 使用绝对路径或确认相对路径。2. 从HuggingFace等可信源重新下载。3. 确保下载的是.gguf文件。访问http://localhost:8080无响应1. server进程未成功启动。2. 防火墙或安全软件阻止了端口。3. 启动命令中host绑定为127.0.0.1却用IP访问。1. 检查终端是否有错误日志进程是否在运行 (ps aux | grep server)。2. 检查端口是否被占用 (netstat -an | grep 8080)。3. 确认启动命令中的--host参数。1. 根据终端错误信息解决。2. 更换端口如--port 8090或关闭占用程序。3. 确保访问的地址和端口与启动参数一致。API请求返回404 Not Found请求的API端点路径错误。检查curl或代码中的URL是否完整是否为http://localhost:8080/v1/chat/completions。修正URL确保包含正确的路径/v1/chat/completions。API请求返回500 Internal Server Error或model does not exist1. 请求负载JSON格式错误。2. 服务器内部推理出错。1. 检查发送的JSON数据是否符合API格式特别是messages字段。2. 查看server终端的详细错误日志。1. 使用json.dumps确保格式正确或使用Postman等工具测试。2. 根据服务器日志调整请求参数如减小max_tokens。推理速度极慢1. 完全使用CPU模式 (-ngl 0)。2. 上下文长度 (-c) 设置过大。3. 系统内存不足触发交换SWAP。1. 查看启动参数和终端日志确认是否使用了GPU。2. 使用htop/top观察CPU和内存使用率检查是否有大量SWAP使用。1. 尝试增加-ngl参数值利用GPU加速。2. 根据实际需要降低上下文长度。3. 关闭不必要的程序增加物理内存。生成的内容乱码或毫无意义1. 模型文件本身有问题。2. 上下文溢出或提示词格式不符合模型要求。1. 用同一个模型在Web UI中测试简单问题如“11?”。2. 检查请求中的messages格式某些模型需要特定的 im_start并发请求时服务器崩溃或OOM内存或显存不足。连续批处理可能积压了太多请求。观察崩溃前资源监控器的峰值。1. 减少并发数 (MAX_WORKERS)。2. 减小批处理大小 (-b)。3. 使用更低量化等级的模型。4. 升级硬件。Windows下编译或运行报错1. 缺少运行时库如vcruntime140.dll。2. 路径包含中文或特殊字符。1. 根据错误信息搜索缺失的DLL。2. 检查llama.cpp和模型文件的路径。1. 安装 Microsoft Visual C Redistributable 。2. 将项目放在纯英文路径下。9. 最佳实践与使用建议为了让你的本地AI助手运行得更稳定、更高效遵循以下实践会事半功倍。项目目录结构化my_ai_assistant/ ├── llama.cpp/ # llama.cpp 主程序目录 │ ├── server.exe (or ./server) │ └── ... ├── models/ # 存放所有GGUF模型 │ ├── qwen2.5-7b-instruct-q4_k_m.gguf │ └── ... ├── scripts/ # 工具脚本 │ ├── start_server.bat (or .sh) │ ├── api_test.py │ └── batch_process.py ├── logs/ # 服务器日志 ├── inputs/ # 批量任务输入文件 └── outputs/ # 批量任务输出结果清晰的目录结构便于管理和维护。使用启动脚本封装命令创建start_server.bat(Windows) 或start_server.sh(Linux/macOS) 来保存复杂的启动命令。# start_server.sh (Linux/macOS) #!/bin/bash cd /path/to/your/llama.cpp ./server -m ./models/qwen2.5-7b-instruct-q4_k_m.gguf \ -c 4096 \ -ngl 24 \ -t 8 \ --host 127.0.0.1 \ --port 8080 \ --cont-batchingREM start_server.bat (Windows) echo off cd /d D:\llama.cpp server.exe -m models\qwen2.5-7b-instruct-q4_k_m.gguf -c 4096 -ngl 24 -t 8 --host 127.0.0.1 --port 8080 --cont-batching pause双击脚本即可启动避免每次输入长命令。模型选择策略初次尝试选择参数量较小如3B、7B、量化等级适中Q4_K_M的指令微调模型Instruct这类模型对话效果好资源需求低。生产验证根据任务复杂度升级到13B、34B甚至更大模型并对比不同量化等级Q4, Q5, Q6, Q8的效果损失。来源可靠优先从HuggingFace上官方或高星仓库下载模型。API集成安全绑定本地地址除非必要启动server时使用--host 127.0.0.1仅允许本机访问。使用反向代理若需对外提供服务务必使用Nginx/Apache等反向代理并配置身份验证、速率限制和SSL加密。输入过滤在你的应用层对用户输入进行长度、内容安全检查防止恶意提示词攻击。效果评估与迭代建立一个小型测试集包含你的典型问题。每次更换模型或参数后用测试集进行效果对比。记录响应时间、答案质量和资源占用为最终选型提供数据支持。通过llama.cpp部署本地大模型你获得的是一个高度可控、完全私有的AI推理后端。它的价值不在于提供一个炫酷的界面而在于为你打开了低成本接入和定制大模型能力的大门。你可以基于这个稳定的API去构建任何你想要的AI应用无论是自动化脚本、智能客服原型还是个人写作伙伴数据安全和定制自由都掌握在你手中。接下来你可以探索更高级的用法例如结合LangChain构建复杂的AI链或者尝试微调GGUF模型以适应特定领域。本地AI的世界从这里才刚刚开始。