跳到主要内容

搜索模块(Search)

1. 模块介绍

搜索模块提供多数据源检索能力,支持项目上下文搜索、知识库搜索、Web 搜索等,为 Agent 提供信息获取能力。

核心概念

概念说明
SearchProvider搜索提供者 SPI,实现特定数据源的搜索能力
SearchFacade搜索门面,统一搜索入口
SearchSourceType数据源类型枚举
SearchRequest搜索请求
SearchResultItem搜索结果项

数据源类型

类型说明使用场景
PROJECT项目上下文代码、配置、日志
KNOWLEDGE知识库FAQ、规范、最佳实践
WEBWeb 搜索公开搜索引擎
EXPERIENCE经验池历史经验检索
CUSTOM自定义自定义数据源

工作流程

Agent 调用搜索工具


┌─────────────────────────────────────────┐
│ search.query(keyword="xxx") │
└────────────────┬────────────────────────┘

┌─────────────────────────────────────────┐
│ SearchFacade │
│ 路由到合适的 SearchProvider │
└────────────────┬────────────────────────┘

┌─────────────────────────────────────────┐
│ SearchProvider │
│ 执行实际搜索 │
└────────────────┬────────────────────────┘

返回搜索结果

2. 快速接入方式

步骤 1:配置搜索模块

# application.yml
spring:
ai:
alibaba:
codeact:
extension:
search:
enabled: true
project-search-enabled: true
knowledge-search-enabled: true
web-search-enabled: false
default-top-k: 10
search-timeout-ms: 5000

步骤 2:实现 SearchProvider

import com.alibaba.assistant.agent.extension.search.spi.SearchProvider;
import com.alibaba.assistant.agent.extension.search.model.*;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.ArrayList;

@Component
public class KnowledgeSearchProvider implements SearchProvider {

private final KnowledgeBaseClient knowledgeClient;

public KnowledgeSearchProvider(KnowledgeBaseClient knowledgeClient) {
this.knowledgeClient = knowledgeClient;
}

@Override
public boolean supports(SearchSourceType type) {
return type == SearchSourceType.KNOWLEDGE;
}

@Override
public List<SearchResultItem> search(SearchRequest request) {
List<SearchResultItem> results = new ArrayList<>();

// 调用知识库搜索
List<Document> docs = knowledgeClient.search(
request.getQuery(),
request.getTopK()
);

// 转换结果
for (Document doc : docs) {
SearchResultItem item = new SearchResultItem();
item.setId(doc.getId());
item.setTitle(doc.getTitle());
item.setContent(doc.getContent());
item.setSourceType(SearchSourceType.KNOWLEDGE);
item.setScore(doc.getScore());

// 设置元数据
SearchMetadata metadata = new SearchMetadata();
metadata.setSourceName("knowledge-base");
metadata.getExtensions().put("docId", doc.getId());
metadata.getExtensions().put("category", doc.getCategory());
item.setMetadata(metadata);

results.add(item);
}

return results;
}

@Override
public String getName() {
return "KnowledgeSearchProvider";
}
}

步骤 3:Agent 调用搜索

Agent 生成的代码可以调用搜索工具:

# 搜索知识库
results = search.knowledge(query="如何处理订单超时", top_k=5)
for item in results:
print(f"标题: {item['title']}")
print(f"内容: {item['content']}")

# 搜索项目代码
code_results = search.project(query="订单状态枚举", top_k=3)

# 统一搜索(自动选择数据源)
all_results = search.query(keyword="订单处理", sources=["KNOWLEDGE", "PROJECT"])

3. 搜索请求

SearchRequest request = new SearchRequest();
request.setQuery("搜索关键词");
request.getSourceTypes().add(SearchSourceType.KNOWLEDGE); // 添加数据源类型
request.setTopK(10);
request.getFilters().put("category", "技术文档");
request.getFilters().put("language", "java");

4. 搜索结果

SearchResultItem item = new SearchResultItem();
item.setId("doc-001");
item.setTitle("文档标题");
item.setContent("文档内容...");
item.setSnippet("文档摘要...");
item.setSourceType(SearchSourceType.KNOWLEDGE);
item.setScore(0.95); // 相关度分数
item.setUri("https://..."); // 资源链接(可选)

// 设置元数据
SearchMetadata metadata = new SearchMetadata();
metadata.setSourceName("knowledge-base");
metadata.setLanguage("java");
metadata.getExtensions().put("category", "技术文档");
item.setMetadata(metadata);

Spring AI Alibaba 开源项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。