news 2026/7/15 4:50:33

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/7/1 22:59:39

并发用户数限制说明:免费版最多支持10个并发

Fun-ASR 并发限制背后的设计智慧&#xff1a;为何免费版只支持10个并发&#xff1f; 在AI语音识别技术逐渐“飞入寻常百姓家”的今天&#xff0c;越来越多开发者希望拥有一套开箱即用、本地部署的语音转写工具。Fun-ASR 正是在这样的背景下诞生——由钉钉与通义联合推出&#x…

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

Android技术在AI时代的深度探索与实践指南

章鱼时代 Android 工程师 职位描述 Android开发经验通信相关专业数学相关专业Android客户端产品研发计算机/软件工程相关专业大规模应用开发/维护经验Kotlin 岗位职责: 1. 能够独立解决复杂的技术问题,持续提升产品质量和用户体验; 2. 参与 AI 功能集成,包括智能对话、语音识…

作者头像 李华
网站建设 2026/7/1 7:51:41

移动端适配进展:Fun-ASR即将推出iOS/Android App

移动端适配进展&#xff1a;Fun-ASR即将推出iOS/Android App 在智能手机几乎成为人体感官延伸的今天&#xff0c;语音输入早已不再是“未来科技”&#xff0c;而是日常办公、学习和沟通中不可或缺的一环。然而&#xff0c;当我们打开会议记录、医生问诊或课堂听写场景时&#x…

作者头像 李华
网站建设 2026/7/10 13:58:23

Userlike欧洲标准:GDPR合规保障隐私

Fun-ASR&#xff1a;以隐私为先的本地化语音识别实践 在远程办公、智能客服和会议记录日益普及的今天&#xff0c;语音识别技术正以前所未有的速度融入企业工作流。但随之而来的&#xff0c;是愈发严峻的数据隐私挑战——一段看似普通的录音中&#xff0c;可能包含员工对话、客…

作者头像 李华
网站建设 2026/7/1 23:18:05

rs232和rs485的区别:手把手教你如何选择

RS232 和 RS485 到底怎么选&#xff1f;一个工业通信老手的实战经验分享你有没有遇到过这样的场景&#xff1a;调试一台新设备&#xff0c;串口线一接上&#xff0c;PC 就能立刻看到打印信息——这是 RS232 的功劳&#xff1b;可当你想把十几个传感器连到控制柜里&#xff0c;却…

作者头像 李华
网站建设 2026/7/15 4:32:38

一文说清高速差分对布线的核心要点

高速差分对布线&#xff0c;到底怎么走才不“翻车”&#xff1f;在一块现代PCB板上&#xff0c;如果你看到两条紧挨着、弯来弯去却始终并行的细线&#xff0c;那八成是高速差分对。它们可能是USB 3.0的数据线、PCIe的通道&#xff0c;也可能是MIPI摄像头的信号线——这些接口跑…

作者头像 李华