菜单

LocalDocs 系统

相关源文件

LocalDocs 系统是 GPT4All 的核心组件,它通过将本地文档库与聊天界面集成,实现了检索增强生成(RAG)。该系统允许用户创建文档集合,为其建立索引以便高效搜索,并在聊天互动中检索相关上下文,从而提高 AI 回答的质量和事实准确性。

有关利用 LocalDocs 结果的聊天系统信息,请参阅 聊天系统

系统概览

LocalDocs 系统提供了一种无缝的方式,可以通过用户提供的文档来增强 LLM 的响应。它处理指定文件夹中的文档,将其分解为可管理的块,生成用于语义搜索的嵌入,并创建一个可搜索的索引。在聊天互动中,它会根据用户的查询检索最相关的文档块,并用这些附加上下文增强 LLM 提示。

主要功能

  • 文档集合管理
  • 多格式文档处理(PDF、DOCX、TXT、XLSX 等)
  • 结合向量相似度和关键词匹配的混合搜索
  • 本地或远程嵌入生成
  • 实时文件夹监控文档更改
  • 与聊天 UI 集成以显示参考来源

来源:gpt4all-chat/src/localdocs.h gpt4all-chat/src/database.h gpt4all-chat/src/embllm.h

架构

LocalDocs 系统由几个相互连接的组件组成,它们协同工作以提供增强文档的响应。

架构图

组件描述

组件描述职责
LocalDocs主接口类提供聊天系统与文档集合交互的 API
数据库核心存储和检索引擎管理文档索引、存储和搜索功能
EmbeddingLLM嵌入生成系统为语义搜索创建文本的向量表示
DocumentReader文档解析器从各种文件格式中提取文本内容
ChunkStreamer文本处理将文档分解为可管理的块以进行索引
SQLite 数据库持久存储存储文档块、元数据和嵌入

来源:gpt4all-chat/src/database.cpp gpt4all-chat/src/localdocs.cpp gpt4all-chat/src/embllm.cpp

文档处理流程

当用户向集合添加文件夹时,系统会通过几个阶段处理文档,使其可搜索和可检索。

文档处理流程

文件处理步骤

  1. 文档发现:系统扫描集合中的文件夹以查找支持的文档类型。
  2. 文本提取:从各种文件格式(PDF、DOCX、TXT、XLSX)中提取内容。
  3. 分块:根据配置的块大小,将文档拆分成更小的块。
  4. 元数据提取:在可用时捕获标题、作者和其他元数据。
  5. 数据库存储:将块和元数据存储在 SQLite 数据库中。
  6. 嵌入生成:为每个块创建向量嵌入以进行语义搜索。
  7. 索引:构建全文搜索和向量索引以进行混合搜索。
  8. 文件夹监控:系统监视文档更改以更新索引。

来源:gpt4all-chat/src/database.cpp822-837 gpt4all-chat/src/database.cpp171-197

嵌入生成

LocalDocs 系统支持两种生成向量嵌入以实现语义搜索的方法

  1. 本地嵌入:使用本地嵌入模型(nomic-embed-text-v1.5)
  2. 远程嵌入:调用 Nomic 嵌入 API 以获得可能更高质量的嵌入

嵌入过程

嵌入配置

嵌入过程可以在应用程序设置中配置

  • 嵌入方法:本地模型或 Nomic API
  • API 密钥:用于 Nomic API 的远程嵌入
  • 硬件加速:CPU 或 GPU(CUDA/Metal)用于本地嵌入
  • 线程数:CPU 嵌入的线程数

来源:gpt4all-chat/src/embllm.cpp36-176 gpt4all-chat/src/database.cpp780-815

检索系统

当用户发送提示时,LocalDocs 系统会检索相关的文档块以增强 LLM 的上下文。

检索过程

混合搜索系统

检索系统采用混合方法,结合了

  1. 向量相似度搜索:使用嵌入来查找语义相关的内容
  2. BM25 关键词搜索:传统的用于关键词匹配的信息检索
  3. 倒数排名融合:结合这两种搜索方法以获得最佳结果

系统检索可配置数量的块(默认:4)以用相关上下文增强 LLM 提示。

来源:gpt4all-chat/src/database.cpp259-287 gpt4all-chat/src/chatllm.cpp929-955

与聊天系统的集成

LocalDocs 系统无缝集成到聊天界面中,以提供增强的响应。

聊天集成流程

用户体验

  1. 用户选择要包含在聊天中的文档集合
  2. 用户发送可能受益于文档上下文的提示
  3. 系统根据提示检索相关的文档块
  4. 检索到的上下文被添加到 LLM 提示中
  5. LLM 生成的响应基于文档上下文
  6. 响应会与源文档的引用一起显示
  7. 用户可以点击来源查看原始文档

来源:gpt4all-chat/src/chat.cpp107-136 gpt4all-chat/qml/ChatItemView.qml235-454

数据库 Schema

LocalDocs 系统使用 SQLite 数据库,其核心结构如下

数据库模式图

关键数据库表

表格目的关键字段
collections存储用户创建的文档集合name, embedding_model
folders跟踪正在监控文档的文件夹path
documents存储有关已索引文档的信息document_path, document_time
chunks包含实际文档内容(分块)chunk_text, document_id
embeddings存储块的向量嵌入model, chunk_id, embedding
chunks_fts用于全文搜索的虚拟表chunk_text, document_id

来源:gpt4all-chat/src/database.cpp100-175 gpt4all-chat/src/database.h43-61

在聊天过程中的使用

当 LocalDocs 系统在聊天会话期间处于活动状态时,它会遵循以下过程

  1. 上下文检索:在生成响应之前,系统会检索相关的文档块
  2. 提示增强:检索到的文本被添加到 LLM 提示中
  3. 来源跟踪:检索信息的来源被跟踪
  4. UI 显示:来源与响应一起显示以供参考

聊天提示增强

来源:gpt4all-chat/src/chatllm.cpp908-955 gpt4all-chat/src/chat.cpp228-232

配置选项

LocalDocs 系统可以通过应用程序设置进行配置

设置描述默认
块大小文档块的大小(按单词计)512
检索大小每次查询要检索的块数4
文件扩展名支持的文档文件扩展名.pdf, .txt, .md, .docx, .xlsx
嵌入方法本地或远程嵌入本地
Nomic API 密钥远程嵌入的 API 密钥
显示引用在 UI 中显示源引用
硬件加速用于本地嵌入的设备汽车

来源:gpt4all-chat/src/mysettings.cpp

结论

LocalDocs 系统是 GPT4All 的一个强大组件,它使用户能够用自己的文档信息来增强 AI 的响应。通过将文档检索与聊天过程无缝集成,它提供了更准确、更具上下文相关性、更符合事实的响应。

该系统的架构通过其混合搜索方法、灵活的嵌入选项和高效的文档处理管道,平衡了性能和准确性。这使其适用于从个人知识管理到专业研究协助的广泛用例。