成都市网站建设_网站建设公司_云服务器_seo优化
2026/1/5 7:22:06 网站建设 项目流程

文档处理和 RAG 流程分析

请关注公众号【碳硅化合物AI】

目录

  • 概述
  • 文档加载流程
  • 文档解析和分割
  • 嵌入生成和存储
  • RAG 检索增强流程
  • 关键类关系
  • 实现关键点说明
  • 总结

概述

RAG(Retrieval-Augmented Generation)是 LangChain4j 的核心功能。基本思路:文档处理成向量存储,用户提问时从向量库检索相关片段,与问题一起发给 LLM,基于上下文回答。

流程分两阶段:文档处理(离线,加载→解析→分割→生成嵌入→存储)、查询(在线,用户提问→生成查询嵌入→检索→增强提示→调用 LLM)。

文档加载

DocumentLoader从各种来源加载文档,核心方法load():从DocumentSource获取输入流,用DocumentParser解析,合并元数据,返回Document

DocumentSource支持多种来源:文件系统、URL、GitHub、S3、Azure Blob Storage 等,每个都提供输入流和元数据。使用示例:

DocumentSourcesource=newFileSystemDocumentSource(Paths.get("doc.pdf"));DocumentParserparser=newApachePdfBoxDocumentParser();Documentdocument=DocumentLoader.load(source,parser);

文档解析和分割

文档解析器把各种格式(PDF、Word、Markdown 等)解析成纯文本。提供多个解析器:ApachePdfBoxDocumentParser(PDF)、ApachePoiDocumentParser(Word/Excel/PPT)、ApacheTikaDocumentParser(通用)、MarkdownDocumentParserYamlDocumentParser

文档分割是 RAG 的关键步骤,长文档需分割成小片段,每个片段单独生成嵌入。提供多种分割策略:按段落、按句子、按行、按词、按字符、按正则、递归分割。选择建议:按段落适合结构化文档保持语义完整,按句子适合细粒度检索,递归分割智能分割。可设置重叠(如 50 字符)避免重要信息被边界切断。

DocumentSplittersplitter=newDocumentByParagraphSplitter(300,50);List<TextSegment>segments=splitter.split(document);

嵌入生成和存储

嵌入模型把文本转换成向量,接口embed(String)embedAll(List<TextSegment>)。生成嵌入后存储到向量库,store.add(embedding, segment)会存储嵌入向量、原始文本片段、元数据,返回唯一 ID。

RAG 检索增强流程

这是 RAG 的核心。当用户提问时,系统会:

  1. 从用户消息中提取查询
  2. 生成查询的嵌入向量
  3. 从向量库中检索相关片段
  4. 把检索到的片段注入到用户消息中
  5. 发送给 LLM

RetrievalAugmentor

RetrievalAugmentor是 RAG 流程的入口:

public interface RetrievalAugmentor { /** * Augments the {@link ChatMessage} provided in the {@link AugmentationRequest} * with retrieved {@link Content}s. */ AugmentationResult augment(AugmentationRequest augmentationRequest); }

DefaultRetrievalAugmentor

默认实现使用了多个组件协作:

@Override public AugmentationResult augment(AugmentationRequest augmentationRequest) { ChatMessage chatMessage = augmentationRequest.chatMessage(); String queryText; if (chatMessage instanceof UserMessage userMessage) { queryText = userMessage.singleText(); } else { throw new IllegalArgumentException("Unsupported message type: " + chatMessage.type()); } Query originalQuery = Query.from(queryText, augmentationRequest.metadata()); // 1. 查询转换 Collection<Query> queries = queryTransformer.transform(originalQuery); // 2. 查询路由和内容检索 Map<Query, Collection<List<Content>>> queryToContents = process(queries); // 3. 内容聚合 List<Content> contents = contentAggregator.aggregate(queryToContents); // 4. 内容注入 ChatMessage augmentedChatMessage = contentInjector.inject(contents, chatMessage); return AugmentationResult.builder() .chatMessage(augmentedChatMessage) .contents(contents) .build(); }

RAG 流程时序图

高级 RAG 组件

QueryTransformer- 查询转换

  • 可以扩展查询(query expansion)
  • 可以压缩查询(query compression)
  • 可以生成多个查询变体

QueryRouter- 查询路由

  • 可以把不同查询路由到不同的检索器
  • 支持多路检索

ContentRetriever- 内容检索

  • EmbeddingStoreContentRetriever- 从向量库检索
  • 可以自定义检索逻辑

ContentAggregator- 内容聚合

  • 合并多个检索器的结果
  • 重排序(re-ranking)
  • 去重和过滤

ContentInjector- 内容注入

  • 把检索到的内容注入到用户消息中
  • 可以自定义注入格式

关键类关系

实现要点

文档分割:太大检索精度低、token 消耗多,太小上下文不完整。建议:段落分割 300-500 字符,句子分割 100-200 字符,设置 10-20% 重叠。

嵌入模型选择:考虑多语言支持(如中文)、维度(越高表达能力越强但成本越高)、速度(本地 vs 云端 API)。

检索策略:简单检索直接用EmbeddingStoreContentRetriever,高级检索用ReRankingContentAggregator先检索更多结果再重排序。

内容注入格式:默认格式可自定义ContentInjector

元数据过滤EmbeddingStore支持元数据过滤,存储时添加元数据,检索时用Filter过滤。

总结

RAG 实现完整:文档处理链(加载→解析→分割)多种实现可选,灵活检索(简单/高级),组件化设计可替换可自定义,通过 AI Services 易于集成。流程虽复杂但抽象良好,使用简单:处理文档存储到向量库,配置ContentRetriever,在 AI Service 中使用。框架自动处理检索、增强、调用 LLM。

RAG 效果取决于:文档分割质量、嵌入模型选择、检索策略优化、提示词设计。需要根据场景调优,LangChain4j 提供了足够的灵活性。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询