LangChain4j如何自定義文檔轉換器實現數據清洗?
LangChain4j 提供了 3 種 RAG(Retrieval-Augmented Generation,檢索增強生成)實現,我們通常在原生或高級的 RAG 實現中,要對數據進行清洗,也就是將外接知識庫中的原數據進行噪音去除,留下有價值的信息。
例如在帶有 HTML 標簽的文本中,HTML 標簽就是噪音,他對于搜索結果是沒有任何幫助,甚至會影響查詢結果的,因此我們就需要將 HTML 標簽進行清除。
那問題來了,怎么進行數據清洗呢?
這就要使用到文檔轉換器了,那么在不使用 LangChain4j 內置文檔轉換器的前提下(因為業務需求是復雜且多變的,因此很多時候我們需要使用自定義文檔轉換器才能實現預期的效果),那怎么實現呢?接下來一起來看。
自定義文檔轉換器
以去除文本中的 HTML 標簽為例,LangChain4j 中自定義文檔轉換器的實現步驟如下:
- 新建類實現 DocumentTransformer 接口。
- 重寫 transform 和 transformAll 方法,前者是對 Document 對象進行文檔轉換,后者是對 List進行數據轉換。
- 在 transform 和 transformAll 方法中,實現數據清除的具體業務落地。
具體實現代碼
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<Document> transformAll(List<Document> documents) {
List<Document> list = new ArrayList<Document>();
documents.stream().forEach(document -> {
list.add(this.transform(document));
});
return list;
}
}
調用文檔轉換器
Document htmlDoc = Document.from(
"<html><body><p>Clean <b>me</b>!</p></body></html>"
);
// 文檔轉換器
DocumentTransformer transformer = new HtmlToTextDocumentTransformer();
Document cleanedDoc = transformer.transform(htmlDoc);
System.out.println(cleanedDoc.text());
最終的執行結果為:
Clean me!
小結
文檔轉換器只是實現生產級別 RAG 的實現步驟之一,生產級別的 RAG 實現的步驟通常包含:文檔加載器、文檔解析器、文檔轉換器、文檔分詞器、文檔向量化、向量持久化、向量檢索等過程,而且每個過程可能都要反復調優,才能實現生產級別的準確性要求,所以道阻且長,吾輩尚需努力啊!