本文档概述了 llama.cpp 中的 HTTP 服务器组件,它允许用户通过 REST API 接口与 LLaMA 模型进行交互。该服务器使应用程序无需直接集成 llama.cpp 库即可进行文本补全、聊天、嵌入和其他操作的请求。
llama.cpp 服务器是一个快速、轻量级的 HTTP 服务器,使用 httplib 和 nlohmann 构建而成。它提供了一种通过网络暴露 LLM 推理能力的方式。
主要功能
来源:examples/server/README.md3-18
服务器采用基于任务的架构,并带有用于并发请求处理的插槽系统。当请求到达时,它会被转换为一个任务并放入队列。可用的处理插槽会拾取任务,使用加载的模型进行推理,并返回结果。
来源:examples/server/server.cpp45-80 examples/server/server.cpp189-216
服务器在两种状态之一运行
SERVER_STATE_LOADING_MODEL:服务器正在启动,模型尚未完全加载SERVER_STATE_READY:服务器已准备就绪,模型已加载来源:examples/server/server.cpp54-57
任务系统负责管理请求。每个传入的请求都会被转换为一个具有特定类型的 server_task
SERVER_TASK_TYPE_COMPLETION:文本生成/补全SERVER_TASK_TYPE_EMBEDDING:为文本生成嵌入SERVER_TASK_TYPE_RERANK:重排提供的段落SERVER_TASK_TYPE_INFILL:填充前缀和后缀之间的文本SERVER_TASK_TYPE_CANCEL:取消正在运行的任务SERVER_TASK_TYPE_NEXT_RESPONSE:请求流式响应的下一部分SERVER_TASK_TYPE_METRICS:请求内部指标SERVER_TASK_TYPE_SLOT_SAVE:将插槽状态保存到磁盘SERVER_TASK_TYPE_SLOT_RESTORE:从磁盘恢复插槽状态SERVER_TASK_TYPE_SLOT_ERASE:清除插槽状态SERVER_TASK_TYPE_SET_LORA:应用 LoRA 适配器来源:examples/server/server.cpp59-70 examples/server/server.cpp189-217
插槽系统是处理实际推理的核心组件。每个插槽代表一个可以并发处理任务的独立处理器。插槽有自己的状态和生命周期。
插槽状态
SLOT_STATE_IDLE:插槽可用于新任务SLOT_STATE_STARTED:插槽正在准备处理任务SLOT_STATE_PROCESSING_PROMPT:插槽正在编码提示SLOT_STATE_DONE_PROMPT:提示编码已完成SLOT_STATE_GENERATING:插槽正在生成 token来源:examples/server/server.cpp46-52
每个插槽都有控制参数(slot_params),例如:
来源:examples/server/server.cpp91-187
服务器提供了一整套 API 端点
| 端点 | 描述 | 兼容 OpenAI |
|---|---|---|
/completion | 从提示生成文本补全 | 否 |
/chat/completions | 从消息历史生成聊天补全 | 是 |
/embedding | 为输入文本生成嵌入 | 是 |
/infill | 填充前缀和后缀之间的文本 | 否 |
/tokenize | 将文本转换为 token ID | 否 |
/detokenize | 将 token ID 转换为文本 | 否 |
/metrics | 兼容 Prometheus 的指标端点 | 否 |
/health | 服务器健康状态 | 否 |
/slots | 插槽状态的监控端点 | 否 |
/props | 更改服务器属性 | 否 |
/v1/completions | 兼容 OpenAI 的补全 API | 是 |
/v1/chat/completions | 兼容 OpenAI 的聊天 API | 是 |
/v1/embeddings | 兼容 OpenAI 的嵌入 API | 是 |
/apply-template | 将聊天模板应用于消息 | 否 |
来源:examples/server/README.md335-828
服务器支持多种响应格式
原生补全响应示例
兼容 OpenAI 的聊天响应示例
来源:examples/server/server.cpp613-851
服务器有许多配置选项,主要通过命令行参数指定。
关键配置选项
| 选项 | 描述 | 默认 |
|---|---|---|
-m, --model | 模型文件路径 | - |
-c, --ctx-size | 上下文大小(以 token 为单位) | 4096 |
-t, --threads | 推理线程数 | 汽车 |
-ngl, --n-gpu-layers | 要卸载到 GPU 的层数 | 0 |
--host | 要监听的 IP 地址 | 127.0.0.1 |
--port | 要监听的端口 | 8080 |
--path | 用于提供静态文件的路径 | - |
--embedding | 仅启用嵌入端点 | false |
--api-key | 用于身份验证的 API 密钥 | - |
--ssl-key-file | SSL 私钥文件的路径 | - |
--ssl-cert-file | SSL 证书文件路径 | - |
--chat-template | 自定义 jinja 聊天模板 | - |
有关选项的完整列表,请参阅 README 或运行 --help。
来源:examples/server/README.md22-172
还可以使用环境变量来配置服务器。每个命令行选项都有一个相应的环境变量,前缀为 LLAMA_ARG_。
示例
来源:examples/server/README.md174-194
使用默认设置启动服务器
这将启动一个监听在 127.0.0.1:8080 的服务器。
来源:examples/server/README.md255-273
服务器也可以使用 Docker 来运行
来源:examples/server/README.md275-281
为了安全连接,服务器可以内置 SSL 支持
然后使用 SSL 证书和密钥运行
来源:examples/server/README.md209-219
服务器包含一个基于 Web 的用户界面,用于通过 /chat/completions 端点与模型进行交互。该 UI 使用以下技术构建:
一个预构建版本已包含在存储库中,为一个用 gzip 压缩的单个 HTML 文件。
要访问 Web UI,请在 Web 浏览器中导航到服务器的 URL。
如果您想修改 Web UI
来源:examples/server/README.md222-248
服务器包含一个全面的测试框架来验证功能
有关更详细的测试选项,请参阅测试文档。
来源:examples/server/tests/README.md1-66 examples/server/tests/tests.sh1-24