generative-ai-for-beginners 第 9 课实战:用 DALL-E 与 gpt-image-1 构建图像生成应用

发布时间:2026/9/7 23:31:57
generative-ai-for-beginners 第 9 课实战:用 DALL-E 与 gpt-image-1 构建图像生成应用 generative-ai-for-beginners 第 9 课实战用 DALL-E 与 gpt-image-1 构建图像生成应用【免费下载链接】generative-ai-for-beginners21 Lessons, Get Started Building with Generative AI项目地址: https://gitcode.com/GitHub_Trending/ge/generative-ai-for-beginners在 generative-ai-for-beginners 课程的第 9 课中我们将目光从纯文本生成扩展到图像生成理解 DALL-E 与 Midjourney 的工作机制用 Python 调用 Azure OpenAI 图像接口完成“提示词到图片”的完整链路并通过 temperature 参数与 metaprompt 机制控制生成结果的一致性与内容安全边界。读完全文你将能够独立搭建一个可运行的图像生成应用掌握client.images.generate、images.edit、create_variation三类接口的参数细节并能把 metaprompt 落地为真实的生产约束代码。课程概览与学习目标本课对应仓库中的 第 9 课文档孟加拉语翻译版英文原文见 09-building-image-applications/README.md内容脉络如下图像生成为什么重要LLM 的能力不止于文本从文本描述生成图像在 MedTech医疗科技、建筑、旅游、游戏开发等领域都有实际价值。两大主流模型DALL-E 与 Midjourney 是什么、如何工作。动手构建用 Python 搭建一个完整的图像生成应用。完成本课学习后你可以做到构建一个图像生成应用使用 metaprompt元提示词为你的应用定义边界与内容约束熟练使用 DALL-E 系列模型与 Midjourney 的提示词工作流。图像生成应用本身也是探索生成式 AI 能力边界的好切入点典型用途包括图像编辑与合成为多种用例生成、修改图像例如局部编辑与图像合成跨行业应用为医疗科技、旅游、游戏开发等行业生成素材图像。场景Edu4All 创业公司课程贯穿一个教学场景——创业公司 Edu4All。学生们需要为自己的评估作业创建图像具体画什么由学生自己决定可以是为自创童话绘制插图、为故事设计新角色或把自己的想法和概念可视化。假设课堂上正在学习“纪念碑”主题Edu4All 的学生可以用类似下面的提示词生成图像Dog next to Eiffel Tower in early morning sunlight清晨阳光下的埃菲尔铁塔旁有一只狗DALL-E 与 Midjourney两大图像生成模型DALL-EDALL-E 是一个可以从文本描述生成图像的生成式 AI 模型。它的架构可以理解为两个模型的组合CLIP从图像和文本中生成嵌入embedding的模型嵌入即数据的数值化表示它让“文字”和“图像”处在同一个语义空间里Diffused attention从嵌入反向生成图像的模型。DALL-E 在“图像 文本”配对数据集上训练因此可以根据文本描述生成图像例如“戴帽子的猫”或“留着莫霍克发型的狗”。MidjourneyMidjourney 的工作方式与 DALL-E 类似接收文本提示词输出图像。同样可以用 a cat in a hat 或 dog with a mohawk 这类提示词生成图像。Midjourney 的强项在于艺术风格化的画面输出与 DALL-E 的 API 化调用方式形成互补——后者更适合嵌入到应用程序中这也是本课动手实验选择它的原因。工作原理自回归 Transformer从 DALL-E 的原始论文arXiv:2102.12092看DALL-E 基于 Transformer 架构构建核心是一个自回归 Transformerautoregressive transformer模型逐像素地生成图像先生成一个像素再利用已生成的像素去生成下一个像素这个过程穿过神经网络的多层结构直到整幅图像完成。正是通过这一机制DALL-E 能够控制生成图像中的属性、物体、特征等细节。课程文档同时指出DALL-E 2 与 DALL-E 3 对生成图像的控制能力更强这也是课程实验选用新一代部署的原因。构建你的第一个图像生成应用1. 准备依赖库构建一个图像生成应用需要以下四个 Python 库python-dotenv把密钥保存在.env文件中与代码隔离强烈建议使用openai用于与 OpenAI API含 Azure OpenAI交互pillow在 Python 中处理图像requests发起 HTTP 请求下载生成的图片。仓库中已经提供了与课程一致的依赖清单见 requirements.txtpython-dotenv openai pillow requests2. 创建并部署 Azure OpenAI 模型如果还没有资源按照 Microsoft Learn 文档的步骤创建一个 Azure OpenAI 资源和模型部署。注意仓库当前文档与示例代码的选型当前一代 Azure OpenAI 图像模型为 gpt-image-1DALL-E 3 已属于遗留模型不再对新部署开放。因此.env中的部署名应指向你实际部署的图像模型AZURE_OPENAI_ENDPOINTyour endpoint AZURE_OPENAI_API_KEYyour key AZURE_OPENAI_DEPLOYMENTgpt-image-1这些信息可以在 Azure OpenAI Foundry Portal 中你所在资源的 Deployments 分区找到。版本说明本课的孟加拉语翻译版translations/bn/09-building-image-applications/README.md快照中仍写着部署 DALL-E 3、API 版本2024-02-01。以仓库当前内容为准示例代码 已统一使用 API 版本2024-10-21下文代码均按当前仓库实际内容给出。3. 初始化环境创建.env文件内容如上一节所示将依赖整理到requirements.txt内容同上创建虚拟环境并安装依赖python3 -m venv venv source venv/bin/activate pip install -r requirements.txtWindows 上创建并激活虚拟环境的命令为python3 -m venv venv venv\Scripts\activate.bat4. 编写 app.py创建app.py写入以下代码与仓库示例 aoai-app.py 的核心流程一致import openai import os import requests from PIL import Image import dotenv from openai import OpenAI, AzureOpenAI # import dotenv dotenv.load_dotenv() # configure Azure OpenAI service client client AzureOpenAI( azure_endpoint os.environ[AZURE_OPENAI_ENDPOINT], api_keyos.environ[AZURE_OPENAI_API_KEY], api_version 2024-10-21 ) try: # Create an image by using the image generation API generation_response client.images.generate( promptBunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils, size1024x1024, n1, modelos.environ[AZURE_OPENAI_DEPLOYMENT] ) # Set the directory for the stored image image_dir os.path.join(os.curdir, images) # If the directory doesnt exist, create it if not os.path.isdir(image_dir): os.mkdir(image_dir) # Initialize the image path (note the filetype should be png) image_path os.path.join(image_dir, generated-image.png) # Retrieve the generated image image_url generation_response.data[0].url # extract image URL from response generated_image requests.get(image_url).content # download the image with open(image_path, wb) as image_file: image_file.write(generated_image) # Display the image in the default image viewer image Image.open(image_path) image.show() # catch exceptions except openai.BadRequestError as err: print(err)下面逐段解释这段代码导入所需库OpenAI 库、dotenv、requests 与 Pillow。import openai import os import requests from PIL import Image import dotenv加载.env中的环境变量# import dotenv dotenv.load_dotenv()配置 Azure OpenAI 服务客户端endpoint 与 key 均取自环境变量API 版本按当前仓库示例为2024-10-21# Get endpoint and key from environment variables client AzureOpenAI( azure_endpoint os.environ[AZURE_OPENAI_ENDPOINT], api_keyos.environ[AZURE_OPENAI_API_KEY], api_version 2024-10-21 )调用图像生成 API。上面的调用会返回一个 JSON 对象其中包含生成图像的 URL可以用该 URL 下载图片并保存到文件# Create an image by using the image generation API generation_response client.images.generate( promptBunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils, size1024x1024, n1, modelos.environ[AZURE_OPENAI_DEPLOYMENT] )最后用系统默认图像查看器展示图片image Image.open(image_path) image.show()5. generate 参数详解聚焦生成调用本身generation_response client.images.generate( promptBunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils, size1024x1024, n1, modelos.environ[AZURE_OPENAI_DEPLOYMENT] )各参数含义参数含义本例取值prompt用于生成图像的文本提示词Bunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils雾蒙蒙的雏菊草地上一匹马上坐着一只叼着棒棒糖的兔子size生成图像的分辨率1024x1024n生成的图像数量1课程实验中也用n2对比两张图的差异temperature控制生成输出随机性的参数取值 010 表示输出确定性最强1 表示最随机默认值为0.7默认此外model指定要调用的模型/部署名。从仓库源码看aoai-app.py 把模型名收敛到环境变量AZURE_OPENAI_DEPLOYMENT中读取model os.environ[AZURE_OPENAI_DEPLOYMENT]这样切换部署时只需改.env而不用动代码它还会把返回对象通过json.loads(result.model_dump_json())转成字典后取data[0].url这是对 SDK 响应对象的一种序列化取值方式与文档中直接访问generation_response.data[0].url等价。另一个值得参考的实现是面向 OpenAI 直连的 oai-app.py。从源码结构看它体现了几条工程化的安全实践启动时校验OPENAI_API_KEY是否存在并显式抛出ValueError下载图片时使用requests.get(image_url, timeout30)并调用response.raise_for_status()处理 HTTP 错误异常捕获从宽泛的BadRequestError细化为OpenAIError。这些细节在写生产代码时值得借鉴。图像生成的进阶能力生成一张图只是起点图像生成 API 还提供了两类进阶操作。局部编辑Edit图像 蒙版 提示词给定一张现有图像、一个蒙版mask标出需要修改的区域和一条文本提示词就可以修改图像的指定部分。课程举的例子是想象我们的兔子图你想给兔子戴上帽子——需要提供图像、标记改动区域的蒙版以及一条说明“要做什么”的文本提示词。注意局部编辑不被 DALL-E 3 支持。课程给出了使用 GPT Image 的示例response client.images.edit( modelgpt-image-1, imageopen(sunlit_lounge.png, rb), maskopen(mask.png, rb), promptA sunlit indoor lounge area with a pool containing a flamingo ) image_url response.data[0].url这里的基础图像只包含“带泳池的阳光休息区”而经过蒙版编辑后的最终图像会在指定区域内多出一只火烈鸟。蒙版中透明/标记的部分就是允许模型重新绘制的内容其余部分保持不变——这正是 edit 接口与从零生成的本质区别。创建变体Variation变体的思路是拿一张现有图像请求生成它的不同版本。提供一张图像可选配提示词即可代码如下response client.images.create_variation( imageopen(bunny-lollipop.png, rb), n1, size1024x1024 ) image_url response.data[0].url注意create_variation目前仅支持 OpenAI 的 DALL-E 2 模型gpt-image-1 不支持。仓库中提供了两套完整的变体示例脚本均遵循“读取上一张生成图 → 调用create_variation→ 下载新图并展示”的流程Azure 版本aoai-app-variation.py它默认读取images/generated-image.png即上一节生成的图作为输入输出保存到images/generated_variation.png并用print(LOG ...)记录创建与下载两个阶段OpenAI 直连版本oai-app-variation.py。Temperature控制输出随机性Temperature 是控制生成式 AI 输出随机性的参数取值 010 表示输出确定性最强1 表示最随机默认值为 0.7。课程的实验方法很直观——同一个提示词跑两次观察输出差异提示词Bunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils第一次运行默认 temperature得到第二次运行同一提示词得到的并不是同一张图可以看到两张图像素级不同但主题一致。此时可以进一步把 temperature 调低例如 0.1来观察变化generation_response client.images.generate( promptBunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils, # Enter your prompt text here size1024x1024, n2 )把 temperature 调到 0从上面默认温度的两张图可以观察到第一张里是兔子第二张里则是马——两次生成的差异相当大。为了让响应更确定把 temperature 设为 0generation_response client.images.generate( promptBunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils, # Enter your prompt text here size1024x1024, n2, temperature0 )运行后得到的两张图像见仓库中的 v1-temp-generated-image.png 与 v2-temp-generated-image.png此时可以清楚地看到两张图像彼此更加相似。这正说明了 temperature 的工程价值——当你需要批量、稳定地产出风格一致的素材时调低 temperature当你需要探索更多样的创意版本时则保持较高值。用 Metaprompt 为你的应用设定边界有了上面的 Demo我们已经能为客户端生成图像了但生产应用必须设定内容边界例如不希望生成“不适合工作场合not safe for work”或“不适合儿童”的图像。这可以通过metaprompt元提示词实现。Metaprompt 是用于控制生成式 AI 模型输出的文本提示词它被置于用户文本提示词之前嵌入到应用程序内部与用户输入一起封装成单条文本提示词从而约束模型的最终输出。例如用它确保生成的图像适合工作场合、适合儿童。一个典型的 metaprompt 示例You are an assistant designer that creates images for children. The image needs to be safe for work and appropriate for children. The image needs to be in color. The image needs to be in landscape orientation. The image needs to be in a 16:9 aspect ratio. Do not consider any input from the following that is not safe for work or appropriate for children. (Input)把它落进代码就是“角色设定 硬性约束 禁用清单 用户输入”的拼接模式disallow_list swords, violence, blood, gore, nudity, sexual content, adult content, adult themes, adult language, adult humor, adult jokes, adult situations, adult meta_prompt fYou are an assistant designer that creates images for children. The image needs to be safe for work and appropriate for children. The image needs to be in color. The image needs to be in landscape orientation. The image needs to be in a 16:9 aspect ratio. Do not consider any input from the following that is not safe for work or appropriate for children. {disallow_list} prompt f{meta_prompt} Create an image of a bunny on a horse, holding a lollipop # TODO add request to generate image从这个结构可以看出无论用户输入什么具体主题最终送进模型的prompt都已经包含了 metaprompt 的全部约束——这是在不改动调用代码的前提下为应用建立内容护栏的通用手法。课后练习与参考解答让 Edu4All 的学生生成图像回到课伊始的 Edu4All 场景让学生们为评估作业生成包含纪念碑的图像具体是哪些纪念碑由学生自定并鼓励他们发挥创造力把这些纪念碑放到不同的情境中。仓库给出的完整参考解答是 aoai-solution.py它与文档中的 Solution 代码一致核心结构如下import openai import os import requests from PIL import Image import dotenv from openai import AzureOpenAI # import dotenv dotenv.load_dotenv() # Get endpoint and key from environment variables client AzureOpenAI( azure_endpoint os.environ[AZURE_OPENAI_ENDPOINT], api_keyos.environ[AZURE_OPENAI_API_KEY], api_version 2024-10-21 ) disallow_list swords, violence, blood, gore, nudity, sexual content, adult content, adult themes, adult language, adult humor, adult jokes, adult situations, adult meta_prompt fYou are an assistant designer that creates images for children. The image needs to be safe for work and appropriate for children. The image needs to be in color. The image needs to be in landscape orientation. The image needs to be in a 16:9 aspect ratio. Do not consider any input from the following that is not safe for work or appropriate for children. {disallow_list} prompt f{meta_prompt} Generate monument of the Arc of Triumph in Paris, France, in the evening light with a small child holding a Teddy looks on. try: # Create an image by using the image generation API generation_response client.images.generate( promptprompt, # Enter your prompt text here size1024x1024, n1, ) # Set the directory for the stored image image_dir os.path.join(os.curdir, images) # If the directory doesnt exist, create it if not os.path.isdir(image_dir): os.mkdir(image_dir) # Initialize the image path (note the filetype should be png) image_path os.path.join(image_dir, generated-image.png) # Retrieve the generated image image_url generation_response.data[0].url # extract image URL from response generated_image requests.get(image_url).content # download the image with open(image_path, wb) as image_file: image_file.write(generated_image) # Display the image in the default image viewer image Image.open(image_path) image.show() # catch exceptions except openai.BadRequestError as err: print(err)从 aoai-solution.py 的源码看它还做了两处额外处理将modelmodel即环境变量中的部署名显式传入images.generate并把输出文件名固定为ch9-sol-generated-image.png避免与练习主流程的generated-image.png相互覆盖。该文件末尾还保留了被注释掉的create_variation代码块作为“在解答基础上再叠加变体生成”的延伸提示。继续学习本课的 TypeScript 版本示例位于 typescript/image-generation-app其 main.ts 展示了同样的“客户端初始化 图像生成 落盘”流程依赖为openai、dotenv等 npm 包见 package.json适合习惯 Node.js 技术栈的读者对照阅读。学完图像生成后可继续第 10 课学习如何用低代码方式构建 AI 应用见 10-building-low-code-ai-applications/README.md。适用前提小结本课代码以 Azure OpenAI 为运行环境需要一个已部署图像模型当前一代为 gpt-image-1的资源、有效的 endpoint 与 API key以及 Python 虚拟环境中的四个依赖库api_version需与你的模型要求匹配当前仓库示例为2024-10-21。images.edit与create_variation的支持范围因模型而异DALL-E 3 不支持 editgpt-image-1 不支持 variationvariation 目前仅限 OpenAI 的 DALL-E 2选型前先确认目标模型的接口能力。【免费下载链接】generative-ai-for-beginners21 Lessons, Get Started Building with Generative AI项目地址: https://gitcode.com/GitHub_Trending/ge/generative-ai-for-beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考