LLModel 接口作为 GPT4All 中语言模型操作的核心抽象层。它定义了一个所有模型实现都必须遵循的通用 API,使系统能够通过统一的接口处理不同的模型架构和后端。本文档记录了 LLModel 接口的设计、结构和用法。
有关 LLamaModel 等特定模型实现的信息,请参阅 LLamaModel 实现。
LLModel 接口提供了以下抽象:
来源
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_p | token 的最小概率阈值 |
temp | softmax 采样的温度(越高 = 越随机) |
n_batch | 并行处理的 token 数量 |
repeat_penalty | 重复 token 的惩罚因子 |
repeat_last_n | 用于检查重复的 past token 数量 |
contextErase | 超出上下文窗口时要擦除的上下文百分比 |
来源
LLModel 接口使用回调函数在文本生成期间提供灵活性和控制
该接口定义了两种类型的回调
PromptCallback:在提示处理期间调用
ResponseCallback:在响应中生成的每个 token 调用
两个回调都返回一个布尔值,允许客户端随时停止生成。
来源
LLModel 类包含一个静态的 Implementation 嵌套类,它负责模型的动态加载实现
实现系统支持
实现加载通过以下方式启动
来源
LLModel 接口通过 GPU 支持提供了硬件加速的抽象
关键的 GPU 相关方法
availableGPUDevices():列出可用于模型实现的所有 GPU 设备initializeGPUDevice():设置特定的 GPU 用于模型推理usingGPUDevice():检查模型是否正在使用 GPU 加速backendName():返回正在使用的后端(例如,“cuda”、“metal”、“kompute”)gpuDeviceName():返回正在使用的 GPU 设备名称LLModel 实现可以支持各种硬件后端
来源
为了与其他语言进行互操作,LLModel 通过 llmodel_c.h 提供了一个 C API 绑定
C API 提供了大多数 LLModel 方法的等效函数
| C++ 方法 | C API 函数 |
|---|---|
loadModel | llmodel_loadModel |
isModelLoaded | llmodel_isModelLoaded |
prompt | llmodel_prompt |
embed | llmodel_embed |
setThreadCount | llmodel_setThreadCount |
这使得 Python、JavaScript 等语言的绑定成为可能。
来源
要实现新的模型类型,请创建一个继承自 LLModel 并实现所有必需的虚拟方法的类
实现核心功能
loadModel:从文件加载您的模型isModelLoaded:返回模型加载状态tokenize:将文本转换为 token IDtokenToString:将 token ID 转换回文本evalTokens:通过您的模型处理 tokensampleToken:从您的模型输出中采样下一个 token实现其他必需的方法
注册您的实现以进行动态加载
LLamaModel 类提供了良好的参考实现,涵盖了接口的所有方面。
来源
LLModel 基类提供了默认实现
prompt():一个完整的实现,处理
countPromptTokens():通过 token 化提示来计算 token 数量
decodePrompt():通过模型处理提示 token
generateResponse():生成响应 token 直到完成或中断
这些默认实现使用了派生类必须实现的抽象方法。
来源
LLModel 接口是 GPT4All 后端系统的一部分
构建系统
llmodel 库目标llamamodel-mainline来源
LLModel 接口位于整个 GPT4All 架构的关键位置
LLModel 接口充当
来源
LLModel 接口是 GPT4All 中核心的抽象,它通过统一的 API 实现与不同语言模型的交互。它提供了全面的功能,用于
通过实现此接口,不同的模型架构(LLaMA、GPT-J 等)可以无缝集成到 GPT4All 生态系统中,并通过任何可用的前端进行使用。