面對複雜研究課題,傳統的手動搜尋耗時費力,而大模型結合連網搜尋的功能也往往難以進行深度、系統的分析。深入研究模型(Qwen-Deep-Research)能自動規劃研究步驟、執行多輪的深入搜尋與資訊整合,並最終產生一份結構化的研究報告。
本文檔僅適用於“中國內地(北京)”地區。如需使用模型,需使用“中國內地(北京)”地區的API Key。
快速開始
您需要已擷取API Key並配置API Key到環境變數(準備下線,併入配置 API Key)。如果通過SDK調用,還需要安裝DashScope SDK。請將範例程式碼中的 DASHSCOPE_API_HOST 替換為擷取的 API Host。
模型採用兩步式工作流程:反問確認(明確研究範圍)和深入研究(執行搜尋並產生報告)。以下樣本展示了包含兩個步驟的完整調用流程。
模型目前僅可通過 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階段的特殊資訊
# 注意: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()
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 |
|
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模型專用,替代streamingQueries和streamingWebResult) -
streamingQueries: 正在產生搜尋查詢詞(僅qwen-deep-research模型) -
streamingWebResult: 正在執行網路搜尋並分析網頁內容(僅qwen-deep-research模型) -
WebResultFinished: 單輪搜尋結束 -
finished: 網路搜尋階段整體完成
串連保持 (phase: "KeepAlive")
在長任務間隙發送,維持串連。此階段不包含業務內容,可忽略。
圖片輸入
深入研究模型支援在使用者訊息中傳入圖片,模型能理解圖片內容並結合圖片進行深入研究分析。傳入圖片時,content欄位需使用數組格式,包含image和text對象。
-
支援 JPEG、PNG、BMP、WEBP 等常見格式,單張圖片不超過 10MB。
-
單次請求最多傳入 5 張圖片,支援公網 URL 和 Base 64 編碼兩種傳入方式。
-
響應格式與純文字請求一致,模型會結合圖片內容進行研究並返回報告。
請求樣本
import os
import dashscope
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)
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": [
{"image": "https://example.aliyuncs.com/example.png"},
{"text": "分析這張圖表中的資料趨勢,並對關鍵發現進行深入研究"}
],
"role": "user"
}
]
},
"model": "qwen-deep-research"
}'MCP 工具調用
MCP 工具調用僅qwen-deep-research-2025-12-15模型支援,主線模型qwen-deep-research不支援此功能。
qwen-deep-research-2025-12-15模型支援通過research_tools參數接入 MCP(Model Context Protocol)服務,使模型在研究過程中能夠調用外部工具進行資訊檢索。響應格式與標準調用一致,模型會在 WebResearch 階段通過 MCP Server 調用指定工具。
research_tools的完整參數說明和 MCP 工具規範請參考Qwen-Deep-Research 深入研究模型。
請求樣本
import os
import dashscope
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)
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-2025-12-15",
"parameters": {
"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"
}
}]
}
}'計費說明
|
模型名稱 |
輸入成本 (每千Token) |
輸出成本 (每千Token) |
免費額度 |
|
qwen-deep-research |
$0.007742 |
$0.023367 |
無免費額度 |
|
qwen-deep-research-2025-12-15 |
待定 |
待定 |
無免費額度 |
計費方式:計費基於輸入和輸出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包含模型在整個研究過程中產生的所有內容,包括反問確認內容、研究計劃、研究目標、搜尋查詢和最終研究報告。
-
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 深入研究模型。
錯誤碼
如果模型調用失敗並返回報錯資訊,請參見錯誤資訊進行解決。
限流
模型限流觸發條件請參考:限流。