LangChain4j RAG流程全解析
本文介绍了RAG(检索增强生成)流程中的关键组件及其功能:1. 文档加载器(DocumentLoader)负责从文件系统、URL等来源获取原始数据;2. 文档解析器(DocumentParser)将PDF等格式文件转换为纯文本和元数据;3. 文本分割器(TextSplitter)将大文本分割为适合模型处理的小片段;4. 向量转换使用Embedding模型将文本转化为语义向量;5. 向量存储(Vec
·
今天继续langchain4j的学习,简单复习一下今天所学RAG的内容
-
文档加载器 (Document Loader)
- 功能: 负责从各种来源获取原始的文档数据,并将其加载为程序可以处理的格式(通常是 langchain4j 的
TextSegment
或类似结构)。 - 重要性: 它是整个 RAG 流程的起点。没有数据加载,后续步骤无从谈起。
- 常见类型:
FileSystemDocumentLoader
: 从本地文件系统加载文件(如.txt
,.pdf
,.docx
,.html
等)。UrlDocumentLoader
: 从指定的 URL 加载网页内容。S3DocumentLoader
: 从 Amazon S3 存储桶加载文件。DirectoryDocumentLoader
: 加载指定目录下的所有文件。- 特定格式加载器(如
PdfDocumentLoader
):专门处理某种格式,可能内置解析逻辑。
- 关键点: 专注于获取原始数据,不关心内容结构和分割。
- 功能: 负责从各种来源获取原始的文档数据,并将其加载为程序可以处理的格式(通常是 langchain4j 的
-
文档解析器 (Document Parser)
- 功能: 接收由加载器获取的原始文档(尤其是二进制或特定格式文档如 PDF, DOCX, PPTX),并提取其中的纯文本和元数据(标题、作者、页码等)。
- 重要性: 许多文档(如 PDF)并非直接存储纯文本。解析器是理解这些复杂格式并抽取有价值文本信息的必要步骤。
- 常见类型/库:
Apache POI
: 常用于处理 Microsoft Office 格式(.docx
,.xlsx
,.pptx
)。PDFBox
/iText
/Tika
: 常用于解析 PDF 文件。Jsoup
: 常用于解析 HTML 并提取干净文本。- langchain4j 通常集成或封装这些库提供统一的解析接口。
- 关键点: 专注于从特定格式中提取文本和元数据,输出通常是包含文本内容和元数据的结构化对象(如
Document
)。
-
文档分割器 / 文本分割器 (Text Splitter / Document Splitter)
- 功能: 将解析器得到的(通常是较大的)文本块或文档分割成更小的、语义上相对连贯的片段(称为
TextSegment
或Chunk
)。 - 重要性:
- 上下文限制: LLM 和 Embedding 模型对输入文本长度(Token 数)有上限。长文档必须分割后才能处理。
- 检索精度: 存储和检索较小的相关片段,比检索整个大文档能返回更精确、更聚焦的答案。
- 语义单元: 合理的分割有助于保持文本的局部语义连贯性(例如,按段落、小节分割)。
- 常见策略:
- 按字符/长度分割: 简单按固定字符数或 Token 数分割(如
CharacterSplitter
)。 - 递归分割: (
RecursiveTextSplitter
) 优先尝试按特定分隔符(如\n\n
段落、\n
换行、句号空格.
、逗号,
等)进行语义分割,如果分割后片段仍过大,则继续递归按次优先级分隔符分割,直到满足大小限制。这是最常用且效果较好的策略。 - 按标记(Token)计数分割: 更精确地控制输入模型前的长度,因为模型是按 Token 处理的。
- 按字符/长度分割: 简单按固定字符数或 Token 数分割(如
- 关键参数:
chunkSize
(目标片段大小)、chunkOverlap
(相邻片段重叠字符/Token数,用于保持上下文连贯性)、separator
(分隔符列表)。 - 关键点: 专注于将大文本分解为适合模型处理的小片段,同时尽量保持语义完整性。
- 功能: 将解析器得到的(通常是较大的)文本块或文档分割成更小的、语义上相对连贯的片段(称为
-
向量转换 (Embedding / Vectorization)
- 功能: 使用 Embedding 模型将分割后的文本片段(
TextSegment
)转换(编码)为高维空间中的数值向量(一个 float 数组,例如 384 维、768 维或 1536 维)。这个向量代表了文本的语义信息。 - 重要性: 这是实现语义搜索的核心。文本被转换为数学向量后,计算机可以通过计算向量之间的距离(如余弦相似度)来衡量文本片段之间的语义相似度。
- 工作原理: 预训练好的 Embedding 模型(如 OpenAI
text-embedding-ada-002
,text-embedding-3-small
, Hugging Face 上的sentence-transformers
模型)接收文本输入,输出固定长度的浮点数向量。语义相似的文本,其向量在高维空间中距离较近。 - 在 langchain4j 中: 通过
EmbeddingModel
接口(如OpenAiEmbeddingModel
,AllMiniLmL6V2EmbeddingModel
,HuggingFaceEmbeddingModel
)实现。 - 关键点: 将文本语义转化为可计算的数学表示(向量)。
- 功能: 使用 Embedding 模型将分割后的文本片段(
-
向量存储 (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 文档处理管道):
- 加载 (Loader): 使用
DocumentLoader
从文件、URL、S3等获取原始文档。 - 解析 (Parser): 使用
DocumentParser
(或Loader内置解析) 从PDF/DOCX/HTML等格式中提取纯文本和元数据,得到Document
(s)。 - 分割 (Splitter): 使用
TextSplitter
将大的Document
文本分割成小的、适合模型的TextSegment
。 - 向量化 (Embedding): 使用
EmbeddingModel
将每个TextSegment
转换为语义向量 (float[]
)。 - 存储 (Vector Store): 将
TextSegment
的向量、原始文本内容、元数据一起存储到EmbeddingStore
中。
当用户提问时,问题也会被转换为向量,然后查询 EmbeddingStore
找到最相关的 TextSegment
作为上下文,连同问题一起发送给 LLM 生成最终答案。
理解这些组件及其协作方式,是构建有效 RAG 应用的基础。每个环节的选择(如用什么分割策略、选哪个 Embedding 模型、用哪种 Vector Store)都会影响最终应用的效果和性能。祝你学习顺利!
更多推荐
所有评论(0)