news 2026/5/5 23:46:51

Langchain4j-文档处理和 RAG 流程分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Langchain4j-文档处理和 RAG 流程分析

文档处理和 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 提供了足够的灵活性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 9:43:41

x64dbg脚本自动化入门教程:简化重复任务流程

从手动到自动&#xff1a;用 x64dbg 脚本重塑你的逆向工程效率你有没有过这样的经历&#xff1f;连续三天分析同一个加壳样本&#xff0c;每次都要重复同样的操作&#xff1a;加载程序、下断点、单步跟进、识别 OEP、转储内存……手指都快按麻了&#xff0c;稍一走神还可能漏掉…

作者头像 李华
网站建设 2026/5/4 2:43:21

音频质量影响识别结果:信噪比越高准确率越好

音频质量影响识别结果&#xff1a;信噪比越高准确率越好 在智能语音系统日益普及的今天&#xff0c;我们早已习惯对手机说“嘿 Siri”&#xff0c;或是在会议中自动生成字幕。然而&#xff0c;当系统把“打开空调”听成“打开厕所”&#xff0c;把财务汇报中的“一百万”误识为…

作者头像 李华
网站建设 2026/5/4 19:07:31

为什么说Fun-ASR是中小企业语音识别最优选?

为什么说Fun-ASR是中小企业语音识别最优选&#xff1f; 在远程办公常态化、会议录音爆炸式增长的今天&#xff0c;越来越多中小企业开始面临一个共性问题&#xff1a;如何高效、安全地将大量语音内容转化为可编辑、可分析的文字&#xff1f;传统做法是依赖人工听写&#xff0c;…

作者头像 李华
网站建设 2026/4/26 12:39:14

牛津大学:给AI装上“可信度雷达“,像人类一样学会说“我不确定“

这项由英国牛津大学工程科学系的Jeremias Sulam、Itai Gat和Aviv Navon&#xff0c;与康奈尔大学、麻省理工学院、哈佛大学等机构的研究者共同完成的研究&#xff0c;发表于2025年1月的arXiv预印本平台&#xff0c;论文编号为arXiv:2501.09588v1。对这项研究感兴趣的读者可以通…

作者头像 李华
网站建设 2026/4/30 9:10:27

热词列表格式详解:每行一个词汇提升识别命中率

热词列表格式详解&#xff1a;每行一个词汇提升识别命中率 在智能客服的录音转写中&#xff0c;一句“请问怎么申请退款流程&#xff1f;”被识别成“请问怎么申请回款流程&#xff1f;”&#xff0c;看似一字之差&#xff0c;却可能导致客户诉求被错误归类。类似问题在医疗、金…

作者头像 李华
网站建设 2026/4/30 12:05:53

太流批了,语音转文字神器

有些时候需要记录会议的内容&#xff0c;然后把语音转换成文字&#xff0c;但是一些转换的语音笔很贵。自己去转换效率又很低下&#xff0c;今天就给大家推荐一款开源的软件&#xff0c;再也不怕会议多了&#xff0c;一招直接全部搞定&#xff0c;有需要的小伙伴可以下载收藏。…

作者头像 李华