为AI编程助手Codex集成图像生成功能:实战方案与工作流优化

为AI编程助手Codex集成图像生成功能:实战方案与工作流优化 1. 项目概述Codex与图像生成的“缺失环节”最近在深度使用Codex进行项目开发时我遇到了一个几乎所有开发者都会碰到的“痛点”我需要为刚写完的命令行工具生成一个漂亮的Logo或者为快速搭建的Web应用首页配一张风格统一的背景图。按照直觉我直接在Codex的对话中提出了类似“为这个项目生成一个科技感十足的图标”这样的请求。结果呢Codex要么尝试用SVG或CSS代码“画”出一个极其简陋的图形要么直接告诉我它无法完成这个任务。这感觉就像你拥有一台功能强大的全自动咖啡机却唯独缺少了打奶泡的蒸汽棒——核心体验不完整。这个现象正是社区热议的“Codex没有暴露内置的image-gen”功能。简单来说Codex作为一个强大的AI编程助手其核心能力聚焦在理解、生成和操作代码上。它能够调用各种API、编写部署脚本、生成测试用例但在需要“视觉创意”输出的环节它却缺少了像ChatGPT对话界面中那样直接、高质量的图像生成能力。用户不得不中断流畅的开发流程手动切换到另一个工具如DALL-E、Midjourney的Web界面去生成图片然后再将图片文件导入项目。这个过程不仅割裂也极大地降低了从“想法”到“完整可交付物”的自动化程度。对于全栈开发者、独立创作者或是快速原型验证团队来说这个“缺失”的影响是实实在在的。现代应用开发早已不是纯代码的比拼UI/UX、品牌视觉、宣传素材都构成了产品不可或缺的一部分。Codex能帮你写好React组件却无法为这个组件配上合适的插画能帮你搭建Flask后端却无法为API文档生成一个清晰的架构图。这种能力上的“断层”迫使开发者在“编码”和“设计”两个思维模式间频繁切换。因此深入探讨这个问题不仅仅是抱怨一个功能的缺失更是去理解当前AI辅助开发工具的边界并寻找切实可行的“补全”方案。本文将从一个一线开发者的视角拆解为什么这个功能如此重要分析其背后的技术限制与可能性并分享几种我亲自实践过的、将图像生成能力“缝合”进Codex工作流的方法。无论你是想提升个人开发效率还是为团队构建更智能的自动化流程这里的内容都能提供直接的参考。2. 核心需求解析为什么我们需要Codex生成图像在深入技术方案之前我们首先要厘清为什么在Codex中集成图像生成不是一个“锦上添花”的功能而是一个影响核心工作流的“雪中送炭”的需求从我大量的项目实践来看需求主要源于以下几个高频场景。2.1 场景一项目文档与Readme的即时美化任何一个像样的开源项目或内部工具其README.md文件就是门面。一个带有项目Logo的标题、一张展示核心功能的截图或架构图能极大提升项目的专业度和吸引力。传统流程是写完代码 - 构思图片内容 - 打开图像生成网站 - 输入提示词 - 调整 - 下载 - 重命名 - 放入目录 - 修改Markdown引用路径。这个过程繁琐且打断心流。理想的工作流在Codex中我只需在编写README.md时自然地插入一句注释或指令如“!-- 在此处插入一个体现数据流动的、赛博朋克风格的架构图尺寸1200x600 --”。Codex应能理解这个需求调用图像模型生成符合描述的图片自动保存到/assets目录并生成正确的Markdown图片链接。这实现了文档创作的“端到端”自动化。2.2 场景二UI原型与占位资源的快速生成在快速原型开发阶段我们经常需要界面上的图片资源。这些资源可能不是最终版但需要符合一定的风格和尺寸以便进行布局测试和效果预览。例如开发一个电商产品列表页我们需要商品图、用户头像等。传统做法要么使用固定的占位图如placeholder.com风格单一要么手动去素材网站搜索下载耗时耗力。Codex增强流程在编写前端组件时直接给出指令“// 为这个ProductCard组件生成一张展示现代无线耳机的产品图白色背景尺寸300x300”。Codex生成图片后自动填充到src属性中。这样开发者在浏览器中立刻能看到一个风格统一、内容相关的近似最终效果极大提升了原型设计的真实感和迭代速度。2.3 场景三代码生成与视觉内容的协同创作这是一个更具前瞻性的场景。想象一下你给Codex一个复杂任务“创建一个关于气候变化数据可视化的交互式网站要求有吸引人的英雄背景图、每个数据板块配有主题图标整体风格为简约科技感。”当前Codex的能力边界它可以出色地完成以下工作搭建Next.js项目框架、使用D3.js或Chart.js编写数据可视化组件、设计响应式布局、甚至编写数据获取逻辑。然而它在“吸引人的英雄背景图”和“主题图标”这里卡住了。它可能会尝试用CSS渐变或SVG简单图形来替代但这与“吸引人”和“简约科技感”的预期相去甚远。真正的协同创作这意味着AI需要同时理解“功能逻辑”和“视觉表现”并能生成两者。图像生成不是独立的它需要与生成的代码在风格、主题、用途上深度结合。缺少了它Codex产出的只是一个“半成品”需要开发者额外投入大量精力进行视觉填充自动化流程的价值大打折扣。注意这里的需求不仅仅是“生成一张图”而是“在正确的开发上下文和项目结构中生成符合语义和风格要求的图像资源”。这要求图像生成功能必须深度集成到Codex的代码理解、文件系统操作和项目上下文感知能力中。3. 技术现状与限制分析为什么Codex“做不到”理解了“为什么需要”我们再来看看“为什么没有”。Codex作为OpenAI旗下的代码模型其设计初衷和架构决定了它目前的能力范围。从技术层面看这个“缺失”是多重因素共同作用的结果。3.1 模型架构与功能定位的隔离Codex及其后继者如GPT-4用于代码的版本的核心训练数据是海量的公开代码库。它的“思维”模式是符号化、逻辑化和结构化的擅长处理编程语言这种有严格语法和确定性的任务。而图像生成模型如DALL-E系列、Stable Diffusion是典型的扩散模型或自回归模型其训练数据是图像-文本对学习的是从文本描述到像素分布的复杂映射这是一种完全不同的、充满随机性和艺术性的生成过程。技术本质差异Codex文本 - 代码结构化文本。输出是可精确验证、可执行的。Image-Gen文本 - 图像高维像素矩阵。输出是感知性的评价标准主观。将两种截然不同的生成模式深度整合到一个模型中在工程上是巨大的挑战。目前更可行的路径是“模型调用”而非“模型融合”。即Codex作为一个调度中心在需要时去调用专门的图像生成API。3.2 API暴露与产品策略考量即使采用“模型调用”的方式为什么OpenAI没有像在ChatGPT中那样为Codex直接提供一个内置的、简单的generate_image(prompt)工具函数呢这很可能涉及产品策略和复杂度管理。复杂度与滥用控制图像生成涉及版权、内容安全生成暴力、色情或名人肖像等等更敏感的问题。在ChatGPT的交互式环境中有实时的人工反馈和内容过滤机制。而在Codex这种可能用于自动化、批量任务的场景中管控难度和风险系数更高。资源消耗与成本生成高质量图像的计算成本远高于生成文本代码。如果将其作为默认功能暴露可能会被用户无意或有意地滥用导致API成本激增。这需要在产品设计上设置明确的限制和计费策略。功能聚焦OpenAI可能希望Codex牢牢锁定“代码专家”的定位避免功能泛化导致核心能力稀释。图像生成可以作为一项由用户通过自定义工具集成的高级能力而非开箱即用的基础功能。3.3 现有替代方案的局限性在GitHub Issue中用户提到了一种变通方案“提示Codex使用OpenAI API直接调用图像生成器”。这其实就是我们即将深入探讨的自定义工具集成。然而用户也指出了现有方案的痛点质量与速度用户自建的脚本使用第三方模型如mflux, krea可能质量不如OpenAI自家的DALL-E 3且速度慢。流程割裂即使是调用官方API也需要用户自行处理API密钥管理、费用、错误重试、图片下载、文件保存、路径更新等一系列工程问题。这并没有从根本上解决“自动化”和“无缝集成”的核心诉求。4. 实战方案为Codex集成自定义图像生成工具既然官方没有提供我们就自己动手丰衣足食。核心思路是将Codex视为一个“智能调度中心”我们为其扩展一个“图像生成工具”。当Codex接收到需要生成图像的指令时它会自动调用我们提供的这个工具并处理后续的所有流程。下面我将分享两种不同集成深度的实战方案。4.1 方案一基于OpenAI API的轻量级集成推荐入门这是最直接、最接近官方体验的方案。我们创建一个Python脚本作为Codex可以调用的外部工具。这个脚本的核心功能是调用OpenAI的Images API。第一步创建工具函数我们创建一个名为image_generator.py的文件。这个文件需要被你的Codex运行环境例如一个自定义的Agent框架或直接通过CLI所加载。# image_generator.py import os import requests import uuid from pathlib import Path from openai import OpenAI class ImageGeneratorTool: 一个为Codex/AI Agent设计的图像生成工具。 def __init__(self, api_keyNone, save_dir./generated_images): 初始化工具。 参数: api_key: OpenAI API密钥。如果为None则从环境变量OPENAI_API_KEY读取。 save_dir: 生成图片的保存目录。 self.client OpenAI(api_keyapi_key or os.getenv(OPENAI_API_KEY)) if not self.client.api_key: raise ValueError(未提供OpenAI API密钥。请通过参数传入或设置OPENAI_API_KEY环境变量。) self.save_dir Path(save_dir) self.save_dir.mkdir(parentsTrue, exist_okTrue) print(f[Image Generator] 图片将保存至: {self.save_dir.absolute()}) def generate_and_save(self, prompt: str, size: str 1024x1024, model: str dall-e-3) - dict: 根据提示词生成图片并保存到本地。 参数: prompt: 图像描述文本。 size: 图片尺寸可选 1024x1024, 1024x1792, 1792x1024 (DALL-E 3)。 model: 模型名称如 dall-e-3 或 dall-e-2。 返回: 一个字典包含状态、本地文件路径、图片URL等信息。 try: print(f[Image Generator] 正在生成: {prompt[:50]}...) response self.client.images.generate( modelmodel, promptprompt, sizesize, qualitystandard, # 或 hd (仅dall-e-3) n1, ) image_url response.data[0].url # 下载图片 img_data requests.get(image_url).content # 生成唯一文件名 filename f{uuid.uuid4().hex[:8]}_{prompt[:20].replace( , _)}.png filepath self.save_dir / filename with open(filepath, wb) as f: f.write(img_data) result { status: success, local_path: str(filepath), url: image_url, prompt: prompt, size: size } print(f[Image Generator] 图片已保存至: {filepath}) return result except Exception as e: error_msg f图像生成失败: {str(e)} print(f[Image Generator] 错误: {error_msg}) return {status: error, message: error_msg} # 为了让Codex/Agent更容易理解和使用可以定义一个更简单的接口 def generate_image(self, prompt: str) - str: 简化接口主要返回本地文件路径方便Codex在代码中引用。 result self.generate_and_save(prompt) if result[status] success: return result[local_path] else: # 返回错误信息Codex可以将其反馈给用户 return fError: {result[message]} # 示例如何被调用 if __name__ __main__: tool ImageGeneratorTool() # 测试生成 path tool.generate_image(A futuristic robot writing code on a transparent screen, cyberpunk style) print(f生成的图片路径: {path})第二步将工具暴露给Codex如何让Codex知道并使用这个工具取决于你运行Codex的具体方式。如果你使用的是支持“自定义工具”或“函数调用”的AI Agent框架如LangChain, AutoGen或OpenAI Assistants API你需要将上面的generate_image函数注册为一个工具。以OpenAI Assistants API这是目前集成自定义函数的主流方式为例# 假设你在配置一个Assistant from openai import OpenAI client OpenAI() # 定义工具函数的schema这告诉AI这个工具是什么、需要什么参数 tools [ { type: function, function: { name: generate_image, description: 根据详细的文本描述生成一张图片并保存到项目目录中。用于创建图标、背景图、示意图等视觉资产。, parameters: { type: object, properties: { prompt: { type: string, description: 对想要生成的图像的详细英文描述。包括主体、风格、色彩、构图等细节。 } }, required: [prompt] } } } ] # 创建Assistant时传入工具定义 assistant client.beta.assistants.create( nameCode Assistant with Image Gen, instructions你是一个全栈开发助手擅长编写代码。当用户需要创建图像资源时你可以调用generate_image工具。生成成功后将图片路径嵌入到你的代码或Markdown响应中。, modelgpt-4-turbo, # 使用支持函数调用的模型 toolstools )第三步处理函数调用当用户向这个Assistant发出“为我的应用生成一个登录页的英雄背景图”的请求时模型会决定需要调用generate_image函数并返回一个包含prompt参数的调用请求。你的后端服务需要捕获这个请求执行我们之前写的ImageGeneratorTool().generate_image(prompt)函数然后将结果图片路径返回给AssistantAssistant再组织最终的自然语言回复给用户。实操心得在定义工具描述(description)时务必清晰准确。例如强调“生成图片并保存到项目目录”这能引导AI在后续对话中正确引用文件路径。参数描述也要详细引导用户给出高质量的提示词。4.2 方案二构建本地化图像生成服务追求可控与隐私如果你对网络延迟、API费用有顾虑或者项目涉及敏感信息不能在云端处理可以搭建本地图像生成服务。这里以开源的Stable Diffusion为例。架构设计我们不再直接调用OpenAI API而是让ImageGeneratorTool向一个本地运行的Stable Diffusion WebUI的API例如使用--api参数启动发送请求。修改ImageGeneratorTool类# local_image_generator.py import requests import uuid from pathlib import Path class LocalImageGeneratorTool: 调用本地Stable Diffusion API的图像生成工具。 def __init__(self, sd_webui_urlhttp://127.0.0.1:7860, save_dir./generated_images): self.sd_url sd_webui_url.rstrip(/) self.save_dir Path(save_dir) self.save_dir.mkdir(parentsTrue, exist_okTrue) # 测试连接 try: resp requests.get(f{self.sd_url}/sdapi/v1/sd-models) if resp.status_code 200: print(f[Local Image Generator] 已连接到本地Stable Diffusion服务。) else: print(f[Local Image Generator] 警告连接测试返回状态码 {resp.status_code}) except Exception as e: print(f[Local Image Generator] 无法连接到本地服务 {self.sd_url}: {e}) # 可以根据需要决定是否抛出异常 def generate_and_save(self, prompt: str, negative_prompt: str , steps: int 20) - dict: 调用本地SD API生成图片。 参数: prompt: 正向提示词。 negative_prompt: 反向提示词不希望出现的内容。 steps: 迭代步数。 try: print(f[Local Image Generator] 正在生成: {prompt[:50]}...) payload { prompt: prompt, negative_prompt: negative_prompt, steps: steps, width: 1024, height: 1024, sampler_name: Euler a, # 常用采样器 cfg_scale: 7, # 提示词相关性 seed: -1, # 随机种子 } response requests.post(urlf{self.sd_url}/sdapi/v1/txt2img, jsonpayload) response.raise_for_status() r response.json() # SD WebUI API返回的是base64编码的图片 import base64 image_data base64.b64decode(r[images][0]) filename fsd_{uuid.uuid4().hex[:8]}.png filepath self.save_dir / filename with open(filepath, wb) as f: f.write(image_data) result { status: success, local_path: str(filepath), prompt: prompt, parameters: payload } print(f[Local Image Generator] 图片已保存至: {filepath}) return result except Exception as e: error_msg f本地图像生成失败: {str(e)} print(f[Local Image Generator] 错误: {error_msg}) return {status: error, message: error_msg} def generate_image(self, prompt: str) - str: result self.generate_and_save(prompt) if result[status] success: return result[local_path] else: return fError: {result[message]}配置与注册确保你的本地环境已经安装并启动了Stable Diffusion WebUI且启用了API通常启动命令为python launch.py --api。将上述LocalImageGeneratorTool类同样封装成函数并按照方案一的方式注册到你的AI Agent框架中。优势与挑战优势完全离线数据隐私有保障生成次数无限制无API费用可自由选择模型如各种社区训练的LoRA风格更可控。挑战需要本地有强大的GPU支持部署和维护Stable Diffusion环境有一定技术门槛生成速度可能慢于优化过的云API。5. 高级集成与工作流自动化有了基础的图像生成工具我们可以进一步思考如何让它更智能、更无缝地融入Codex驱动的开发工作流。这不仅仅是“能生成”而是“生成得恰到好处”。5.1 上下文感知的图像生成一个笨拙的工具只会机械地执行“生成一张关于X的图”的指令。一个智能的工具应该能理解当前的开发上下文。例如当Codex正在为一个Python数据分析脚本编写文档时如果用户说“加一张展示结果的图”工具应该能理解项目类型这是一个Python项目可能使用matplotlib或seaborn。分析代码上下文读取当前脚本看它生成了什么数据绘制了什么图表。生成或提取理想情况下不是调用DALL-E去“画”一张假图而是直接运行这段代码捕获其输出的图表保存为图片。这才是真正的“上下文感知”。实现思路我们可以扩展工具使其具备简单的代码执行和截图能力。例如当检测到提示词包含“代码输出图”、“可视化结果”时工具可以尝试从对话历史或当前编辑的文件中提取相关的绘图代码段。在一个安全的沙箱环境中执行这段代码例如使用pyodide在浏览器端运行或一个隔离的Docker容器。使用无头浏览器或图形库的保存功能将生成的图表保存为图片文件。# 上下文感知图像生成工具的伪代码扩展 class ContextAwareImageTool(ImageGeneratorTool): def generate_chart_from_code(self, code_snippet: str, file_format: str png) - str: 执行一段绘图代码并保存结果。 # 1. 安全沙箱执行代码此处为概念展示实际需谨慎处理 # 2. 假设代码使用matplotlib我们可以重定向plt.savefig import matplotlib matplotlib.use(Agg) # 使用不显示的后端 import matplotlib.pyplot as plt namespace {} try: exec(code_snippet, namespace) # 假设代码最后创建了图表我们保存它 filename fchart_{uuid.uuid4().hex[:8]}.{file_format} filepath self.save_dir / filename plt.savefig(filepath, dpi300, bbox_inchestight) plt.close(all) # 清理图形 return str(filepath) except Exception as e: return fError executing chart code: {e}5.2 多轮迭代与风格一致性在真实项目中我们往往需要一系列风格一致的图片。比如为一个网站生成英雄图、功能图标、头像等。简单的单次调用无法保证这种一致性。解决方案引入“风格种子”或“参考图像”的概念。工具可以维护一个简单的“项目风格上下文”。首次生成用户指定一个详细的风格如“扁平化插图使用柔和的蓝绿色调带有细线边框”。记录参数工具在生成第一张图片时不仅保存图片还将生成时使用的关键参数对于DALL-E 3可能是提示词的风格部分对于SD则是seed、checkpoint模型名称、LoRA等与一个“项目ID”关联存储起来。后续生成当用户在同一会话或项目中请求“再生成一个设置图标”时工具可以自动从上下文中提取之前记录的风格参数并将其融合到新的提示词中从而生成风格匹配的新图片。# 简化的风格上下文管理 class StyleAwareImageGenerator(ImageGeneratorTool): def __init__(self, ...): super().__init__(...) self.project_styles {} # project_id - style_params def generate_with_style(self, prompt: str, project_id: str default, style_description: str None) - str: # 如果提供了新的风格描述则更新记录 if style_description: self.project_styles[project_id] style_description full_prompt f{prompt}, {style_description} # 如果已有记录的风格则合并 elif project_id in self.project_styles: full_prompt f{prompt}, {self.project_styles[project_id]} else: full_prompt prompt return self.generate_image(full_prompt)5.3 与文件系统及版本控制的联动最理想的无缝集成是图像生成工具能像Codex操作代码文件一样自然地操作图片资源文件。智能路径放置工具能根据项目结构将生成的图标放在/src/assets/icons/将生成的截图放在/docs/images/。自动更新引用生成图片后自动更新相关代码或Markdown文件中的资源引用路径。例如在README.md中插入![架构图](./assets/arch.png)。版本控制提示在图片生成后工具可以建议或自动执行git add命令将新图片纳入版本管理。这需要工具对项目结构有更深的理解并与Codex的文件编辑能力紧密结合。在实现上可以让工具返回一个结构化的结果不仅包含路径还包含建议的下一步操作由Codex来决策和执行。6. 常见问题与排查技巧实录在实际集成和使用自定义图像生成工具的过程中我踩过不少坑。这里把一些典型问题和解决方案记录下来希望能帮你节省时间。6.1 工具调用失败模型不理解或拒绝调用问题现象你明明注册了generate_image工具但Codex在对话中完全无视你的图像生成请求继续用代码或文字来描述图片。排查与解决检查工具描述这是最常见的原因。工具的描述(description)必须极其清晰明确说明它的用途。例如“根据文本描述生成一张图片”就比“生成图片”好得多。在参数描述里也要引导用户输入“详细的、英文的”提示词。检查模型版本确保你使用的AI模型如gpt-4-turbo,gpt-4o支持函数调用Function Calling功能。早期的gpt-3.5-turbo版本可能支持不佳。优化用户指令用户的指令需要足够明确触发工具调用。直接说“生成一张太阳系的图片”比“我需要一张图”要好。有时甚至需要“教”AI比如说“请调用你的图像生成工具为我创建一个Logo主题是...”。系统指令强化在创建Assistant或设置系统提示词时明确告诉AI“你拥有图像生成能力。当用户需要创建任何视觉资产如图标、背景、示意图时你应该优先调用generate_image工具。”6.2 图像生成质量不佳问题现象图片生成了但效果很差不符合预期。排查与解决提示词工程AI生成图片七分靠提示词。传递给工具的prompt参数质量直接决定输出。具体化“一只猫” vs “一只毛茸茸的橘猫在阳光下蜷缩在窗台上写实风格浅景深”。加入风格关键词如“digital art”, “flat illustration”, “cyberpunk”, “minimalist”, “isometric”。指定构图和细节“wide shot”, “close-up”, “symmetric”, “highly detailed”。使用负面提示词如果后端支持如“blurry”, “ugly”, “text”。调整生成参数如果使用本地SD可以调整steps步数更高更精细但更慢、cfg_scale提示词相关性通常7-12、sampler采样器如DPM 2M Karras等。需要通过实验找到最佳组合。模型选择DALL-E 3在理解复杂提示和生成高质量图像方面通常优于DALL-E 2。如果使用Stable Diffusion尝试不同的基础模型和LoRA对特定风格影响巨大。6.3 文件路径与项目集成混乱问题现象图片成功生成并保存了但Codex在后续的代码或文本中引用了错误的路径或者根本不知道如何引用。排查与解决统一基础路径在工具初始化时明确一个相对于项目根目录的保存路径如./generated_assets。并确保Codex的运行上下文知道这个基础路径。返回结构化信息不要只返回一个本地绝对路径如/home/user/project/generated_assets/abc.png。返回一个相对于当前工作目录的路径如./generated_assets/abc.png或者同时返回绝对路径和相对路径。在回复中显式声明当工具调用成功AI在组织回复给用户时应该清晰地说明“已生成图片保存在[./assets/logo.png]。你可以在README中使用![项目Logo](./assets/logo.png)来引用它。” 这样既给出了结果也给出了下一步操作的明确指导。处理文件已存在工具内应加入简单的重名处理逻辑如使用UUID或时间戳避免覆盖已有文件。6.4 性能与成本问题问题现象生成速度慢或者使用云API时费用增长很快。优化策略缓存机制对于相同或相似的提示词可以计算一个哈希值检查是否已有生成过的图片直接返回路径避免重复生成。这对于在开发中反复调整样式时特别有用。预览与确认对于可能消耗大量计算资源或API额度的复杂生成任务可以设计一个“预览-确认”流程。例如先调用快速、低质量的模型生成小图供确认用户满意后再生成高清大图。本地降级方案在自动化脚本中可以设置一个开关。当云API调用失败、达到限额或需要离线工作时自动降级到使用本地的轻量级模型如更小的SD模型或甚至使用简单的占位图生成服务。批量生成优化如果需要为一组项目生成风格统一的图标可以设计一个批量生成模式一次性提交所有提示词并利用本地SD的批处理功能这比逐个调用API更高效。集成图像生成到Codex本质上是在扩展AI助手的能力边界让它从“代码世界”走向“多模态创作”。这个过程虽然需要一些额外的开发工作但带来的效率提升和流程自动化收益是巨大的。从我自己的实践来看一旦这套流程跑通在开发那些需要频繁产出视觉材料的项目如宣传页、演示Demo、开源项目时体验会有质的飞跃。你不再需要在不同工具间切换所有的创造都集中在一个连贯的对话和指令流中完成。这或许就是未来AI辅助开发的常态一个能理解你全方位意图并调动各种资源将其实现的超级助手。而我们今天所做的正是在为这个未来搭建一块关键的拼图。