03 通义千问 API 调用基础实现

通义千问 API 调用基础实现

关联:索引

AI 工具使用:API 调用与调参提示词模板(学生可直接复制)

使用方法:把你自己的代码/报错/实验记录粘贴到 {你的内容} 处;要求 AI 输出结构化结果(表格/步骤/清单),便于你照做与复盘。

模板 1:生成最小可运行调用代码(文本生成 + 问答)

你是 Python 实践课助教。请给我一份“最小可运行”的通义千问调用示例代码,要求:
1)使用 dashscope SDK;API Key 从环境变量 DASHSCOPE_API_KEY 读取;
2)包含两个函数:generate_text(prompt)、answer_question(question);
3)将 temperature、top_p、max_length(输出长度上限)作为可配置参数;
4)对常见失败进行处理:Key 缺失、参数非法、频率超限(给出可执行的排查提示);
5)输出内容要清晰:打印 request_id、模型名、最终文本结果。

我当前环境/需求:{你的内容}

模板 2:参数对比实验设计(温度 vs top_p)

请围绕“通义千问生成效果的可控性”,为我设计一个课堂参数对比实验:
1)给出 2 个固定 Prompt(一个偏事实问答、一个偏创意写作);
2)给出 3 组参数组合(temperature、top_p、max_length),每组说明预期差异;
3)给出记录表模板:参数→输出特点→是否跑题→是否重复→可读性→结论。

补充要求:实验需要能在较短时间内完成。
我的笔记内容:{你的内容}

模板 3:报错排查(定位→修复→预防)

下面是我调用通义千问 API 的报错信息与代码片段。请你按“定位→修复→预防”的结构输出:
1)先判断属于哪类问题:密钥/权限、参数非法、频率超限、网络、代码逻辑;
2)给出最短排查步骤(最多 6 步),每一步要具体到我该检查什么;
3)给出修复后的代码改动建议(用要点,不要长篇解释);
4)给出预防清单(3 条以内)。

我的内容:{你的内容}

模板 4:代码结构与规范优化(把脚本变成可复用工具)

请帮我把下面这段通义千问调用脚本优化成“可复用的工程化结构”,要求:
1)用函数拆分:读取配置、调用模型、解析输出、打印结果;
2)加入基本的参数校验与异常提示(不要引入复杂第三方库);
3)保持代码短小、便于课堂演示(不超过 120 行)。

我的代码:{你的内容}

1. 接入流程(从 0 到 1)

前提:已在上一节课安装 dashscope==1.25.13python-dotenv==1.2.2

1. 配置 Key(两种方式二选一)

方式 A:环境变量(推荐)

# Windows PowerShell(临时,仅当前终端生效)
$env:DASHSCOPE_API_KEY="你的Key"

# Windows PowerShell(永久,重开终端后生效)
setx DASHSCOPE_API_KEY "你的Key"

验证(不会泄露完整 Key):

python -c "import os; k=os.getenv('DASHSCOPE_API_KEY'); print('未配置DASHSCOPE_API_KEY' if not k else (k[:3]+'***'+k[-3:]))"

在项目根目录新建 .env(不要提交到仓库):

DASHSCOPE_API_KEY=你的Key

然后在 Python 里加载:

from dotenv import load_dotenv
load_dotenv()

2. 文本生成(最小调用)

import os
from http import HTTPStatus

import dashscope
from dashscope import Generation

dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")

def generate_text(prompt: str, temperature: float = 0.7, top_p: float = 0.8, max_length: int = 256) -> str:
    if not dashscope.api_key:
        raise RuntimeError("未配置 DASHSCOPE_API_KEY:请先设置环境变量或使用 .env 加载")
    resp = Generation.call(
        model=Generation.Models.qwen_turbo,
        prompt=prompt,
        temperature=temperature,
        top_p=top_p,
        max_length=max_length,
    )
    if resp.status_code != HTTPStatus.OK:
        raise RuntimeError(f"调用失败: status_code={resp.status_code}, code={resp.code}, message={resp.message}, request_id={resp.request_id}")
    print(f"model={Generation.Models.qwen_turbo}, request_id={resp.request_id}")
    return resp.output.get("text", "")

def answer_question(question: str, temperature: float = 0.3, top_p: float = 0.8, max_length: int = 256) -> str:
    return generate_text(f"请用3点回答:{question}", temperature=temperature, top_p=top_p, max_length=max_length)

if __name__ == "__main__":
    print(generate_text("用一句话解释什么是 API。"))
    print(answer_question("温度 temperature 参数一般调大有什么效果?"))

成功标志:终端能打印出一段非空文本结果;若失败,能看到明确的 status_code / code / message / request_id

3. 问答(用同一接口实现)

question = "温度 temperature 参数一般调大有什么效果?"
print(generate_text(f"请用3点回答:{question}", temperature=0.3, top_p=0.8, max_length=256))

用同一个 Prompt,做两次调用对比:

记录:是否更发散、是否更有创意、是否更容易跑题、是否更重复。

  1. 快速回顾:Key 推荐放哪里?(环境变量/.env)为什么不写在代码里?
  2. 快速回顾:调用失败看哪四个字段?(status_code / code / message / request_id

目标:记住“参数影响的现象”,而不是背定义。

参数 你能观察到的现象 常见建议
temperature 值越大越发散、越有创意,但更可能跑题(通常为 0~2 的小数) 问答/抽取偏低;创作偏高
top_p 控制从“概率质量”里采样的范围,越大越开放(通常为 0~1 的小数) 与 temperature 搭配使用
max_length / max_tokens 输出长度上限,太小会截断(正整数) 先保守给足,再逐步收敛

参数命名说明(SDK vs 控制台/HTTP)

1. 密钥错误(Key 缺失/无效/权限不足)

排查顺序:

  1. print(os.getenv("DASHSCOPE_API_KEY")) 是否为 None/空字符串?
  2. Key 是否复制错误(多空格/少字符)?
  3. 是否在新终端里运行(环境变量未刷新)?

2. 参数非法(类型不对/范围不对/字段名不对)

排查顺序:

  1. 先把参数减少到最少:只传 model + prompt 能否成功?
  2. 再逐个加回 temperature/top_p/max_length,定位是哪一个触发报错。

3. 请求频率超限(限流/并发过高)

排查顺序:

  1. 是否在循环里高频调用、或多人共用一个 Key?

目标:让 AI 变成“更快写出可运行脚本 + 更快定位报错”的工具,而不是替你写完全部作业。

  1. 用模板 1:让 AI 生成最小可运行代码(你对照自己的代码挑差异点)。
  2. 用模板 3:把你的报错 + 代码片段粘给 AI,让它按“定位→修复→预防”输出排查步骤。

作业(课后完成)

  1. 提交 API 调用代码(文本生成 + 问答功能),要求包含参数配置注释(写清 temperature/top_p/max_length 的意义与取值)。
  2. 提交 API 调用成功的运行截图(含终端输出/返回结果,注意 Key 打码)。
  3. 记录至少 2 个不同参数组合的测试结果,分析参数对生成效果的影响(150 字左右)。