spring-ai-alibaba提供了許多讀取外部文檔的包,例如語雀、飛書、notion筆記等
這些包以spring-ai-alibaba-starter-document-reader開頭,實現了spring-ai的DocumentReader接口
最簡單樣例
我們一起來看一個最簡單的例子,以spring-ai-alibaba-starter-document-reader-bilibili為例
使用分為三步
第一步:引入jar包
<dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter-document-reader-bilibili</artifactId></dependency>
?第二步:申請權限并添加配置
這一步某些平臺可以省略,比如樣例的bilibili,無需申請api-key之類的令牌即可訪問
第三步:調用代碼
BilibiliDocumentReader reader = new BilibiliDocumentReader("BV1ErERzUEqg");List<Document> documents = reader.get();System.out.println(documents.size());System.out.println(documents.get(0).getText());System.out.println(documents.get(0).getMetadata().get("title"));
這里我是讀取的B站的全網最最全的AI推薦!歷時半年,我們選出了Top100【全網首發】_嗶哩嗶哩_bilibili,在其網址中找到BV開頭的那串字符(這是視頻的id),傳入BilibiliDocumentReader即可實現讀取。
ps:BilibiliDocumentReader并不會讀取視頻中的語音或字幕,讀取的主要是標題和下方的文字描述。
進階知識
內部原理
spring-ai-alibaba的document-reader包中,一般包含2部分:
META-INF:元信息,主要是pom文件引入外部依賴
java實現類:實現類數量不同jar包不一樣,一般為1-3個,主要有以下三個角色
? ? ? ? 1)代表訪問權限的類:接收用戶api-key或access-token等身份識別信息,確保用戶有權限訪問平臺數據
? ? ? ? 2)代表資源路徑的類:接收資源位置,如本地路徑、網址等,用來訪問目標資源
? ? ? ? 3)代表解析器的類:根據目標資源的類型實現文檔解析,如html解析、xml解析、markdown解析等
整體流程一般是根據訪問權限和資源路徑拼裝請求,得到回復后使用對應的解析器,解析為Document格式的結果。
DocumentParser
上面提到的第三種角色,代表解析器的類,在spring-ai-alibaba中被提煉為一個接口:DocumentParser
public interface DocumentParser {List<Document> parse(InputStream inputStream);}
DocumentParser接收一個輸入流,輸出Document列表
DocumentParser與DocumentReader接口不同,DocumentParser不關心數據如何來,只關心拿到數據后,如何轉換為Document
除了spring-ai-alibaba-core中包含的JsonDocumentParser和TextDocumentParser,spring-ai-alibaba還提供了許多document-parser的擴展包,如Markdown、pdf等(具體可以參考spring-ai-alibaba 1.0.0.2 學習(二)——jar包盤點-CSDN博客)
DocumentParser可以理解為DocumentReader接口實現過程中的一個子步驟,主要是為了將文檔平臺和文檔格式進行解耦
舉個例子,在語雀平臺有markdown格式的文檔,在notion筆記中也有markdown格式的文檔,那么在接入各個平臺的markdown格式文檔時,為了避免重復造輪子,那么就將markdown格式文檔轉換成Document的代碼提取為MarkdownDocumentParser(spring-ai-alibaba-starter-document-parser-markdown),那么在各個平臺的DocumentReader的構造函數中傳入同一個MarkdownDocumentParser即可
換個角度,語雀平臺有markdown格式的文檔,也可能有yaml格式或者其他格式的文檔,那么YuQueDocumentReader的構造函數只需要傳入一個DocumentParser,即可兼容各種格式文檔的解析。