构建AI智能体:二十二、双剑合璧:Qwen系列双模型在文生文、文生图中的搭配应用

简介: 使用Gradio构建的一个演示界面,该界面将展示如何使用Qwen-Turbo生成提示词,然后使用Qwen-Image生成图像。 我们将按照之前的设计,将流程分为两个主要步骤:先生成提示词,然后生成图像。在提示词生成成功之前,直接生成图像将会给出提示先生成提示词。

一、温故知新

       回顾前面几篇文章,我们分别对文生图的案例演示和RAG Query改写做了详细介绍,今天我们再趣味性的强化一下两者的应用途径,结合两个模型Qwen-Turbo和Qwen-Image同时使用,将自然语言处理与计算机视觉完美结合,发现两者的奥妙之处。

image.gif


二、系统介绍

先看看展示界面:

image.gif


示例关键词:北极光, 日出

示例生成的文案:极光在晨曦中缓缓舞动,淡绿色与紫色的光带如丝绸般飘荡在深蓝色的天空。太阳刚刚升起,金色的光芒从地平线洒下,照亮了覆盖着薄霜的雪原。冰湖倒映着绚丽的极光与初升的太阳,整个画面充满神秘与宁静,空气中弥漫着清冷而纯净的气息。

生成的图片:

image.gif


       看系统界面,清楚我们使用Gradio构建的一个演示界面,该界面将展示如何使用Qwen-Turbo生成提示词,然后使用Qwen-Image生成图像。 我们将按照之前的设计,将流程分为两个主要步骤:先生成提示词,然后生成图像。在提示词生成成功之前,直接生成图像将会给出提示先生成提示词。

       系统的核心在于三个主要功能模块:关键词管理、提示词生成和图像处理。关键词管理系统提供了结构化的选择方式,用户可以从多个类别中选择感兴趣的关键词,系统会自动将这些关键词组合成有意义的查询。

       提示词生成引擎是系统的智能核心,它不仅简单拼接关键词,而是理解用户的创作意图,生成富有创意和细节的图像描述。图像处理模块则负责将文本描述转换为视觉内容,支持多种风格和尺寸的定制。

系统主要包含以下功能:

 1. 关键词选择:使用选项卡和复选框组让用户选择关键词。

 2. 参数设置:下拉菜单选择尺寸和风格,文本框输入负面提示词。

 3. 生成提示词:点击按钮调用Qwen-Turbo生成提示词,并显示在文本框中。

 4. 生成图像:只有在提示词生成后才可点击,调用Qwen-Image生成图像并显示。

 5. 状态显示:显示操作的状态信息(成功、错误、进行中)。

 6. 清除和下载功能:清除所有选择,下载生成的图像。


三、系统流程

       实际操作过程简单直观:首先在界面左侧选择相关的关键词,这些关键词按主题分类,方便快速查找和选择。接着设置图像参数,包括尺寸、风格等可选设置。

       点击"生成提示词"后,系统调用Qwen-Turbo生成详细的图像描述。获得满意的提示词后,可以点击"生成图像"按钮,系统将调用Qwen-Image创建最终的视觉作品。整个过程通常只需要几分钟,具体时间取决于图像复杂度和服务器负载。

1. 流程图

image.gif

2. 流程介绍

2.1 应用启动与初始化

  • 用户启动应用,加载Gradio界面
  • 系统初始化API连接和参数设置
  • 生成图像按钮初始状态为禁用

2.2 提示词生成

  • 用户选择关键词和参数
  • 点击生成提示词按钮
  • 系统验证输入有效性
  • 调用Qwen-Turbo API生成详细图像描述
  • 处理API响应,显示生成的提示词或错误信息
  • 成功生成提示词后启用生成图像按钮

2.3 图像生成

  • 点击生成图像按钮
  • 系统验证提示词存在且有效
  • 调用Qwen-Image API生成图像
  • 异步处理API响应
  • 下载生成的图像并显示在界面

四、代码参考与解析

import dashscope
from dashscope import ImageSynthesis
import requests
import tempfile
import os
import time
from PIL import Image
import io
import base64
import json
import gradio as gr
# 设置您的 DashScope API Key
DASHSCOPE_API_KEY =  os.environ.get("DASHSCOPE_API_KEY", "")  # 请替换为您的实际API Key
# 初始化 DashScope
dashscope.api_key = DASHSCOPE_API_KEY
# DashScope Qwen-Image 支持的风格参数
SUPPORTED_STYLES = {
    "自动": "auto",
    "3D卡通": "<3d cartoon>",
    "动漫": "<anime>",
    "油画": "<oil painting>",
    "水彩": "<watercolor>",
    "素描": "<sketch>",
    "中国画": "<chinese painting>",
    "扁平插画": "<flat illustration>",
    "摄影": "<photography>",
    "肖像": "<portrait>"
}
# DashScope Qwen-Image 支持的尺寸参数
SUPPORTED_SIZES = {
    "正方形 (1024x1024)": "1024*1024",
    "横屏 (1280x720)": "1280*720",
    "竖屏 (720x1280)": "720*1280"
}
# 多组关键词选项
KEYWORD_GROUPS = {
    "自然": ["森林", "河流", "山脉", "星空", "湖泊", "海洋", "沙漠", "冰川", "草原", "瀑布", 
              "峡谷", "岛屿", "火山", "洞穴", "森林小径", "珊瑚礁", "热带雨林", "北极光", "温泉", "绿洲"],
    "城市": ["高楼", "街道", "公园", "夜景", "桥梁", "广场", "地铁", "商业区", "住宅区", "地标建筑",
              "咖啡馆", "博物馆", "美术馆", "火车站", "机场", "港口", "书店", "餐厅", "购物中心", "体育场"],
    "人物": ["儿童", "老人", "情侣", "家庭", "学生", "医生", "艺术家", "运动员", "上班族", "旅行者",
              "科学家", "教师", "音乐家", "舞蹈家", "演员", "作家", "摄影师", "厨师", "农民", "消防员", "解放军"],
    "动物": ["猫咪", "小狗", "熊猫", "老虎", "狮子", "大象", "海豚", "鸟类", "蝴蝶", "兔子",
              "猴子", "长颈鹿", "斑马", "企鹅", "考拉", "袋鼠", "熊", "狐狸", "狼", "马"],
    "植物": ["樱花", "玫瑰", "竹子", "松树", "向日葵", "仙人掌", "荷叶", "枫叶", "薰衣草", "郁金香",
              "百合", "牡丹", "菊花", "桂花", "茉莉花", "桃花", "杜鹃花", "梅花", "向日葵", "绿萝"],
    "物品": ["礼帽", "手杖", "书本", "咖啡杯", "吉他", "相机", "钟表", "花瓶", "雨伞", "背包",
              "眼镜", "围巾", "手套", "项链", "耳环", "戒指", "手表", "钱包", "手机", "笔记本电脑"],
    "天气": ["晴天", "雨天", "雪天", "雾天", "日落", "日出", "彩虹", "雷电", "阴天", "微风",
              "大风", "暴雨", "暴雪", "冰雹", "台风", "霜冻", "露水", "雾霾", "多云", "晴朗"],
    "场景": ["咖啡馆", "图书馆", "博物馆", "海滩", "山脉", "森林", "花园", "未来城市", "赛博朋克", "太空站", 
              "海底世界", "古代城堡", "乡村小屋", "豪华别墅", "小木屋", "沙漠帐篷", "雪山营地", "太空飞船", "阅兵式"]
}
def generate_prompt_with_qwen(keywords_dict, style=None):
    """
    使用通义千问Turbo模型根据关键词生成详细的图像描述提示词
    """
    url = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation"
    
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {DASHSCOPE_API_KEY}"
    }
    
    # 构建风格提示
    style_prompt = ""
    if style and style != "自动":
        style_name = style
        style_prompt = f",风格为{style_name}"
    
    # 从字典中提取所有选中的关键词
    all_keywords = []
    for group, keywords in keywords_dict.items():
        if keywords:
            all_keywords.extend(keywords)
    
    # 如果没有选择任何关键词,返回错误
    if not all_keywords:
        return None, "请至少选择一个关键词"
    
    # 将关键词列表组合成字符串
    keywords_str = ",".join(all_keywords)
    
    # 构建请求体
    payload = {
        "model": "qwen-turbo",
        "input": {
            "messages": [
                {
                    "role": "system",
                    "content": "你是一个专业的图像描述生成助手。你的任务是根据用户提供的关键词,生成一段150字以内的详细、生动、富有想象力的图像描述,用于AI文生图模型。描述应该包含场景、主体、动作、环境、光线、色彩、情绪等细节,使AI能够生成高质量的图像。"
                },
                {
                    "role": "user",
                    "content": f"请根据以下关键词生成一段详细的图像描述{style_prompt},描述应该具体、生动,包含足够的细节,适合用于AI文生图:{keywords_str}。请直接给出描述文本,不要包含任何解释或其他内容。"
                }
            ]
        },
        "parameters": {
            "temperature": 0.8,
            "top_p": 0.8,
            "result_format": "message"
        }
    }
    
    try:
        print(f"发送请求到Qwen-Turbo API: {json.dumps(payload, ensure_ascii=False)}")
        response = requests.post(url, headers=headers, json=payload)
        response_data = response.json()
        
        print(f"Qwen-Turbo API响应: {json.dumps(response_data, ensure_ascii=False, indent=2)}")
        
        if response.status_code == 200 and "output" in response_data:
            # 提取生成的提示词
            generated_prompt = response_data["output"]["choices"][0]["message"]["content"]
            return generated_prompt, None
        else:
            error_msg = f"Qwen-Turbo API调用失败,状态码: {response.status_code}"
            if "message" in response_data:
                error_msg += f", 错误信息: {response_data['message']}"
            return None, error_msg
            
    except Exception as e:
        error_msg = f"调用Qwen-Turbo时发生异常: {str(e)}"
        print(error_msg)
        import traceback
        traceback.print_exc()
        return None, error_msg
def generate_image_direct(prompt, size, style=None, negative_prompt=None):
    """
    直接使用HTTP请求调用DashScope API,避免dashscope库的问题
    """
    if not DASHSCOPE_API_KEY or DASHSCOPE_API_KEY == "":
        return "请先设置您的 DashScope API Key"
    
    url = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text2image/image-synthesis"
    
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {DASHSCOPE_API_KEY}",
        "X-DashScope-Async": "enable"  # 启用异步调用
    }
    
    # 构建请求体
    payload = {
        "model": "wanx-v1",
        "input": {
            "prompt": prompt
        },
        "parameters": {
            "size": size,
            "n": 1
        }
    }
    
    # 添加风格参数(如果提供且不是"自动")
    if style and style != "自动":
        # 将中文风格名称转换为API支持的格式
        style_code = SUPPORTED_STYLES.get(style, "auto")
        payload["parameters"]["style"] = style_code
        
    # 添加负面提示(如果提供)
    if negative_prompt and negative_prompt.strip():
        payload["parameters"]["negative_prompt"] = negative_prompt
    
    try:
        print(f"发送请求到DashScope API: {json.dumps(payload, ensure_ascii=False)}")
        response = requests.post(url, headers=headers, json=payload)
        response_data = response.json()
        
        print(f"API响应: {json.dumps(response_data, ensure_ascii=False, indent=2)}")
        
        if response.status_code == 200:
            # 检查是否为异步任务
            if "output" in response_data and "task_status" in response_data["output"]:
                task_id = response_data["output"]["task_id"]
                print(f"异步任务已创建,任务ID: {task_id}")
                
                # 轮询任务状态
                return poll_task_result(task_id)
            elif "output" in response_data and "results" in response_data["output"]:
                # 同步响应,直接获取结果
                if len(response_data["output"]["results"]) > 0:
                    image_url = response_data["output"]["results"][0]["url"]
                    return download_and_save_image(image_url)
                else:
                    return "API响应中未包含有效结果"
            else:
                return "API响应格式不正确"
        else:
            error_msg = f"API调用失败,状态码: {response.status_code}"
            if "message" in response_data:
                error_msg += f", 错误信息: {response_data['message']}"
            return error_msg
            
    except Exception as e:
        error_msg = f"发生异常: {str(e)}"
        print(error_msg)
        import traceback
        traceback.print_exc()
        return error_msg
def poll_task_result(task_id, max_attempts=30, delay=2):
    """
    轮询异步任务结果
    """
    if not DASHSCOPE_API_KEY or DASHSCOPE_API_KEY == "":
        return "请先设置您的 DashScope API Key"
    
    url = f"https://dashscope.aliyuncs.com/api/v1/tasks/{task_id}"
    
    headers = {
        "Authorization": f"Bearer {DASHSCOPE_API_KEY}"
    }
    
    attempt = 0
    
    while attempt < max_attempts:
        try:
            print(f"轮询任务状态,尝试 {attempt + 1}/{max_attempts}")
            response = requests.get(url, headers=headers)
            response_data = response.json()
            
            print(f"任务状态响应: {json.dumps(response_data, ensure_ascii=False, indent=2)}")
            
            if response.status_code == 200:
                if "output" not in response_data:
                    return "API响应格式不正确,缺少output字段"
                
                task_status = response_data["output"].get("task_status", "UNKNOWN")
                
                if task_status == "SUCCEEDED":
                    if ("output" in response_data and 
                        "results" in response_data["output"] and 
                        len(response_data["output"]["results"]) > 0):
                        
                        image_url = response_data["output"]["results"][0]["url"]
                        return download_and_save_image(image_url)
                    else:
                        return "任务成功但未包含有效结果"
                elif task_status in ["FAILED", "CANCELED"]:
                    error_msg = f"任务失败,状态: {task_status}"
                    if "message" in response_data["output"]:
                        error_msg += f", 错误信息: {response_data['output']['message']}"
                    return error_msg
                else:
                    # 任务仍在处理中,等待后再次尝试
                    time.sleep(delay)
                    attempt += 1
            else:
                return f"获取任务状态失败,状态码: {response.status_code}"
                
        except Exception as e:
            error_msg = f"轮询任务时发生异常: {str(e)}"
            print(error_msg)
            time.sleep(delay)
            attempt += 1
    
    return "任务处理超时"
def download_and_save_image(image_url):
    """
    下载图像并保存到临时文件
    """
    try:
        img_response = requests.get(image_url)
        if img_response.status_code == 200:
            # 创建临时文件保存图像
            with tempfile.NamedTemporaryFile(delete=False, suffix='.png') as f:
                f.write(img_response.content)
                image_path = f.name
            
            print("图像下载成功!")
            return image_path
        else:
            return f"下载图像失败,状态码: {img_response.status_code}"
    except Exception as e:
        return f"下载图像时发生异常: {str(e)}"
# 创建 Gradio 界面
def create_interface():
    with gr.Blocks(title="Qwen-Image 智能文生图演示", theme=gr.themes.Soft()) as demo:
        gr.Markdown("# 🎨 Qwen-Turbo 关键字生成文本 + Qwen-Image 智能文生图演示")
        gr.Markdown("使用通义千问Turbo模型将关键词转换为详细描述,再用通义万相生成图像  ")
        
        # 创建关键词选项卡
        keyword_components = {}
        
        with gr.Row():
            with gr.Column(scale=1):
                # 关键词选项卡 - 移除了不支持的label参数
                with gr.Tabs():
                    for group_name, keywords in KEYWORD_GROUPS.items():
                        with gr.Tab(group_name):
                            # 为每组关键词创建多选框,并存储在字典中
                            keyword_components[group_name] = gr.CheckboxGroup(
                                choices=keywords,
                                label=f"{group_name}类关键词",
                                interactive=True
                            )
                    
                # 使用gr.Row()将图像尺寸和图像风格合并成一行显示
                with gr.Row():
                    with gr.Column(scale=1):
                        # 使用支持的尺寸选项
                        size = gr.Dropdown(
                            choices=list(SUPPORTED_SIZES.keys()),
                            value="横屏 (1280x720)",
                            label="图像尺寸"
                        )
                    
                    with gr.Column(scale=1):
                        # 使用支持的风格选项
                        style = gr.Dropdown(
                            choices=list(SUPPORTED_STYLES.keys()),
                            value="自动",
                            label="图像风格"
                        )
                
                negative_prompt = gr.Textbox(
                    label="负面提示词 (可选)",
                    placeholder="请输入不希望出现在图像中的内容",
                    lines=1
                )
                
                with gr.Row():
                    generate_prompt_btn = gr.Button("Qwen-Turbo 生成提示词", variant="primary")
                    generate_image_btn = gr.Button("Qwen-Image 生成图像", variant="secondary")
                
                # 生成的提示词显示
                generated_prompt = gr.Textbox(
                    label="生成的详细提示词",
                    placeholder="这里将显示通义千问生成的详细提示词",
                    lines=3,
                    interactive=True
                )
                
            with gr.Column(scale=1):
                # 将已选关键词显示框移到生成的图像上方
                selected_keywords_display = gr.Textbox(
                    label="已选关键词",
                    placeholder="这里将显示所有已选择的关键词",
                    lines=1,
                    interactive=False
                )
                
                output_image = gr.Image(
                    label="生成的图像",
                    interactive=False
                )
                
                status_text = gr.Textbox(
                    label="状态信息",
                    interactive=False,
                    lines=1
                )
                
                with gr.Row():
                    download_btn = gr.Button("下载图像", variant="primary")
                    clear_btn = gr.Button("清除", variant="stop")
        
        # 将使用说明移到主Row外部,实现全屏显示
        with gr.Row():
            with gr.Column():
                gr.Markdown("### 使用说明")
                gr.Markdown("""
                __1.__ 在左侧选项卡中选择您想要图像的关键词,可以从多组不同类型中选择关键词&nbsp;&nbsp;&nbsp;&nbsp; __2.__ 选择图像尺寸和风格
                &nbsp;&nbsp;&nbsp;&nbsp;  __3. 可选:__ 在负面提示词框中输入不希望出现在图像中的内容        
                __4.__ 点击"生成提示词"按钮生成详细描述 &nbsp;&nbsp;&nbsp;&nbsp; __5.__ 点击"生成图像"按钮根据提示词生成图像
                &nbsp;&nbsp;&nbsp;&nbsp; __6.__  注意使用前必须先设置好 __DashScope API Key__。
                """)
                
        # 添加一个函数,用于即时更新已选关键词显示
        def update_selected_keywords_display(*args):
            # args包含所有关键词选择组件的当前值
            all_selected_keywords = []
            
            for selected in args:
                if selected:
                    all_selected_keywords.extend(selected)
            
            # 将已选关键词格式化为字符串显示
            keywords_display = ", ".join(all_selected_keywords)
            return keywords_display
        
        # 处理生成提示词按钮点击事件
        def on_generate_prompt_click(*args):
            # 前 len(KEYWORD_GROUPS) 个参数是每组关键词的选择结果
            selected_keywords_dict = {}
            all_selected_keywords = []
            
            for i, group_name in enumerate(KEYWORD_GROUPS.keys()):
                selected_keywords_dict[group_name] = args[i]
                # 收集所有已选关键词
                if args[i]:
                    all_selected_keywords.extend(args[i])
            
            # 下一个参数是尺寸,再下一个是风格
            style = args[len(KEYWORD_GROUPS) + 1]
            
            if not any(selected_keywords_dict.values()):
                yield None, "", "⚠️ 警告:请至少选择一个关键词!"
                return
                
            if not DASHSCOPE_API_KEY or DASHSCOPE_API_KEY == "您的API_KEY":
                yield None, "", "⚠️ 警告:请先设置您的 DashScope API Key!"
                return
                
            # 更新状态
            status = "正在使用通义千问生成详细提示词..."
            # 将已选关键词格式化为字符串显示
            keywords_display = ", ".join(all_selected_keywords)
            yield None, keywords_display, status
            
            # 使用通义千问生成详细提示词
            prompt, error = generate_prompt_with_qwen(selected_keywords_dict, style)
            if error:
                yield None, keywords_display, f"❌ 生成提示词失败: {error}"
            else:
                yield prompt, keywords_display, "✅ 提示词生成成功!"
        
        # 处理生成图像按钮点击事件
        def on_generate_image_click(prompt, size, style, negative_prompt):
            if not prompt.strip():
                yield None, "⚠️ 异常提醒:请先生成提示词!"
                return
                
            if not DASHSCOPE_API_KEY or DASHSCOPE_API_KEY == "您的API_KEY":
                yield None, "⚠️ 异常提醒:请先设置您的 DashScope API Key!"
                return
                
            # 更新状态
            status = "正在生成图像,这可能需要一些时间..."
            yield None, status
            
            # 将用户友好的尺寸名称转换为API格式
            api_size = SUPPORTED_SIZES.get(size, "1024*1024")
            
            # 调用API生成图像
            result = generate_image_direct(prompt, api_size, style, negative_prompt)
            
            # 检查结果是图像路径还是错误信息
            if isinstance(result, str) and result.endswith('.png') and os.path.exists(result):
                yield result, "✅ 图像生成成功!"
            else:
                yield None, f"❌ 生成图像失败: {result}"
        
        # 处理清除按钮点击事件
        def on_clear_click():
            # 清除关键词选择
            clear_keywords = [[] for _ in range(len(KEYWORD_GROUPS))]
            # 清除其他组件
            return clear_keywords + [None, "", "已清除图像和提示词"]
        
        # 准备输入参数列表:所有关键词组件 + [尺寸, 风格]
        generate_prompt_inputs = list(keyword_components.values()) + [size, style]
        generate_prompt_btn.click(
            fn=on_generate_prompt_click,
            inputs=generate_prompt_inputs,
            outputs=[generated_prompt, selected_keywords_display, status_text]
        )
        
        generate_image_btn.click(
            fn=on_generate_image_click,
            inputs=[generated_prompt, size, style, negative_prompt],
            outputs=[output_image, status_text],
            api_name="generate_image",
            show_progress=True
        )
        
        # 处理下载按钮点击事件
        def on_download_click(image):
            if image is None:
                return "没有可下载的图像"
            
            # 获取当前时间作为文件名
            timestamp = int(time.time())
            filename = f"qwen_image_{timestamp}.png"
            
            try:
                # 如果图像是文件路径
                if isinstance(image, str) and os.path.exists(image):
                    import shutil
                    shutil.copy2(image, filename)
                    return f"图像已保存为 {filename}"
                else:
                    return "无法保存图像:无效的图像路径"
            except Exception as e:
                return f"保存图像时发生错误: {str(e)}"
        
        download_btn.click(
            fn=on_download_click,
            inputs=output_image,
            outputs=status_text
        )
        
        # 准备清除按钮的输出参数
        clear_outputs = list(keyword_components.values()) + [output_image, generated_prompt, selected_keywords_display, status_text]
        clear_btn.click(
            fn=on_clear_click,
            inputs=None,
            outputs=clear_outputs
        )
        
        # 为每个关键词选择组件添加事件监听,实现即时更新已选关键词显示
        for component in keyword_components.values():
            component.change(
                fn=update_selected_keywords_display,
                inputs=list(keyword_components.values()),
                outputs=selected_keywords_display
            )
    
    return demo
# 启动 Gradio 应用
if __name__ == "__main__":
    # 检查API密钥是否已设置
    if not DASHSCOPE_API_KEY or DASHSCOPE_API_KEY == "您的API_KEY":
        print("警告: 请先设置您的 DashScope API Key")
        print("您可以在代码中设置 DASHSCOPE_API_KEY 变量")
    
    # 创建并启动 Gradio 界面
    demo = create_interface()
    demo.launch(
        server_name="0.0.0.0",  # 允许外部访问
        server_port=7861,       # 设置端口
        share=False,            # 不创建公开链接
        debug=True              # 启用调试模式
    )

image.gif

结构分析:

1. 导入和初始化

import dashscope
from dashscope import ImageSynthesis
import requests
import tempfile
import os
import time
from PIL import Image
import io
import base64
import json
import gradio as gr
# 设置API密钥
DASHSCOPE_API_KEY = os.environ.get("DASHSCOPE_API_KEY", "")
dashscope.api_key = DASHSCOPE_API_KEY


  • 导入必要的库,包括DashScope SDK、HTTP请求、文件处理、图像处理和Gradio界面库
  • 从环境变量获取API密钥并进行初始化


2. 参数配置

# 支持的风格和尺寸参数
SUPPORTED_STYLES = {...}
SUPPORTED_SIZES = {...}
# 多组关键词选项
KEYWORD_GROUPS = {
    "自然": ["森林", "河流", ...],
    "城市": ["高楼", "街道", ...],
    # ... 其他类别
}

image.gif

  • 定义了API支持的图像风格和尺寸选项
  • 创建了分类的关键词库,方便用户选择


3. 核心功能函数

3.1 提示词生成函数

def generate_prompt_with_qwen(keywords_dict, style=None):


  • 使用Qwen-Turbo模型根据用户选择的关键词生成详细的图像描述
  • 构建系统提示词,指导模型生成适合AI绘画的描述
  • 处理API响应并提取生成的提示词
  • 输入:用户选择的关键词和风格参数
    处理:构建API请求,调用Qwen-Turbo模型
    输出:生成的详细图像描述提示词


3.2 图像生成函数

def generate_image_direct(prompt, size, style=None, negative_prompt=None):

image.gif

  • 直接使用HTTP请求调用DashScope API生成图像
  • 支持异步任务处理和轮询机制
  • 处理风格、尺寸和负面提示词参数
  • 输入:生成的提示词和用户设置的参数
    处理:构建API请求,调用Qwen-Image模型
    输出:图像URL或任务ID(异步任务)


3.3 辅助函数

def poll_task_result(task_id, max_attempts=30, delay=2):
def download_and_save_image(image_url):

image.gif

  • 实现异步任务状态轮询
  • 下载生成的图像并保存到临时文件


4. Gradio界面构建

def create_interface():

image.gif

  • 创建多选项卡关键词选择界面
  • 设计图像参数配置区域(尺寸、风格、负面提示词)
  • 设置提示词生成和图像生成按钮
  • 添加状态显示和结果展示区域


5. 事件处理逻辑

def on_generate_prompt_click(*args):
def on_generate_image_click(prompt, size, style, negative_prompt):
def on_clear_click():
def on_download_click(image):

image.gif

  • 处理用户交互事件
  • 协调提示词生成和图像生成流程
  • 实现状态更新和结果反馈


6. 函数的执行流程

       这是一个简化流程图,清晰地展示了Qwen-Turbo和Qwen-Image协同工作的核心流程

image.gif


五、应用场景与案例赏析

       这一技术在实际应用中展现出巨大价值。在创意设计领域,设计师可以快速生成概念图、灵感素材;在内容创作方面,自媒体工作者能够为文章配图、制作吸引人的封面;在教育领域,教师可以创建教学插图、可视化教材。

       商业应用案例同样丰富:电商企业可以用其生成产品展示图,营销团队可以创作广告素材,甚至房地产行业也能用于生成房产概念图。这些应用不仅提高了工作效率,更重要的是开启了新的创作可能性。

  • 案例1

image.gif

关键词:森林, 绿洲, 日落, 乡村小屋

生成的文案:夕阳西下,金色的余晖洒在宁静的森林中,一片绿洲悄然浮现。绿洲中央矗立着一座古朴的乡村小屋,屋顶覆盖着青苔,木窗透出温暖的灯光。小屋前的小径铺满落叶,微风轻拂,树叶沙沙作响。天空染上橙红与紫罗兰的渐变色彩,映照在绿洲的水面上,波光粼粼,宛如梦境。整个画面充满温馨与安宁,仿佛时间在此静止。

生成的图片:

image.gif

  • 案例2

image.gif

关键词:山脉, 星空, 摄影师, 晴朗

生成的文案:摄影师伫立在巍峨的山脉之巅,夜空如墨,繁星点点,银河横跨天际,璀璨夺目。他专注地调整着相机参数,镜头对准那片神秘的星空,脸上带着沉静而兴奋的神情。四周寂静无声,只有微风轻拂山岩,月光洒落在雪峰之上,银白与深蓝交织,营造出宁静而壮丽的氛围。

生成的图片:

image.gif

  • 案例3

image.gif

关键词:森林小径, 手机, 古代城堡

生成的文案:幽深的森林小径蜿蜒穿过茂密的树影,青苔覆盖的石板上残留着昨夜的露水。一位旅人手持老旧手机,神情专注地查看屏幕,仿佛在寻找某种指引。远处,一座古老的城堡矗立在薄雾中,尖顶刺破灰蓝色的天空,墙壁爬满藤蔓,散发着神秘与沧桑的气息。阳光透过树叶洒下斑驳光影,营造出一种静谧而略带忧郁的氛围。

生成的图片:

image.gif

  • 案例4

image.gif

关键词:高楼, 暴雪, 赛博朋克

生成的文案:高楼在暴雪中闪烁着冷艳的霓虹光芒,赛博朋克风格的灯光在白色雪花中投下斑斓的光影。街道上行人稀少,穿着厚重羽绒服的影子在闪烁的广告屏下匆匆而过。巨大的全息投影在空中浮现,模糊的数字代码在风雪中若隐若现,整个城市仿佛被冻结在未来的梦境之中。

生成的图片:

image.gif


六、总结

       为了获得最佳效果,我们也应该掌握一些实用技巧:在关键词选择时,尽量选择相关性强、具体的词汇;在提示词生成后,可以适当编辑优化;对于图像生成,可以尝试不同的风格参数组合。

       代码性能方面,通过合理的API调用策略和缓存机制,可以优化提高响应速度。同时,还应该了解各种参数对生成结果的影响,以便更好地控制输出质量。

       随着AI技术的不断发展,这一领域仍有巨大提升空间。未来的版本可能会支持更复杂的提示词结构、更精细的风格控制、更快的生成速度。同时,应用场景也将进一步扩展,可能涵盖视频生成、3D模型创建等更复杂的视觉内容生产。

       Qwen-Turbo与Qwen-Image的组合不仅是一次思维的风暴,也是AI内容创作的实际落地。双模型架构不仅技术先进,更重要的是实用性强,能够真正解决实际创作中的痛点。        

相关文章
|
25天前
|
存储 人工智能 自然语言处理
构建AI智能体:十八、解密LangChain中的RAG架构:让AI模型突破局限学会“翻书”答题
本文深入探讨了如何利用LangChain框架实现RAG(检索增强生成)架构,构建智能问答系统。文章首先介绍了RAG技术解决大模型知识更新和准确性问题的原理,以及LangChain作为开发框架提供的模块化组件。详细解析了LangChain的核心模块(模型、提示、索引、链等)和四种ChainType(stuff、map_reduce、refine、map_rerank)的特点与适用场景。通过一个完整的代码示例,展示了如何结合DeepSeek模型和FAISS向量数据库处理PDF文档,实现本地知识库问答功能
301 9
|
19天前
|
机器学习/深度学习 人工智能 API
构建AI智能体:二十四、RAG的高效召回方法论:提升RAG系统召回率的三大策略实践
本文探讨了检索增强生成(RAG)系统中的高效召回技术。RAG系统通过检索相关文档增强大语言模型的回答质量,但性能受制于垃圾进,垃圾出原则。为提高召回效果,文章重点分析了三种方法:Small-to-Big通过大小文本块映射兼顾检索精度与上下文丰富度;索引扩展(如HyDE)利用大模型生成假设文档来优化检索;双向改写弥合用户查询与文档表述的差异。这些方法从不同角度解决了RAG系统中的语义鸿沟、词汇不匹配等核心问题,可单独或组合使用。高效召回技术能显著提升RAG系统的回答质量和效率。
208 5
|
20天前
|
存储 人工智能 自然语言处理
构建AI智能体:二十三、RAG超越语义搜索:如何用Rerank模型实现检索精度的大幅提升
本文介绍了重排序(Rerank)技术在检索增强生成(RAG)系统中的应用。Rerank作为初始检索和最终生成之间的关键环节,通过交叉编码器对初步检索结果进行精细化排序,筛选出最相关的少量文档提供给大语言模型。相比Embedding模型,Rerank能更精准理解查询-文档的语义关系,显著提高答案质量,降低Token消耗。文章详细比较了BGE-Rerank和CohereRerank等主流模型,并通过代码示例展示了Rerank在解决歧义查询(如区分苹果公司和水果)上的优势。
325 5
|
23天前
|
人工智能 JSON API
构建AI智能体:二十、妙笔生花:Gradio集成DashScope Qwen-Image模型实现文生图
本文介绍了一个基于Gradio和阿里云通义千问Qwen-Image模型的文生图应用。该应用通过简洁的Web界面实现文本生成图像功能,支持多种风格(3D卡通、动漫、油画等)和尺寸选择,并包含负面提示词功能。文章详细解析了代码结构,包括API调用封装、参数映射、错误处理等核心功能模块,同时提供了丰富的示例提示词和生成效果展示。该工具适合探索AI图像生成能力,通过调整提示词和参数可优化生成效果。
398 3
|
2月前
|
人工智能
实训Agent创客:一键生成电商场景Agent
在阿里云百炼一键生成电商场景Agent,轻松帮您搞定商品展示图片、视频。快来参与活动任务吧!
346 2
|
26天前
|
存储 人工智能 自然语言处理
构建AI智能体:十七、大模型的幻觉难题:RAG 解决AI才华横溢却胡言乱语的弊病
RAG(检索增强生成)是一种结合信息检索与大型语言模型的技术,旨在解决LLM的幻觉问题。其核心流程包括:离线处理阶段(知识库构建)和在线处理阶段(用户查询应答)。通过将外部知识源转换为向量存入数据库,当用户提问时,系统会检索相关内容并增强提示,再由LLM生成准确答案。RAG技术显著提升了AI在专业领域的可靠性,适用于智能客服、企业知识管理、内容创作等场景。尽管面临检索精度、多模态处理等挑战,RAG仍是AI实用化的重要突破方向。
251 2
|
2月前
|
人工智能 测试技术 API
构建AI智能体:二、DeepSeek的Ollama部署FastAPI封装调用
本文介绍如何通过Ollama本地部署DeepSeek大模型,结合FastAPI实现API接口调用。涵盖Ollama安装、路径迁移、模型下载运行及REST API封装全过程,助力快速构建可扩展的AI应用服务。
640 6
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
构建AI智能体:十三、大数据下的“搭积木”:N-Gram 如何实现更智能的语义搜索
N-gram是一种基于上下文的统计语言模型,通过前N-1个词预测当前词的概率,广泛应用于文本生成、输入法预测、语音识别等领域,具有简单高效、可解释性强的优点,是自然语言处理的基础技术之一。
283 10
|
2月前
|
存储 机器学习/深度学习 人工智能
构建AI智能体:三、Prompt提示词工程:几句话让AI秒懂你心
本文深入浅出地讲解Prompt原理及其与大模型的关系,系统介绍Prompt的核心要素、编写原则与应用场景,帮助用户通过精准指令提升AI交互效率,释放大模型潜能。
450 5
|
1月前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:十、开箱即见 Gradio:大模型的“魔法画布”,让每一个想法清晰可见
Gradio是一个快速构建机器学习演示界面的Python库,能够将需要数天开发工作的模型展示缩短为几分钟的脚本编写。它通过简单的Python代码即可生成完整的Web应用界面,支持文本、图像、音频等多种交互组件,适用于模型展示、教学演示和原型测试等场景。文章详细介绍了Gradio的核心功能、基础语法和组件使用方法,并通过情感分析和聊天机器人两个实际案例展示了如何快速部署AI模型交互界面。Gradio大幅降低了将模型转化为可交互应用的门槛,使开发者能更专注于模型本身而非界面开发。
447 7