一、文檔檢索 (Document Retriever)簡介
1、核心概念
文檔檢索(DocumentRetriever)是一種信息檢索技術,旨在從大量未結構化或半結構化文檔中快速找到與特定查詢相關的文檔或信息。文檔檢索通常以在線(online)方式運行。
DocumentRetriever通常基于向量搜索。 它將用戶的查詢問題(query)轉化為Embeddings后,在存儲文檔中進行相似性搜索,返回相關的片段。片段的用途之一是作為提示詞(prompt)的一部分,發送給大模型(LLM)匯總處理后,作為答案呈現給用戶。
public interface DocumentRetriever extends Function<Query, List<Document>> {/*** Retrieves relevant documents from an underlying data source based on the given* query.* @param query The query to use for retrieving documents* @return The list of relevant documents*/List<Document> retrieve(Query query);default List<Document> apply(Query query) {return retrieve(query);}}
DocumentRetriever API提供了簡單、靈活的方式,供開發者使用自定義的檢索系統。
- DocumentRetriever API簡單地將用戶的查詢作為輸入,返回文檔片段(Document)的列表。
- Document表示一個文檔片段,它包含一個文本內容,以及一個或多個元數據。
- 用戶可以通過retrieve方法執行自定義的檢索步驟。
- DashScopeDocumentRetrieverOptions提供了DashScopeDocumentRetriever的配置信息,它通過構建器創建選項。
- 在構造DashScopeDocumentRetriever時,通過將一個DashScopeDocumentRetrieverOptions實例傳入,已完成配置。
DashScopeDocumentCloudReader類:百煉云端文檔解析,主要是走當前數據中心邏輯。
作用:將用戶添加的文檔上傳到百煉平臺云端。
通過查看 DashScopeDocumentCloudReader的get方法可以看到上傳邏輯。
二、文檔檢索 (Document Retriever)使用
Spring AI Alibaba 文檔檢索 (Document Retriever):https://java2ai.com/docs/1.0.0-M6.1/tutorials/retriever
Spring AI Alibaba 支持以上 Model 抽象與通義系列模型的適配,并通過 spring-ai-alibaba-starter AutoConfiguration 自動初始化了默認實例,因此我們可以在應用程序中直接注入 ChatModel、ImageModel 等 bean,當然在需要的時候也可以自定義 Model 實例。
在普通 Controller Bean 中注入 DocumentRetriever 實例,實現下面幾個功能:
- 簡單調用
- 流式調用
- 上傳用戶文檔-向量存儲
編寫 Controller接口
@Slf4j
@RestController
@RequestMapping("/dashscope/document-retriever")
public class DashScopeDocumentRetrieverController {private final ChatClient chatClient;private final DashScopeApi dashscopeApi;@Value("${spring.ai.dashscope.api-key}")private String apiKey;//private String apiKey = "sk-xxx";private static final String indexName = "高并發-知識庫";private static final String retrievalSystemTemplate = """Context information is below.---------------------{question_answer_context}---------------------Given the context and provided history information and not prior knowledge,reply to the user comment. If the answer is not in the context, informthe user that you can't answer the question.""";public DashScopeDocumentRetrieverController(ChatClient.Builder builder) {// 暫時無法從Spring IOC容器中獲取,所以這里手動創建 DashScopeApi 對象。this.dashscopeApi = new DashScopeApi(apiKey);DocumentRetriever retriever = new DashScopeDocumentRetriever(this.dashscopeApi,DashScopeDocumentRetrieverOptions.builder().withIndexName(indexName).build());this.chatClient = builder//.defaultAdvisors(new DocumentRetrievalAdvisor(retriever)).defaultAdvisors(new DocumentRetrievalAdvisor(retriever, retrievalSystemTemplate)).build();}/*** 導入用戶文檔*/@GetMapping("/importDocuments")private String importDocuments() {File file = new File("D:\\TempFiles\\高并發秒殺系統的設計與實現.pdf");// 獲取文件或目錄的絕對路徑。String filePath = file.getAbsolutePath();// 1. import and split documentsDocumentReader reader = new DashScopeDocumentCloudReader(filePath, dashscopeApi, null);List<Document> documentList = reader.get();log.info("{} documents loaded and split", documentList.size());// 2. add documents to DashScope cloud storageVectorStore vectorStore = new DashScopeCloudStore(dashscopeApi, new DashScopeStoreOptions(indexName));vectorStore.add(documentList);log.info("{} documents added to dashscope cloud vector store", documentList.size());return "success";}/*** 簡單調用方式*/@GetMapping("/simple/chat")public String simpleChat(@RequestParam(defaultValue = "你好,請問你的知識庫文檔主要是關于什么內容的?") String userInputPrompt) {String aiOutput = chatClient.prompt(userInputPrompt).call().content();log.info("simpleChat --> userInputPrompt = {}, aiOutput = {}", userInputPrompt, aiOutput);return aiOutput;}/*** Stream 流式調用。* 可以使大模型的輸出信息實現打字機效果。*/@GetMapping("/stream/chat")public Flux<String> streamChat(HttpServletResponse response,@RequestParam(defaultValue = "你好,請問你的知識庫文檔主要是關于什么內容的?") String userInputPrompt) {// 避免接口返回亂碼response.setCharacterEncoding("UTF-8");log.info("streamChat --> userInputPrompt = {},", userInputPrompt);Flux<String> aiOutput = chatClient.prompt(userInputPrompt).stream().content();return aiOutput;}}
啟動項目,用戶上傳文件之后,我們在阿里云百煉平臺就可以查看到文檔信息。
訪問接口與 AI 大模型智能對話。
– 求知若饑,虛心若愚。