Skip to main content
專項模型

深入研究(Qwen-Deep-Research)

自動完成複雜研究課題——規劃研究步驟、執行多輪連網搜尋與資訊整合,最終產生結構化研究報告,無需手動搜尋。

本文檔僅適用於華北2(北京)地區。如需使用模型,需使用華北2(北京)地區的API Key

快速開始

您需要已擷取API Key配置API Key到環境變數。如果通過SDK調用,還需要安裝DashScope SDK。請將範例程式碼中的 DASHSCOPE_API_HOST 替換為擷取的 API Host。 模型採用兩步工作流程:第一步,模型提出細化問題,確認你的研究方向;第二步,基於你的回複執行完整研究並產生報告。第一步不是多餘的——它讓模型在啟動耗時的多輪搜尋前先對齊研究範圍,避免跑偏。
模型目前僅支援 DashScope SDK調用,暫不支援 Java 版 DashScope SDK,也不支援 OpenAI 相容介面調用。
import os
import dashscope

# 以下為華北2(北京)地區的URL,各地區的URL不同。
dashscope.base_http_api_url = 'https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1'

# 配置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階段的特殊資訊
            # 注意:qwen-deep-research-2025-12-15模型使用streamingThinking狀態
            # 替代streamingQueries和streamingWebResult
            if phase == "WebResearch":
                if extra.get('deep_research', {}).get('research'):
                    research_info = extra['deep_research']['research']

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

                    # 處理streamingWebResult狀態(主線模型)
                    # 快照模型使用streamingThinking合并了此狀態
                    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 == "streamingThinking":
                    print("   → 正在拆解研究任務並總結網頁內容(WebResearch階段)")
                elif 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()

模型列表

模型名稱

上下文長度 (Token)

最大輸入 (Token)

最大輸出 (Token)

qwen-deep-research

1,000,000

997,952

32,768

qwen-deep-research-2025-12-15

qwen-deep-research為主線模型,持續更新最佳化。qwen-deep-research-2025-12-15為快照版本,研究深度和報告品質更優,額外支援 MCP 工具調用。兩個模型均支援圖片輸入,獨立計費。

核心能力

通過 phase(當前任務)和 status(任務進度)兩個欄位跟蹤模型工作進展。phase 表示當前執行的核心任務,status 表示該任務的內部進度。 反問確認與報告產生(phase: "answer") 分析使用者問題,通過提問明確研究範圍;最終研究報告也在此階段輸出。 狀態值:
  • typing:正在產生常值內容
  • finished:常值內容產生完畢
研究規劃(phase: "ResearchPlanning") 根據使用者需求制定研究大綱。 狀態值:
  • typing:正在產生研究計劃
  • finished:研究計劃制定完成
網路搜尋(phase: "WebResearch") 執行多輪搜尋並處理資訊。每輪搜尋結束返回WebResultFinished,整個階段結束返回finished 狀態值:
  • streamingThinking:正在拆解研究任務並總結網頁內容(qwen-deep-research-2025-12-15專用,替代streamingQueriesstreamingWebResult
  • streamingQueries:正在產生搜尋查詢詞(僅qwen-deep-research
  • streamingWebResult:正在執行網路搜尋並分析網頁內容(僅qwen-deep-research
  • WebResultFinished:單輪搜尋結束
  • finished:網路搜尋階段整體完成
串連保持(phase: "KeepAlive") 長任務間隙發送,用於維持串連。此階段不包含業務內容,忽略並繼續處理後續響應即可。

圖片輸入

兩個模型均支援在使用者訊息中傳入圖片,模型能理解圖片內容並結合圖片進行深入研究。content欄位使用數組格式,同時包含imagetext對象。
  • 支援 JPEG、PNG、BMP、WEBP 格式,單張圖片不超過 10 MB。
  • 單次請求最多傳入 5 張圖片,支援公網URL和 Base 64 編碼兩種方式。
  • 響應格式與純文字請求一致,模型會結合圖片內容產生研究報告。
請求樣本
import os
import dashscope

# 以下為華北2(北京)地區的URL,各地區的URL不同。
dashscope.base_http_api_url = 'https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1'

API_KEY = os.getenv('DASHSCOPE_API_KEY')

messages = [
    {
        "role": "user",
        "content": [
            {"image": "https://example.aliyuncs.com/example.png"},
            {"text": "分析這張圖表中的資料趨勢,並對關鍵發現進行深入研究"}
        ]
    }
]

responses = dashscope.Generation.call(
    api_key=API_KEY,
    model="qwen-deep-research",
    messages=messages,
    stream=True
)

for response in responses:
    if hasattr(response, 'output') and response.output:
        message = response.output.get('message', {})
        content = message.get('content', '')
        if content:
            print(content, end='', flush=True)

MCP 工具調用

MCP 工具調用僅qwen-deep-research-2025-12-15支援,主線模型qwen-deep-research不支援此功能。
通過 research_tools 參數接入 MCP(Model Context Protocol)服務後,qwen-deep-research-2025-12-15可在 WebResearch 階段調用知識庫、內部文檔、專有資料庫等私人資料來源,與公網搜尋結合使用。響應格式與標準調用一致。
research_tools 的完整參數說明和 MCP 工具規範請參考 Qwen-Deep-Research 深入研究模型

請求樣本

import os
import dashscope

# 以下為華北2(北京)地區的URL,各地區的URL不同。
dashscope.base_http_api_url = 'https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1'

API_KEY = os.getenv('DASHSCOPE_API_KEY')

messages = [
    {
        "role": "user",
        "content": "使用知識庫搜尋近期發布的產品更新公告,並整理成研究報告"
    }
]

responses = dashscope.Generation.call(
    api_key=API_KEY,
    model="qwen-deep-research-2025-12-15",
    messages=messages,
    stream=True,
    enable_feedback=False,
    research_tools=[{
        "type": "mcp",
        "server_label": "my-server",
        "server_url": "https://your-mcp-server.example.com/sse",
        "allowed_tools": ["search", "fetch"],
        "authentication": {
            "bearer": "your_jwt_token_here"
        }
    }]
)

for response in responses:
    if hasattr(response, 'output') and response.output:
        message = response.output.get('message', {})
        content = message.get('content', '')
        if content:
            print(content, end='', flush=True)

計費說明

模型名稱

輸入成本 (每千Token)

輸出成本 (每千Token)

免費額度

qwen-deep-research

$0.007742

$0.023367

無免費額度

qwen-deep-research-2025-12-15

待定

待定

無免費額度

按輸入和輸出 Token 總量計費。輸入 Token 包含使用者訊息和模型內建系統提示詞;輸出 Token 包含反問確認、研究計劃、搜尋查詢和最終研究報告等所有產生內容。兩個模型獨立計費。

應用於生產環境

必須使用流式輸出 模型僅支援流式輸出(stream=True)。一次完整的研究任務可能持續數分鐘、經歷數十輪迭代搜尋,同步請求會逾時。流式輸出保持串連暢通,並通過 phasestatus 欄位即時追蹤進度。 錯誤處理 對每個響應塊檢查狀態代碼,非 200 狀態讀取 codemessage 欄位並做相應處理。流式響應早期階段某些響應塊可能只包含中繼資料,後續塊會包含實際內容。 Token 消耗監控 statusfinished 時,從 response.usage 擷取 Token 消耗統計,包括輸入 Token 數、輸出 Token 數和請求 ID。 串連保持 KeepAlive 階段用於維持長任務間的串連,不包含業務內容,忽略並繼續處理後續響應即可。

常見問題

  • 為什麼某些響應塊的 output 為空白? 流式響應早期階段,部分響應塊只含中繼資料,實際內容在後續塊中逐步到達。
  • 如何判斷某個階段已完成? status 欄位變為 finished 時,當前階段完成。
  • 模型是否支援 OpenAI 相容介面調用? 不支援。
  • 輸入和輸出 Token 如何計算? 輸入 Token 包含使用者訊息和模型內建系統提示詞;輸出 Token 包含反問確認、研究計劃、搜尋查詢和最終研究報告等所有產生內容。
  • qwen-deep-research 和 qwen-deep-research-2025-12-15 有什麼區別? qwen-deep-research是主線模型,持續更新。qwen-deep-research-2025-12-15是快照版本,研究深度和報告品質更優,額外支援 MCP 工具調用。兩個模型均支援圖片輸入,獨立計費,快照版本價格略高。
  • 如何傳入圖片進行研究? content設為數組格式,包含{"image": "圖片URL"}{"text": "文本描述"}。兩個模型均支援圖片輸入。
  • 如何跳過反問確認,直接進入研究? parameters中將enable_feedback設為false,模型將跳過反問確認階段,直接進入研究流程。

API參考

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

錯誤碼

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

限流

模型限流觸發條件請參考:限流
Token Plan
用量統計與效能監控
資產中心
服務支援