Files
ai-agent-dev/03_大模型API调用.ipynb
2026-07-08 10:09:42 +08:00

357 lines
12 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 03 大模型 API 调用\n",
"\n",
"## 学习目标\n",
"1. 理解大模型 API 的基本概念OpenAI、Anthropic 等)\n",
"2. 学会使用 Python 代码调用大模型 API 进行对话\n",
"3. 掌握 API 密钥的安全管理和环境变量配置\n",
"4. 能够区分 OpenAI 格式与 Anthropic 格式的 API 调用方式"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. 大模型 API 概述\n",
"\n",
"大模型Large Language Model, LLM通常通过 **HTTP API** 提供服务。你发送一段文本Prompt模型返回生成的回复。\n",
"\n",
"### 主流 API 提供商\n",
"\n",
"| 提供商 | 代表模型 | 特点 |\n",
"| --- | --- | --- |\n",
"| **OpenAI** | GPT-4o、GPT-4o-mini | 生态最成熟,很多第三方平台兼容其格式 |\n",
"| **Anthropic** | Claude 3.5 Sonnet、Claude 3 Opus | 长文本处理能力强,安全性设计突出 |\n",
"| **国内厂商** | 文心一言、通义千问、智谱 GLM | 中文优化好,无需翻墙 |\n",
"\n",
"> 💡 **注意**:很多国内平台(如硅基流动、智谱 AI、DashScope提供兼容 OpenAI 格式的 API可以直接使用 OpenAI SDK 调用。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2. API 调用核心概念\n",
"\n",
"调用大模型 API 时,你需要了解以下几个核心要素:\n",
"\n",
"- **Base URL**API 服务的基础地址,例如 `https://api.openai.com/v1` 或 `https://api.anthropic.com`\n",
"- **API Key**:身份验证密钥,类似于密码,**绝对不能泄露**\n",
"- **Model**:模型名称,本课程统一使用 `qwen3.6-35b-A3b`\n",
"- **Message / Prompt**:发送给模型的输入内容\n",
"- **Temperature**控制输出随机性0~2越低越确定越高越有创意\n",
"- **Max Tokens**:限制模型输出的最大长度"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3. API 密钥安全管理\n",
"\n",
"**切勿将 API Key 直接写入代码并上传到 GitHub** 推荐做法是将密钥存放在环境变量中。\n",
"\n",
"### 方法一:使用 .env 文件(推荐)\n",
"\n",
"1. 在项目根目录创建 `.env` 文件(注意文件名以点开头)\n",
"2. 添加以下内容(填入老师提供的实际值):\n",
"\n",
"```env\n",
"# 请使用老师提供的 base_url 和 api_key\n",
"OPENAI_BASE_URL=https://your-openai-compatible-base-url.com/v1\n",
"OPENAI_API_KEY=sk-your-openai-api-key\n",
"\n",
"ANTHROPIC_BASE_URL=https://api.anthropic.com\n",
"ANTHROPIC_API_KEY=sk-ant-your-anthropic-api-key\n",
"```\n",
"\n",
"> ⚠️ **重要**`.env` 文件已加入 `.gitignore`,不会上传到 Git切勿手动删除该忽略配置。\n",
"\n",
"### 方法二手动设置系统环境变量Windows\n",
"\n",
"```powershell\n",
"# 当前终端会话有效\n",
"$env:OPENAI_API_KEY=\"sk-your-api-key\"\n",
"$env:OPENAI_BASE_URL=\"https://your-base-url.com/v1\"\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 加载 .env 文件中的环境变量\n",
"from dotenv import load_dotenv\n",
"import os\n",
"\n",
"load_dotenv() # 默认加载当前目录下的 .env 文件\n",
"\n",
"# 验证环境变量是否加载成功\n",
"openai_base_url = os.getenv(\"OPENAI_BASE_URL\")\n",
"openai_api_key = os.getenv(\"OPENAI_API_KEY\")\n",
"anthropic_base_url = os.getenv(\"ANTHROPIC_BASE_URL\")\n",
"anthropic_api_key = os.getenv(\"ANTHROPIC_API_KEY\")\n",
"\n",
"print(\"✅ OPENAI_BASE_URL 已设置\" if openai_base_url else \"❌ OPENAI_BASE_URL 未设置\")\n",
"print(\"✅ OPENAI_API_KEY 已设置\" if openai_api_key else \"❌ OPENAI_API_KEY 未设置\")\n",
"print(\"✅ ANTHROPIC_BASE_URL 已设置\" if anthropic_base_url else \"❌ ANTHROPIC_BASE_URL 未设置\")\n",
"print(\"✅ ANTHROPIC_API_KEY 已设置\" if anthropic_api_key else \"❌ ANTHROPIC_API_KEY 未设置\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4. 方式一OpenAI 格式调用(兼容 OpenAI SDK\n",
"\n",
"OpenAI 格式的 API 是目前最通用的标准。很多国内厂商如硅基流动、智谱、DeepSeek也提供兼容此格式的接口。\n",
"\n",
"### 安装依赖\n",
"\n",
"```powershell\n",
"pip install openai python-dotenv -i https://pypi.tuna.tsinghua.edu.cn/simple\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from openai import OpenAI\n",
"import os\n",
"\n",
"# 初始化客户端(使用环境变量中的配置)\n",
"client = OpenAI(\n",
" base_url=os.getenv(\"OPENAI_BASE_URL\"),\n",
" api_key=os.getenv(\"OPENAI_API_KEY\")\n",
")\n",
"\n",
"# 发送对话请求\n",
"response = client.chat.completions.create(\n",
" model=\"qwen3.6-35b-A3b\", # 请根据老师提供的实际模型名称修改\n",
" messages=[\n",
" {\"role\": \"system\", \"content\": \"你是一个 helpful 的 AI 助手。\"},\n",
" {\"role\": \"user\", \"content\": \"请用一句话解释什么是大语言模型。\"}\n",
" ],\n",
" temperature=0.7,\n",
" max_tokens=200\n",
")\n",
"\n",
"# 输出模型回复\n",
"print(\"🤖 AI 回复:\")\n",
"print(response.choices[0].message.content)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### OpenAI 格式调用要点\n",
"\n",
"| 参数 | 说明 |\n",
"| --- | --- |\n",
"| `model` | 模型名称,本课程默认使用 `qwen3.6-35b-A3b` |\n",
"| `messages` | 消息列表,每条消息包含 `role`system/user/assistant和 `content` |\n",
"| `temperature` | 随机性0~20 最确定2 最有创意 |\n",
"| `max_tokens` | 最大输出 token 数 |\n",
"| `response.choices[0].message.content` | 获取模型回复的文本内容 |"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 5. 扩展阅读Anthropic 格式调用Claude API\n",
"\n",
"Anthropic 的 Claude 系列模型使用独立的 API 格式,与 OpenAI 格式不同。需要安装 `anthropic` Python SDK。\n",
"\n",
"> 课程主线统一使用 OpenAI 兼容格式调用 `qwen3.6-35b-A3b`。以下 Anthropic/Claude 内容仅用于了解不同 API 格式,不作为默认运行示例。\n",
"\n",
"### 安装依赖\n",
"\n",
"```powershell\n",
"pip install anthropic python-dotenv -i https://pypi.tuna.tsinghua.edu.cn/simple\n",
"```\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Anthropic/Claude 调用格式示意(扩展阅读)\n",
"\n",
"课程默认不执行 Claude 调用,主线统一使用 OpenAI 兼容格式调用 `qwen3.6-35b-A3b`。如需了解 Anthropic SDK 的写法,可参考下面的非执行示例:\n",
"\n",
"```python\n",
"from anthropic import Anthropic\n",
"import os\n",
"\n",
"client = Anthropic(\n",
" base_url=os.getenv(\"ANTHROPIC_BASE_URL\"),\n",
" api_key=os.getenv(\"ANTHROPIC_API_KEY\"),\n",
")\n",
"\n",
"response = client.messages.create(\n",
" model=\"<your-claude-model>\",\n",
" max_tokens=200,\n",
" temperature=0.7,\n",
" system=\"你是一个 helpful 的 AI 助手。\",\n",
" messages=[\n",
" {\"role\": \"user\", \"content\": \"请用一句话解释什么是大语言模型。\"}\n",
" ],\n",
")\n",
"\n",
"print(response.content[0].text)\n",
"```\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Anthropic 格式与 OpenAI 格式的区别\n",
"\n",
"| 特性 | OpenAI 格式 | Anthropic 格式 |\n",
"| --- | --- | --- |\n",
"| 系统提示 | 放入 `messages` 列表role=\"system\" | 独立的 `system` 参数 |\n",
"| 回复获取 | `response.choices[0].message.content` | `response.content[0].text` |\n",
"| SDK 包名 | `openai` | `anthropic` |\n",
"| 客户端类 | `OpenAI()` | `Anthropic()` |\n",
"| 方法名 | `chat.completions.create()` | `messages.create()` |"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 6. 多轮对话示例\n",
"\n",
"多轮对话需要保留历史消息,让模型理解上下文。以下以 OpenAI 格式为例:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from openai import OpenAI\n",
"import os\n",
"\n",
"client = OpenAI(\n",
" base_url=os.getenv(\"OPENAI_BASE_URL\"),\n",
" api_key=os.getenv(\"OPENAI_API_KEY\")\n",
")\n",
"\n",
"# 维护对话历史\n",
"messages = [\n",
" {\"role\": \"system\", \"content\": \"你是一个 helpful 的 AI 助手。\"}\n",
"]\n",
"\n",
"# 第一轮对话\n",
"messages.append({\"role\": \"user\", \"content\": \"你好,我叫小明。\"})\n",
"response = client.chat.completions.create(\n",
" model=\"qwen3.6-35b-A3b\",\n",
" messages=messages,\n",
" temperature=0.7\n",
")\n",
"reply = response.choices[0].message.content\n",
"print(f\"🤖: {reply}\")\n",
"\n",
"# 将模型回复加入历史\n",
"messages.append({\"role\": \"assistant\", \"content\": reply})\n",
"\n",
"# 第二轮对话(模型应该记得我叫小明)\n",
"messages.append({\"role\": \"user\", \"content\": \"你还记得我的名字吗?\"})\n",
"response = client.chat.completions.create(\n",
" model=\"qwen3.6-35b-A3b\",\n",
" messages=messages,\n",
" temperature=0.7\n",
")\n",
"reply = response.choices[0].message.content\n",
"print(f\"🤖: {reply}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 7. 流式输出Streaming\n",
"\n",
"流式输出让模型内容逐字返回,提升用户体验:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from openai import OpenAI\n",
"import os\n",
"\n",
"client = OpenAI(\n",
" base_url=os.getenv(\"OPENAI_BASE_URL\"),\n",
" api_key=os.getenv(\"OPENAI_API_KEY\")\n",
")\n",
"\n",
"stream = client.chat.completions.create(\n",
" model=\"qwen3.6-35b-A3b\",\n",
" messages=[{\"role\": \"user\", \"content\": \"写一首关于春天的短诗。\"}],\n",
" stream=True # 开启流式输出\n",
")\n",
"\n",
"print(\"🤖: \", end=\"\")\n",
"for chunk in stream:\n",
" # 某些 chunk 的 choices 为空,需要先判断\n",
" if chunk.choices and chunk.choices[0].delta.content is not None:\n",
" print(chunk.choices[0].delta.content, end=\"\")\n",
"print()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 8. 本节课练习\n",
"\n",
"1. 根据老师提供的 `base_url` 和 `api_key`,在 `.env` 文件中正确配置 OpenAI 和 Anthropic 两种环境变量\n",
"2. 运行 OpenAI 格式的示例代码,成功获取模型回复\n",
"3. 阅读 Anthropic 格式的扩展说明,对比两种 API 的差异\n",
"4. 尝试修改 `temperature` 和 `max_tokens` 参数,观察输出变化\n",
"5. 使用流式输出模式,让模型生成一段关于人工智能的短文"
]
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.14.4"
}
},
"nbformat": 4,
"nbformat_minor": 4
}