spring-ai-alibaba 1.0.0.2 学习(八)——接入阿里云信息查询服务
相比私有知识库,检索前还需要创建知识库,自行导入知识文档,从网上检索公开文档这个方案直接检索即可,省略了搭建知识库的过程,更加方便
前一篇接入阿里百炼云平台知识库,虽然知识库是在云端,但仍然是私有知识库,那如果不想接入私有知识库,想从网上检索文档,应该如何操作呢?
阿里云提供了信息查询服务(信息查询服务(IQS)-阿里云帮助中心)作为大模型专用搜索解决方案,可惜spring-ai-alibaba并没有将其直接封装为工具或检索器(但是提供了baidu和bing作为工具,具体工具列表参考spring-ai-alibaba 1.0.0.2 学习(二)——jar包盘点-CSDN博客),需要我们自行封装
ps: 阿里通义大模型qwen本身是有联网搜索功能的,仅需将options中的enable_search设置为true即可(默认false)
将信息查询服务封装为检索器
第一步:引入相关依赖
<dependency><groupId>com.aliyun</groupId><artifactId>iqs20241111</artifactId><version>1.3.1</version>
</dependency>
第二步:申请权限并添加配置
在阿里云平台申请IQS权限,并将accessKeyId和accessKeySecret添加到配置文件
第三步:代码封装
import com.alibaba.cloud.ai.dashscope.api.DashScopeApi;
import com.alibaba.cloud.ai.dashscope.rag.DashScopeDocumentRetrievalAdvisor;
import com.alibaba.cloud.ai.dashscope.rag.DashScopeDocumentRetriever;
import com.alibaba.cloud.ai.dashscope.rag.DashScopeDocumentRetrieverOptions;
import com.aliyun.iqs20241111.Client;
import com.aliyun.iqs20241111.models.*;
import com.aliyun.teaopenapi.models.Config;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.api.Advisor;
import org.springframework.ai.document.Document;
import org.springframework.ai.rag.Query;
import org.springframework.ai.rag.retrieval.search.DocumentRetriever;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;public class AlibabaIqsDocumentRetriever implements DocumentRetriever{@Overridepublic List<Document> retrieve(Query query) {try {//分2步,初始化客户端,执行搜索Client iqsClient = initClient();return search(iqsClient, query);} catch (Exception e) {throw new RuntimeException(e);}}//执行搜索private List<Document> search(Client client, Query query) throws Exception {//分3步:构建请求对象,调用client发送请求,处理返回结果RequestContents requestContents = new RequestContents().setMainText(true);UnifiedSearchInput input = new UnifiedSearchInput().setQuery(query.text()).setContents(requestContents);UnifiedSearchRequest request = new UnifiedSearchRequest().setBody(input);UnifiedSearchResponse response = client.unifiedSearch(request);return convertDocument(response);}//将结果转化为Documentprivate List<Document> convertDocument(UnifiedSearchResponse response) {return response.getBody().getPageItems().stream().map(item ->Document.builder().text(item.mainText).score(item.rerankScore).build()).toList();}//构建Client对象//也可以将Client做成自动装配的beanprivate Client initClient() throws Exception {String accessKeyId = "your_access_key_id";String accessKeySecret = "your_access_key_secret";Config iqsConfig = new Config().setAccessKeyId(accessKeyId).setAccessKeySecret(accessKeySecret).setEndpoint("iqs.cn-zhangjiakou.aliyuncs.com");return new Client(iqsConfig);}
}
通过以上三步,就可以使用DocumentRetriever进行检索了(将其注入DocumentRetrievalAdvisor,不清楚的参考spring-ai-alibaba 1.0.0.2 学习(七)——集成阿里云百炼平台知识库-CSDN博客 中的检索部分)