全部產品
Search
文件中心

Alibaba Cloud Model Studio:深入研究(Qwen-Deep-Research)

更新時間:Dec 03, 2025

面對複雜研究課題,傳統的手動搜尋耗時費力,而大模型結合連網搜尋的功能也往往難以進行深度、系統的分析。深入研究模型(Qwen-Deep-Research)能自動規劃研究步驟、執行多輪的深入搜尋與資訊整合,並最終產生一份結構化的研究報告。

重要

本文檔僅適用於中國大陸版(北京)。如需使用模型,需使用中國大陸版(北京)的API Key

快速開始

您需要已擷取與配置 API Key配置API Key到環境變數(準備下線,併入配置 API Key)。如果通過SDK調用,還需要安裝DashScope SDK

模型採用兩步式工作流程:反問確認(明確研究範圍)和深入研究(執行搜尋並產生報告)。

模型目前僅可通過 DashScope SDK 調用,暫不支援 Java 版 DashScope SDK,也不支援 OpenAI 相容介面調用。
import os
import dashscope

# 配置API Key
# 若沒有配置環境變數,請用百鍊API Key將下行替換為:API_KEY = "sk-xxx"
API_KEY = os.getenv('DASHSCOPE_API_KEY')

def call_deep_research_model(messages, step_name):
    print(f"\n=== {step_name} ===")
    
    try:
        responses = dashscope.Generation.call(
            api_key=API_KEY,
            model="qwen-deep-research",
            messages=messages,
            # qwen-deep-research模型目前僅支援流式輸出
            stream=True
            # incremental_output=True 使用增量輸出請添加此參數
        )
        
        return process_responses(responses, step_name)
        
    except Exception as e:
        print(f"調用API時發生錯誤: {e}")
        return ""


# 顯示階段內容
def display_phase_content(phase, content, status):
    if content:
        print(f"\n[{phase}] {status}: {content}")
    else:
        print(f"\n[{phase}] {status}")

# 處理響應
def process_responses(responses, step_name):
    current_phase = None
    phase_content = ""
    research_goal = ""
    web_sites = []
    references = []
    keepalive_shown = False  # 標記是否已經顯示過KeepAlive提示

    for response in responses:
        # 檢查響應狀態代碼
        if hasattr(response, 'status_code') and response.status_code != 200:
            print(f"HTTP返回碼:{response.status_code}")
            if hasattr(response, 'code'):
                print(f"錯誤碼:{response.code}")
            if hasattr(response, 'message'):
                print(f"錯誤資訊:{response.message}")
            print("請參考文檔:https://www.alibabacloud.com/help/zh/model-studio/error-code")
            continue

        if hasattr(response, 'output') and response.output:
            message = response.output.get('message', {})
            phase = message.get('phase')
            content = message.get('content', '')
            status = message.get('status')
            extra = message.get('extra', {})

            # 階段變化檢測
            if phase != current_phase:
                if current_phase and phase_content:
                    # 根據階段名稱和步驟名稱來顯示不同的完成描述
                    if step_name == "第一步:模型反問確認" and current_phase == "answer":
                        print(f"\n 模型反問階段完成")
                    else:
                        print(f"\n {current_phase} 階段完成")
                current_phase = phase
                phase_content = ""
                keepalive_shown = False  # 重設KeepAlive提示標記

                # 根據階段名稱和步驟名稱來顯示不同的描述
                if step_name == "第一步:模型反問確認" and phase == "answer":
                    print(f"\n 進入模型反問階段")
                else:
                    print(f"\n 進入 {phase} 階段")
                    
            # 處理Answer階段的references資訊
            if phase == "answer":
                if extra.get('deep_research', {}).get('references'):
                    new_references = extra['deep_research']['references']
                    if new_references and new_references != references:  # 避免重複顯示
                        references = new_references
                        print(f"\n   引用來源 ({len(references)} 個):")
                        for i, ref in enumerate(references, 1):
                            print(f"     {i}. {ref.get('title', '無標題')}")
                            if ref.get('url'):
                                print(f"        URL: {ref['url']}")
                            if ref.get('description'):
                                print(f"        描述: {ref['description'][:100]}...")
                            print()

            # 處理WebResearch階段的特殊資訊
            if phase == "WebResearch":
                if extra.get('deep_research', {}).get('research'):
                    research_info = extra['deep_research']['research']

                    # 處理streamingQueries狀態
                    if status == "streamingQueries":
                        if 'researchGoal' in research_info:
                            goal = research_info['researchGoal']
                            if goal:
                                research_goal += goal
                                print(f"\n   研究目標: {goal}", end='', flush=True)

                    # 處理streamingWebResult狀態
                    elif status == "streamingWebResult":
                        if 'webSites' in research_info:
                            sites = research_info['webSites']
                            if sites and sites != web_sites:  # 避免重複顯示
                                web_sites = sites
                                print(f"\n   找到 {len(sites)} 個相關網站:")
                                for i, site in enumerate(sites, 1):
                                    print(f"     {i}. {site.get('title', '無標題')}")
                                    print(f"        描述: {site.get('description', '無描述')[:100]}...")
                                    print(f"        URL: {site.get('url', '無連結')}")
                                    if site.get('favicon'):
                                        print(f"        表徵圖: {site['favicon']}")
                                    print()

                    # 處理WebResultFinished狀態
                    elif status == "WebResultFinished":
                        print(f"\n   網路搜尋完成,共找到 {len(web_sites)} 個參考資訊源")
                        if research_goal:
                            print(f"   研究目標: {research_goal}")

            # 累積內容並顯示
            if content:
                phase_content += content
                # 即時顯示內容
                print(content, end='', flush=True)

            # 顯示階段狀態變化
            if status and status != "typing":
                print(f"\n   狀態: {status}")

                # 顯示狀態說明
                if status == "streamingQueries":
                    print("   → 正在產生研究目標和搜尋查詢(WebResearch階段)")
                elif status == "streamingWebResult":
                    print("   → 正在執行搜尋、網頁閱讀和代碼執行(WebResearch階段)")
                elif status == "WebResultFinished":
                    print("   → 網路搜尋階段完成(WebResearch階段)")

            # 當狀態為finished時,顯示token消耗情況
            if status == "finished":
                if hasattr(response, 'usage') and response.usage:
                    usage = response.usage
                    print(f"\n    Token消耗統計:")
                    print(f"      輸入tokens: {usage.get('input_tokens', 0)}")
                    print(f"      輸出tokens: {usage.get('output_tokens', 0)}")
                    print(f"      請求ID: {response.get('request_id', '未知')}")

            if phase == "KeepAlive":
                # 只在第一次進入KeepAlive階段時顯示提示
                if not keepalive_shown:
                    print("當前步驟已經完成,準備開始下一步驟工作")
                    keepalive_shown = True
                continue

    if current_phase and phase_content:
        if step_name == "第一步:模型反問確認" and current_phase == "answer":
            print(f"\n 模型反問階段完成")
        else:
            print(f"\n {current_phase} 階段完成")

    return phase_content

def main():
    # 檢查API Key
    if not API_KEY:
        print("錯誤:未設定 DASHSCOPE_API_KEY 環境變數")
        print("請設定環境變數或直接在代碼中修改 API_KEY 變數")
        return
    
    print("使用者發起對話:研究一下人工智慧在教育中的應用")
    
    # 第一步:模型反問確認
    # 模型會分析使用者問題,提出細化問題來明確研究方向
    messages = [{'role': 'user', 'content': '研究一下人工智慧在教育中的應用'}]
    step1_content = call_deep_research_model(messages, "第一步:模型反問確認")

    # 第二步:深入研究
    # 基於第一步的反問內容,模型會執行完整的研究流程
    messages = [
        {'role': 'user', 'content': '研究一下人工智慧在教育中的應用'},
        {'role': 'assistant', 'content': step1_content},  # 包含模型的反問內容
        {'role': 'user', 'content': '我主要關注個人化學習和智能評估這兩個方面'}
    ]
    
    call_deep_research_model(messages, "第二步:深入研究")
    print("\n 研究完成!")

if __name__ == "__main__":
    main()
echo "第一步:模型反問確認"
curl --location 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation' \
--header 'X-DashScope-SSE: enable' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
    "input": {
        "messages": [
            {
                "content": "研究一下人工智慧在教育中的應用", 
                "role": "user"
            }
        ]
    },
    "model": "qwen-deep-research"
}'

echo -e "\n\n" 
echo "第二步:深入研究"
curl --location 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation' \
--header 'X-DashScope-SSE: enable' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
    "input": {
        "messages": [
            {
                "content": "研究一下人工智慧在教育中的應用", 
                "role": "user"
            },
            {
                "content": "請告訴我您希望重點研究人工智慧在教育中的哪些具體應用情境?", 
                "role": "assistant"
            },
            {
                "content": "我主要關注個人化學習方面", 
                "role": "user"
            }
        ]
    },
    "model": "qwen-deep-research"
}'

模型列表

模型名稱

上下文長度 (Token)

最大輸入 (Token)

最大輸出 (Token)

qwen-deep-research

1,000,000

997,952

32,768

核心能力

模型通過 phase 和 status 欄位展示工作流程。phase 表示當前執行的核心任務,status 表示該任務的內部進度。

反問確認與報告產生 (phase: "answer")

模型分析使用者初始問題,提出細化問題確認研究範圍。在產生最終報告時,此階段複用。

狀態變化:

  • typing: 正在產生常值內容

  • finished: 常值內容產生完畢

研究規劃 (phase: "ResearchPlanning")

根據使用者需求制定研究大綱。

狀態變化:

  • typing: 正在產生研究計劃

  • finished: 研究計劃制定完成

網路搜尋 (phase: "WebResearch")

執行搜尋並處理資訊。

狀態變化:

  • streamingQueries: 正在產生用於搜尋的查詢詞

  • streamingWebResult: 正在執行網路搜尋並分析網頁內容

  • WebResultFinished: 網路搜尋與資訊提取完成

串連保持 (phase: "KeepAlive")

在長任務間隙發送,維持串連。此階段不包含業務內容,可忽略。

計費說明

模型名稱

輸入成本 (每千Token)

輸出成本 (每千Token)

免費額度

qwen-deep-research

$0.007742

$0.023367

無免費額度

計費方式:計費基於輸入和輸出Token總量。輸入Token包含使用者訊息內容和模型內建的系統提示詞。輸出Token包含反問確認、研究計劃、研究目標、搜尋查詢和最終研究報告等所有產生內容。

應用於生產環境

流式輸出處理

模型僅支援流式輸出(stream=True)。處理響應時需正確解析 phase 和 status 欄位,判斷當前階段和完成狀態。

錯誤處理

檢查響應狀態代碼,非200狀態需處理錯誤。流式響應早期階段某些響應塊可能只包含中繼資料,後續塊會包含實際內容。

Token消耗監控

在 status 為 finished 時,通過 response.usage 擷取Token消耗統計,包括輸入Tokens、輸出Tokens和請求ID。

串連管理

模型可能在長任務間隙發送 KeepAlive 階段響應,用於維持串連。可忽略此階段內容,繼續處理後續響應。

常見問題

  • 為什麼某些響應塊的output為空白?

    在流式響應的早期階段,某些響應塊可能只包含中繼資料資訊,後續塊會包含實際內容。

  • 如何判斷某個階段是否完成?

    當 status 欄位變為 "finished" 時,表示當前階段完成。

  • 模型是否支援OpenAI相容介面調用?

    模型目前暫不支援通過OpenAI相容介面調用。

  • 模型的輸入與輸出Token數量是如何計算的?

    輸入Token包含使用者發送的訊息內容和模型內建的系統提示詞,包括使用者問題、使用者回答和系統提示詞。輸出Token包含模型在整個研究過程中產生的所有內容,包括反問確認內容、研究計劃、研究目標、搜尋查詢和最終研究報告。

API參考

關於Qwen-Deep-Research模型的輸入與輸出參數,請參考Qwen-Deep-Research 深入研究模型

錯誤碼

如果模型調用失敗並返回報錯資訊,請參見錯誤資訊進行解決。

限流

模型限流觸發條件請參考:限流