本文档详细介绍了 GPT4All 项目使用的外部库、Git 子模块和依赖项。它解释了这些组件如何集成到构建系统中以及它们在应用程序架构中的作用。
有关构建系统本身的信息,请参阅 构建系统。
GPT4All 使用 Git 子模块来管理核心依赖项。这些依赖项在 .gitmodules 文件中指定,并在克隆存储库时通过使用 git clone 的 --recursive 标志拉取。
| 子模块 | 路径 | 目的 | 存储库 URL |
|---|---|---|---|
| llama.cpp | gpt4all-backend/deps/llama.cpp-mainline | 核心 LLM 实现 | https://github.com/nomic-ai/llama.cpp.git |
| usearch | gpt4all-chat/deps/usearch | LocalDocs 的向量搜索库 | https://github.com/nomic-ai/usearch.git |
| SingleApplication | gpt4all-chat/deps/SingleApplication | 确保只运行一个实例 | https://github.com/nomic-ai/SingleApplication.git |
| fmt | gpt4all-chat/deps/fmt | 现代 C++ 格式化库 | https://github.com/fmtlib/fmt.git |
| DuckX | gpt4all-chat/deps/DuckX | LocalDocs 的 DOCX 文件解析 | https://github.com/nomic-ai/DuckX.git |
| QXlsx | gpt4all-chat/deps/QXlsx | Excel 文件解析 | https://github.com/nomic-ai/QXlsx.git |
| minja | gpt4all-chat/deps/minja | 聊天模板的模板引擎 | https://github.com/nomic-ai/minja.git |
| json | gpt4all-chat/deps/json | JSON 解析库 | https://github.com/nlohmann/json.git |
其中大多数子模块是 Nomic AI 维护的自定义分支,以确保兼容性并添加 GPT4All 所需的特定功能。
来源:.gitmodules1-26 gpt4all-chat/CMakeLists.txt147-148
GPT4All 使用 Qt 6 框架构建。该应用程序需要多个 Qt 模块
来源:gpt4all-chat/CMakeLists.txt96-107
| Qt 模块 | 目的 | 配置 |
|---|---|---|
| Qt6::Core | 核心功能、事件循环、设置 | 必填 |
| Qt6::HttpServer | 实现本地 API 服务器 | 必填 |
| Qt6::LinguistTools | 国际化支持 | 必填 |
| Qt6::Quick | QML UI 系统 | 必填 |
| Qt6::QuickDialogs2 | 现代对话框组件 | 必填 |
| Qt6::Sql | 聊天记录和 LocalDocs 的数据库访问 | 必填 |
| Qt6::Svg | SVG 图标渲染 | 必填 |
| Qt6::Pdf | PDF 渲染(可替换为 PDFium) | 可选 |
项目要求 Qt 6.8 或更高版本,如 CMakeLists.txt 文件中所指定。
来源:gpt4all-chat/CMakeLists.txt96-107 gpt4all-chat/CMakeLists.txt107
未使用 Qt6::Pdf 时,应用程序会获取 PDFium 以在 LocalDocs 功能中进行 PDF 渲染。PDFium 在构建过程中使用 CMake 的 FetchContent 机制获取。
在应用程序启动时,当未使用 Qt6::Pdf 时,PDFium 会在 main.cpp 中初始化。
并在应用程序退出时清理。
来源:gpt4all-chat/deps/CMakeLists.txt18-51 gpt4all-chat/src/main.cpp75-77 gpt4all-chat/src/main.cpp190-192
依赖项通过 CMake 集成到构建系统中。以下是不同组件的链接方式。
主应用程序目标在 CMakeLists.txt 文件中链接到这些依赖项。
来源:gpt4all-chat/CMakeLists.txt449-460
运行时,应用程序初始化各种组件和单例。
LLModel 实现(根据模型类型动态加载)的搜索路径根据平台的不同而设置。
来源:gpt4all-chat/src/main.cpp105-116 gpt4all-chat/src/main.cpp134-141
某些依赖项具有特定于平台的变体
macOS:
Windows:
Linux:
来源:gpt4all-chat/CMakeLists.txt17-27 gpt4all-chat/CMakeLists.txt224-226 gpt4all-chat/src/main.cpp55-71 gpt4all-chat/src/main.cpp100-102
应用程序包含用于 LocalDocs 功能的本地嵌入式模型。此模型在构建过程中下载并包含在应用程序资源中。
来源:gpt4all-chat/CMakeLists.txt199-213
根据更新日志,依赖项发生了一些重大变化:
来源:gpt4all-chat/CHANGELOG.md44 gpt4all-chat/CHANGELOG.md60-62 gpt4all-chat/CHANGELOG.md58 gpt4all-chat/CHANGELOG.md176
GPT4All 在 CI/CD 管道中为不同的目标平台处理依赖项的方式不同。
该项目使用特定于平台的部署工具将所有必需的依赖项与应用程序捆绑在一起。
macdeployqt 创建包含所有依赖项的应用程序包。windeployqt 收集所需的 DLL。linuxdeployqt 创建包含依赖项的包。来源:gpt4all-chat/CMakeLists.txt564-578 gpt4all-chat/cmake/deploy-qt-mac.cmake.in1-27
| 库 | 版本/来源 | 目的 |
|---|---|---|
| Qt | 6.8+ | UI框架和核心功能 |
| llama.cpp | Nomic AI 定制分支 | 核心 LLM 实现 |
| fmt | GitHub最新版 | 字符串格式化 |
| nlohmann/json | GitHub最新版 | JSON 解析 |
| usearch | Nomic AI 定制分支 | 向量相似性搜索 |
| minja | Nomic AI 自定义实现 | 聊天模板的模板引擎 |
| PDFium | chromium/6996 | PDF 渲染(未使用 Qt6::Pdf 时) |
| DuckX | Nomic AI 定制分支 | LocalDocs 的 DOCX 解析 |
| QXlsx | Nomic AI 定制分支 | Excel 文件解析 |