深度搜索实践教程

深度搜索(Deep Search)是一款基于 Multi-Agent 架构的专业知识问答系统,专注于为用户提供精准、聚焦且内容详尽的深度解答。它不仅能够高效检索数据,还具备理解用户意图、整合多源数据并生成全面且结构化的答案的能力。相较于传统搜索引擎,深度搜索在复杂问题的拆解、多源数据的深度融合以及跨领域知识的关联方面表现更为出色。

能力对比

下表展示了深度搜索和传统AI搜索的对比:

维度

深度搜索

传统AI搜索

理解能力

上下文推理,意图识别。

语义检索、关键词检索。

响应模式

主动追问上下文细节(如时间范围、地域限制等)。

被动接受原始提问。

数据来源

支持跨平台聚合(私域、联网、数据库等)。

依赖某个单一数据源。

知识密度

单次输出多篇参考文献标注,直到准确回答问题。

仅提供固定的3-5个相关数据段。

交互深度

支持连续多轮的专业对话。

会话轮数对效果影响较大。

适用问题

复杂、开放性问题(如分析、对比等)。

简单、事实型问题。

技术架构

深度搜索是基于Multi-Agent架构的系统,由以下Single-Agent组成:

  • Query理解Agent:对用户原始Query的理解和改写。

  • 自主规划Agent:用于对用户Query的意图识别、执行路径规划和调整、答案校正等。

  • 搜索Agent:用于本轮知识检索和总结。

  • 闲聊Agent:用于对用户闲聊场景的回答,如“你好”等。

  • 澄清Agent:反问问题的生成,用于明确用户模糊的问题。

  • 总结Agent:用于最终回答用户问题。

image.png

能力体验

控制台

1、登录开放搜索控制台选择LLM智能问答版,点击左侧导航栏实例管理,选择对应的实例点击管理

image

2、进入实例详情页面,点击问答测试,开启深度搜索,在对话框输入需要询问的内容,点击发送。

2

3、问答测试效果展示。

3

API调用

深度搜索相关请求参数

参数

类型

必须

默认值

描述

options.chat.enable_deep_search

Boolean

true

是否打开深度搜索

  • true:打开深度搜索,需要多轮推理综合数据返回结果,单次对话消耗的时间和计算资源相对较多。

  • false:关闭深度搜索。

image

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

请求的处理状态。

  • OK:表示请求成功。

  • FAIL:表示请求失败。

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_IDALIBABA_CLOUD_ACCESS_KEY_SECRET

重要
  • 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维,具体操作,请参见创建RAM用户

  • 创建AccessKey IDAccessKey Secret,请参考创建AccessKey

  • 如果您使用的是RAM用户的AccessKey,请确保您的RAM用户账号被授予AliyunOpenSearchFullAccess权限。

  • 请不要将AccessKey IDAccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。

  • LinuxmacOS系统配置方法:

    执行以下命令,其中, <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系统配置方法

    1. 新建环境变量文件,添加环境变量ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET,并写入已准备好的AccessKey IDAccessKey Secret。

    2. 重启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());
        }
    }
}