菜单

依赖项与子模块

相关源文件

本文档详细介绍了 GPT4All 项目使用的外部库、Git 子模块和依赖项。它解释了这些组件如何集成到构建系统中以及它们在应用程序架构中的作用。

有关构建系统本身的信息,请参阅 构建系统

Git 子模块概述

GPT4All 使用 Git 子模块来管理核心依赖项。这些依赖项在 .gitmodules 文件中指定,并在克隆存储库时通过使用 git clone--recursive 标志拉取。

来源:.gitmodules1-26

子模块详情

子模块路径目的存储库 URL
llama.cppgpt4all-backend/deps/llama.cpp-mainline核心 LLM 实现https://github.com/nomic-ai/llama.cpp.git
usearchgpt4all-chat/deps/usearchLocalDocs 的向量搜索库https://github.com/nomic-ai/usearch.git
SingleApplicationgpt4all-chat/deps/SingleApplication确保只运行一个实例https://github.com/nomic-ai/SingleApplication.git
fmtgpt4all-chat/deps/fmt现代 C++ 格式化库https://github.com/fmtlib/fmt.git
DuckXgpt4all-chat/deps/DuckXLocalDocs 的 DOCX 文件解析https://github.com/nomic-ai/DuckX.git
QXlsxgpt4all-chat/deps/QXlsxExcel 文件解析https://github.com/nomic-ai/QXlsx.git
minjagpt4all-chat/deps/minja聊天模板的模板引擎https://github.com/nomic-ai/minja.git
jsongpt4all-chat/deps/jsonJSON 解析库https://github.com/nlohmann/json.git

其中大多数子模块是 Nomic AI 维护的自定义分支,以确保兼容性并添加 GPT4All 所需的特定功能。

来源:.gitmodules1-26 gpt4all-chat/CMakeLists.txt147-148

Qt 依赖项

GPT4All 使用 Qt 6 框架构建。该应用程序需要多个 Qt 模块

来源:gpt4all-chat/CMakeLists.txt96-107

Qt 模块目的配置
Qt6::Core核心功能、事件循环、设置必填
Qt6::HttpServer实现本地 API 服务器必填
Qt6::LinguistTools国际化支持必填
Qt6::QuickQML UI 系统必填
Qt6::QuickDialogs2现代对话框组件必填
Qt6::Sql聊天记录和 LocalDocs 的数据库访问必填
Qt6::SvgSVG 图标渲染必填
Qt6::PdfPDF 渲染(可替换为 PDFium)可选

项目要求 Qt 6.8 或更高版本,如 CMakeLists.txt 文件中所指定。

来源:gpt4all-chat/CMakeLists.txt96-107 gpt4all-chat/CMakeLists.txt107

外部依赖

用于 PDF 渲染的 PDFium

未使用 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

平台特定依赖项

某些依赖项具有特定于平台的变体

  1. macOS:

    • 使用 Cocoa 库进行 Dock 图标集成
    • 库的框架结构
    • Intel/ARM 的通用二进制支持
  2. Windows:

    • 用于窗口管理的 Win32 API
    • 根据架构(x64/ARM64)的不同 PDFium 二进制文件
    • 可以强制 Windows ARM 使用 Direct3D 12
  3. Linux:

    • 标准的共享库方法
    • 用于窗口管理的 X11 集成
    • 自定义图标处理

来源: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

近期依赖项变更

根据更新日志,依赖项发生了一些重大变化:

  1. minja 在 v3.8.0 中取代了 Jinja2Cpp,以改进模板兼容性(2024 年 12 月)
  2. Qt 在 v3.7.0 中从 6.5.1 更新到 6.8.1(2025 年 1 月)
  3. Windows ARM64 支持在 v3.7.0 中添加(2025 年 1 月)
  4. QXlsx 库在 v3.4.0 中添加,用于 Excel 文件支持(2024 年 10 月)
  5. DuckX 库在 v3.4.0 中添加,用于 DOCX 文件支持(2024 年 10 月)

来源:gpt4all-chat/CHANGELOG.md44 gpt4all-chat/CHANGELOG.md60-62 gpt4all-chat/CHANGELOG.md58 gpt4all-chat/CHANGELOG.md176

构建管道中的依赖管理

GPT4All 在 CI/CD 管道中为不同的目标平台处理依赖项的方式不同。

该项目使用特定于平台的部署工具将所有必需的依赖项与应用程序捆绑在一起。

  • macOS:使用 macdeployqt 创建包含所有依赖项的应用程序包。
  • Windows:使用 windeployqt 收集所需的 DLL。
  • Linux:使用 linuxdeployqt 创建包含依赖项的包。

来源:gpt4all-chat/CMakeLists.txt564-578 gpt4all-chat/cmake/deploy-qt-mac.cmake.in1-27

库版本

版本/来源目的
Qt6.8+UI框架和核心功能
llama.cppNomic AI 定制分支核心 LLM 实现
fmtGitHub最新版字符串格式化
nlohmann/jsonGitHub最新版JSON 解析
usearchNomic AI 定制分支向量相似性搜索
minjaNomic AI 自定义实现聊天模板的模板引擎
PDFiumchromium/6996PDF 渲染(未使用 Qt6::Pdf 时)
DuckXNomic AI 定制分支LocalDocs 的 DOCX 解析
QXlsxNomic AI 定制分支Excel 文件解析

来源:.gitmodules1-26 gpt4all-chat/deps/CMakeLists.txt20