news 2026/4/16 14:23:39

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/4/16 12:32:19

Grafana仪表盘模板分享:可视化系统健康状态

Grafana仪表盘模板分享&#xff1a;可视化系统健康状态 在构建现代语音识别系统时&#xff0c;一个常被忽视的问题是&#xff1a;我们如何真正“看见”系统的运行&#xff1f;当模型推理缓慢、GPU显存溢出或批量任务卡住时&#xff0c;仅靠日志和命令行工具排查问题&#xff0c…

作者头像 李华
网站建设 2026/4/16 13:03:48

内存至少需要16GB:确保长时间运行不崩溃

内存至少需要16GB&#xff1a;确保长时间运行不崩溃 在本地部署语音识别系统时&#xff0c;你有没有遇到过这样的情况——刚开始运行一切正常&#xff0c;但处理到第5个音频文件时&#xff0c;程序突然卡死、报错“CUDA out of memory”&#xff0c;甚至整个服务直接崩溃&#…

作者头像 李华
网站建设 2026/4/16 12:52:01

伦理审查机制:确保技术向善发展

伦理审查机制&#xff1a;确保技术向善发展 在远程办公、智能会议和语音交互日益普及的今天&#xff0c;语音识别技术早已不再是实验室里的前沿探索&#xff0c;而是深入到了我们每天的工作流中。打开录音笔&#xff0c;一段讲话转眼变成文字纪要&#xff1b;接入客服系统&…

作者头像 李华
网站建设 2026/4/14 1:00:17

通义千问语音版底层技术曝光:源自Fun-ASR架构优化

通义千问语音版底层技术解析&#xff1a;从 Fun-ASR 架构看语音识别的工程化落地 在智能对话系统日益普及的今天&#xff0c;用户不再满足于“能听清”&#xff0c;更期望“听得懂、反应快、用得顺”。当我们在钉钉中唤醒“通义千问语音版”进行会议转录或实时提问时&#xff0…

作者头像 李华
网站建设 2026/4/14 7:36:48

老用户返利计划:邀请好友得双重奖励

Fun-ASR WebUI&#xff1a;本地化语音识别系统的工程实践与深度解析 在远程办公、在线教育和智能硬件日益普及的今天&#xff0c;语音转文字技术几乎渗透到了每一个数字工作流中。然而&#xff0c;当我们频繁使用云端语音服务时&#xff0c;是否曾担心过会议录音被上传至第三方…

作者头像 李华
网站建设 2026/4/11 13:38:25

地铁站背景噪音下仍保持85%+准确率

地铁站背景噪音下仍保持85%准确率&#xff1a;Fun-ASR语音识别系统技术解析 在地铁站台&#xff0c;广播声、脚步声、列车进站的轰鸣交织成一片嘈杂。你对着手机语音助手说“帮我查明天早上八点去西单的地铁”&#xff0c;结果它却听成了“帮我杀掉老板”。这不是段子&#xff…

作者头像 李华