找回密码
 立即注册
首页 业界区 业界 LangChain4j如何自定义文档转换器实现数据清洗? ...

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

句惫 6 天前
LangChain4j 提供了 3 种 RAG(Retrieval-Augmented Generation,检索增强生成)实现,我们通常在原生或高级的 RAG 实现中,要对数据进行清洗,也就是将外接知识库中的原数据进行噪音去除,留下有价值的信息。
例如在带有 HTML 标签的文本中,HTML 标签就是噪音,他对于搜索结果是没有任何帮助,甚至会影响查询结果的,因此我们就需要将 HTML 标签进行清除。
那问题来了,怎么进行数据清洗呢?
这就要使用到文档转换器了,那么在不使用 LangChain4j 内置文档转换器的前提下(因为业务需求是复杂且多变的,因此很多时候我们需要使用自定义文档转换器才能实现预期的效果),那怎么实现呢?接下来一起来看。
自定义文档转换器

以去除文本中的 HTML 标签为例,LangChain4j 中自定义文档转换器的实现步骤如下:

  • 新建类实现 DocumentTransformer 接口。
  • 重写 transform 和 transformAll 方法,前者是对 Document 对象进行文档转换,后者是对 List 进行数据转换。
  • 在 transform 和 transformAll 方法中,实现数据清除的具体业务落地。
具体实现代码
  1. import dev.langchain4j.data.document.Document;
  2. import dev.langchain4j.data.document.DocumentTransformer;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. /**
  6. * 自定义文档转换器
  7. */
  8. public class HtmlToTextDocumentTransformer implements DocumentTransformer {
  9.     @Override
  10.     public Document transform(Document document) {
  11.         return Document.from(removeHtmlTags(document.text()));
  12.     }
  13.     // 使用正则表达式清除内容中的 HTML 标签
  14.     public static String removeHtmlTags(String html) {
  15.         if (html == null || html.isEmpty()) {
  16.             return "";
  17.         }
  18.         // 定义正则表达式,匹配所有HTML标签
  19.         String regex = "<[^>]+>";
  20.         // 替换所有匹配的标签为空字符串
  21.         return html.replaceAll(regex, "").trim();
  22.     }
  23.     @Override
  24.     public List<Document> transformAll(List<Document> documents) {
  25.         List<Document> list = new ArrayList<Document>();
  26.         documents.stream().forEach(document -> {
  27.             list.add(this.transform(document));
  28.         });
  29.         return list;
  30.     }
  31. }
复制代码
调用文档转换器
  1. Document htmlDoc = Document.from(
  2.         "<html><body><p>Clean <b>me</b>!</p></body></html>"
  3. );
  4. // 文档转换器
  5. DocumentTransformer transformer = new HtmlToTextDocumentTransformer();
  6. Document cleanedDoc = transformer.transform(htmlDoc);
  7. System.out.println(cleanedDoc.text());
复制代码
最终的执行结果为:
Clean me!
小结

文档转换器只是实现生产级别 RAG 的实现步骤之一,生产级别的 RAG 实现的步骤通常包含:文档加载器、文档解析器、文档转换器、文档分词器、文档向量化、向量持久化、向量检索等过程,而且每个过程可能都要反复调优,才能实现生产级别的准确性要求,所以道阻且长,吾辈尚需努力啊!
本文已收录到我的技术小站 www.javacn.site,其中包含的内容有:Spring AI、LangChain4j、Dify、Agent、MCP、Function Call、RAG、向量数据库、Prompt、多模态、向量数据库、嵌入模型等内容。
   

关注公众号(加好友):

            
作者:        王磊的博客        
出处:        http://vipstone.cnblogs.com/        
   

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册