大模型的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响应时,希望内容逐字逐句地实时显示在终端上,而不是等待所有内容接收完毕后一次性显示。


少有人走的路


















