欢迎光临
我们一直在努力

第二篇章:API 调用入门——和 AI 第一次对话

覆盖内容:HTTP 请求 → 注册 DeepSeek → 第一条 AI 消息 → 模型参数 → System Prompt → 多轮对话 → 流式输出 → Token 计费 → 错误处理 → 实战 最终产出:一个 AI 翻译助手(中英日互译 + 流式输出) 前置要求:完成第一篇 Python 基础 你需要准备:一个 DeepSeek API Key


一、什么是 API?为什么大模型要「调接口」?

大模型不是跑在你电脑上的——它跑在几千公里外的 GPU 集群上。你想让它干活,就通过网络给它发请求,它算完了把结果返回给你。

这个过程叫 API 调用。API 就是「你家到模型」的快递通道。

你的电脑 DeepSeek 服务器
│ │
│ POST /chat/completions │
│ {"model":"deepseek-chat", │
│ "messages":[{"role":"user", │
│ "content":"你好"}]} │
│ ──────────────────────────────────▶ │
│ │ GPU 计算…
│ {"choices":[{"message": │
│ {"content":"你好!…"}}]} │
│ ◀────────────────────────────────── │
│ │


二、HTTP 请求基础(10 分钟速通)

调用 API 的本质就是发 HTTP 请求。Python 用 requests 库:

2.1 装库

pip install requests

2.2 GET 请求

import requests

# 拿一条免费 API 试试 —— 获取一句名言
resp = requests.get("https://api.quotable.io/random")
data = resp.json()
print(data["content"])
print(f"—— {data['author']}")
# 输出示例:Life is what happens when you're busy making other plans. —— John Lennon

2.3 POST 请求

# POST 通常要传数据(JSON body)
resp = requests.post(
"https://httpbin.org/post",
json={"name": "小明", "message": "测试"}
)
print(resp.json())

2.4 状态码

resp = requests.get("https://api.quotable.io/random")
print(resp.status_code) # 200 = 成功,404 = 找不到,500 = 服务器炸了

if resp.status_code == 200:
print("请求成功")
else:
print(f"请求失败:{resp.status_code}")


三、注册 DeepSeek,拿到你的 API Key

DeepSeek 是国产大模型,价格量大管饱,完全兼容 OpenAI 接口格式,新手友好,但目前只支持文本输入。 还可以使用阿里的百炼平台,目前注册限时3个月的免费体验,众多模型任你选,支持多模态。

在这里插入图片描述

注册步骤

  • 打开 https://platform.deepseek.com/
  • 用手机号 / 微信扫码注册
  • 进入控制台 → 左侧 「API keys」
  • 点 「创建 API key」,取个名字(如 ai-learning)
  • 立刻复制保存,关掉弹窗后就看不到了
  • 点击充值,充值1元,学习阶段够用了,用完了再冲
  • 安全提醒

    # ❌ 绝对不要把 Key 写死在代码里提交到 GitHub
    api_key = "sk-xxxxxxxxxxxxxx" # 危险!

    # ✅ 用环境变量
    import os
    api_key = os.getenv("DEEPSEEK_API_KEY")

    # 在终端设置环境变量
    # macOS / Linux
    export DEEPSEEK_API_KEY="sk-你的key"

    # Windows CMD
    set DEEPSEEK_API_KEY=sk-你的key

    # Windows PowerShell
    $env:DEEPSEEK_API_KEY="sk-你的key"


    四、发出人生第一条大模型请求

    4.1 装 openai 库

    DeepSeek 兼容 OpenAI 的接口格式,直接用 openai 官方库:

    pip install openai

    4.2 第一条消息

    这里注意:每个模型厂商的URL都不一样,可参考对应的api文档查看。

    # first_chat.py —— 人生第一条 AI 消息
    import os
    from openai import OpenAI

    # 初始化客户端
    client = OpenAI(
    api_key=os.getenv("DEEPSEEK_API_KEY"), # 你的 API Key
    base_url="https://api.deepseek.com" # DeepSeek 的地址
    )

    # 发消息
    response = client.chat.completions.create(
    model="deepseek-chat", # 模型名
    messages=[
    {"role": "user", "content": "用一句话解释什么是大模型"}
    ]
    )

    # 拿回答
    answer = response.choices[0].message.content
    print(answer)

    运行:

    python first_chat.py

    输出示例:

    大模型是指基于海量数据和深度神经网络训练而成的、具备强大泛化能力和涌现能力的超大规模人工智能模型。

    4.3 拆解返回结果

    # response 是个宝藏,能看到很多信息
    response = client.chat.completions.create(
    model="deepseek-chat",
    messages=[{"role": "user", "content": "你是谁?"}]
    )

    # 完整结构
    print(response.model_dump_json(indent=2))

    关键字段:

    response.id # 请求 ID
    response.model # 使用的模型
    response.choices[0].message.content # 回复内容
    response.choices[0].message.role # "assistant"
    response.choices[0].finish_reason # "stop" 表示正常结束
    response.usage.total_tokens # 消耗的 token 数
    response.usage.prompt_tokens # 输入 token
    response.usage.completion_tokens # 输出 token


    五、模型参数详解——控制 AI 的「性格」

    5.1 temperature(温度,0-2)

    控制回答的随机性 / 创造性:

    # temperature=0:最确定,每次回答几乎一样(适合代码生成、事实问答)
    client.chat.completions.create(
    model="deepseek-chat",
    messages=[{"role": "user", "content": "写一个冷笑话"}],
    temperature=0
    )

    # temperature=1.5:最狂野,天马行空(适合创意写作、头脑风暴)
    client.chat.completions.create(
    model="deepseek-chat",
    messages=[{"role": "user", "content": "写一个冷笑话"}],
    temperature=1.5
    )

    动手:对比实验

    # temperature_test.py —— 感受 temperature 的效果
    from openai import OpenAI
    import os

    client = OpenAI(
    api_key=os.getenv("DEEPSEEK_API_KEY"),
    base_url="https://api.deepseek.com"
    )

    prompt = "用一句话描述雨天"

    for temp in [0, 0.5, 1.0, 1.5]:
    response = client.chat.completions.create(
    model="deepseek-chat",
    messages=[{"role": "user", "content": prompt}],
    temperature=temp
    )
    print(f"temperature={temp}: {response.choices[0].message.content}")

    5.2 max_tokens(最大输出长度)

    # 限制回答最多 50 个 token
    response = client.chat.completions.create(
    model="deepseek-chat",
    messages=[{"role": "user", "content": "写一篇关于 AI 的 500 字文章"}],
    max_tokens=50 # 写到 50 token 就停
    )

    5.3 top_p(核采样,0-1)

    temperature 的替代方案,控制候选词范围。一般调 temperature 就够了,top_p 保持默认。

    速查表

    参数作用推荐值
    temperature 随机性,越大越狂野 代码/事实 0-0.3,聊天 0.7,创意 1.0+
    max_tokens 限制输出长度 按需设置
    top_p 核采样 保持默认 1.0
    stream 流式输出 聊天场景 True
    frequency_penalty 降低重复词 重复问题时设为 0.5

    六、System Prompt——给 AI 一个「人设」

    messages = [
    {"role": "system", "content": "你是一个毒舌的文学评论家,每句话都必须带讽刺"},
    {"role": "user", "content": "评价一下《小时代》"}
    ]

    response = client.chat.completions.create(
    model="deepseek-chat",
    messages=messages
    )
    print(response.choices[0].message.content)
    # 输出:哦,《小时代》,一部让我深刻意识到奢侈品广告也能拍成电影的旷世杰作……

    动手:双人格聊天

    # two_personalities.py —— 同一个人问同一句话,不同人设回答
    from openai import OpenAI
    import os

    client = OpenAI(
    api_key=os.getenv("DEEPSEEK_API_KEY"),
    base_url="https://api.deepseek.com"
    )

    question = "我今天不想上班,怎么办?"

    personalities = [
    {
    "name": "毒舌导师",
    "system": "你是一个毒舌的职场导师,说话刻薄但有用,喜欢反问"
    },
    {
    "name": "温柔鼓励师",
    "system": "你是一个温柔的职场鼓励师,善于共情,说话温暖"
    },
    {
    "name": "鲁迅",
    "system": "你模仿鲁迅的口气,语气犀利,喜欢用比喻"
    }
    ]

    for p in personalities:
    response = client.chat.completions.create(
    model="deepseek-chat",
    messages=[
    {"role": "system", "content": p["system"]},
    {"role": "user", "content": question}
    ]
    )
    print(f"\\n{'='*40}")
    print(f"【{p['name']}】")
    print(response.choices[0].message.content)

    System Prompt 常用模式

    # 1. 角色设定
    {"role": "system", "content": "你是一个高级 Python 后端工程师,有 10 年经验"}

    # 2. 格式约束
    {"role": "system", "content": "你的回答必须使用 JSON 格式,不要加任何解释文字"}

    # 3. 行为约束
    {"role": "system", "content": "你不知道就说不知道,不要编造"}

    # 4. 组合
    {"role": "system", "content": """你是一个资深代码审查员。
    规则:
    1. 只指出真正的问题,不要吹毛求疵
    2. 每个问题给出行号和修复建议
    3. 如果没有问题就说「代码没问题」"""
    }


    七、多轮对话——让 AI 记住上下文

    7.1 原理

    messages 数组就是「对话历史」。你把每次对话都拼进去,AI 就记住了。

    # 不带记忆(每次都是新话题)
    messages = [{"role": "user", "content": "我叫小明"}]
    # AI: 你好小明

    messages = [{"role": "user", "content": "我叫什么?"}]
    # AI: 我不知道你叫什么

    # 带记忆(把之前的对话也传回去)
    messages = [
    {"role": "user", "content": "我叫小明"},
    {"role": "assistant", "content": "你好小明!"},
    {"role": "user", "content": "我叫什么?"}
    ]
    # AI: 你叫小明

    7.2 实现一个命令行聊天机器人

    # chatbot.py —— 有记忆的命令行聊天机器人
    from openai import OpenAI
    import os

    client = OpenAI(
    api_key=os.getenv("DEEPSEEK_API_KEY"),
    base_url="https://api.deepseek.com"
    )

    # 存对话历史
    messages = [
    {"role": "system", "content": "你是一个友好的助手"}
    ]

    print("=" * 50)
    print(" 🤖 命令行聊天机器人(输入 quit 退出)")
    print("=" * 50)

    while True:
    user_input = input("\\n你:")
    if user_input.lower() == "quit":
    print("再见!")
    break

    # 把用户消息加到历史
    messages.append({"role": "user", "content": user_input})

    # 调用 API
    response = client.chat.completions.create(
    model="deepseek-chat",
    messages=messages
    )

    assistant_msg = response.choices[0].message.content
    print(f"AI:{assistant_msg}")

    # 把 AI 回复也加到历史
    messages.append({"role": "assistant", "content": assistant_msg})

    试一下:

    你:你好,我是小啾啾
    AI:你好呀,小啾啾!很高兴认识你,有什么需要帮忙的吗?无论是日常问题、知识解答、心情陪伴还是其他任何事情,我都在这里哦~ (๑˃̵ᴗ˂̵)و
    ……

    你:我正在学习ai大模型应用开发
    AI:哇,太棒了!小啾啾同学,你正在踏入一个超级酷的领域!🎉
    ……

    你:还记得我叫什么吗?
    AI:哈哈,当然记得!你是小啾啾呀~ 我不仅记得名字,还记得你在学AI大模型应用开发呢!😎

    7.3 上下文窗口限制

    messages 太长了会超。简单处理:只保留最近 N 条。虽然目前也支持最大1m的上下文窗口。

    MAX_HISTORY = 20 # 只保留最近 20 条消息

    if len(messages) > MAX_HISTORY:
    # 保留 system prompt + 最近的消息
    messages = messages[:1] + messages[(MAX_HISTORY 1):]

    八、流式输出——打字机效果

    不用等 AI 全部算完才看到回答,一个字一个字往外蹦。

    # stream_chat.py —— 流式输出,打字机效果
    from openai import OpenAI
    import os

    client = OpenAI(
    api_key=os.getenv("DEEPSEEK_API_KEY"),
    base_url="https://api.deepseek.com"
    )

    messages = [{"role": "user", "content": "用 200 字介绍武汉"}]

    # stream=True 开启流式
    stream = client.chat.completions.create(
    model="deepseek-chat",
    messages=messages,
    stream=True
    )

    print("AI:", end="", flush=True)
    for chunk in stream:
    if chunk.choices[0].delta.content:
    content = chunk.choices[0].delta.content
    print(content, end="", flush=True) # 逐字打印

    print() # 最后的换行

    效果:文字像打字机一样逐字出现在屏幕上。


    九、Token 与计费(知道花了多少钱)

    9.1 什么是 Token

    Token 是模型理解文本的最小单位——不完全是「字」,更接近「词根」。

    Token 用量计算

    token 是模型用来表示自然语言文本的基本单位,也是我们的计费单元,可以直观的理解为“字”或“词”;通常 1 个中文词语、1 个英文单词、1 个数字或 1 个符号计为 1 个 token。 一般情况下模型中 token 和字数的换算比例大致如下: 1 个英文字符 ≈ 0.3 个 token。 1 个中文字符 ≈ 0.6 个 token。 但因为不同模型的分词不同,所以换算比例也存在差异,每一次实际处理 token 数量以模型返回为准,您可以从返回结果的 usage 中查看。 以上是deepseek官方给出的说明。

    9.2 统计 Token

    # 从 response 里直接拿用量
    response = client.chat.completions.create(
    model="deepseek-chat",
    messages=[{"role": "user", "content": "你好"}]
    )

    usage = response.usage
    print(f"输入 token: {usage.prompt_tokens}")
    print(f"输出 token: {usage.completion_tokens}")
    print(f"总计: {usage.total_tokens}")

    # DeepSeek 价格(极低)
    # 输入:1 元 / 100 万 token
    # 输出:2 元 / 100 万 token
    cost_input = usage.prompt_tokens / 1_000_000 * 1
    cost_output = usage.completion_tokens / 1_000_000 * 2
    print(f"本次花费:{cost_input + cost_output:.6f} 元")
    # 输出:本次花费:0.000005 元

    9.3 做一个用量追踪器

    # token_tracker.py
    class TokenTracker:
    def __init__(self):
    self.total_prompt = 0
    self.total_completion = 0

    def add(self, usage):
    self.total_prompt += usage.prompt_tokens
    self.total_completion += usage.completion_tokens

    def summary(self):
    total = self.total_prompt + self.total_completion
    cost = (self.total_prompt / 1_000_000 * 1 +
    self.total_completion / 1_000_000 * 2)
    print(f"\\n📊 用量统计")
    print(f" 输入 token: {self.total_prompt:,}")
    print(f" 输出 token: {self.total_completion:,}")
    print(f" 总计 token: {total:,}")
    print(f" 预估费用: ¥{cost:.4f}")

    # 使用
    tracker = TokenTracker()
    # 每次调用 API 后:tracker.add(response.usage)
    # 结束时:tracker.summary()


    十、错误处理——程序不崩

    10.1 常见错误类型

    from openai import (
    APIError, # 服务器错误
    APIConnectionError, # 网络不通
    RateLimitError, # 请求太频繁
    APITimeoutError, # 超时
    AuthenticationError,# API Key 不对
    )

    try:
    response = client.chat.completions.create(
    model="deepseek-chat",
    messages=[{"role": "user", "content": "你好"}],
    timeout=30 # 30 秒超时
    )
    except AuthenticationError:
    print("❌ API Key 无效,检查环境变量")
    except RateLimitError:
    print("❌ 请求太频繁,等一下再试")
    except APITimeoutError:
    print("❌ 请求超时,网络可能有问题")
    except APIConnectionError:
    print("❌ 连接失败,检查网络")
    except APIError as e:
    print(f"❌ API 错误:{e}")
    except Exception as e:
    print(f"❌ 未知错误:{e}")

    10.2 带重试的请求

    import time

    def chat_with_retry(client, messages, max_retries=3):
    """带重试的 API 调用"""
    for attempt in range(max_retries):
    try:
    response = client.chat.completions.create(
    model="deepseek-chat",
    messages=messages,
    timeout=30
    )
    return response
    except RateLimitError:
    if attempt < max_retries 1:
    wait = 2 ** attempt # 指数退避:1s, 2s, 4s
    print(f"⏳ 请求太频繁,{wait}秒后重试…")
    time.sleep(wait)
    else:
    raise
    except (APITimeoutError, APIConnectionError):
    if attempt < max_retries 1:
    print(f"⏳ 网络问题,重试中({attempt + 1}/{max_retries})…")
    time.sleep(1)
    else:
    raise


    十一、阶段实战:AI 翻译助手

    综合运用本篇全部知识,做一个支持流式输出的命令行翻译助手。

    # translator.py —— 第二篇章毕业作品
    import os
    import time
    from openai import OpenAI, APIError, RateLimitError, APITimeoutError, APIConnectionError

    # ─── 初始化 ───
    client = OpenAI(
    api_key=os.getenv("DEEPSEEK_API_KEY"),
    base_url="https://api.deepseek.com"
    )

    LANGUAGES = {
    "1": {"name": "中文", "prompt": "中文"},
    "2": {"name": "English", "prompt": "English"},
    "3": {"name": "日本語", "prompt": "日本語"},
    "4": {"name": "한국어", "prompt": "한국어"},
    }

    # Token 统计
    total_prompt_tokens = 0
    total_completion_tokens = 0

    def translate(text, target_lang, stream=True):
    """翻译文本"""
    global total_prompt_tokens, total_completion_tokens

    system_prompt = (
    f"你是一个专业的翻译助手。"
    f"将用户输入的文本翻译成{target_lang}。"
    f"只输出翻译结果,不要加任何解释。"
    f"保持原文的语气和风格。"
    )

    for attempt in range(3):
    try:
    response = client.chat.completions.create(
    model="deepseek-chat",
    messages=[
    {"role": "system", "content": system_prompt},
    {"role": "user", "content": text}
    ],
    stream=stream,
    temperature=0.3,
    timeout=30
    )
    break
    except RateLimitError:
    if attempt < 2:
    time.sleep(2 ** attempt)
    else:
    raise
    except (APITimeoutError, APIConnectionError):
    if attempt < 2:
    time.sleep(1)
    else:
    raise

    if stream:
    result = ""
    print(f"\\n🌐 翻译结果 ({target_lang}):")
    print("-" * 50)
    for chunk in response:
    if chunk.choices[0].delta.content:
    content = chunk.choices[0].delta.content
    print(content, end="", flush=True)
    result += content
    print("\\n" + "-" * 50)

    # 流式模式无法获取精确 token 数,这里只做粗略统计
    estimated_tokens = len(text) // 2 + len(result) // 2
    total_prompt_tokens += estimated_tokens
    total_completion_tokens += estimated_tokens
    else:
    content = response.choices[0].message.content
    total_prompt_tokens += response.usage.prompt_tokens
    total_completion_tokens += response.usage.completion_tokens
    result = content

    return result

    def main():
    print("=" * 50)
    print(" 🌐 AI 翻译助手 · 第二篇章毕业作品")
    print("=" * 50)

    while True:
    print("\\n支持语言:")
    for key, lang in LANGUAGES.items():
    print(f" {key}. {lang['name']}")

    print("\\n输入 'q' 退出,输入 's' 查看用量统计")
    choice = input("翻译到(输入编号):").strip()

    if choice.lower() == 'q':
    break
    elif choice.lower() == 's':
    show_stats()
    continue

    if choice not in LANGUAGES:
    print("❌ 无效选择")
    continue

    target = LANGUAGES[choice]

    print(f"\\n请输入要翻译成 {target['name']} 的文字(输入空行结束):")
    lines = []
    while True:
    line = input()
    if line == "":
    break
    lines.append(line)

    if not lines:
    continue

    text = "\\n".join(lines)
    translate(text, target["prompt"])

    def show_stats():
    total = total_prompt_tokens + total_completion_tokens
    cost = total_prompt_tokens / 1_000_000 * 1 + total_completion_tokens / 1_000_000 * 2
    print(f"\\n📊 本次会话用量统计")
    print(f" 预估 token: {total:,}")
    print(f" 预估费用: ¥{cost:.6f}")

    if __name__ == "__main__":
    try:
    main()
    except APIError as e:
    print(f"\\n❌ API 错误:{e}")
    except KeyboardInterrupt:
    print("\\n\\n👋 已退出")
    show_stats()

    运行效果

    ==================================================
    🌐 AI 翻译助手 · 第二篇章毕业作品
    ==================================================

    支持语言:
    1. 中文
    2. English
    3. 日本語
    4. 한국어

    翻译到(输入编号):2

    请输入要翻译成 English 的文字:
    恭喜你,完成第二章学习,API调用入门,请继续努力吧!

    🌐 翻译结果 (English):
    ————————————————–
    Congratulations on completing Chapter 2: Getting Started with API Calls. Keep up the good work!
    ————————————————–


    本篇总结

    知识点 你学会了什么
    ──────────────────────────────────────────────
    HTTP 请求 requests 库,GET/POST,状态码
    DeepSeek 注册 API Key,openai 库,base_url
    第一条 AI 消息 client.chat.completions.create,messages 格式
    模型参数 temperature / max_tokens / top_p
    System Prompt 给 AI 人设、行为约束、格式约束
    多轮对话 messages 数组做对话历史,上下文窗口
    流式输出 stream=True,打字机效果
    Token 计费 usage 字段,费用估算
    错误处理 异常类型 / 重试 / 指数退避
    实战 AI 翻译助手,支持 4 种语言 + 流式输出


    下一篇预告

    第三篇章:Prompt Engineering——Few-shot、Chain of Thought、结构化输出、文本分类、情感分析、SQL 生成。让 AI 稳定输出你想要的格式。


    作业:给翻译助手加一个「自动检测源语言」的功能——用户不用手动选,输入文字后 AI 自动判断是哪种语言,然后翻译成用户指定的目标语言。

    赞(0)
    未经允许不得转载:171主机测评 » 第二篇章:API 调用入门——和 AI 第一次对话
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址