Qwen-Deep-Research 是通义千问的研究型智能体模型。它可拆解复杂问题,结合互联网搜索进行推理分析并生成研究报告。
模型与价格
模型名称 | 上下文长度 | 最大输入 | 最大输出 | 输入成本 | 输出成本 | 免费额度 |
(Token数) | (每千Token) | |||||
qwen-deep-research | 1,000,000 | 997,952 | 32,768 | 0.054元 | 0.163元 | 无免费额度 |
使用方法
您需要已获取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 = []
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://help.aliyun.com/zh/model-studio/developer-reference/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} 阶段")
# 处理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"
}'
模型工作机制详解
Qwen-Deep-Research采用两步式工作流程:
反问确认:模型分析用户初始问题,提出细化问题确认研究范围和重点
深入研究:基于用户回答,制定研究计划并执行,生成最终报告
模型通过阶段(phase)和状态(status)两个维度来组织工作流程。阶段代表模型执行的任务,状态代表执行任务的进度。
1. 反问确认阶段 (phase: "answer")
模型任务:分析用户初始问题,提出细化问题确认研究范围和重点
状态变化:
status: "typing"
:模型正在生成反问内容,逐字符输出status: "finished"
:反问完成,等待用户回答
模型行为:
分析用户问题的复杂性
识别需要澄清的关键点
生成结构化的反问内容
帮助用户明确研究方向
示例状态变化:
// 开始反问
{"phase": "answer", "status": "typing", "content": "我了解..."}
// 反问完成
{"phase": "answer", "status": "finished", "content": ""}
2. 研究规划阶段 (phase: "ResearchPlanning")
模型任务:基于用户回答,制定详细的研究计划和执行步骤
状态变化:
status: "typing"
:模型正在制定研究计划status: "finished"
:研究计划制定完成
模型行为:
分析用户的具体需求
设计研究方法和步骤
确定信息收集策略
规划报告结构
示例状态变化:
// 开始规划
{"phase": "ResearchPlanning", "status": "typing", "content": "基于您的研究需求"}
// 规划完成
{"phase": "ResearchPlanning", "status": "finished", "content": ""}
3. 网络搜索阶段 (phase: "WebResearch")
模型任务:执行网络搜索,收集相关信息
WebResearch阶段分为两个子阶段,通过不同的status值区分:
子阶段1:streamingQueries
status: "streamingQueries"
:正在生成研究目标和搜索查询模型分析研究需求,制定搜索策略
生成具体的搜索查询语句
子阶段2:streamingWebResult
status: "streamingWebResult"
:正在执行搜索、网页阅读和代码执行模型执行网络搜索
读取和分析网页内容
提取相关信息并整理
状态变化:
status: "WebResultFinished"
:网络搜索阶段完成
模型行为:
根据研究计划生成搜索查询
执行多个搜索任务
收集和筛选搜索结果
整理结果及来源信息
状态详解:
生成搜索查询 (status: "streamingQueries"):
{
"phase": "WebResearch",
"status": "streamingQueries",
"content": "",
"extra": {
"deep_research": {
"research": {
"id": 4
}
}
}
}
执行搜索和网页阅读 (status: "streamingWebResult"):
{
"phase": "WebResearch",
"status": "streamingWebResult",
"content": "",
"extra": {
"deep_research": {
"research": {
"id": 1,
"webSites": [
{
"title": "网站标题",
"description": "网站描述",
"url": "网站URL"
}
]
}
}
}
}
搜索完成 (status: "WebResultFinished"):
{
"phase": "WebResearch",
"status": "WebResultFinished",
"content": "",
"extra": {
"deep_research": {
"research": {
"id": 1
}
}
}
}
4. 连接保持阶段 (phase: "KeepAlive")
模型任务:在长时间处理过程中保持连接
状态特点:
不包含有用内容
主要用于维持流式连接
5. 报告生成阶段 (phase: "answer")
模型任务:基于收集的信息,生成最终研究报告
状态变化:
status: "typing"
:模型正在生成报告内容status: "finished"
:报告生成完成
模型行为:
分析收集到的信息
组织报告结构
生成详细的研究内容
提供结论和建议
常见问题
为什么某些响应块的
output
为空?在流式响应的早期阶段,某些响应块可能只包含元数据信息,后续块会包含实际内容。
如何判断某个阶段是否完成?
当
status
字段变为 "finished" 时,表示当前阶段完成。模型是否支持OpenAI兼容接口调用?
模型目前暂不支持通过OpenAI兼容接口调用。
模型的输入Token数量是如何计算的?
输入Token包含用户发送的消息内容和模型内置的系统提示词。具体包括:
用户问题:如"研究一下人工智能在教育中的应用"
用户回答:如"我主要关注个性化学习和智能评估这两个方面"
系统提示词:模型内置的研究任务提示词
模型的输出Token数量是如何计算的?
输出Token包含模型在整个研究过程中生成的部分内容。具体包括:
反问确认内容:模型提出的细化问题
研究计划:制定的研究步骤和方法
研究目标:
researchGoal
字段的内容搜索查询:
query
字段的内容最终研究报告:完整的研究分析结果
API参考
关于Qwen-Deep-Research模型的输入与输出参数,请参考通义千问API详情。
错误码
如果模型调用失败并返回报错信息,请参见错误信息进行解决。
限流
模型限流触发条件请参考:限流。