相比私有知识库,检索前还需要创建知识库,自行导入知识文档,从网上检索公开文档这个方案直接检索即可,省略了搭建知识库的过程,更加方便

前一篇接入阿里百炼云平台知识库,虽然知识库是在云端,但仍然是私有知识库,那如果不想接入私有知识库,想从网上检索文档,应该如何操作呢?

阿里云提供了信息查询服务(信息查询服务(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{
    
    @Override
    public 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);
    }

    //将结果转化为Document
    private List<Document> convertDocument(UnifiedSearchResponse response) {
        
        return response.getBody().getPageItems().stream()
                .map(item ->
                        Document.builder()
                                .text(item.mainText)
                                .score(item.rerankScore)
                                .build()
                )
                .toList();
    }

    //构建Client对象
    //也可以将Client做成自动装配的bean
    private 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博客 中的检索部分)

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐