今天继续langchain4j的学习,简单复习一下今天所学RAG的内容

  1. 文档加载器 (Document Loader)

    • 功能: 负责从各种来源获取原始的文档数据,并将其加载为程序可以处理的格式(通常是 langchain4j 的 TextSegment 或类似结构)。
    • 重要性: 它是整个 RAG 流程的起点。没有数据加载,后续步骤无从谈起。
    • 常见类型:
      • FileSystemDocumentLoader: 从本地文件系统加载文件(如 .txt.pdf.docx.html 等)。
      • UrlDocumentLoader: 从指定的 URL 加载网页内容。
      • S3DocumentLoader: 从 Amazon S3 存储桶加载文件。
      • DirectoryDocumentLoader: 加载指定目录下的所有文件。
      • 特定格式加载器(如 PdfDocumentLoader):专门处理某种格式,可能内置解析逻辑。
    • 关键点: 专注于获取原始数据,不关心内容结构和分割。
  2. 文档解析器 (Document Parser)

    • 功能: 接收由加载器获取的原始文档(尤其是二进制或特定格式文档如 PDF, DOCX, PPTX),并提取其中的纯文本和元数据(标题、作者、页码等)。
    • 重要性: 许多文档(如 PDF)并非直接存储纯文本。解析器是理解这些复杂格式并抽取有价值文本信息的必要步骤。
    • 常见类型/库:
      • Apache POI: 常用于处理 Microsoft Office 格式(.docx.xlsx.pptx)。
      • PDFBox / iText / Tika: 常用于解析 PDF 文件。
      • Jsoup: 常用于解析 HTML 并提取干净文本。
      • langchain4j 通常集成或封装这些库提供统一的解析接口。
    • 关键点: 专注于从特定格式中提取文本和元数据,输出通常是包含文本内容和元数据的结构化对象(如 Document)。
  3. 文档分割器 / 文本分割器 (Text Splitter / Document Splitter)

    • 功能: 将解析器得到的(通常是较大的)文本块或文档分割成更小的、语义上相对连贯的片段(称为 TextSegment 或 Chunk)。
    • 重要性:
      • 上下文限制: LLM 和 Embedding 模型对输入文本长度(Token 数)有上限。长文档必须分割后才能处理。
      • 检索精度: 存储和检索较小的相关片段,比检索整个大文档能返回更精确、更聚焦的答案。
      • 语义单元: 合理的分割有助于保持文本的局部语义连贯性(例如,按段落、小节分割)。
    • 常见策略:
      • 按字符/长度分割: 简单按固定字符数或 Token 数分割(如 CharacterSplitter)。
      • 递归分割: (RecursiveTextSplitter) 优先尝试按特定分隔符(如 \n\n 段落、\n 换行、句号空格 . 、逗号  等)进行语义分割,如果分割后片段仍过大,则继续递归按次优先级分隔符分割,直到满足大小限制。这是最常用且效果较好的策略。
      • 按标记(Token)计数分割: 更精确地控制输入模型前的长度,因为模型是按 Token 处理的。
    • 关键参数: chunkSize(目标片段大小)、chunkOverlap(相邻片段重叠字符/Token数,用于保持上下文连贯性)、separator(分隔符列表)。
    • 关键点: 专注于将大文本分解为适合模型处理的小片段,同时尽量保持语义完整性。
  4. 向量转换 (Embedding / Vectorization)

    • 功能: 使用 Embedding 模型将分割后的文本片段(TextSegment转换(编码)为高维空间中的数值向量(一个 float 数组,例如 384 维、768 维或 1536 维)。这个向量代表了文本的语义信息
    • 重要性: 这是实现语义搜索的核心。文本被转换为数学向量后,计算机可以通过计算向量之间的距离(如余弦相似度)来衡量文本片段之间的语义相似度
    • 工作原理: 预训练好的 Embedding 模型(如 OpenAI text-embedding-ada-002text-embedding-3-small, Hugging Face 上的 sentence-transformers 模型)接收文本输入,输出固定长度的浮点数向量。语义相似的文本,其向量在高维空间中距离较近。
    • 在 langchain4j 中: 通过 EmbeddingModel 接口(如 OpenAiEmbeddingModelAllMiniLmL6V2EmbeddingModelHuggingFaceEmbeddingModel)实现。
    • 关键点: 将文本语义转化为可计算的数学表示(向量)
  5. 向量存储 (Vector Store / Embedding Store)

    • 功能: 一个专门用于高效存储文档片段对应的 Embedding 向量以及关联的原始文本片段和元数据,并提供基于向量相似度的快速检索功能的数据库。
    • 重要性: 它是 RAG 的“知识库”或“记忆体”。用户提问时,系统将问题也转换为向量(Embedding),然后从向量存储中快速查找出与问题向量最相似的 K 个文本片段(及其原文和元数据),作为上下文提供给 LLM 生成答案。
    • 核心操作: add/ingest (添加向量和关联数据), search/relevanceSearch (根据查询向量进行相似度搜索)。
    • 常见类型(langchain4j 支持的):
      • 内存型 (InMemoryEmbeddingStore): 简单,易上手,适合原型、小数据集或演示。重启后数据丢失。
      • 本地文件型 (LocalFileEmbeddingStore): 数据持久化到本地文件。
      • 专业向量数据库:
        • ChromaEmbeddingStore: 轻量级开源向量数据库。
        • ElasticsearchEmbeddingStore: 利用 Elasticsearch 的向量搜索插件。
        • MilvusEmbeddingStore / ZillizEmbeddingStore: 高性能开源向量数据库。
        • PineconeEmbeddingStore: 流行的云向量数据库服务。
        • RedisVectorStore (通过 RedisEmbeddingStore 或 RedisVectorDatabaseEmbeddingStore): 利用 Redis 的向量搜索模块。
        • AzureAiSearchEmbeddingStore: 利用微软 Azure AI Search(原 Cognitive Search)的向量搜索能力。
        • QdrantEmbeddingStore: 另一个高性能开源向量数据库。
        • PgVectorEmbeddingStore: 利用 PostgreSQL 的 pgvector 扩展。
    • 关键点: 存储 Embedding 向量和关联文本片段,并提供基于语义相似度的快速检索能力。是 RAG 实现高效知识检索的核心基础设施。

总结流程 (RAG 文档处理管道):

  1. 加载 (Loader): 使用 DocumentLoader 从文件、URL、S3等获取原始文档。
  2. 解析 (Parser): 使用 DocumentParser (或Loader内置解析) 从PDF/DOCX/HTML等格式中提取纯文本和元数据,得到 Document(s)。
  3. 分割 (Splitter): 使用 TextSplitter 将大的 Document 文本分割成小的、适合模型的 TextSegment
  4. 向量化 (Embedding): 使用 EmbeddingModel 将每个 TextSegment 转换为语义向量 (float[])。
  5. 存储 (Vector Store): 将 TextSegment 的向量、原始文本内容、元数据一起存储到 EmbeddingStore 中。

当用户提问时,问题也会被转换为向量,然后查询 EmbeddingStore 找到最相关的 TextSegment 作为上下文,连同问题一起发送给 LLM 生成最终答案。

理解这些组件及其协作方式,是构建有效 RAG 应用的基础。每个环节的选择(如用什么分割策略、选哪个 Embedding 模型、用哪种 Vector Store)都会影响最终应用的效果和性能。祝你学习顺利!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐