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,即可兼容各种格式文档的解析。