LangChain4j如何自定义文档转换器实现数据清洗?

笔记哥 / 05-12 / 44点赞 / 0评论 / 899阅读
LangChain4j 提供了 3 种 RAG(Retrieval-Augmented Generation,检索增强生成)实现,我们通常在原生或高级的 RAG 实现中,要对数据进行清洗,也就是将外接知识库中的原数据进行噪音去除,留下有价值的信息。 > > > 例如在带有 HTML 标签的文本中,HTML 标签就是噪音,他对于搜索结果是没有任何帮助,甚至会影响查询结果的,因此我们就需要将 HTML 标签进行清除。 > 那问题来了,怎么进行数据清洗呢? 这就要使用到文档转换器了,那么在不使用 LangChain4j 内置文档转换器的前提下(因为业务需求是复杂且多变的,因此很多时候我们需要使用自定义文档转换器才能实现预期的效果),那怎么实现呢?接下来一起来看。 ## 自定义文档转换器 以去除文本中的 HTML 标签为例,LangChain4j 中自定义文档转换器的实现步骤如下: 1. 新建类实现 DocumentTransformer 接口。 2. 重写 transform 和 transformAll 方法,前者是对 Document 对象进行文档转换,后者是对 List 进行数据转换。 3. 在 transform 和 transformAll 方法中,实现数据清除的具体业务落地。 ## 具体实现代码 ```java import dev.langchain4j.data.document.Document; import dev.langchain4j.data.document.DocumentTransformer; import java.util.ArrayList; import java.util.List; /** * 自定义文档转换器 */ public class HtmlToTextDocumentTransformer implements DocumentTransformer { @Override public Document transform(Document document) { return Document.from(removeHtmlTags(document.text())); } // 使用正则表达式清除内容中的 HTML 标签 public static String removeHtmlTags(String html) { if (html == null || html.isEmpty()) { return ""; } // 定义正则表达式,匹配所有HTML标签 String regex = "<[^>]+>"; // 替换所有匹配的标签为空字符串 return html.replaceAll(regex, "").trim(); } @Override public List transformAll(List documents) { List list = new ArrayList(); documents.stream().forEach(document -> { list.add(this.transform(document)); }); return list; } } ``` ## 调用文档转换器 ```java Document htmlDoc = Document.from( "

Clean me!

" ); // 文档转换器 DocumentTransformer transformer = new HtmlToTextDocumentTransformer(); Document cleanedDoc = transformer.transform(htmlDoc); System.out.println(cleanedDoc.text()); ``` 最终的执行结果为: > > > Clean me! > ## 小结 文档转换器只是实现生产级别 RAG 的实现步骤之一,生产级别的 RAG 实现的步骤通常包含:文档加载器、文档解析器、文档转换器、文档分词器、文档向量化、向量持久化、向量检索等过程,而且每个过程可能都要反复调优,才能实现生产级别的准确性要求。