菜单

LLModel 接口

相关源文件

LLModel 接口作为 GPT4All 中语言模型操作的核心抽象层。它定义了一个所有模型实现都必须遵循的通用 API,使系统能够通过统一的接口处理不同的模型架构和后端。本文档记录了 LLModel 接口的设计、结构和用法。

有关 LLamaModel 等特定模型实现的信息,请参阅 LLamaModel 实现

目的与架构

LLModel 接口提供了以下抽象:

  1. 加载和管理语言模型
  2. 文本生成和补全
  3. 嵌入生成
  4. 用于序列化/反序列化的状态管理
  5. 硬件加速支持
  6. 线程控制

来源

核心接口组件

LLModel 接口包含客户端可以使用的公共方法和实现必须提供的受保护方法。

公共方法

这些方法定义了用户代码与语言模型交互的 API

方法目的
loadModel加载磁盘上的模型文件,并指定上下文大小和 GPU 层数
isModelLoaded检查模型是否已成功加载
prompt根据给定提示生成文本补全
countPromptTokens计算提示字符串中的 token 数量
embed从文本输入生成嵌入(向量表示)
setThreadCount设置用于计算的 CPU 线程数
threadCount获取当前使用的线程数
stateSize获取模型内部状态的大小,用于序列化
saveState序列化模型内部状态
restoreState恢复先前序列化的状态
contextLength获取模型支持的最大上下文长度

受保护的方法

这些是每个模型实现都必须提供的抽象方法

方法目的
tokenize将文本转换为 token ID
isSpecialToken检查 token 是否为特殊 token
tokenToString将 token ID 转换回字符串表示
initSampler初始化文本生成的采样参数
sampleToken从模型的输出分布中采样下一个 token
evalTokens通过模型处理 token 批次
shiftContext当上下文窗口超出最大大小时进行上下文窗口的移动
endTokens返回表示序列结束的 token 列表
shouldAddBOS返回是否应添加 BOS(序列开始)token

来源

提示上下文

文本生成行为通过 PromptContext 结构进行控制

参数描述
n_predict要生成的最大 token 数
top_k将采样限制在最有可能的 k 个 token
top_p核采样概率阈值
min_ptoken 的最小概率阈值
tempsoftmax 采样的温度(越高 = 越随机)
n_batch并行处理的 token 数量
repeat_penalty重复 token 的惩罚因子
repeat_last_n用于检查重复的 past token 数量
contextErase超出上下文窗口时要擦除的上下文百分比

来源

回调机制

LLModel 接口使用回调函数在文本生成期间提供灵活性和控制

该接口定义了两种类型的回调

  1. PromptCallback:在提示处理期间调用

  2. ResponseCallback:在响应中生成的每个 token 调用

两个回调都返回一个布尔值,允许客户端随时停止生成。

来源

实现加载系统

LLModel 类包含一个静态的 Implementation 嵌套类,它负责模型的动态加载实现

实现系统支持

  1. 根据模型文件动态加载模型实现
  2. 多个后端(CPU、CUDA、Metal、Vulkan/Kompute)
  3. 自动检测适用于给定模型的实现

实现加载通过以下方式启动

来源

硬件加速

LLModel 接口通过 GPU 支持提供了硬件加速的抽象

关键的 GPU 相关方法

  1. availableGPUDevices():列出可用于模型实现的所有 GPU 设备
  2. initializeGPUDevice():设置特定的 GPU 用于模型推理
  3. usingGPUDevice():检查模型是否正在使用 GPU 加速
  4. backendName():返回正在使用的后端(例如,“cuda”、“metal”、“kompute”)
  5. gpuDeviceName():返回正在使用的 GPU 设备名称

LLModel 实现可以支持各种硬件后端

  • CPU(通用)
  • CUDA(NVIDIA GPU)
  • Metal(Apple GPU)
  • Vulkan/Kompute(跨平台 GPU 支持)

来源

C API 绑定

为了与其他语言进行互操作,LLModel 通过 llmodel_c.h 提供了一个 C API 绑定

C API 提供了大多数 LLModel 方法的等效函数

C++ 方法C API 函数
loadModelllmodel_loadModel
isModelLoadedllmodel_isModelLoaded
promptllmodel_prompt
embedllmodel_embed
setThreadCountllmodel_setThreadCount

这使得 Python、JavaScript 等语言的绑定成为可能。

来源

创建新的模型实现

要实现新的模型类型,请创建一个继承自 LLModel 并实现所有必需的虚拟方法的类

  1. 实现核心功能

    • loadModel:从文件加载您的模型
    • isModelLoaded:返回模型加载状态
    • tokenize:将文本转换为 token ID
    • tokenToString:将 token ID 转换回文本
    • evalTokens:通过您的模型处理 token
    • sampleToken:从您的模型输出中采样下一个 token
  2. 实现其他必需的方法

    • 支持状态管理的方法
    • 上下文处理方法
    • 特殊 token 管理
  3. 注册您的实现以进行动态加载

LLamaModel 类提供了良好的参考实现,涵盖了接口的所有方面。

来源

默认实现细节

LLModel 基类提供了默认实现

  1. prompt():一个完整的实现,处理

    • 输入提示的 token 化
    • 分批处理 token
    • 采样和生成响应
    • 必要时的上下文转移
    • 回调处理
  2. countPromptTokens():通过 token 化提示来计算 token 数量

  3. decodePrompt():通过模型处理提示 token

  4. generateResponse():生成响应 token 直到完成或中断

这些默认实现使用了派生类必须实现的抽象方法。

来源

构建系统集成

LLModel 接口是 GPT4All 后端系统的一部分

构建系统

  1. 创建 llmodel 库目标
  2. 构建模型实现目标,例如 llamamodel-mainline
  3. 配置各种硬件加速选项(CUDA、Metal、Vulkan、Kompute)
  4. 发布公共头文件

来源

GPT4All 架构中的 LLModel

LLModel 接口位于整个 GPT4All 架构的关键位置

LLModel 接口充当

  1. 用户界面和模型实现之间的抽象边界
  2. 所有模型类型的通用接口,无论其架构如何
  3. 硬件加速功能入口点

来源

总结

LLModel 接口是 GPT4All 中核心的抽象,它通过统一的 API 实现与不同语言模型的交互。它提供了全面的功能,用于

  • 模型加载和管理
  • 文本生成和嵌入
  • 状态序列化
  • 硬件加速
  • 基于回调的控制流

通过实现此接口,不同的模型架构(LLaMA、GPT-J 等)可以无缝集成到 GPT4All 生态系统中,并通过任何可用的前端进行使用。