深度搜索(Deep Search)是一款基于 Multi-Agent 架构的专业知识问答系统,专注于为用户提供精准、聚焦且内容详尽的深度解答。它不仅能够高效检索数据,还具备理解用户意图、整合多源数据并生成全面且结构化的答案的能力。相较于传统搜索引擎,深度搜索在复杂问题的拆解、多源数据的深度融合以及跨领域知识的关联方面表现更为出色。
能力对比
下表展示了深度搜索和传统AI搜索的对比:
维度 | 深度搜索 | 传统AI搜索 |
理解能力 | 上下文推理,意图识别。 | 语义检索、关键词检索。 |
响应模式 | 主动追问上下文细节(如时间范围、地域限制等)。 | 被动接受原始提问。 |
数据来源 | 支持跨平台聚合(私域、联网、数据库等)。 | 依赖某个单一数据源。 |
知识密度 | 单次输出多篇参考文献标注,直到准确回答问题。 | 仅提供固定的3-5个相关数据段。 |
交互深度 | 支持连续多轮的专业对话。 | 会话轮数对效果影响较大。 |
适用问题 | 复杂、开放性问题(如分析、对比等)。 | 简单、事实型问题。 |
技术架构
深度搜索是基于Multi-Agent架构的系统,由以下Single-Agent组成:
Query理解Agent:对用户原始Query的理解和改写。
自主规划Agent:用于对用户Query的意图识别、执行路径规划和调整、答案校正等。
搜索Agent:用于本轮知识检索和总结。
闲聊Agent:用于对用户闲聊场景的回答,如“你好”等。
澄清Agent:反问问题的生成,用于明确用户模糊的问题。
总结Agent:用于最终回答用户问题。
能力体验
控制台
1、登录开放搜索控制台选择LLM智能问答版,点击左侧导航栏实例管理,选择对应的实例点击管理。
2、进入实例详情页面,点击问答测试,开启深度搜索,在对话框输入需要询问的内容,点击发送。
3、问答测试效果展示。
API调用
深度搜索相关请求参数
参数 | 类型 | 必须 | 默认值 | 描述 |
options.chat.enable_deep_search | Boolean | 否 | true | 是否打开深度搜索。
|
options.chat.agent.think_process | Boolean | 否 | true | 是否返回思考过程。 |
options.chat.agent.max_think_round | Integer | 否 | 10 | 思考轮数(最大不超过20)。 |
options.chat.agent.language | String | 否 | AUTO | 思考过程及回答语言。 AUTO:根据用户query判断使用中文还是英文。 CN:中文。 EN:英文。 |
完整问答测试参数请参见问答参数说明。
请求体示例
{
"question" : {
"text" : "推荐3张周杰伦的专辑",
"type" : "TEXT"
},
"options": {
"retrieve": {
"web_search": {
"enable": true
}
},
"chat": {
"enable_deep_search": true,
"model": "qwen3-235b-a22b"
},
"agent": {
"think_process": true,
"max_think_round": 10,
"language": "AUTO"
}
}
}
返回参数
参数 | 类型 | 描述 |
request_id | String | 请求ID。 |
status | String | 请求的处理状态。
|
latency | Float | 请求成功时,服务器处理请求所花费的时间,单位为毫秒。 |
id | Integer | 主键ID。 |
title | String | 文档的标题。 |
category | String | 类目名。 |
url | String | 文档链接。 |
answer | String | 问答结果。 |
type | String | 返回结果类型。 |
scores | Array | 文档内容分。 |
event | String | 思考事件。 THINK+ACTION+ANSWER为一轮思考过程(THINK不保证一定返回)。THINK表示思考,ACTION表示执行的动作,ANSWER表示本轮思考结论。SUMMARY为最终回答结果,文本类型的只有一个。 |
event_status | String | 该结果是否完成。 PROCESSING:回答中; FINISHED:回答结束。 |
code | String | 返回的错误码(若无报错则不返回)。 |
message | String | 返回的错误信息(若无报错则不返回)。 |
响应体示例
{
"request_id": "f1b9*****************2853a",
"status": "OK",
"latency": 33967.562031,
"result": {
"data": [
{
"answer": "用户要求推荐3张周杰伦的专辑。我需要先了解周杰伦有哪些专辑,然后从中挑选3张具有代表性的推荐。",
"type": "TEXT_MARKDOWN",
"reference": [],
"rich_text_ref": [],
"event": "THINK",
"event_status": "FINISHED"
},
{
"answer": "周杰伦所有专辑列表",
"type": "TEXT_MARKDOWN",
"reference": [],
"rich_text_ref": [],
"event": "ACTION",
"event_status": "FINISHED"
},
{
"answer": "周杰伦的专辑列表如下(按发行年份排序): \n\n1. **《JAY》**(2000年) \n2. **《范特西》**(2001年) \n3. **《八度空间》**(2002年) \n4. **《叶惠美》**(2003年) \n5. **《七里香》**(2004年) \n6. **《十一月的萧邦》**(2005年) \n7. **《依然范特西》**(2006年) \n8. **《我很忙》**(2007年) \n9. **《魔杰座》**(2008年) \n10. **《跨时代》**(2010年) \n11. **《惊叹号》**(2011年) \n12. **《十二新作》**(2012年) \n13. **《哎呦,不错哦》**(2014年) \n14. **《周杰伦的床边故事》**(2016年) \n15. **《最伟大的作品》**(2022年) \n\n注:部分搜索结果中提到的歌曲实际为专辑内曲目,已整理为完整专辑列表。",
"type": "TEXT_MARKDOWN",
"reference": [],
"rich_text_ref": [],
"event": "ANSWER",
"event_status": "FINISHED"
},
{
"answer": "\n首先,用户的问题是:“推荐3张周杰伦的专辑”。我需要基于已知信息来回答。已知信息包括多个文档,描述了周杰伦的专辑。\n\n回顾已知信息:\n- [文档01] 列出了周杰伦的专辑和歌曲,但似乎只提到了《JAY》专辑,并列出了一些歌曲,但文档开头说“周杰伦的音乐作品包括六张正式个人专辑、四张EP专辑”,但具体专辑名称没有完整列出。它列出了歌曲,但专辑名称只有《JAY》被明确提到。\n- [文档02] 提到了专辑如《八度空间》、《周杰伦的床边故事》、《范特西》、《杰伦》等,并给出了年份。\n- [文档03] 类似[文档02],提到了专辑如《最伟大的作品》、《周杰伦的床边故事》、《哎呦, 不错哦》、《十二新作》、《惊叹号》。\n- [文档04] 提到了《JAY》和《范特西》,并描述了它们。\n- [文档05] 类似[文档02]和[文档03],提到了相同的专辑。\n\n从这些文档中,我可以提取出周杰伦的专辑列表:\n- [文档02] 和 [文档03] 明确列出了专辑名称和年份:\n - 《最伟大的作品》2022年\n - 《周杰伦的床边故事》2016年\n - 《哎呦, 不错哦》2014年\n - 《十二新作》2012年\n - 《惊叹号》2011年\n- 另外,[文档01] 提到了《JAY》2000年,[文档04] 也提到了《JAY》和《范特西》。\n- [文档02] 还提到了《八度空间》2002年、《范特西》2001年、《杰伦》2000年(可能指的是《JAY》)。\n\n综合所有文档,周杰伦的专辑包括:\n- 《JAY》2000年 [文档01][文档04]\n- 《范特西》2001年 [文档02][文档04]\n- 《八度空间》2002年 [文档02]\n- 《惊叹号》2011年 [文档02][文档03]\n- 《十二新作》2012年 [文档02][文档03]\n- 《哎呦, 不错哦》2014年 [文档02][文档03]\n- 《周杰伦的床边故事》2016年 [文档02][文档03]\n- 《最伟大的作品》2022年 [文档02][文档03]\n\n用户要求推荐3张专辑。我需要基于已知信息推荐,并确保每一点都有来源支撑。\n\n推荐标准:我应该选择一些经典或代表性的专辑。从文档中:\n- [文档02] 和 [文档03] 高度评价了《范特西》,称其为“周杰伦音乐生涯里的高峰,也成为无数音乐人相继模仿,却难以逾越的时代标杆之作”。[文档02][文档03]\n- [文档01] 提到了《JAY》作为首张专辑。\n- [文档02] 提到了《八度空间》延续了前两张专辑的风格,并拿下多项大奖。[文档02]\n- 其他专辑如《周杰伦的床边故事》和《最伟大的作品》也被提及。\n\n所以,我可以推荐:\n1. 《范特西》 - 因为它被描述为高峰和标杆。\n2. 《JAY》 - 作为首张专辑,具有历史意义。\n3. 《八度空间》 - 因为它延续了成功并获奖。\n\n或者,选择更近期的,但文档中强调了早期专辑的重要性。\n\n确保引用来源:每个事实必须用[文档xx]格式引用。\n\n回答要求:\n- 使用中文。\n- 如果已知信息能回答问题,必须使用已知信息,并引用来源。\n- 使用丰富的markdown格式:如列表、表格等。\n- 自然语气,不生硬。\n- 正确性,不编造信息。\n\n结构回答:\n- 开头直接推荐3张专辑。\n- 为每张专辑提供理由,基于文档。\n- 使用列表或表格组织。\n- 引用来源。\n\n最终推荐:\n1. 《范特西》 (2001年) - 理由:被描述为周杰伦音乐生涯的高峰和时代标杆。[文档02][文档03]\n2. 《JAY》 (2000年) - 理由:首张专辑,奠定了他的音乐风格。[文档01][文档04]\n3. 《八度空间》 (2002年) - 理由:延续前作风格,拿下多项大奖,给唱片行业带来希望。[文档02]\n\n或者,考虑《周杰伦的床边故事》或《最伟大的作品》,但文档中对它们的描述较少,而早期专辑有更多评价。\n\n在[文档02][文档03]中,有对《范特西》的详细描述,其他专辑只是列出。\n\n所以,选择这三张是合理的。\n\n使用markdown:可以用有序列表或表格。\n\n例如:\n- 用### 标题\n- 列表描述\n- 加粗专辑名称\n\n确保不添加额外信息:只基于文档。\n",
"type": "TEXT_MARKDOWN",
"reference": [],
"rich_text_ref": [],
"event": "THINK",
"event_status": "FINISHED"
},
{
"answer": "\n以下是基于周杰伦音乐生涯的代表性专辑,我为您推荐三张经典作品。这些专辑不仅展现了周杰伦独特的音乐风格(融合流行、R&B、摇滚等元素),还因其艺术成就和影响力而广受赞誉。推荐依据来源于可靠文档信息,每张专辑的推荐理由都严格基于相关文档内容,并标注了来源编号(如[文档xx])。\n\n### 推荐的三张周杰伦专辑\n\n1. **《范特西》(2001年)** \n - **推荐理由**:这张专辑被公认为周杰伦音乐生涯的高峰之作,它确立了其创作范式,成为无数音乐人模仿却难以逾越的时代标杆。专辑中的每首歌都像一颗镜头,以听觉塑造画面,带人穿越古今中外,例如《爱在西元前》融合R&B与嘻哈,营造时空漩涡感;《忍者》用单一和弦和日式意象增强临场感;《威廉古堡》则以管风琴演奏营造诡谲的中世纪氛围。整体上,它奠定了周杰伦成熟的方法论,并深受全球乐迷喜爱[^2^][^3^]。 \n - **代表歌曲**:《爱在西元前》《忍者》《威廉古堡》(来源:[^2^][^3^])。\n\n2. **《JAY》(2000年)** \n - **推荐理由**:作为周杰伦的首张个人专辑,它标志着其音乐生涯的起点,收录了多首经典歌曲如《可爱女人》《完美主义》和《星晴》。这张专辑展现了周杰伦独特的音乐才华,融合了多种元素,为后续作品奠定了基调,并迅速赢得了乐迷的广泛认可[^1^][^4^]。 \n - **代表歌曲**:《可爱女人》《完美主义》《星晴》(来源:[^1^][^4^])。\n\n3. **《八度空间》(2002年)** \n - **推荐理由**:这张专辑延续了前两张作品的编曲基调,个人风格更加成熟,帮助周杰伦势如破竹地拿下多项大奖,缔造了华语乐坛新纪录。同时,它以高销量为当时受盗版困扰的唱片行业带来了希望。专辑中的闽南语歌曲《火车叨位去》体现了周杰伦的乡土情怀,这在后期作品中较为罕见,突显了其艺术深度[^2^]。 \n - **代表歌曲**:《火车叨位去》《暗号》(来源:[^2^])。\n\n这三张专辑分别代表了周杰伦早期事业的突破、创新和成熟阶段,是了解其音乐精髓的绝佳起点。每张都承载着独特的创作故事,值得您细细品味!",
"type": "TEXT_MARKDOWN",
"reference": [
{
"title": "谁晓得周杰伦的所有专辑的名字",
"category": "webSearch",
"url": "https://zhidao.baidu.com/question/317142607014917724.html"
},
{
"title": "周杰伦",
"category": "webSearch",
"url": "https://music.apple.com/cn/artist/300117743"
},
{
"title": "\u200e周杰伦-Apple Music",
"category": "webSearch",
"url": "https://music.apple.com/cn/artist/a/300117743"
},
{
"title": "周杰伦全专辑名称汇总",
"category": "webSearch",
"url": "https://m.xueba5.com/xw/25426.html"
},
{
"title": "周杰伦",
"category": "webSearch",
"url": "https://music.apple.com/cn/artist/%E5%91%A8%E6%9D%B0%E4%BC%A6/300117743"
}
],
"rich_text_ref": [],
"event": "SUMMARY",
"event_status": "FINISHED"
}
]
}
}
SDK调用
配置环境变量
配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维,具体操作,请参见创建RAM用户。
创建AccessKey ID和AccessKey Secret,请参考创建AccessKey。
如果您使用的是RAM用户的AccessKey,请确保您的RAM用户账号被授予AliyunOpenSearchFullAccess权限。
请不要将AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
Linux和macOS系统配置方法:
执行以下命令,其中,
<access_key_id>
需替换为您RAM用户的AccessKey ID,<access_key_secret>
替换为您RAM用户的AccessKey Secret。export ALIBABA_CLOUD_ACCESS_KEY_ID=<access_key_id> export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<access_key_secret>
Windows系统配置方法
新建环境变量文件,添加环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET,并写入已准备好的AccessKey ID和AccessKey Secret。
重启Windows系统生效。
添加依赖
<dependency>
<groupId>com.aliyun.opensearch</groupId>
<artifactId>aliyun-sdk-opensearch</artifactId>
<version>6.0.0</version>
</dependency>
调用代码
您可以参考以下代码示例完成调用。
package com.aliyun.opensearch;
import com.aliyun.opensearch.OpenSearchClient;
import com.aliyun.opensearch.sdk.generated.OpenSearch;
import com.aliyun.opensearch.sdk.generated.commons.OpenSearchClientException;
import com.aliyun.opensearch.sdk.generated.commons.OpenSearchException;
import com.aliyun.opensearch.sdk.generated.commons.OpenSearchResult;
import java.util.HashMap;
import java.util.Map;
public class LLMSearch {
private static String accesskey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
private static String secret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
private static String appName = "替换为应用名称";
private static String host = "替换应用的API访问地址";
private static String path = "/apps/%s/actions/multi-search";
public static void main(String[] args) {
String appPath = String.format(path, appName);
//ApiReadTimeOut
OpenSearch openSearch = new OpenSearch(accesskey, secret, host);
openSearch.setTimeout(90000);
OpenSearchClient openSearchClient = new OpenSearchClient(openSearch);
Map<String, String> params = new HashMap<String, String>() {{
put("format", "full_json");
put("_POST_BODY", "{\"question\":{\"text\":\"推荐3张周杰伦的专辑\",\"type\":\"TEXT\",\"session\":\"\"},\"options\":{\"chat\":{\"stream\":true,\"enable_deep_search\":true,\"model\":\"opensearch-qwen\"}}}");
}};
try {
OpenSearchResult openSearchResult = openSearchClient
.callAndDecodeResult(appPath, params, "POST");
System.out.println("RequestID=" + openSearchResult.getTraceInfo().getRequestId());
System.out.println(openSearchResult.getResult());
} catch (
OpenSearchException e) {
System.out.println("RequestID=" + e.getRequestId());
System.out.println("ErrorCode=" + e.getCode());
System.out.println("ErrorMessage=" + e.getMessage());
} catch (
OpenSearchClientException e) {
System.out.println("ErrorMessage=" + e.getMessage());
}
}
}