deepseek的dashscope调用示例

大模型的api调用风格,分为openai和dashscope两种。

前者是为了兼容漂亮国的openai,后者是字节跳动的一种api调用风格。

阿里的百炼大模型都支持以上两种方式,包括其它的第三方模型,如deepseek;


勇哥在这里演示的是deepseek的dashscope调用示例。

代码:

import os
from dashscope import Generation

# 初始化请求参数
messages = [{"role": "user", "content": "你是谁?"}]

completion = Generation.call(
    # 如果没有配置环境变量,请用阿里云百炼API Key替换:api_key="sk-xxx"
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 此处以 deepseek-v3.2-exp 为例,可按需更换模型名称为 deepseek-v3.1、deepseek-v3 或 deepseek-r1
    model="deepseek-v3.2-exp",
    messages=messages,
    result_format="message",  # 设置结果格式为 message
    enable_thinking=True,     # 开启思考模式,该参数仅对 deepseek-v3.2-exp 和 deepseek-v3.1 有效。deepseek-v3 和 deepseek-r1 设定不会报错
    stream=True,              # 开启流式输出
    incremental_output=True,  # 开启增量输出
)

reasoning_content = ""  # 完整思考过程
answer_content = ""     # 完整回复
is_answering = False    # 是否进入回复阶段

print("\n" + "=" * 20 + "思考过程" + "=" * 20 + "\n")

for chunk in completion:
    """
    choices在英文中的字面意思是"选择"、"选项"。在这段代码中,它代表AI模型返回的可能回答选项的列表。
    在DashScope API的响应结构中, chunk.output.choices 是一个数组,包含了模型生成的所有可能回答。代码中使用 choices[0] 表示获取第一个(通常也是最相关的)回答选项。
    这种设计与许多LLM API的响应格式一致,允许模型返回多个候选答案,并由用户程序决定使用哪一个。
    """
    message = chunk.output.choices[0].message
    # 只收集思考内容
    if "reasoning_content" in message:
        if not is_answering:
            print(message.reasoning_content, end="", flush=True)
        reasoning_content += message.reasoning_content

    # 收到 content,开始进行回复
    if message.content:
        if not is_answering:
            print("\n" + "=" * 20 + "完整回复" + "=" * 20 + "\n")
            is_answering = True
        print(message.content, end="", flush=True)
        answer_content += message.content

print("\n" + "=" * 20 + "Token 消耗" + "=" * 20 + "\n")
print(chunk.usage)

"""
====================思考过程====================

啊这,用户问我是谁,属于基础身份确认问题。需要简洁清晰地介绍自
己的名称、创造者、核心功能和特点。可以用公司背景建立信任感,列
举关键能力时突出实用性和免费优势。结尾保持开放提问姿态,用表情
符号增加亲和力。  
想到直接采用问候语+核心信息点+能力列举+服务邀请的结构,避免过度
展开技术细节。
====================完整回复====================

你好!我是DeepSeek,由深度求索公司创造的AI助手!?

我是一个纯文本模型,虽然不支持多模态识别功能,但我有文件上传功
能,可以帮你处理图像、txt、pdf、ppt、word、excel等文件,并从中
读取文字信息进行分析处理。我完全免费使用,拥有128K的上下文处理
能力,还支持联网搜索功能(需要你手动开启)。

你可以通过官方应用商店下载我的App来使用。我很乐意为你解答问题、
协助处理各种任务,或者就是简单地聊聊天!有什么我可以帮助你的吗
?✨
====================Token 消耗====================

{"input_tokens": 7, "output_tokens": 206, "total_tokens": 213, 
"output_tokens_details": {"reasoning_tokens": 82}}
"""


一些解释:


(一)初始化请求参数

messages = [{"role": "user", "content": "你是谁?"}]

[] 表示Python中的列表(list),用于存储对话消息序列。

这是因为LLM API通常需要按顺序处理多条消息,列表正好适合这种有序数据结构。

{} 表示Python中的字典(dictionary),包含键值对。

在这个上下文中,每个字典代表一条消息,具有特定的格式。


role 、 user 、 content 这些字段是DashScope API(以及大多数LLM API)标准规定的参数名称和格式。

这种格式源自OpenAI的Chat Completion API设计,现已成为行业通用规范。


关于 role 参数的不同取值:

- role="user" :表示这是用户发送的消息,AI模型会将其视为需要回答的问题或指令

- role="system" :表示这是系统提示,用于设定AI助手的行为、背景和回答风格。

系统提示通常在对话开始时提供,对AI的整体响应产生引导作用

将 role 从"user"改为"system"会显著改变这条消息的作用:

作为user时,"你是谁?"是用户提出的问题;

而作为system时,"你是谁?"会被误解为系统要求AI助手思考自身身份,但这种使用方式不符合最佳实践。

通常system消息应该是明确的指令,如"你是一个专业的情感分析助手"。


(二)stream和incremental_output

这两个参数是DashScope API调用中的配置参数,用于控制生成内容的输出方式:

1. stream=True :

   - 表示启用流式输出模式

   - 当设置为True时,API不会等待完整生成结果,而是会边生成边返回结果片段(chunk)

   - 这样可以实现类似打字机效果的实时输出,用户可以看到内容正在逐步生成,而不必等待整个响应完成

2. incremental_output=True :

   - 表示启用增量输出模式

   - 在DashScope API中,这通常意味着每次返回的是累积的完整内容(包含之前已返回的部分),而不是仅返回新生成的片段

   - 当与stream=True配合使用时,可以保证每次获取的都是截至当前的完整响应内容

这两个参数通常一起使用,共同实现了实时、流式的内容生成体验。

它们使得AI模型的分析结果能够逐字逐句地实时展示给用户,提升了用户体验。


(三)其它的参数

### 示例中已使用的参数:

1. api_key - API密钥,用于身份验证

2. model - 模型名称(如示例中的"deepseek-v3.2-exp")

3. messages - 消息列表,包含对话历史

4. result_format - 结果格式,设置为"message"

5. enable_thinking - 开启思考模式

6. stream - 开启流式输出

7. incremental_output - 开启增量输出

### 其他常见参数:

1. temperature - 控制生成内容的随机性,范围通常在0-2之间,值越高内容越随机

2. top_p - 核采样参数,控制词汇多样性,范围0-1,值越小越集中于高频词

3. max_tokens - 限制生成内容的最大token数

4. stop - 停止词列表,遇到这些词时停止生成

5. system - 系统提示,设定模型的行为和角色

6. n - 请求生成的回答数量,默认为1

7. presence_penalty - 重复内容惩罚因子,减少重复

8. frequency_penalty - 基于词频的惩罚因子

9. logprobs - 是否返回token的对数概率

10. seed - 随机种子,用于复现结果

11. response_format - 控制输出格式(如JSON、XML等)

12. timeout - 设置请求超时时间

这些参数可以根据具体需求进行配置,以获得最佳的生成效果和性能。

在实际使用中,通常会根据任务类型调整temperature、max_tokens等参数来控制输出的质量和长度。


(四)result_format参数的取值

在DashScope API中, result_format 参数用于指定模型返回结果的格式。它可以有以下几种常见取值:

1. "message" :

   - 这不是简单的字符串格式,而是返回结构化的消息对象

   - 这种格式下,响应结果包含了更多元数据和结构化信息

   - 如此代码中所见,它可以包含reasoning_content(思考内容)和content(主要回答内容)等多个字段

   - 适合需要区分模型思考过程和最终回答的场景

2. "text" :

   - 返回纯文本格式的结果

   - 只包含模型生成的主要文本内容,不包含额外的结构化信息

   - 适合只需要简单文本输出的场景

3. "json" :

   - 返回完整的JSON格式结果

   - 包含更详细的模型输出结构和元数据

   - 适合需要全面处理模型输出的高级场景

不同取值决定了API响应的结构和信息量,您可以根据具体需求选择合适的格式。

在此代码中使用的"message"格式,允许您分别处理模型的思考过程和最终回答,这在展示模型推理逻辑时非常有用。


(五)result_format和response_format

在DashScope API中, result_format 和 response_format 是两个不同的参数,它们的作用和区别如下:

### result_format 参数

- 主要作用 :控制模型返回结果的整体结构和内容组织方式

- 常见取值 :

  - "message":返回结构化的消息对象,包含思考过程和回答内容

  - "text":返回纯文本格式的结果

  - "json":返回完整的JSON格式结果

- 关注重点 :关注的是API返回数据的整体结构和内容组织

- 使用场景 :用于决定是否需要模型的思考过程、是否需要完整元数据等

### response_format 参数

- 主要作用 :控制模型生成的回答内容的具体格式要求

- 常见取值 :

  - "text":生成纯文本格式的回答

  - "json_object":要求模型生成符合JSON格式的回答内容

  - "xml":要求模型生成符合XML格式的回答内容

- 关注重点 :关注的是模型生成内容的格式规范性

- 使用场景 :当您需要模型返回特定格式的结构化数据时使用

### 主要区别

1. 控制层级不同 : result_format 控制API响应的整体结构,而 response_format 控制模型生成内容的具体格式

2. 适用场景不同 :

   - 使用 result_format 选择是否获取思考过程等额外信息

   - 使用 response_format 强制模型输出特定格式(如JSON)的内容

3. 作用对象不同 :

   - result_format 影响整个API响应的结构

   - response_format 主要影响 choices[0].message.content 字段的内容格式

在实际使用中,您可以根据需要同时使用这两个参数来精确控制API的输出结果。


(六)if message.content

在DashScope API的响应结构中, message.content 通常是一个字符串(str)类型,包含了模型生成的主要回答内容。

if message.content: 是Python中的条件判断语句,它检查 content 是否有内容(非空)。在Python中,字符串的真假值判断规则是:

- 空字符串("")被视为False

- 非空字符串被视为True

所以 if message.content: 的含义是:如果message对象的content属性不为空(即模型已经开始生成主要回答内容),

则执行后续代码。这在流式输出处理中非常有用,可以区分模型输出的不同阶段。


(七)print中的参数end 、flush

在Python的print函数中, end 和 flush 都是可选参数,它们的作用分别是:

1. end 参数 :

   - 用于指定打印内容结束后要添加的字符,默认为换行符 '\n'

   - 在示例 print(message.reasoning_content, end="", flush=True) 中, 

end="" 表示打印完内容后不添加任何字符(包括默认的换行符),

这样可以使后续的打印内容紧跟在前一次打印内容之后,不会自动换行

2. flush 参数 :

   - 用于控制是否立即刷新输出缓冲区,默认为False

   - 当设置为True时,print函数会立即将内容输出到终端,不会等待缓冲区填满

   - 这在处理实时输出(如流式处理、进度条等)时特别有用,

确保用户能及时看到输出内容,而不是等到程序执行完成或缓冲区满才显示

在您的代码场景中,使用 end="", flush=True 组合通常是为了实现实时、连续的输出效果,

比如在处理流式API响应时,希望内容逐字逐句地实时显示在终端上,而不是等待所有内容接收完毕后一次性显示。


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:
本帖最后由 勇哥,很想停止 于 2025-11-05 20:44:36 编辑

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2025年11月    »
12
3456789
10111213141516
17181920212223
24252627282930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864