Week1 Day 2 Lab Chat Completions API 与 OpenAI 兼容端点 —— 云端接口与 Ollama 本地模型调用实践
前置准备
1. 安装依赖包
先在终端执行安装所需的 Python 库:
bash
pip install python-dotenv requests openai beautifulsoup4
2. 项目根目录新建 .env 文件
填入你的密钥,没有对应密钥可以先留空,对应环节跳过即可:
env
# OpenAI 云端 API 密钥 OPENAI_API_KEY=sk-proj-你的OpenAI密钥 # Google Gemini 兼容端点配置 GOOGLE_API_KEY=AIz你的Google密钥 GEMINI_BASE_URL = "https://generativelanguage.googleapis.com/v1beta/openai/"
实验 1:加载环境变量 & 校验 OpenAI 密钥
对应讲义开头的密钥检查部分:
python
运行
import os from dotenv import load_dotenv # 加载 .env 文件,override=True 确保每次修改后立即生效 load_dotenv(override=True) # 读取 OpenAI 密钥并校验格式 api_key = os.getenv('OPENAI_API_KEY') if not api_key: print("No API key was found - please head over to the troubleshooting notebook in this folder to identify & fix!") elif not api_key.startswith("sk-proj-"): print("An API key was found, but it doesn't start sk-proj-; please check you're using the right key - see troubleshooting notebook") else: print("API key found and looks good so far!")
实验 2:原生 requests 调用 OpenAI 接口
对应讲义「底层 HTTP 端点调用」部分,不依赖 openai 库,直接发 HTTP 请求:
python
运行
import requests import json # 请求头:鉴权 + 内容格式 headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } # 请求体:模型名 + 对话消息 payload = { "model": "gpt-5-nano", "messages": [ {"role": "user", "content": "Tell me a fun fact"} ] } # 发送 POST 请求 response = requests.post( "https://api.openai.com/v1/chat/completions", headers=headers, json=payload ) # 打印完整返回结果 print("完整响应:") print(json.dumps(response.json(), indent=2, ensure_ascii=False)) # 提取并打印模型回复内容 print("\n模型回复:") print(response.json()["choices"][0]["message"]["content"])
实验 3:使用 openai 官方客户端库调用
对应讲义「Python 客户端库」部分,是对上面 HTTP 请求的封装,代码更简洁:
python
运行
from openai import OpenAI # 初始化 OpenAI 客户端(自动读取 .env 里的 OPENAI_API_KEY) openai_client = OpenAI() # 调用聊天补全接口 response = openai_client.chat.completions.create( model="gpt-5-nano", messages=[{"role": "user", "content": "Tell me a fun fact"}] ) # 提取回复内容 print(response.choices[0].message.content)
讲义特别说明:openai库只是轻量的接口调用封装,本身不包含任何大模型代码,模型全部在 OpenAI 云端运行。
实验 4:OpenAI 兼容端点 - Google Gemini
对应讲义「兼容端点」知识点:复用
openai 客户端,只改 base_url 和 api_key 就能调用其他厂商模型:python
运行
import os from dotenv import load_dotenv from openai import OpenAI load_dotenv(override=True) # 读取 Gemini 配置 google_api_key = os.getenv("GOOGLE_API_KEY") gemini_base_url = os.getenv("GEMINI_BASE_URL") # 密钥校验 if not google_api_key: print("No API key was found - please be sure to add your key to the .env file, and save the file!") elif not google_api_key.startswith(("AIz", "AQ.")): print("An API key was found, but it doesn't start with AIz or AQ.") else: print("Google API key found and looks good so far!") # 用 openai 客户端调用 Gemini 兼容接口 gemini_client = OpenAI( base_url=gemini_base_url, api_key=google_api_key ) response = gemini_client.chat.completions.create( model="gemini-3.1-flash-lite", messages=[{"role": "user", "content": "Tell me a fun fact"}] ) print(response.choices[0].message.content)
实验 5:OpenAI 兼容端点 - Ollama 本地开源模型(核心)
对应讲义最关键的本地化离线部分:本地运行的 Ollama 同样提供 OpenAI 兼容接口,完全断网也能调用。
步骤 1:检查本地 Ollama 服务是否启动
python
运行
import requests # 访问 Ollama 默认本地地址 try: res = requests.get("http://localhost:11434") print("Ollama is running") except Exception as e: print("Ollama 未启动,请先在终端执行 ollama serve")
步骤 2:拉取本地开源模型(终端执行,二选一即可)
bash
# 推荐基础版,3B 参数,普通电脑可跑 ollama pull llama3.2 # 电脑配置较低可选 1B 参数版本 # ollama pull llama3.2:1b # 额外:DeepSeek 推理模型 # ollama pull deepseek-r1:1.5b
步骤 3:用 openai 客户端调用本地 Llama3.2 模型
python
运行
from openai import OpenAI # Ollama 本地兼容端点配置 OLLAMA_BASE_URL = "http://localhost:11434/v1" # 初始化客户端:api_key 随便填,Ollama 不校验 ollama_client = OpenAI( base_url=OLLAMA_BASE_URL, api_key="ollama" ) # 调用本地模型,和调用云端 API 代码完全一致 response = ollama_client.chat.completions.create( model="llama3.2", messages=[{"role": "user", "content": "Tell me a fun fact"}] ) print(response.choices[0].message.content)
步骤 4:调用本地 DeepSeek-R1 模型
python
运行
response = ollama_client.chat.completions.create( model="deepseek-r1:1.5b", messages=[{"role": "user", "content": "Tell me a fun fact"}] ) print(response.choices[0].message.content)
课后作业参考实现:本地 Ollama 版网页摘要工具
作业要求:把 Day 1 的「网页摘要项目」从 OpenAI 云端 API 改造成 Ollama 本地模型实现。
以下是完整可运行代码:
python
运行
import requests from bs4 import BeautifulSoup from openai import OpenAI # ========== 1. 配置本地 Ollama 客户端 ========== OLLAMA_BASE_URL = "http://localhost:11434/v1" MODEL = "llama3.2" # 配置低可改成 llama3.2:1b ollama_client = OpenAI( base_url=OLLAMA_BASE_URL, api_key="ollama" ) # ========== 2. 工具函数:抓取网页正文 ========== def get_webpage_text(url): """输入网址,提取网页纯文本内容""" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" } response = requests.get(url, headers=headers) response.encoding = response.apparent_encoding soup = BeautifulSoup(response.text, "html.parser") # 移除脚本和样式标签 for tag in soup(["script", "style"]): tag.decompose() # 提取纯文本并清理多余空白 text = soup.get_text(separator="\n", strip=True) return text # ========== 3. 本地模型生成摘要 ========== def summarize_webpage(url): """输入网址,返回本地模型生成的摘要""" # 抓取网页内容 content = get_webpage_text(url) # 内容过长时截断,避免超出模型上下文 content = content[:4000] prompt = f"""请用中文为以下网页内容生成一段简洁的摘要,控制在150字以内: {content} """ response = ollama_client.chat.completions.create( model=MODEL, messages=[{"role": "user", "content": prompt}], temperature=0.3 ) return response.choices[0].message.content # ========== 4. 测试运行 ========== if __name__ == "__main__": test_url = "https://edwarddonner.com/2024/11/13/llm-engineering-resources/" summary = summarize_webpage(test_url) print("网页摘要结果:") print(summary)
关键提示
这套「OpenAI 兼容端点」模式是你实现断网本地化校园咨询系统的核心:RAG、Agent 项目,默认都是用 OpenAI 云端 API 编写,你只需要像上面一样,把
base_url 改成本地 Ollama 地址、模型名改成本地模型名,就能无缝切换为断网可用的本地版本,业务代码几乎不用修改。如果是本地的 Ollama
from openai import OpenAI # Ollama本地兼容OpenAI接口地址,固定为 http://localhost:11434/v1 OLLAMA_BASE_URL = "http://localhost:11434/v1" # ollama不需要真实api_key,随便写字符串 ollama_client = OpenAI( base_url=OLLAMA_BASE_URL, api_key="ollama" ) # -------- 在这里修改你本地的模型名称 -------- # 可以是 llama3.2、llama3.2:1b、gemma4:12b、deepseek-r1:1.5b,必须是你已经ollama pull下载好的 MODEL_NAME = "gemma4:12b" def llm_chat(user_prompt: str): """调用本地Ollama大模型,返回模型输出文本""" response = ollama_client.chat.completions.create( model=MODEL_NAME, messages=[ {"role": "user", "content": user_prompt} ] ) return response.choices[0].message.content if __name__ == "__main__": print("=== 调用本地Ollama Llama模型测试 ===") result = llm_chat("hi") print(f"模型输出:\n{result}")


浙公网安备 33010602011771号