核心说明:示例用「豆包API」(国内平台,API Key易申请,无需科学上网),全程贴合Jupyter单元格操作,分6步调试,每一步可独立运行、单独排错,完美适配你第1周“调用LLM API”的学习任务,代码带详细注释,后端视角易懂。

前提准备:

  1. 已安装Jupyter并启动;
  2. 已申请豆包API Key(登录豆包开放平台,创建应用即可获取,免费额度足够调试);
  3. 已掌握Token、Temperature、上下文基础。

第一步:新建Jupyter文件(回顾基础操作)

  1. 启动Jupyter:Windows终端输入 jupyter notebook,Mac/Linux输入 jupyter3 notebook,自动弹出浏览器。

  2. 新建文件:点击右上角「New」→「Python 3」,修改文件名为「week1-debug-llm-api」(规范命名,方便后续查找)。

第二步:安装依赖(Jupyter单元格运行,第一次安装即可)

调用LLM API需要「requests」库(发送HTTP请求,类比Java的OkHttp),在第一个单元格输入以下代码,点击「Run」运行安装:

# 安装调用API所需的依赖,感叹号“!”表示在终端执行命令
# 国内镜像源,安装更快,避免超时
!pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple

调试说明:运行后出现「Successfully installed requests」即成功;若失败,重新运行一次即可(网络波动问题)。

第三步:导入依赖+设置API Key(核心配置)

新建第二个单元格(快捷键「B」),输入以下代码,替换自己的豆包API Key,运行:

# 导入依赖(每次运行代码前,需先导入)
import requests
import json

# 关键配置:替换成你自己的豆包API Key(必做!)
API_KEY = "你的豆包API Key"
# 豆包API的请求地址(固定,不用改)
URL = "https://aquasearch.ai/api/v1/chat/completions"

# 配置请求头(类比Java的请求头设置,携带API Key鉴权)
headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {API_KEY}"
}

调试说明:

  • API Key获取:登录豆包开放平台 → 控制台 → 创建应用 → 复制「API Key」。

  • 运行无报错,说明依赖导入成功、配置无误;若报错「ModuleNotFoundError」,回到第二步重新安装requests。

第四步:调试「单轮对话」(基础调用,验证API连通性)

新建第三个单元格,输入代码(包含Temperature、Token参数,贴合之前学的LLM基础),运行调试:

# 单轮对话请求参数(核心!对应LLM基础的3个关键概念)
payload = {
    "model": "doubao-pro",  # 豆包模型,固定值(免费可用)
    "messages": [
        # 单轮对话:只有用户提问(user),无历史上下文
        {"role": "user", "content": "我想成为大模型应用开发者,给我1句建议"}
    ],
    "temperature": 0.3,  # 低随机性,回答严谨(适合客观建议)
    "max_tokens": 100,   # 限制输出token数量,避免回答过长、浪费费用
    "stream": False      # 非流式输出(先调试非流式,后续再调试流式)
}

# 发送POST请求(类比Java的HttpClient发送POST请求)
response = requests.post(url=URL, headers=headers, data=json.dumps(payload))

# 解析响应结果(将JSON响应转为Python字典,方便查看)
result = response.json()

# 打印最终回答(提取模型输出的内容)
print("LLM回答:", result["choices"][0]["message"]["content"])

调试重点(后端视角):

  • 运行成功:单元格下方会输出LLM的回答,说明API调用成功(核心目标)。

  • 常见报错及解决:

    • 报错「401 Unauthorized」:API Key错误,重新替换正确的API Key。

    • 报错「ConnectionError」:网络问题,检查网络,重新运行单元格。

    • 报错「max_tokens exceeds limit」:减小max_tokens的值(比如改为50)。

  • 参数调试:修改temperature(比如改为0.8),重新运行,观察回答的随机性变化(贴合之前学的Temperature知识点)。

第五步:调试「多轮对话」(上下文应用,重点)

新建第四个单元格,调试多轮对话(用到「上下文」知识点,类比Java的Session),运行:

# 多轮对话:维护上下文(messages列表里存所有历史对话)
payload = {
    "model": "doubao-pro",
    "messages": [
        # 历史对话1:用户提问
        {"role": "user", "content": "什么是LLM的Token?"},
        # 历史对话2:模型回答(模拟上一轮回答,实际开发中从历史记录中获取)
        {"role": "assistant", "content": "Token是LLM的最小处理单位,将文字拆分为模型可识别的语义单元,用于计费和上下文限制。"},
        # 当前提问:结合上下文,模型能识别“它”指的是Token
        {"role": "user", "content": "它和Java里的字符有什么区别?"}
    ],
    "temperature": 0.2,
    "max_tokens": 150,
    "stream": False
}

# 发送请求并解析
response = requests.post(url=URL, headers=headers, data=json.dumps(payload))
result = response.json()

# 打印回答(模型会结合上下文,解释Token和Java字符的区别)
print("LLM多轮对话回答:", result["choices"][0]["message"]["content"])

调试说明:

  • 核心逻辑:上下文保存在「messages」列表中,每一轮对话都要将历史记录(user+assistant)传入模型,模型才能“记住”之前的内容。

  • 调试技巧:删除messages里的历史回答,重新运行,观察模型是否能正确理解“它”的含义(验证上下文的作用)。

第六步:调试「流式输出」(必做任务,打字机效果)

新建第五个单元格,调试流式输出(类比Java的流式响应),运行:

# 流式输出:逐字显示回答(和ChatGPT一样的打字效果)
payload = {
    "model": "doubao-pro",
    "messages": [{"role": "user", "content": "简单说下什么是上下文"}],
    "temperature": 0.4,
    "max_tokens": 120,
    "stream": True  # 关键:开启流式输出
}

# 发送流式请求(stream=True,获取流式响应)
response = requests.post(url=URL, headers=headers, data=json.dumps(payload), stream=True)

# 解析流式响应,逐字打印
print("流式输出(打字机效果):")
for line in response.iter_lines():
    if line:
        # 解析每一行的响应(去除多余字符,提取有效内容)
        line = line.decode('utf-8').lstrip('data: ').rstrip(',')
        if line == '[DONE]':  # 流式结束标识
            break
        try:
            data = json.loads(line)
            # 提取当前流式输出的内容,打印不换行
            content = data["choices"][0]["delta"].get("content", "")
            if content:
                print(content, end="", flush=True)
        except:
            pass

调试说明:

  • 运行后,会逐字显示LLM的回答(打字机效果),和你第1周“实现流式输出”的任务完全一致。

  • 若流式输出无内容,检查stream是否设为True,或重新运行单元格(网络延迟)。

七、调试总结&避坑指南(后端视角重点)

    1. 调试顺序:先调试「单轮对话」(确保API连通)→ 再调试「多轮对话」(上下文)→ 最后调试「流式输出」(任务重点),逐段排错,避免一次性写完整代码报错。
    1. 核心避坑:API Key必须替换成自己的,否则无法调用;流式输出和非流式输出不能同时开启(stream设为True/False二选一)。
    1. 贴合学习:这份示例完全对应你第1周的任务,调试成功后,可直接复用代码,修改提问内容、参数,完成本周的“CLI聊天机器人”任务。
    1. 报错处理:遇到报错,先看报错信息(比如401=API Key错、ConnectionError=网络错),再对应解决,不用慌(后端调试的核心思路)。

补充:若你申请的是百度、阿里等其他平台的API Key,只需修改「URL」和「payload参数格式」(参考对应平台的开发者文档),核心调试逻辑完全一致。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐