写在前面你有没有想过为什么OpenAI的SDK能连接那么多不同的AI模型是不是觉得每个模型都要学一套新的API很麻烦别担心这篇教程就是为你准备的我们会用最通俗的语言把那些看起来高大上的概念掰开揉碎了讲给你听。同时我们也会深入到底层原理让你真正理解为什么是这样。第一部分核心概念——这些是你必须知道的1.1 API Key你的通行证大白话解释想象API Key就像是一张门禁卡。每个AI服务商都有自己的大门你想进去用他们的AI就得有这张卡。没有卡对不起门都不给你开。深入理解API Key本质上是一个加密字符串用于身份验证和授权。它通常包含两部分前缀标识如sk-表示OpenAIak-表示阿里云等加密密钥一串随机字符确保唯一性和安全性安全提醒# ❌ 错误做法直接写在代码里 api_key sk-xxxxxxxxxxxxx # ✅ 正确做法从环境变量读取 import os api_key os.getenv(OPENAI_API_KEY)1.2 Base URL模型的门牌号大白话解释Base URL就是AI服务商的地址。就像你要去不同的商店每个商店都有自己的地址。OpenAI有OpenAI的地址阿里云有阿里云的地址。深入理解Base URL是一个HTTP端点endpoint它决定了你的请求会被发送到哪里。标准的OpenAI格式是https://api.openai.com/v1但当你使用其他服务商时这个地址会变Azure OpenAI:https://your-resource.openai.azure.com/openai/deployments/your-deployment通义千问:https://dashscope.aliyuncs.com/compatible-mode/v1智谱GLM:https://open.bigmodel.cn/api/paas/v4DeepSeek:https://api.deepseek.com/v1为什么这很重要因为OpenAI的SDK设计得很聪明它允许你自定义Base URL。这意味着只要你把Base URL改成其他服务商的地址同时那个服务商又兼容OpenAI的接口格式你就可以用同一套代码连接不同的模型1.3 模型名称你要调用的角色大白话解释每个AI服务商都有很多模型就像一家餐厅有很多菜品。你得告诉服务员你要点什么菜这就是模型名称的作用。深入理解模型名称通常包含以下信息模型类型如gpt-4、gpt-3.5-turbo版本信息如gpt-4-0125-preview能力标识如gpt-4-vision-preview表示支持视觉不同服务商的命名规则不同# OpenAI model gpt-4-turbo # 通义千问 model qwen-turbo # 智谱GLM model glm-4 # DeepSeek model deepseek-chat1.4 请求和响应你和AI的对话流程大白话解释你发一个问题AI回一个答案这就是一次请求和响应。但在这个过程中有很多细节需要注意。深入理解请求结构{ model: gpt-4, # 用哪个模型 messages: [ # 对话历史 {role: system, content: 你是一个助手}, {role: user, content: 你好} ], temperature: 0.7, # 创造性程度 max_tokens: 1000, # 最大回复长度 stream: False # 是否流式输出 }响应结构{ id: chatcmpl-xxxxx, object: chat.completion, created: 1234567890, model: gpt-4, choices: [ { index: 0, message: { role: assistant, content: 你好有什么我可以帮助你的吗 }, finish_reason: stop } ], usage: { prompt_tokens: 10, completion_tokens: 15, total_tokens: 25 } }1.5 TokenAI世界的货币大白话解释Token可以理解为AI处理文本的基本单位。一个英文单词大约是1个token一个汉字大约是2个token。你用AI就是按token数量付费的。深入理解Token不仅仅是计费单位它还关系到上下文窗口模型能记住多少内容输入限制你一次能发多少内容输出限制模型一次能回多少内容不同模型的Token限制| 模型 | 输入上限 | 输出上限 | |------|---------|---------| | GPT-3.5-Turbo | 16K tokens | 4K tokens | | GPT-4-Turbo | 128K tokens | 4K tokens | | GPT-4o | 128K tokens | 16K tokens | | Claude 3 Opus | 200K tokens | 4K tokens | | 通义千问-Max | 32K tokens | 8K tokens |1.6 流式输出像打字机一样逐字显示大白话解释普通输出是等AI全部想好了再一次性给你流式输出是AI想一个字给你一个字就像打字机一样。深入理解流式输出使用Server-Sent Events (SSE)技术通过HTTP长连接实现实时数据推送。它的优势是用户体验更好不用等待立即看到反馈降低超时风险长时间生成不会因为超时而失败便于监控可以实时看到生成进度第二部分使用方式的差异——不同服务商怎么连2.1 OpenAI官方标准范例OpenAI是行业的标杆它的API设计被广泛采用。基本连接from openai import OpenAI client OpenAI( api_keysk-xxxxxxxxxxxxx ) response client.chat.completions.create( modelgpt-4-turbo, messages[ {role: user, content: 介绍一下你自己} ] ) print(response.choices[0].message.content)流式输出stream client.chat.completions.create( modelgpt-4-turbo, messages[ {role: user, content: 写一首诗} ], streamTrue ) for chunk in stream: if chunk.choices[0].delta.content: print(chunk.choices[0].delta.content, end, flushTrue)2.2 Azure OpenAI企业级方案微软Azure提供的OpenAI服务更适合企业使用但配置稍有不同。关键差异需要指定部署名称deployment name认证方式支持API Key和Azure ADBase URL格式不同连接方式from openai import AzureOpenAI client AzureOpenAI( azure_endpointhttps://your-resource.openai.azure.com, api_keyyour-azure-key, api_version2024-02-15-preview ) response client.chat.completions.create( modelgpt-4-deployment, # 这是你的部署名称 messages[ {role: user, content: 你好} ] )2.3 国内大模型兼容OpenAI接口很多国内厂商为了降低迁移成本都提供了兼容OpenAI的接口。你只需要改Base URL和API Key就行2.3.1 通义千问阿里云from openai import OpenAI client OpenAI( api_keysk-xxxxxxxxxxxxx, # 阿里云的API Key base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1 ) response client.chat.completions.create( modelqwen-turbo, messages[ {role: user, content: 介绍一下通义千问} ] )2.3.2 智谱GLMfrom openai import OpenAI client OpenAI( api_keyxxxxxxxxxxxxx.xxxxxxxxxxxxx, # GLM的API Key格式 base_urlhttps://open.bigmodel.cn/api/paas/v4 ) response client.chat.completions.create( modelglm-4, messages[ {role: user, content: 介绍一下智谱GLM} ] )2.3.3 DeepSeekfrom openai import OpenAI client OpenAI( api_keysk-xxxxxxxxxxxxx, base_urlhttps://api.deepseek.com/v1 ) response client.chat.completions.create( modeldeepseek-chat, messages[ {role: user, content: 介绍一下DeepSeek} ] )2.3.4 Moonshot月之暗面from openai import OpenAI client OpenAI( api_keysk-xxxxxxxxxxxxx, base_urlhttps://api.moonshot.cn/v1 ) response client.chat.completions.create( modelmoonshot-v1-8k, messages[ {role: user, content: 介绍一下Kimi} ] )2.4 统一封装一个类搞定所有模型为了更方便地切换不同模型我们可以封装一个统一的类from openai import OpenAI from typing import Optional, Dict, List import os class UniversalLLM: 统一的大模型调用接口 支持OpenAI、Azure、以及兼容OpenAI接口的国内模型 PROVIDERS { openai: { base_url: https://api.openai.com/v1, default_model: gpt-4-turbo }, qwen: { base_url: https://dashscope.aliyuncs.com/compatible-mode/v1, default_model: qwen-turbo }, glm: { base_url: https://open.bigmodel.cn/api/paas/v4, default_model: glm-4 }, deepseek: { base_url: https://api.deepseek.com/v1, default_model: deepseek-chat }, moonshot: { base_url: https://api.moonshot.cn/v1, default_model: moonshot-v1-8k } } def __init__( self, provider: str openai, api_key: Optional[str] None, base_url: Optional[str] None, model: Optional[str] None ): 初始化LLM客户端 Args: provider: 服务商名称openai/qwen/glm/deepseek/moonshot api_key: API密钥如果不提供会从环境变量读取 base_url: 自定义Base URL如果不提供使用默认配置 model: 模型名称如果不提供使用默认模型 if provider not in self.PROVIDERS: raise ValueError(f不支持的provider: {provider}) self.provider provider self.config self.PROVIDERS[provider] self.api_key api_key or os.getenv(f{provider.upper()}_API_KEY) if not self.api_key: raise ValueError(f请提供{provider}的API Key) self.base_url base_url or self.config[base_url] self.model model or self.config[default_model] self.client OpenAI( api_keyself.api_key, base_urlself.base_url ) def chat( self, message: str, system_prompt: Optional[str] None, history: Optional[List[Dict]] None, stream: bool False, **kwargs ) - str: 发起对话 Args: message: 用户消息 system_prompt: 系统提示词 history: 历史对话记录 stream: 是否流式输出 **kwargs: 其他参数temperature、max_tokens等 Returns: 模型的回复内容 messages [] if system_prompt: messages.append({role: system, content: system_prompt}) if history: messages.extend(history) messages.append({role: user, content: message}) if stream: return self._stream_chat(messages, **kwargs) else: return self._sync_chat(messages, **kwargs) def _sync_chat(self, messages: List[Dict], **kwargs) - str: 同步对话 response self.client.chat.completions.create( modelself.model, messagesmessages, **kwargs ) return response.choices[0].message.content def _stream_chat(self, messages: List[Dict], **kwargs): 流式对话 stream self.client.chat.completions.create( modelself.model, messagesmessages, streamTrue, **kwargs ) full_content for chunk in stream: if chunk.choices[0].delta.content: content chunk.choices[0].delta.content full_content content print(content, end, flushTrue) print() return full_content llm UniversalLLM(providerqwen, api_keyyour-api-key) response llm.chat(你好请介绍一下你自己, streamTrue)第三部分不同模态大模型的连接——文本、图像、语音3.1 文本模型最基础也最重要文本模型是最常用的我们已经在前面的例子中展示了基本用法。这里补充一些高级技巧。3.1.1 多轮对话管理class ChatSession: 多轮对话管理器 def __init__(self, llm: UniversalLLM, system_prompt: str ): self.llm llm self.system_prompt system_prompt self.history [] def send(self, message: str) - str: 发送消息并保持历史记录 response self.llm.chat( messagemessage, system_promptself.system_prompt, historyself.history ) self.history.append({role: user, content: message}) self.history.append({role: assistant, content: response}) return response def clear(self): 清空历史记录 self.history [] session ChatSession(llm, system_prompt你是一个友好的AI助手) print(session.send(你好)) print(session.send(我刚才说了什么))3.1.2 Function Calling函数调用这是让AI能够执行具体操作的能力非常强大import json tools [ { type: function, function: { name: get_weather, description: 获取指定城市的天气信息, parameters: { type: object, properties: { city: { type: string, description: 城市名称如北京 } }, required: [city] } } } ] def get_weather(city: str) - dict: 模拟天气查询函数 weather_data { 北京: {temperature: 25°C, weather: 晴}, 上海: {temperature: 28°C, weather: 多云}, 广州: {temperature: 32°C, weather: 雷阵雨} } return weather_data.get(city, {error: 未找到该城市}) response llm.client.chat.completions.create( modelllm.model, messages[ {role: user, content: 北京今天天气怎么样} ], toolstools, tool_choiceauto ) message response.choices[0].message if message.tool_calls: tool_call message.tool_calls[0] function_name tool_call.function.name function_args json.loads(tool_call.function.arguments) if function_name get_weather: result get_weather(function_args[city]) print(f天气查询结果{result})3.2 图像模型让AI学会画画图像模型主要有两类图像生成根据文本描述生成图像如DALL-E、Stable Diffusion图像理解理解图像内容并回答问题如GPT-4V、Gemini Vision3.2.1 图像生成DALL-Edef generate_image( prompt: str, model: str dall-e-3, size: str 1024x1024, quality: str standard ): 使用DALL-E生成图像 Args: prompt: 图像描述 model: 模型名称dall-e-2 或 dall-e-3 size: 图像尺寸 quality: 图像质量standard 或 hd client OpenAI(api_keyos.getenv(OPENAI_API_KEY)) response client.images.generate( modelmodel, promptprompt, sizesize, qualityquality, n1 ) image_url response.data[0].url print(f生成的图像地址{image_url}) return image_url image_url generate_image( prompt一只穿着宇航服的猫咪在月球上漫步背景是地球, qualityhd )3.2.2 图像理解GPT-4Vimport base64 def analyze_image( image_path: str, question: str, model: str gpt-4-vision-preview ): 使用GPT-4V分析图像 Args: image_path: 图像文件路径 question: 要问的问题 model: 模型名称 with open(image_path, rb) as f: image_data base64.b64encode(f.read()).decode(utf-8) client OpenAI(api_keyos.getenv(OPENAI_API_KEY)) response client.chat.completions.create( modelmodel, messages[ { role: user, content: [ { type: text, text: question }, { type: image_url, image_url: { url: fdata:image/jpeg;base64,{image_data} } } ] } ], max_tokens1000 ) return response.choices[0].message.content result analyze_image( image_pathphoto.jpg, question这张图片里有什么请详细描述。 ) print(result)3.2.3 使用图像URL进行分析def analyze_image_url(image_url: str, question: str): 使用图像URL进行分析 client OpenAI(api_keyos.getenv(OPENAI_API_KEY)) response client.chat.completions.create( modelgpt-4-vision-preview, messages[ { role: user, content: [ {type: text, text: question}, { type: image_url, image_url: {url: image_url} } ] } ] ) return response.choices[0].message.content result analyze_image_url( image_urlhttps://example.com/image.jpg, question描述这张图片的内容 )3.3 语音模型让AI听和说语音模型包括语音转文字STT如Whisper文字转语音TTS如OpenAI TTS3.3.1 语音转文字Whisperdef transcribe_audio( audio_path: str, model: str whisper-1, language: str zh ): 使用Whisper转录音频 Args: audio_path: 音频文件路径 model: 模型名称 language: 音频语言zh表示中文 client OpenAI(api_keyos.getenv(OPENAI_API_KEY)) with open(audio_path, rb) as audio_file: transcript client.audio.transcriptions.create( modelmodel, fileaudio_file, languagelanguage ) return transcript.text text transcribe_audio(recording.mp3) print(f转录结果{text})3.3.2 文字转语音TTSdef text_to_speech( text: str, output_path: str output.mp3, model: str tts-1, voice: str alloy ): 将文字转换为语音 Args: text: 要转换的文字 output_path: 输出文件路径 model: 模型名称tts-1 或 tts-1-hd voice: 声音类型alloy/echo/fable/onyx/nova/shimmer client OpenAI(api_keyos.getenv(OPENAI_API_KEY)) response client.audio.speech.create( modelmodel, voicevoice, inputtext ) with open(output_path, wb) as f: f.write(response.content) print(f语音已保存到{output_path}) text_to_speech( text你好这是一个文字转语音的示例。, voicenova )3.4 多模态模型文本图像的融合最新的模型如GPT-4o、Gemini等支持多模态输入可以同时处理文本和图像。def multimodal_chat( text: str, image_paths: list None, image_urls: list None, model: str gpt-4o ): 多模态对话 Args: text: 文本内容 image_paths: 本地图像路径列表 image_urls: 图像URL列表 model: 模型名称 client OpenAI(api_keyos.getenv(OPENAI_API_KEY)) content [{type: text, text: text}] if image_paths: for path in image_paths: with open(path, rb) as f: image_data base64.b64encode(f.read()).decode(utf-8) content.append({ type: image_url, image_url: { url: fdata:image/jpeg;base64,{image_data} } }) if image_urls: for url in image_urls: content.append({ type: image_url, image_url: {url: url} }) response client.chat.completions.create( modelmodel, messages[{role: user, content: content}] ) return response.choices[0].message.content result multimodal_chat( text比较这两张图片的不同之处, image_paths[image1.jpg, image2.jpg] ) print(result)第四部分高级技巧与最佳实践4.1 错误处理和重试机制调用API时网络问题、限流等都可能导致失败需要做好错误处理。import time from openai import APIError, RateLimitError, APIConnectionError def robust_chat( client: OpenAI, model: str, messages: list, max_retries: int 3, retry_delay: float 1.0 ): 带重试机制的对话函数 for attempt in range(max_retries): try: response client.chat.completions.create( modelmodel, messagesmessages ) return response.choices[0].message.content except RateLimitError: print(f触发限流等待{retry_delay}秒后重试...) time.sleep(retry_delay) retry_delay * 2 except APIConnectionError: print(f网络连接失败尝试第{attempt 1}次重试...) time.sleep(retry_delay) except APIError as e: print(fAPI错误{e}) if attempt max_retries - 1: raise raise Exception(超过最大重试次数)4.2 成本控制Token消耗直接关系到成本需要合理控制。def estimate_tokens(text: str) - int: 粗略估算token数量 chinese_chars sum(1 for char in text if \u4e00 char \u9fff) english_words len(text.split()) return chinese_chars * 2 english_words def cost_aware_chat( client: OpenAI, model: str, messages: list, max_cost_usd: float 0.1 ): 带成本控制的对话函数 total_tokens sum(estimate_tokens(msg[content]) for msg in messages) price_per_1k_tokens { gpt-4-turbo: 0.01, gpt-3.5-turbo: 0.0005, gpt-4o: 0.005 } estimated_cost (total_tokens / 1000) * price_per_1k_tokens.get(model, 0.01) if estimated_cost max_cost_usd: raise ValueError(f预估成本${estimated_cost:.4f}超过限制${max_cost_usd}) print(f预估成本${estimated_cost:.4f}) response client.chat.completions.create( modelmodel, messagesmessages ) actual_tokens response.usage.total_tokens actual_cost (actual_tokens / 1000) * price_per_1k_tokens.get(model, 0.01) print(f实际成本${actual_cost:.4f}) return response.choices[0].message.content4.3 异步调用对于批量请求异步调用可以大幅提升效率。import asyncio from openai import AsyncOpenAI async def async_chat(client: AsyncOpenAI, model: str, messages: list): 异步对话 response await client.chat.completions.create( modelmodel, messagesmessages ) return response.choices[0].message.content async def batch_chat(prompts: list, model: str gpt-3.5-turbo): 批量异步对话 client AsyncOpenAI(api_keyos.getenv(OPENAI_API_KEY)) tasks [ async_chat( client, model, [{role: user, content: prompt}] ) for prompt in prompts ] results await asyncio.gather(*tasks) return results async def main(): prompts [ 什么是人工智能, 什么是机器学习, 什么是深度学习 ] results await batch_chat(prompts) for prompt, result in zip(prompts, results): print(f问题{prompt}) print(f回答{result}\n) asyncio.run(main())4.4 使用LangChain简化开发LangChain是一个流行的框架可以简化LLM应用开发。from langchain_openai import ChatOpenAI from langchain.schema import HumanMessage, SystemMessage def langchain_example(): 使用LangChain调用模型 llm ChatOpenAI( modelgpt-4-turbo, temperature0.7 ) messages [ SystemMessage(content你是一个专业的Python编程导师), HumanMessage(content如何学习Python) ] response llm.invoke(messages) print(response.content) langchain_example()第五部分常见问题与解决方案Q1: 如何选择合适的模型A:根据任务需求选择简单任务GPT-3.5-Turbo快速、便宜复杂推理GPT-4-Turbo能力强多模态任务GPT-4o、GPT-4V长文本处理Claude 3200K上下文中文场景通义千问、智谱GLMQ2: 如何处理超长文本A:几种方案分段处理将长文本分成多个部分摘要压缩先用模型生成摘要再处理向量检索使用RAG技术只检索相关部分def chunk_text(text: str, chunk_size: int 4000): 将长文本分段 chunks [] for i in range(0, len(text), chunk_size): chunks.append(text[i:i chunk_size]) return chunks def process_long_text(client: OpenAI, text: str, task: str): 处理长文本 chunks chunk_text(text) results [] for chunk in chunks: response client.chat.completions.create( modelgpt-3.5-turbo, messages[ {role: user, content: f{task}\n\n文本{chunk}} ] ) results.append(response.choices[0].message.content) return \n\n.join(results)Q3: 如何提高响应速度A:几个技巧使用流式输出用户能更快看到反馈选择更快的模型GPT-3.5比GPT-4快减少输出长度设置max_tokens使用缓存相同问题不重复请求import hashlib class ResponseCache: 简单的响应缓存 def __init__(self): self.cache {} def _get_key(self, messages: list) - str: content .join([msg[content] for msg in messages]) return hashlib.md5(content.encode()).hexdigest() def get(self, messages: list): key self._get_key(messages) return self.cache.get(key) def set(self, messages: list, response: str): key self._get_key(messages) self.cache[key] response cache ResponseCache() def cached_chat(client: OpenAI, model: str, messages: list): 带缓存的对话 cached cache.get(messages) if cached: print(使用缓存结果) return cached response client.chat.completions.create( modelmodel, messagesmessages ) result response.choices[0].message.content cache.set(messages, result) return resultQ4: 如何保护API Key安全A:最佳实践使用环境变量不要硬编码使用密钥管理服务如AWS Secrets Manager定期轮换定期更换API Key最小权限只给必要的权限import os from dotenv import load_dotenv load_dotenv() api_key os.getenv(OPENAI_API_KEY) if not api_key: raise ValueError(请在.env文件中设置OPENAI_API_KEY)第六部分总结与展望核心要点回顾统一接口是关键OpenAI的API设计已成为行业标准掌握它就能连接大多数模型理解底层概念API Key、Base URL、Token等概念是基础中的基础多模态是趋势文本、图像、语音的融合将越来越重要成本和性能要平衡根据实际需求选择合适的模型未来发展方向更强的多模态能力视频理解、3D生成等更长的上下文无限上下文窗口更低的成本模型优化带来价格下降更快的速度实时交互成为可能学习建议动手实践光看不练假把式多写代码关注官方文档API更新很快要保持学习加入社区和其他开发者交流经验关注前沿AI领域发展迅速要保持敏感附录完整代码示例完整的多模态AI助手import os import base64 from openai import OpenAI from typing import Optional, List, Dict import json class AIAssistant: 多模态AI助手 支持文本对话、图像理解、语音处理 def __init__( self, provider: str openai, api_key: Optional[str] None, model: str gpt-4o ): providers { openai: https://api.openai.com/v1, qwen: https://dashscope.aliyuncs.com/compatible-mode/v1, glm: https://open.bigmodel.cn/api/paas/v4, deepseek: https://api.deepseek.com/v1 } self.api_key api_key or os.getenv(f{provider.upper()}_API_KEY) self.base_url providers.get(provider) self.model model self.client OpenAI( api_keyself.api_key, base_urlself.base_url ) self.conversation_history [] def chat( self, message: str, system_prompt: Optional[str] None, stream: bool False ) - str: 文本对话 if system_prompt and not self.conversation_history: self.conversation_history.append({ role: system, content: system_prompt }) self.conversation_history.append({ role: user, content: message }) if stream: return self._stream_response() else: response self.client.chat.completions.create( modelself.model, messagesself.conversation_history ) assistant_message response.choices[0].message.content self.conversation_history.append({ role: assistant, content: assistant_message }) return assistant_message def _stream_response(self): 流式响应 stream self.client.chat.completions.create( modelself.model, messagesself.conversation_history, streamTrue ) full_response for chunk in stream: if chunk.choices[0].delta.content: content chunk.choices[0].delta.content full_response content print(content, end, flushTrue) print() self.conversation_history.append({ role: assistant, content: full_response }) return full_response def analyze_image( self, image_path: Optional[str] None, image_url: Optional[str] None, question: str 描述这张图片 ) - str: 图像理解 content [{type: text, text: question}] if image_path: with open(image_path, rb) as f: image_data base64.b64encode(f.read()).decode(utf-8) content.append({ type: image_url, image_url: { url: fdata:image/jpeg;base64,{image_data} } }) elif image_url: content.append({ type: image_url, image_url: {url: image_url} }) response self.client.chat.completions.create( modelself.model, messages[{role: user, content: content}] ) return response.choices[0].message.content def generate_image( self, prompt: str, size: str 1024x1024 ) - str: 图像生成 response self.client.images.generate( modeldall-e-3, promptprompt, sizesize, n1 ) return response.data[0].url def transcribe_audio( self, audio_path: str, language: str zh ) - str: 语音转文字 with open(audio_path, rb) as audio_file: transcript self.client.audio.transcriptions.create( modelwhisper-1, fileaudio_file, languagelanguage ) return transcript.text def text_to_speech( self, text: str, output_path: str output.mp3, voice: str alloy ): 文字转语音 response self.client.audio.speech.create( modeltts-1, voicevoice, inputtext ) with open(output_path, wb) as f: f.write(response.content) return output_path def clear_history(self): 清空对话历史 self.conversation_history [] def export_history(self) - str: 导出对话历史 return json.dumps(self.conversation_history, ensure_asciiFalse, indent2) if __name__ __main__: assistant AIAssistant(provideropenai, modelgpt-4o) print( 文本对话测试 ) response assistant.chat( 你好请介绍一下你自己, system_prompt你是一个友好的AI助手, streamTrue ) print(\n 图像理解测试 ) image_url https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg description assistant.analyze_image( image_urlimage_url, question详细描述这张图片的景色 ) print(f图片描述{description}) print(\n 对话历史 ) print(assistant.export_history())结语恭喜你读完了这篇教程现在你应该已经掌握了✅ OpenAI API的核心概念 ✅ 如何连接不同的AI服务商 ✅ 如何处理文本、图像、语音等多种模态 ✅ 实际开发中的最佳实践记住学习AI开发最重要的是动手实践。不要只是看要自己写代码、调试、解决问题。只有这样你才能真正掌握这些技能。如果你在学习过程中遇到问题可以查阅官方文档在GitHub上找开源项目学习加入开发者社区交流祝你学习愉快参考资源OpenAI官方文档通义千问API文档智谱GLM API文档DeepSeek API文档LangChain文档
AI开发~OpenAI连接各大公共模型:从入门到精通
写在前面你有没有想过为什么OpenAI的SDK能连接那么多不同的AI模型是不是觉得每个模型都要学一套新的API很麻烦别担心这篇教程就是为你准备的我们会用最通俗的语言把那些看起来高大上的概念掰开揉碎了讲给你听。同时我们也会深入到底层原理让你真正理解为什么是这样。第一部分核心概念——这些是你必须知道的1.1 API Key你的通行证大白话解释想象API Key就像是一张门禁卡。每个AI服务商都有自己的大门你想进去用他们的AI就得有这张卡。没有卡对不起门都不给你开。深入理解API Key本质上是一个加密字符串用于身份验证和授权。它通常包含两部分前缀标识如sk-表示OpenAIak-表示阿里云等加密密钥一串随机字符确保唯一性和安全性安全提醒# ❌ 错误做法直接写在代码里 api_key sk-xxxxxxxxxxxxx # ✅ 正确做法从环境变量读取 import os api_key os.getenv(OPENAI_API_KEY)1.2 Base URL模型的门牌号大白话解释Base URL就是AI服务商的地址。就像你要去不同的商店每个商店都有自己的地址。OpenAI有OpenAI的地址阿里云有阿里云的地址。深入理解Base URL是一个HTTP端点endpoint它决定了你的请求会被发送到哪里。标准的OpenAI格式是https://api.openai.com/v1但当你使用其他服务商时这个地址会变Azure OpenAI:https://your-resource.openai.azure.com/openai/deployments/your-deployment通义千问:https://dashscope.aliyuncs.com/compatible-mode/v1智谱GLM:https://open.bigmodel.cn/api/paas/v4DeepSeek:https://api.deepseek.com/v1为什么这很重要因为OpenAI的SDK设计得很聪明它允许你自定义Base URL。这意味着只要你把Base URL改成其他服务商的地址同时那个服务商又兼容OpenAI的接口格式你就可以用同一套代码连接不同的模型1.3 模型名称你要调用的角色大白话解释每个AI服务商都有很多模型就像一家餐厅有很多菜品。你得告诉服务员你要点什么菜这就是模型名称的作用。深入理解模型名称通常包含以下信息模型类型如gpt-4、gpt-3.5-turbo版本信息如gpt-4-0125-preview能力标识如gpt-4-vision-preview表示支持视觉不同服务商的命名规则不同# OpenAI model gpt-4-turbo # 通义千问 model qwen-turbo # 智谱GLM model glm-4 # DeepSeek model deepseek-chat1.4 请求和响应你和AI的对话流程大白话解释你发一个问题AI回一个答案这就是一次请求和响应。但在这个过程中有很多细节需要注意。深入理解请求结构{ model: gpt-4, # 用哪个模型 messages: [ # 对话历史 {role: system, content: 你是一个助手}, {role: user, content: 你好} ], temperature: 0.7, # 创造性程度 max_tokens: 1000, # 最大回复长度 stream: False # 是否流式输出 }响应结构{ id: chatcmpl-xxxxx, object: chat.completion, created: 1234567890, model: gpt-4, choices: [ { index: 0, message: { role: assistant, content: 你好有什么我可以帮助你的吗 }, finish_reason: stop } ], usage: { prompt_tokens: 10, completion_tokens: 15, total_tokens: 25 } }1.5 TokenAI世界的货币大白话解释Token可以理解为AI处理文本的基本单位。一个英文单词大约是1个token一个汉字大约是2个token。你用AI就是按token数量付费的。深入理解Token不仅仅是计费单位它还关系到上下文窗口模型能记住多少内容输入限制你一次能发多少内容输出限制模型一次能回多少内容不同模型的Token限制| 模型 | 输入上限 | 输出上限 | |------|---------|---------| | GPT-3.5-Turbo | 16K tokens | 4K tokens | | GPT-4-Turbo | 128K tokens | 4K tokens | | GPT-4o | 128K tokens | 16K tokens | | Claude 3 Opus | 200K tokens | 4K tokens | | 通义千问-Max | 32K tokens | 8K tokens |1.6 流式输出像打字机一样逐字显示大白话解释普通输出是等AI全部想好了再一次性给你流式输出是AI想一个字给你一个字就像打字机一样。深入理解流式输出使用Server-Sent Events (SSE)技术通过HTTP长连接实现实时数据推送。它的优势是用户体验更好不用等待立即看到反馈降低超时风险长时间生成不会因为超时而失败便于监控可以实时看到生成进度第二部分使用方式的差异——不同服务商怎么连2.1 OpenAI官方标准范例OpenAI是行业的标杆它的API设计被广泛采用。基本连接from openai import OpenAI client OpenAI( api_keysk-xxxxxxxxxxxxx ) response client.chat.completions.create( modelgpt-4-turbo, messages[ {role: user, content: 介绍一下你自己} ] ) print(response.choices[0].message.content)流式输出stream client.chat.completions.create( modelgpt-4-turbo, messages[ {role: user, content: 写一首诗} ], streamTrue ) for chunk in stream: if chunk.choices[0].delta.content: print(chunk.choices[0].delta.content, end, flushTrue)2.2 Azure OpenAI企业级方案微软Azure提供的OpenAI服务更适合企业使用但配置稍有不同。关键差异需要指定部署名称deployment name认证方式支持API Key和Azure ADBase URL格式不同连接方式from openai import AzureOpenAI client AzureOpenAI( azure_endpointhttps://your-resource.openai.azure.com, api_keyyour-azure-key, api_version2024-02-15-preview ) response client.chat.completions.create( modelgpt-4-deployment, # 这是你的部署名称 messages[ {role: user, content: 你好} ] )2.3 国内大模型兼容OpenAI接口很多国内厂商为了降低迁移成本都提供了兼容OpenAI的接口。你只需要改Base URL和API Key就行2.3.1 通义千问阿里云from openai import OpenAI client OpenAI( api_keysk-xxxxxxxxxxxxx, # 阿里云的API Key base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1 ) response client.chat.completions.create( modelqwen-turbo, messages[ {role: user, content: 介绍一下通义千问} ] )2.3.2 智谱GLMfrom openai import OpenAI client OpenAI( api_keyxxxxxxxxxxxxx.xxxxxxxxxxxxx, # GLM的API Key格式 base_urlhttps://open.bigmodel.cn/api/paas/v4 ) response client.chat.completions.create( modelglm-4, messages[ {role: user, content: 介绍一下智谱GLM} ] )2.3.3 DeepSeekfrom openai import OpenAI client OpenAI( api_keysk-xxxxxxxxxxxxx, base_urlhttps://api.deepseek.com/v1 ) response client.chat.completions.create( modeldeepseek-chat, messages[ {role: user, content: 介绍一下DeepSeek} ] )2.3.4 Moonshot月之暗面from openai import OpenAI client OpenAI( api_keysk-xxxxxxxxxxxxx, base_urlhttps://api.moonshot.cn/v1 ) response client.chat.completions.create( modelmoonshot-v1-8k, messages[ {role: user, content: 介绍一下Kimi} ] )2.4 统一封装一个类搞定所有模型为了更方便地切换不同模型我们可以封装一个统一的类from openai import OpenAI from typing import Optional, Dict, List import os class UniversalLLM: 统一的大模型调用接口 支持OpenAI、Azure、以及兼容OpenAI接口的国内模型 PROVIDERS { openai: { base_url: https://api.openai.com/v1, default_model: gpt-4-turbo }, qwen: { base_url: https://dashscope.aliyuncs.com/compatible-mode/v1, default_model: qwen-turbo }, glm: { base_url: https://open.bigmodel.cn/api/paas/v4, default_model: glm-4 }, deepseek: { base_url: https://api.deepseek.com/v1, default_model: deepseek-chat }, moonshot: { base_url: https://api.moonshot.cn/v1, default_model: moonshot-v1-8k } } def __init__( self, provider: str openai, api_key: Optional[str] None, base_url: Optional[str] None, model: Optional[str] None ): 初始化LLM客户端 Args: provider: 服务商名称openai/qwen/glm/deepseek/moonshot api_key: API密钥如果不提供会从环境变量读取 base_url: 自定义Base URL如果不提供使用默认配置 model: 模型名称如果不提供使用默认模型 if provider not in self.PROVIDERS: raise ValueError(f不支持的provider: {provider}) self.provider provider self.config self.PROVIDERS[provider] self.api_key api_key or os.getenv(f{provider.upper()}_API_KEY) if not self.api_key: raise ValueError(f请提供{provider}的API Key) self.base_url base_url or self.config[base_url] self.model model or self.config[default_model] self.client OpenAI( api_keyself.api_key, base_urlself.base_url ) def chat( self, message: str, system_prompt: Optional[str] None, history: Optional[List[Dict]] None, stream: bool False, **kwargs ) - str: 发起对话 Args: message: 用户消息 system_prompt: 系统提示词 history: 历史对话记录 stream: 是否流式输出 **kwargs: 其他参数temperature、max_tokens等 Returns: 模型的回复内容 messages [] if system_prompt: messages.append({role: system, content: system_prompt}) if history: messages.extend(history) messages.append({role: user, content: message}) if stream: return self._stream_chat(messages, **kwargs) else: return self._sync_chat(messages, **kwargs) def _sync_chat(self, messages: List[Dict], **kwargs) - str: 同步对话 response self.client.chat.completions.create( modelself.model, messagesmessages, **kwargs ) return response.choices[0].message.content def _stream_chat(self, messages: List[Dict], **kwargs): 流式对话 stream self.client.chat.completions.create( modelself.model, messagesmessages, streamTrue, **kwargs ) full_content for chunk in stream: if chunk.choices[0].delta.content: content chunk.choices[0].delta.content full_content content print(content, end, flushTrue) print() return full_content llm UniversalLLM(providerqwen, api_keyyour-api-key) response llm.chat(你好请介绍一下你自己, streamTrue)第三部分不同模态大模型的连接——文本、图像、语音3.1 文本模型最基础也最重要文本模型是最常用的我们已经在前面的例子中展示了基本用法。这里补充一些高级技巧。3.1.1 多轮对话管理class ChatSession: 多轮对话管理器 def __init__(self, llm: UniversalLLM, system_prompt: str ): self.llm llm self.system_prompt system_prompt self.history [] def send(self, message: str) - str: 发送消息并保持历史记录 response self.llm.chat( messagemessage, system_promptself.system_prompt, historyself.history ) self.history.append({role: user, content: message}) self.history.append({role: assistant, content: response}) return response def clear(self): 清空历史记录 self.history [] session ChatSession(llm, system_prompt你是一个友好的AI助手) print(session.send(你好)) print(session.send(我刚才说了什么))3.1.2 Function Calling函数调用这是让AI能够执行具体操作的能力非常强大import json tools [ { type: function, function: { name: get_weather, description: 获取指定城市的天气信息, parameters: { type: object, properties: { city: { type: string, description: 城市名称如北京 } }, required: [city] } } } ] def get_weather(city: str) - dict: 模拟天气查询函数 weather_data { 北京: {temperature: 25°C, weather: 晴}, 上海: {temperature: 28°C, weather: 多云}, 广州: {temperature: 32°C, weather: 雷阵雨} } return weather_data.get(city, {error: 未找到该城市}) response llm.client.chat.completions.create( modelllm.model, messages[ {role: user, content: 北京今天天气怎么样} ], toolstools, tool_choiceauto ) message response.choices[0].message if message.tool_calls: tool_call message.tool_calls[0] function_name tool_call.function.name function_args json.loads(tool_call.function.arguments) if function_name get_weather: result get_weather(function_args[city]) print(f天气查询结果{result})3.2 图像模型让AI学会画画图像模型主要有两类图像生成根据文本描述生成图像如DALL-E、Stable Diffusion图像理解理解图像内容并回答问题如GPT-4V、Gemini Vision3.2.1 图像生成DALL-Edef generate_image( prompt: str, model: str dall-e-3, size: str 1024x1024, quality: str standard ): 使用DALL-E生成图像 Args: prompt: 图像描述 model: 模型名称dall-e-2 或 dall-e-3 size: 图像尺寸 quality: 图像质量standard 或 hd client OpenAI(api_keyos.getenv(OPENAI_API_KEY)) response client.images.generate( modelmodel, promptprompt, sizesize, qualityquality, n1 ) image_url response.data[0].url print(f生成的图像地址{image_url}) return image_url image_url generate_image( prompt一只穿着宇航服的猫咪在月球上漫步背景是地球, qualityhd )3.2.2 图像理解GPT-4Vimport base64 def analyze_image( image_path: str, question: str, model: str gpt-4-vision-preview ): 使用GPT-4V分析图像 Args: image_path: 图像文件路径 question: 要问的问题 model: 模型名称 with open(image_path, rb) as f: image_data base64.b64encode(f.read()).decode(utf-8) client OpenAI(api_keyos.getenv(OPENAI_API_KEY)) response client.chat.completions.create( modelmodel, messages[ { role: user, content: [ { type: text, text: question }, { type: image_url, image_url: { url: fdata:image/jpeg;base64,{image_data} } } ] } ], max_tokens1000 ) return response.choices[0].message.content result analyze_image( image_pathphoto.jpg, question这张图片里有什么请详细描述。 ) print(result)3.2.3 使用图像URL进行分析def analyze_image_url(image_url: str, question: str): 使用图像URL进行分析 client OpenAI(api_keyos.getenv(OPENAI_API_KEY)) response client.chat.completions.create( modelgpt-4-vision-preview, messages[ { role: user, content: [ {type: text, text: question}, { type: image_url, image_url: {url: image_url} } ] } ] ) return response.choices[0].message.content result analyze_image_url( image_urlhttps://example.com/image.jpg, question描述这张图片的内容 )3.3 语音模型让AI听和说语音模型包括语音转文字STT如Whisper文字转语音TTS如OpenAI TTS3.3.1 语音转文字Whisperdef transcribe_audio( audio_path: str, model: str whisper-1, language: str zh ): 使用Whisper转录音频 Args: audio_path: 音频文件路径 model: 模型名称 language: 音频语言zh表示中文 client OpenAI(api_keyos.getenv(OPENAI_API_KEY)) with open(audio_path, rb) as audio_file: transcript client.audio.transcriptions.create( modelmodel, fileaudio_file, languagelanguage ) return transcript.text text transcribe_audio(recording.mp3) print(f转录结果{text})3.3.2 文字转语音TTSdef text_to_speech( text: str, output_path: str output.mp3, model: str tts-1, voice: str alloy ): 将文字转换为语音 Args: text: 要转换的文字 output_path: 输出文件路径 model: 模型名称tts-1 或 tts-1-hd voice: 声音类型alloy/echo/fable/onyx/nova/shimmer client OpenAI(api_keyos.getenv(OPENAI_API_KEY)) response client.audio.speech.create( modelmodel, voicevoice, inputtext ) with open(output_path, wb) as f: f.write(response.content) print(f语音已保存到{output_path}) text_to_speech( text你好这是一个文字转语音的示例。, voicenova )3.4 多模态模型文本图像的融合最新的模型如GPT-4o、Gemini等支持多模态输入可以同时处理文本和图像。def multimodal_chat( text: str, image_paths: list None, image_urls: list None, model: str gpt-4o ): 多模态对话 Args: text: 文本内容 image_paths: 本地图像路径列表 image_urls: 图像URL列表 model: 模型名称 client OpenAI(api_keyos.getenv(OPENAI_API_KEY)) content [{type: text, text: text}] if image_paths: for path in image_paths: with open(path, rb) as f: image_data base64.b64encode(f.read()).decode(utf-8) content.append({ type: image_url, image_url: { url: fdata:image/jpeg;base64,{image_data} } }) if image_urls: for url in image_urls: content.append({ type: image_url, image_url: {url: url} }) response client.chat.completions.create( modelmodel, messages[{role: user, content: content}] ) return response.choices[0].message.content result multimodal_chat( text比较这两张图片的不同之处, image_paths[image1.jpg, image2.jpg] ) print(result)第四部分高级技巧与最佳实践4.1 错误处理和重试机制调用API时网络问题、限流等都可能导致失败需要做好错误处理。import time from openai import APIError, RateLimitError, APIConnectionError def robust_chat( client: OpenAI, model: str, messages: list, max_retries: int 3, retry_delay: float 1.0 ): 带重试机制的对话函数 for attempt in range(max_retries): try: response client.chat.completions.create( modelmodel, messagesmessages ) return response.choices[0].message.content except RateLimitError: print(f触发限流等待{retry_delay}秒后重试...) time.sleep(retry_delay) retry_delay * 2 except APIConnectionError: print(f网络连接失败尝试第{attempt 1}次重试...) time.sleep(retry_delay) except APIError as e: print(fAPI错误{e}) if attempt max_retries - 1: raise raise Exception(超过最大重试次数)4.2 成本控制Token消耗直接关系到成本需要合理控制。def estimate_tokens(text: str) - int: 粗略估算token数量 chinese_chars sum(1 for char in text if \u4e00 char \u9fff) english_words len(text.split()) return chinese_chars * 2 english_words def cost_aware_chat( client: OpenAI, model: str, messages: list, max_cost_usd: float 0.1 ): 带成本控制的对话函数 total_tokens sum(estimate_tokens(msg[content]) for msg in messages) price_per_1k_tokens { gpt-4-turbo: 0.01, gpt-3.5-turbo: 0.0005, gpt-4o: 0.005 } estimated_cost (total_tokens / 1000) * price_per_1k_tokens.get(model, 0.01) if estimated_cost max_cost_usd: raise ValueError(f预估成本${estimated_cost:.4f}超过限制${max_cost_usd}) print(f预估成本${estimated_cost:.4f}) response client.chat.completions.create( modelmodel, messagesmessages ) actual_tokens response.usage.total_tokens actual_cost (actual_tokens / 1000) * price_per_1k_tokens.get(model, 0.01) print(f实际成本${actual_cost:.4f}) return response.choices[0].message.content4.3 异步调用对于批量请求异步调用可以大幅提升效率。import asyncio from openai import AsyncOpenAI async def async_chat(client: AsyncOpenAI, model: str, messages: list): 异步对话 response await client.chat.completions.create( modelmodel, messagesmessages ) return response.choices[0].message.content async def batch_chat(prompts: list, model: str gpt-3.5-turbo): 批量异步对话 client AsyncOpenAI(api_keyos.getenv(OPENAI_API_KEY)) tasks [ async_chat( client, model, [{role: user, content: prompt}] ) for prompt in prompts ] results await asyncio.gather(*tasks) return results async def main(): prompts [ 什么是人工智能, 什么是机器学习, 什么是深度学习 ] results await batch_chat(prompts) for prompt, result in zip(prompts, results): print(f问题{prompt}) print(f回答{result}\n) asyncio.run(main())4.4 使用LangChain简化开发LangChain是一个流行的框架可以简化LLM应用开发。from langchain_openai import ChatOpenAI from langchain.schema import HumanMessage, SystemMessage def langchain_example(): 使用LangChain调用模型 llm ChatOpenAI( modelgpt-4-turbo, temperature0.7 ) messages [ SystemMessage(content你是一个专业的Python编程导师), HumanMessage(content如何学习Python) ] response llm.invoke(messages) print(response.content) langchain_example()第五部分常见问题与解决方案Q1: 如何选择合适的模型A:根据任务需求选择简单任务GPT-3.5-Turbo快速、便宜复杂推理GPT-4-Turbo能力强多模态任务GPT-4o、GPT-4V长文本处理Claude 3200K上下文中文场景通义千问、智谱GLMQ2: 如何处理超长文本A:几种方案分段处理将长文本分成多个部分摘要压缩先用模型生成摘要再处理向量检索使用RAG技术只检索相关部分def chunk_text(text: str, chunk_size: int 4000): 将长文本分段 chunks [] for i in range(0, len(text), chunk_size): chunks.append(text[i:i chunk_size]) return chunks def process_long_text(client: OpenAI, text: str, task: str): 处理长文本 chunks chunk_text(text) results [] for chunk in chunks: response client.chat.completions.create( modelgpt-3.5-turbo, messages[ {role: user, content: f{task}\n\n文本{chunk}} ] ) results.append(response.choices[0].message.content) return \n\n.join(results)Q3: 如何提高响应速度A:几个技巧使用流式输出用户能更快看到反馈选择更快的模型GPT-3.5比GPT-4快减少输出长度设置max_tokens使用缓存相同问题不重复请求import hashlib class ResponseCache: 简单的响应缓存 def __init__(self): self.cache {} def _get_key(self, messages: list) - str: content .join([msg[content] for msg in messages]) return hashlib.md5(content.encode()).hexdigest() def get(self, messages: list): key self._get_key(messages) return self.cache.get(key) def set(self, messages: list, response: str): key self._get_key(messages) self.cache[key] response cache ResponseCache() def cached_chat(client: OpenAI, model: str, messages: list): 带缓存的对话 cached cache.get(messages) if cached: print(使用缓存结果) return cached response client.chat.completions.create( modelmodel, messagesmessages ) result response.choices[0].message.content cache.set(messages, result) return resultQ4: 如何保护API Key安全A:最佳实践使用环境变量不要硬编码使用密钥管理服务如AWS Secrets Manager定期轮换定期更换API Key最小权限只给必要的权限import os from dotenv import load_dotenv load_dotenv() api_key os.getenv(OPENAI_API_KEY) if not api_key: raise ValueError(请在.env文件中设置OPENAI_API_KEY)第六部分总结与展望核心要点回顾统一接口是关键OpenAI的API设计已成为行业标准掌握它就能连接大多数模型理解底层概念API Key、Base URL、Token等概念是基础中的基础多模态是趋势文本、图像、语音的融合将越来越重要成本和性能要平衡根据实际需求选择合适的模型未来发展方向更强的多模态能力视频理解、3D生成等更长的上下文无限上下文窗口更低的成本模型优化带来价格下降更快的速度实时交互成为可能学习建议动手实践光看不练假把式多写代码关注官方文档API更新很快要保持学习加入社区和其他开发者交流经验关注前沿AI领域发展迅速要保持敏感附录完整代码示例完整的多模态AI助手import os import base64 from openai import OpenAI from typing import Optional, List, Dict import json class AIAssistant: 多模态AI助手 支持文本对话、图像理解、语音处理 def __init__( self, provider: str openai, api_key: Optional[str] None, model: str gpt-4o ): providers { openai: https://api.openai.com/v1, qwen: https://dashscope.aliyuncs.com/compatible-mode/v1, glm: https://open.bigmodel.cn/api/paas/v4, deepseek: https://api.deepseek.com/v1 } self.api_key api_key or os.getenv(f{provider.upper()}_API_KEY) self.base_url providers.get(provider) self.model model self.client OpenAI( api_keyself.api_key, base_urlself.base_url ) self.conversation_history [] def chat( self, message: str, system_prompt: Optional[str] None, stream: bool False ) - str: 文本对话 if system_prompt and not self.conversation_history: self.conversation_history.append({ role: system, content: system_prompt }) self.conversation_history.append({ role: user, content: message }) if stream: return self._stream_response() else: response self.client.chat.completions.create( modelself.model, messagesself.conversation_history ) assistant_message response.choices[0].message.content self.conversation_history.append({ role: assistant, content: assistant_message }) return assistant_message def _stream_response(self): 流式响应 stream self.client.chat.completions.create( modelself.model, messagesself.conversation_history, streamTrue ) full_response for chunk in stream: if chunk.choices[0].delta.content: content chunk.choices[0].delta.content full_response content print(content, end, flushTrue) print() self.conversation_history.append({ role: assistant, content: full_response }) return full_response def analyze_image( self, image_path: Optional[str] None, image_url: Optional[str] None, question: str 描述这张图片 ) - str: 图像理解 content [{type: text, text: question}] if image_path: with open(image_path, rb) as f: image_data base64.b64encode(f.read()).decode(utf-8) content.append({ type: image_url, image_url: { url: fdata:image/jpeg;base64,{image_data} } }) elif image_url: content.append({ type: image_url, image_url: {url: image_url} }) response self.client.chat.completions.create( modelself.model, messages[{role: user, content: content}] ) return response.choices[0].message.content def generate_image( self, prompt: str, size: str 1024x1024 ) - str: 图像生成 response self.client.images.generate( modeldall-e-3, promptprompt, sizesize, n1 ) return response.data[0].url def transcribe_audio( self, audio_path: str, language: str zh ) - str: 语音转文字 with open(audio_path, rb) as audio_file: transcript self.client.audio.transcriptions.create( modelwhisper-1, fileaudio_file, languagelanguage ) return transcript.text def text_to_speech( self, text: str, output_path: str output.mp3, voice: str alloy ): 文字转语音 response self.client.audio.speech.create( modeltts-1, voicevoice, inputtext ) with open(output_path, wb) as f: f.write(response.content) return output_path def clear_history(self): 清空对话历史 self.conversation_history [] def export_history(self) - str: 导出对话历史 return json.dumps(self.conversation_history, ensure_asciiFalse, indent2) if __name__ __main__: assistant AIAssistant(provideropenai, modelgpt-4o) print( 文本对话测试 ) response assistant.chat( 你好请介绍一下你自己, system_prompt你是一个友好的AI助手, streamTrue ) print(\n 图像理解测试 ) image_url https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg description assistant.analyze_image( image_urlimage_url, question详细描述这张图片的景色 ) print(f图片描述{description}) print(\n 对话历史 ) print(assistant.export_history())结语恭喜你读完了这篇教程现在你应该已经掌握了✅ OpenAI API的核心概念 ✅ 如何连接不同的AI服务商 ✅ 如何处理文本、图像、语音等多种模态 ✅ 实际开发中的最佳实践记住学习AI开发最重要的是动手实践。不要只是看要自己写代码、调试、解决问题。只有这样你才能真正掌握这些技能。如果你在学习过程中遇到问题可以查阅官方文档在GitHub上找开源项目学习加入开发者社区交流祝你学习愉快参考资源OpenAI官方文档通义千问API文档智谱GLM API文档DeepSeek API文档LangChain文档