数据挖掘(Qwen-Doc-Turbo)

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

说明

本文档仅适用于中国大陆版(北京地域),需使用中国(北京)地域的API Key

使用方式

Qwen-Doc-Turbo 支持通过以下三种方式从文件中提取信息,具体文件大小与类型限制请参考限制

特性

文件URL (推荐)

文件ID

纯文本

文件来源

公网 URL

本地文件 (需先上传)

字符串传入

输入长度限制

最多10个文件
支持大文件 (最大输入253k Token)

1个文件
支持大文件 (最大输入253k Token)

9,000 Token以内

SDK 兼容性

仅限 DashScope

上传: OpenAI
调用: OpenAI 和 DashScope

OpenAI 和 DashScope

核心优点

无需上传至百炼,支持批量调用

避免重复上传,适合复用

无需文件管理

前提条件

通过文件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'), # 如果您没有配置环境变量,请在此处替换您的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}")
        print("请参考文档:https://help.aliyun.com/zh/model-studio/developer-reference/error-code")
except Exception as e:
    print(f"发生错误: {e}")
    print("请参考文档:https://help.aliyun.com/zh/model-studio/developer-reference/error-code")
curl --location 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer $DASHSCOPE_API_KEY' \
--header 'X-DashScope-SSE: enable' \
--data '{
    "model": "qwen-doc-turbo",
    "input": {
        "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"
                        }
                    ]
                }
            ]
    }
}'

响应示例

[
  {
    "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文档页面进行了解。

Python

import os
from pathlib import Path
from openai import OpenAI

client = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),  # 如果您没有配置环境变量,请在此处替换您的API-KEY
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",  # 填写DashScope服务base_url
)

file_object = client.files.create(file=Path("示例产品手册A.docx"), purpose="file-extract")
# 打印file-id用于后续模型对话
print(file_object.id)

Java

import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.files.*;

import java.nio.file.Paths;

public class Main {
    public static void main(String[] args) {
        // 创建客户端,使用环境变量中的API密钥
        OpenAIClient client = OpenAIOkHttpClient.builder()
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .build();
        // 设置文件路径,请根据实际需求修改路径与文件名
        Path filePath = Paths.get("src/main/java/org/example/示例产品手册A.docx");
        // 创建文件上传参数
        FileCreateParams fileParams = FileCreateParams.builder()
                .file(filePath)
                .purpose(FilePurpose.of("file-extract"))
                .build();

        // 上传文件打印fileid
        FileObject fileObject = client.files().create(fileParams);
        // # 打印file-id用于后续模型对话
        System.out.println(fileObject.id());
    }
}

curl

curl --location --request POST 'https://dashscope.aliyuncs.com/compatible-mode/v1/files' \
  --header "Authorization: Bearer $DASHSCOPE_API_KEY" \
  --form 'file=@"示例产品手册A.docx"' \
  --form 'purpose="file-extract"'

运行以上代码,您可以得到本次上传文件对应的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"), # 如果您没有配置环境变量,请在此处替换您的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(价格(去除货币符号和逗号)) '}
        ],
        # 本代码示例采用流式输出,以清晰和直观地展示模型输出过程。如果您希望查看非流式输出的案例,请参见https://help.aliyun.com/zh/model-studio/text-generation
        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}")
    print("请参考文档:https://help.aliyun.com/zh/model-studio/developer-reference/error-code")
import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.core.http.StreamResponse;
import com.openai.models.chat.completions.*;

public class Main {
    public static void main(String[] args) {
        // 创建客户端,使用环境变量中的API密钥
        OpenAIClient client = OpenAIOkHttpClient.builder()
                // 若没有配置环境变量,请用阿里云百炼API Key将下行替换为:.apiKey("sk-xxx");
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .build();

        ChatCompletionCreateParams chatParams = ChatCompletionCreateParams.builder()
                .addSystemMessage("You are a helpful assistant.")
                // 请将 '{FILE_ID}'替换为您实际对话场景所使用的 fileid
                .addSystemMessage("fileid://{FILE_ID}")
                .addUserMessage("从这份产品手册中,提取所有产品信息,并整理成一个标准的JSON数组。每个对象需要包含:model(产品的型号)、name(产品的名称)、price(价格(去除货币符号和逗号))")
                .model("qwen-doc-turbo")
                .build();

        try (StreamResponse<ChatCompletionChunk> streamResponse = client.chat().completions().createStreaming(chatParams)) {
            streamResponse.stream().forEach(chunk -> {
                String content = chunk.choices().get(0).delta().content().orElse("");
                if (!content.isEmpty()) {
                    System.out.print(content);
                }
            });
        } catch (Exception e) {
            System.err.println("错误信息:" + e.getMessage());
        }
    }
}
curl --location 'https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header "Content-Type: application/json" \
--data '{
    "model": "qwen-doc-turbo",
    "messages": [
        {"role": "system","content": "You are a helpful assistant."},
        {"role": "system","content": "fileid://{FILE_ID}"},
        {"role": "user","content": "从这份产品手册中,提取所有产品信息,并整理成一个标准的JSON数组。每个对象需要包含:model(产品的型号)、name(产品的名称)、price(价格(去除货币符号和逗号))"}
    ],
    "stream": true,
    "stream_options": {
        "include_usage": true
    }
}'

完整示例:上传文件并调用模型

import os
import time
from pathlib import Path
from openai import OpenAI, BadRequestError

client = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),  # 如果您没有配置环境变量,请在此处替换您的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)  # 等待2秒后重试
            else:
                raise e
    
    if retry_count >= max_retries:
        print("文件解析超时,请稍后重试")

except BadRequestError as e:
    print(f"错误信息:{e}")
    print("请参考文档:https://help.aliyun.com/zh/model-studio/developer-reference/error-code")
except Exception as e:
    print(f"发生错误:{e}")
import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.core.http.StreamResponse;
import com.openai.models.chat.completions.*;
import com.openai.models.files.*;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.concurrent.TimeUnit;

public class Main {
    public static void main(String[] args) {
        // 创建客户端
        OpenAIClient client = OpenAIOkHttpClient.builder()
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .build();
        
        try {
            // 步骤1:上传文件
            Path filePath = Paths.get("src/main/java/org/example/示例产品手册A.docx");
            FileCreateParams fileParams = FileCreateParams.builder()
                    .file(filePath)
                    .purpose(FilePurpose.of("file-extract"))
                    .build();
            
            FileObject fileObject = client.files().create(fileParams);
            String fileId = fileObject.id();
            System.out.println("文件上传成功,file-id: " + fileId);
            
            // 步骤2:等待文件解析并调用模型(最多重试10次)
            int maxRetries = 10;
            int retryCount = 0;
            boolean success = false;
            
            while (retryCount < maxRetries && !success) {
                try {
                    // 步骤3:使用file-id调用模型
                    ChatCompletionCreateParams chatParams = ChatCompletionCreateParams.builder()
                            .addSystemMessage("You are a helpful assistant.")
                            .addSystemMessage("fileid://" + fileId)
                            .addUserMessage("从这份产品手册中,提取所有产品信息,并整理成一个标准的JSON数组。每个对象需要包含:model(产品的型号)、name(产品的名称)、price(价格(去除货币符号和逗号))")
                            .model("qwen-doc-turbo")
                            .build();
                    
                    // 步骤4:处理模型输出
                    try (StreamResponse<ChatCompletionChunk> streamResponse = 
                            client.chat().completions().createStreaming(chatParams)) {
                        streamResponse.stream().forEach(chunk -> {
                            String content = chunk.choices().get(0).delta().content().orElse("");
                            if (!content.isEmpty()) {
                                System.out.print(content);
                            }
                        });
                        System.out.println();
                        success = true;
                    }
                    
                } catch (Exception e) {
                    if (e.getMessage() != null && e.getMessage().contains("File parsing in progress")) {
                        retryCount++;
                        System.out.println("文件解析中,等待后重试 (" + retryCount + "/" + maxRetries + ")...");
                        TimeUnit.SECONDS.sleep(2);  // 等待2秒后重试
                    } else {
                        throw e;
                    }
                }
            }
            
            if (!success) {
                System.out.println("文件解析超时,请稍后重试");
            }
            
        } catch (Exception e) {
            System.err.println("错误信息:" + e.getMessage());
            e.printStackTrace();
        }
    }
}

响应示例

[
  {
    "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,000Token,请通过文件URL或文件ID传入信息对话。
import os
from openai import OpenAI, BadRequestError

client = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"), # 如果您没有配置环境变量,请在此处替换您的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(价格(去除货币符号和逗号))'}
        ],
        # 本代码示例均采用流式输出,以清晰和直观地展示模型输出过程。如果您希望查看非流式输出的案例,请参见https://help.aliyun.com/zh/model-studio/text-generation
        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}")
    print("请参考文档:https://help.aliyun.com/zh/model-studio/developer-reference/error-code")
import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.core.http.StreamResponse;
import com.openai.models.chat.completions.*;

public class Main {
    public static void main(String[] args) {
        // 创建客户端,使用环境变量中的API密钥
        OpenAIClient client = OpenAIOkHttpClient.builder()
                // 若没有配置环境变量,请用阿里云百炼API Key将下行替换为:.apiKey("sk-xxx");
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .build();

        ChatCompletionCreateParams chatParams = ChatCompletionCreateParams.builder()
                .addSystemMessage("You are a helpful assistant.")
                .addSystemMessage("智能办公产品手册 版本:V2.0 发布日期:2024年1月 目录 1.1 产品概述...")
                .addUserMessage("从这份产品手册中,提取所有产品信息,并整理成一个标准的JSON数组。每个对象需要包含:model(产品的型号)、name(产品的名称)、price(价格(去除货币符号和逗号))")
                .model("qwen-doc-turbo")
                .build();

        try (StreamResponse<ChatCompletionChunk> streamResponse = client.chat().completions().createStreaming(chatParams)) {
            streamResponse.stream().forEach(chunk -> {
                String content = chunk.choices().get(0).delta().content().orElse("");
                if (!content.isEmpty()) {
                    System.out.print(content);
                }
            });
        } catch (Exception e) {
            System.err.println("错误信息:" + e.getMessage());
        }
    }
}
curl --location 'https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header "Content-Type: application/json" \
--data '{
    "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
    }
}'

响应示例

[
  {
    "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-turbo

262,144

253,952

32,768

0.0006

0.001

无免费额度

常见问题

  1. 通过OpenAI文件兼容接口上传文件后,文件将被保存在何处?

    所有通过OpenAI文件兼容接口上传的文件均将被保存在当前阿里云账号下的阿里云百炼存储空间且不会产生任何费用,关于所上传文件的信息查询与管理请参考OpenAI文件接口

  2. 文件ID是否可以用于其他模型对话或功能调用?

    文件ID目前仅能用于Qwen-Long、Qwen-Doc-Turbo模型对话以及Batch接口批量调用

  3. 通过文件URL方式上传时,文件解析策略(file_parsing_strategy)参数有什么不同?

    当解析策略设置为 "auto" 时,系统会根据文件内容自动进行解析;当解析策略设置为 "text_only" 时,系统将仅解析文字类内容;当解析策略设置为“text_and_images”时,系统将会解析所有图片与文本类内容,解析所需时间也会相应增加。

  4. 如何确定文件已经解析完成?

    获取 file-id 后,您可以直接尝试使用该ID与模型进行对话。如果文件仍在解析中,API会返回相应的错误提示File parsing in progress, please try again later.,此时请稍后重试。如果模型调用成功并返回了回复,则表示文件已解析完成,可以正常使用。

  5. 文件上传后的解析过程是否会产生任何额外费用?

    文档解析并不会产生任何额外费用。

API参考

关于Qwen-Doc-Turbo模型的输入与输出参数,请参考通义千问API详情

错误码

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

限制

  • 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 个文件。

    • 支持格式: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 调用。

  • 限流:关于模型的限流条件,请参见限流