跳转到主要内容
专用模型

数据挖掘(Qwen-Doc)

使用 Qwen-Doc-Turbo 模型从文档中提取结构化数据,支持信息抽取、内容审核、分类打标和摘要生成。

数据挖掘模型专门针对信息抽取、内容审核、分类打标和摘要生成任务进行设计。相比通用对话模型,该模型能够快速且精确地输出规范的结构化数据(如JSON格式),解决通用对话模型返回不规范回复结构或提取信息不够准确的问题。

使用方式

Qwen-Doc-Turbo 支持通过以下三种方式从文件中提取信息,具体文件大小与类型限制请参考限制
特性文件URL(推荐)文件ID纯文本
文件来源公网 URL本地文件(需先上传)字符串传入
输入长度限制最多10个文件,支持大文件(最大输入253k Token)1个文件,支持大文件(最大输入253k Token)9,000 Token以内
SDK 兼容性仅限 DashScope上传: OpenAI;调用: OpenAIDashScopeOpenAIDashScope
核心优点无需上传至千问云,支持批量调用避免重复上传,适合复用无需文件管理

前提条件

通过文件URL传入

通过文件URL直接提取结构化数据,支持最多10个文件同时处理。此处以传入示例产品手册A示例产品手册B文件并通过提示词约束模型以JSON格式返回所提取信息为例。
文件URL方式当前仅支持DashScope协议,可以选择使用DashScope Python SDK或者HTTP方式调用(如curl)。
import os
import dashscope

response = dashscope.Generation.call(
  api_key=os.getenv('DASHSCOPE_API_KEY'),
  model='qwen-doc-turbo',
  messages=[
    {"role": "system", "content": "You are a helpful assistant."},
    {
      "role": "user",
      "content": [
        {
          "type": "text",
          "text": "从这两份产品手册中,提取所有产品信息,并整理成一个标准的JSON数组。每个对象需要包含:model(产品的型号)、name(产品的名称)、price(价格(去除货币符号和逗号))"
        },
        {
          "type": "doc_url",
          "doc_url": [
            "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251107/jockge/%E7%A4%BA%E4%BE%8B%E4%BA%A7%E5%93%81%E6%89%8B%E5%86%8CA.docx",
            "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251107/ztwxzr/%E7%A4%BA%E4%BE%8B%E4%BA%A7%E5%93%81%E6%89%8B%E5%86%8CB.docx"
          ],
          "file_parsing_strategy": "auto"
        }
      ]
    }
  ]
)
try:
  if response.status_code == 200:
    print(response.output.choices[0].message.content)
  else:
    print(f"请求失败,状态码: {response.status_code}")
    print(f"错误代码: {response.code}")
    print(f"错误信息: {response.message}")
except Exception as e:
  print(f"发生错误: {e}")
[
  {
    "model": "PRO-100",
    "name": "智能打印机",
    "price": "8999"
  },
  {
    "model": "PRO-200",
    "name": "智能扫描仪",
    "price": "12999"
  },
  ...
  {
    "model": "SEC-400",
    "name": "智能访客系统",
    "price": "9999"
  },
  {
    "model": "SEC-500",
    "name": "智能停车管理",
    "price": "22999"
  }
]

通过文件ID传入

上传文件

在运行以下代码前,请先点击示例产品手册A下载文件,并将其放置在项目代码所在的目录中。通过OpenAI兼容接口上传到千问云平台的安全存储空间,获取返回的file-id。有关文件上传接口的详细参数解释及调用方式,请参考API文档页面进行了解。
import os
from pathlib import Path
from openai import OpenAI

client = OpenAI(
  api_key=os.getenv("DASHSCOPE_API_KEY"),
  base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

file_object = client.files.create(file=Path("示例产品手册A.docx"), purpose="file-extract")
# 打印file-id用于后续模型对话
print(file_object.id)
运行以上代码,您可以得到本次上传文件对应的file-id

通过文件ID传入信息并对话

将获取的 file-id 嵌入到System Message 中。第一条System Message用于设定角色向模型提问,后续的System Message用于传入 file-id,User Message包含针对文件的具体问题。
import os
from openai import OpenAI, BadRequestError

client = OpenAI(
  api_key=os.getenv("DASHSCOPE_API_KEY"),
  base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

try:
  completion = client.chat.completions.create(
    model="qwen-doc-turbo",
    messages=[
      {'role': 'system', 'content': 'You are a helpful assistant.'},
      # 请将 '{FILE_ID}'替换为您实际对话场景所使用的 fileid
      {'role': 'system', 'content': 'fileid://{FILE_ID}'},
      {'role': 'user', 'content': '从这份产品手册中,提取所有产品信息,并整理成一个标准的JSON数组。每个对象需要包含:model(产品的型号)、name(产品的名称)、price(价格(去除货币符号和逗号)) '}
    ],
    # 本代码示例采用流式输出,以清晰和直观地展示模型输出过程
    stream=True,
    stream_options={"include_usage": True}
  )

  full_content = ""
  for chunk in completion:
    if chunk.choices and chunk.choices[0].delta.content:
      full_content += chunk.choices[0].delta.content
      print(chunk.model_dump())

  print(full_content)

except BadRequestError as e:
  print(f"错误信息:{e}")
import os
import time
from pathlib import Path
from openai import OpenAI, BadRequestError

client = OpenAI(
  api_key=os.getenv("DASHSCOPE_API_KEY"),
  base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

try:
  # 步骤1:上传文件
  file_object = client.files.create(file=Path("示例产品手册A.docx"), purpose="file-extract")
  file_id = file_object.id
  print(f"文件上传成功,file-id: {file_id}")

  # 步骤2:等待文件解析完成(可选,如果文件较大可能需要等待)
  # 如果文件仍在解析中,API会返回错误提示,此时需要重试
  max_retries = 10
  retry_count = 0

  while retry_count < max_retries:
    try:
      # 步骤3:使用file-id调用模型
      completion = client.chat.completions.create(
        model="qwen-doc-turbo",
        messages=[
          {'role': 'system', 'content': 'You are a helpful assistant.'},
          {'role': 'system', 'content': f'fileid://{file_id}'},
          {'role': 'user', 'content': '从这份产品手册中,提取所有产品信息,并整理成一个标准的JSON数组。每个对象需要包含:model(产品的型号)、name(产品的名称)、price(价格(去除货币符号和逗号))'}
        ],
        stream=True,
        stream_options={"include_usage": True}
      )

      # 步骤4:处理模型输出
      full_content = ""
      for chunk in completion:
        if chunk.choices and chunk.choices[0].delta.content:
          full_content += chunk.choices[0].delta.content
          print(chunk.choices[0].delta.content, end='', flush=True)

      print(f"\n\n完整输出:\n{full_content}")
      break

    except BadRequestError as e:
      if "File parsing in progress" in str(e):
        retry_count += 1
        print(f"文件解析中,等待后重试 ({retry_count}/{max_retries})...")
        time.sleep(2)
      else:
        raise e

  if retry_count >= max_retries:
    print("文件解析超时,请稍后重试")

except BadRequestError as e:
  print(f"错误信息:{e}")
except Exception as e:
  print(f"发生错误:{e}")
[
  {
    "model": "PRO-100",
    "name": "智能打印机",
    "price": "8999"
  },
  {
    "model": "PRO-200",
    "name": "智能扫描仪",
    "price": "12999"
  },
  ...
  {
    "model": "SEC-400",
    "name": "智能访客系统",
    "price": "9999"
  },
  {
    "model": "SEC-500",
    "name": "智能停车管理",
    "price": "22999"
  }
]

通过纯文本传入

除了通过 file-id 传入文件信息外,您还可以直接使用字符串传入文件内容。在此方法下,为避免模型混淆角色设定与文件内容,请确保在 messages 的第一条消息中添加用于角色设定的信息。
受限于API调用请求体大小,如果您的文本内容长度超过9,000 Token,请通过文件URL或文件ID传入信息对话。
import os
from openai import OpenAI, BadRequestError

client = OpenAI(
  api_key=os.getenv("DASHSCOPE_API_KEY"),
  base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

try:
  completion = client.chat.completions.create(
    model="qwen-doc-turbo",
    messages=[
      {'role': 'system', 'content': 'You are a helpful assistant.'},
      {'role': 'system', 'content': '智能办公产品手册 版本:V2.0 发布日期:2024年1月 目录 1.1 产品概述...'},
      {'role': 'user', 'content': '从这份产品手册中,提取所有产品信息,并整理成一个标准的JSON数组。每个对象需要包含:model(产品的型号)、name(产品的名称)、price(价格(去除货币符号和逗号))'}
    ],
    stream=True,
    stream_options={"include_usage": True}
  )

  full_content = ""
  for chunk in completion:
    if chunk.choices and chunk.choices[0].delta.content:
      full_content += chunk.choices[0].delta.content
      print(chunk.model_dump())

  print(full_content)

except BadRequestError as e:
  print(f"错误信息:{e}")
[
  {
    "model": "PRO-100",
    "name": "智能打印机",
    "price": "8999"
  },
  {
    "model": "PRO-200",
    "name": "智能扫描仪",
    "price": "12999"
  },
  ...
  {
    "model": "SEC-400",
    "name": "智能访客系统",
    "price": "9999"
  },
  {
    "model": "SEC-500",
    "name": "智能停车管理",
    "price": "22999"
  }
]

模型定价

模型名称上下文长度最大输入最大输出输入成本(每千Token)输出成本(每千Token)免费额度
qwen-doc-turbo262,144253,95232,7680.0006元0.001元无免费额度

常见问题

所有通过OpenAI文件兼容接口上传的文件均将被保存在当前账号下的千问云存储空间且不会产生任何费用,关于所上传文件的信息查询与管理请参考OpenAI文件接口
文件ID目前仅能用于Qwen-Long、Qwen-Doc-Turbo模型对话以及Batch接口批量调用
当解析策略设置为 "auto" 时,系统会根据文件内容自动进行解析;当解析策略设置为 "text_only" 时,系统将仅解析文字类内容;当解析策略设置为"text_and_images"时,系统将会解析所有图片与文本类内容,解析所需时间也会相应增加。
获取 file-id 后,您可以直接尝试使用该ID与模型进行对话。如果文件仍在解析中,API会返回相应的错误提示File parsing in progress, please try again later.,此时请稍后重试。如果模型调用成功并返回了回复,则表示文件已解析完成,可以正常使用。
文档解析并不会产生任何额外费用。

API参考

关于Qwen-Doc-Turbo模型的输入与输出参数,请参考DashScope chat

错误码

如果模型调用失败并返回报错信息,请参见错误信息进行解决。

限制

  • SDK 依赖
    • 文件URL (doc_url): 文件URL方式当前仅支持DashScope协议,可以选择使用DashScope Python SDK或者HTTP方式调用(如curl)。
    • 上传文件 (file-id): 文件上传与管理操作必须使用 OpenAI 兼容 SDK。
  • 文件上传与引用
    • 文件URL (doc_url): 单次请求最多支持 10 个文件URL,且传入的URL需确保公网可访问。
    • 上传文件 (file-id): 单个文件不超过 150MB。单个千问云账号最多可上传 1 万个文件,总大小不超过 100GB,当前暂无有效期限制。单次请求最多引用 1 个文件。
      使用文件ID传入时,当文件数量或总大小达到任一上限时,新的文件上传请求将会失败。请参考OpenAI兼容-File,及时删除不再需要的文件以释放配额,然后才能继续上传。
    • 支持格式:TXT, DOC, DOCX, PDF, XLS, XLSX, MD, PPT, PPTX, JPG, JPEG, PNG, GIF, BMP。
  • API 输入
    • 通过doc_urlfile-id 引入信息时,上下文长度上限为 262,144 Token。
    • 直接在 usersystem 消息中输入纯文本时,单条消息内容限制在 9,000 Token 以内。
  • API 输出
    • 最大输出长度为 32,768 Token。
  • 文件共享
    • file-id 仅在生成它的千问云账号内有效,不支持跨账号或通过 RAM 用户 API Key 调用。
  • 限流:关于模型的限流条件,请参见限流