利用 NIM 平台上的生成式 AI模型,根据描述生成图片

news2024/11/25 2:52:35

以下是一个使用 NIM 平台的生成式 AI模型构建的简单 demo。这个 demo 实现了文生图,通过解析用户需求来判断是否需要进行画图。这里使用 Python 和 FastAPI框架来搭建一个简单的 web 应用。

项目结构

work/

├── images/
├── chat.py
└── chat.html

安装依赖

pip install fastapi uvicorn openai

创建聊天应用

from openai import OpenAI
from fastapi import FastAPI, Query
import uvicorn
from fastapi.middleware.cors import CORSMiddleware
import requests, base64
from datetime import datetime
import json

invoke_url = "https://ai.api.nvidia.com/v1/genai/nvidia/consistory"
headers = {
    "Authorization": "Bearer 你的apikey",
    "Accept": "application/json",
}

def draw_image(subject_prompt, subject_tokens, style_prompt, scene_prompt1):
    print("subject_prompt=====",subject_prompt)
    print("subject_tokens=====",subject_tokens)
    print("style_prompt=====",style_prompt)
    print("scene_prompt1=====",scene_prompt1)
    payload = {
        "mode": 'init',
        "subject_prompt": subject_prompt,
        "subject_tokens": subject_tokens,
        "subject_seed": 43,
        "style_prompt": style_prompt,
        "scene_prompt1": scene_prompt1,
        "scene_prompt2": scene_prompt1,
        "negative_prompt": "",
        "cfg_scale": 5,
        "same_initial_noise": False
    }

    response = requests.post(invoke_url, headers=headers, json=payload)
    response.raise_for_status()

    data = response.json()
    current_time = datetime.now()
    img_base64 = data['artifacts'][0]["base64"]
    img_bytes = base64.b64decode(img_base64)
    fileName = f"imgs/{current_time}.jpg"
    with open(fileName, "wb") as f:
        f.write(img_bytes)
    # 返回图片链接,就是src
    return "https://abc/files/myWorkSapce/wordk1/" + fileName + "?_xsrf=2%7Cc6e76894%7Cfa2f2f15a513717ec5fe62cb04591a57%7C1728806376"

client = OpenAI(
  base_url = "https://integrate.api.nvidia.com/v1",
  api_key = "你的apikey"
)

img_template = """分析用户是否有关于画图的意向,如果有画图意向,则根据用户的描述按照下面的 json 格式进行输出,输出内容一定要满足json格式,输出内容不要有其它冗余:
'{
  "subject_prompt": 图片的主题(使用英文输出,一定要描述清楚,不要省略,比如“猫”),
  "subject_tokens": 图像的主题描述词汇,输出为数组格式[词汇, 词汇],使用英文输出,
  "style_prompt": 图像的风格,使用英文输出,
  "scene_prompt1": 场景描述,使用英文输出
}'
"""

app = FastAPI()
# 配置 CORS 中间件
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # 允许所有来源
    allow_credentials=True,  # 允许传递凭证(如 cookies)
    allow_methods=["*"],  # 允许所有 HTTP 方法
    allow_headers=["*"],  # 允许所有头部
)

def need_draw(json_str):
    # 解析 JSON 字符串
    try:
        json.loads(json_str)
        return True
    except json.JSONDecodeError:
        return False

@app.get("/get_answer")
async def get_answer(question: str = Query(..., description="输入的问题")):
    imageCompletion = client.chat.completions.create(
        model="meta/llama3-70b-instruct",
        messages=[{"role":"system","content":img_template},{"role":"user","content":question}],
        temperature=0.5,
        top_p=1,
        max_tokens=1024,
        stream=False
    )
    print("imageCompletion=====",imageCompletion)
    if need_draw(imageCompletion.choices[0].message.content):
        data = json.loads(imageCompletion.choices[0].message.content)
        # 获取 style_prompt 字段
        subject_prompt = data.get("subject_prompt")
        subject_tokens = data.get("subject_tokens")
        style_prompt = data.get("style_prompt")
        scene_prompt1 = data.get("scene_prompt1")
        return {"answer": draw_image(subject_prompt,subject_tokens,style_prompt,scene_prompt1), "isImage": True}
    else:
        completion = client.chat.completions.create(
            model="meta/llama3-70b-instruct",
            messages=[{"role":"system","content":"You are a helpful assistant, Communicate using Chinese."},{"role":"user","content":question}],
            temperature=0.5,
            top_p=1,
            max_tokens=1024,
            stream=True
        )
        answer = ""
        for chunk in completion:
            if chunk.choices[0].delta.content is not None:
                answer += chunk.choices[0].delta.content
        return {"answer": answer, "isImage": False}

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

HTML模板

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>聊天页面</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f4;
            margin: 0;
            padding: 0;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }
        .chat-container {
            width: 100%;
            max-width: 600px;
            background-color: #fff;
            border-radius: 8px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
            overflow: hidden;
        }
        .chat-header {
            background-color: #007bff;
            color: #fff;
            padding: 10px;
            text-align: center;
            font-size: 18px;
        }
        .chat-body {
            padding: 20px;
            height: 400px;
            overflow-y: auto;
            border-bottom: 1px solid #ddd;
        }
        .chat-message {
            margin-bottom: 10px;
        }
        .chat-message.user {
            text-align: right;
            color: #007bff;
        }
        .chat-message.bot {
            text-align: left;
            color: #333;
        }
        .chat-input {
            display: flex;
            padding: 10px;
        }
        .chat-input input {
            flex: 1;
            padding: 10px;
            border: 1px solid #ddd;
            border-radius: 4px;
            margin-right: 10px;
        }
        .chat-input button {
            padding: 10px 20px;
            background-color: #007bff;
            color: #fff;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        .chat-input button:hover {
            background-color: #0056b3;
        }
    </style>
</head>
<body>
    <div class="chat-container">
        <div class="chat-header">聊天页面</div>
        <div class="chat-body" id="chat-body">
            <!-- 聊天记录将在这里显示 -->
        </div>
        <div class="chat-input">
            <input type="text" id="user-input" placeholder="输入问题...">
            <button onclick="sendMessage()">发送</button>
        </div>
    </div>

    <script>
        function sendMessage() {
            const userInput = document.getElementById('user-input').value.trim();
            if (userInput === '') {
                alert('请输入问题');
                return;
            }

            // 显示用户消息
            const chatBody = document.getElementById('chat-body');
            const userMessage = document.createElement('div');
            userMessage.className = 'chat-message user';
            userMessage.textContent = userInput;
            chatBody.appendChild(userMessage);
            chatBody.scrollTop = chatBody.scrollHeight;

            // 清空输入框
            document.getElementById('user-input').value = '';

            // 发送请求获取回答
            fetch(`http://localhost:8001/get_answer?question=${encodeURIComponent(userInput)}`)
                .then(response => response.json())
                .then(data => {
                    if (data.isImage) {
                        const botMessage = document.createElement('img');
                        botMessage.src = data.answer;
                        botMessage.className = 'chat-message bot';
                        botMessage.width = 300;
                        botMessage.height = 200;
                        chatBody.appendChild(botMessage);
                        chatBody.scrollTop = chatBody.scrollHeight;
                    } else {
                        const botMessage = document.createElement('div');
                        botMessage.className = 'chat-message bot';
                        botMessage.textContent = data.answer;
                        chatBody.appendChild(botMessage);
                        chatBody.scrollTop = chatBody.scrollHeight;
                    }
                })
                .catch(error => {
                    console.error('Error:', error);
                    const errorMessage = document.createElement('div');
                    errorMessage.className = 'chat-message bot';
                    errorMessage.textContent = '无法获取回答,请稍后再试。';
                    chatBody.appendChild(errorMessage);
                    chatBody.scrollTop = chatBody.scrollHeight;
                });
        }
    </script>
</body>
</html>

运行应用

python chat.py

访问页面

在这里插入图片描述
在这里插入图片描述

总结

demo使用了模型meta / llama3-70b-instructnvidia / consistory,根据用户输入判断是否有作画意图,来判断是否调用文生图模型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2212295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PostgreSQL技术内幕14:从插件来看PG扩展性-FDW插件

文章目录 0.简介1.FDW介绍2.使用方式2.1 创建过程2.1.1 创建插件2.1.2 创建 Foreign Server2.1.3 创建 User Mapping(外部服务器映射&#xff0c;本地文件可以不需要&#xff09;2.1.4 创建外部表 2.2 查询流程 3.源码分析3.1 扩展接口分析3.2 和其他部分关联3.2.1 和计划的关联…

AI智能助理在企业内部的8大应用场景

一、概述 1.1 AI智能助理核心功能概览 1.2 AI智能助理业务应用价值 二、详解 AI智能助理在企业内部办公方向的应用可以极大地提高工作效率、优化流程&#xff0c;并为员工提供更加个性化的支持。以下是一些具体的业务场景&#xff1a; 日程管理和会议安排&#xff1a; 自动安…

现今 CSS3 最强二维布局系统 Grid 网格布局

深入学习 CSS3 目前最强大的布局系统 Grid 网格布局 Grid 网格布局的基本认识 Grid 网格布局: Grid 布局是一个基于网格的二位布局系统&#xff0c;是目前 CSS 最强的布局系统&#xff0c;它可以同时对列和行进行处理&#xff08;它将网页划分成一个个网格&#xff0c;可以任…

Java读取PDF后做知识库问答_SpringAI实现

​​​​​​​​​​​​​​ 核心思路&#xff1a; 简单来说&#xff0c;就是把PDF文件读取并向量化&#xff0c;然后放到向量存储里面&#xff0c;再通过大模型&#xff0c;来实现问答。 RAG&#xff08;检索增强生成&#xff09;介绍&#xff1a; 检索增强生成&#x…

UE5 猎户座漂浮小岛 02 模型 地形

UE5 猎户座漂浮小岛 02 模型 地形 1.模型 1.1 导入 1.2 统一模型比例 1.3 添加碰撞体 2.地形 2.1 地 2.2 山体 2.3 海洋 2.4 花草

特征提取:传统算法 vs 深度学习

特征提取&#xff1a;传统算法 vs 深度学习 特征点是图像中梯度变化较为剧烈的像素&#xff0c;比如&#xff1a;角点、边缘等。FAST&#xff08;Features from Accelerated Segment Test&#xff09;是一种高速的角点检测算法&#xff1b;而尺度不变特征变换SIFT&#xff08…

使用DataX同步hive数据到MySQL

目录 1、组件环境 2、安装datax 2.1、下载datax并解压 3、安装datax-web 3.0、下载datax-web的源码&#xff0c;进行编译 3.1、在MySQL中创建datax-web元数据 3.2、安装data-web 3.2.1执行install.sh命令解压部署 3.2.1、手动修改 datax-admin配置文件 3.2.2、手动修改…

【python实操】python小程序之文件操作的输出指定格式数据以及异常捕获

引言 python小程序之文件操作的输出指定格式数据以及异常捕获 文章目录 引言一、文件操作之输出指定格式JSON1.1 题目1.2 代码1.3 代码解释1.3.1 总结 二、异常2.1 概念2.1.1 基本语法2.1.1.1 try...except2.1.1.2 try...except...else2.1.1.3 try...except...finally2.1.1.4 t…

量化选股:原理与实战指南(二)

🌟作者简介:热爱数据分析,学习Python、Stata、SPSS等统计语言的小高同学~🍊个人主页:小高要坚强的博客🍓当前专栏:《Python之量化交易》🍎本文内容:量化选股:原理与实战指南(二)🌸作者“三要”格言:要坚强、要努力、要学习 目录 引言 一、价值类因子简介 …

position定位静态定位/绝对定位/相对定位

1.静态定位static&#xff1a;按照标准流进行布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>D…

基于springboot Vue3的两种图形验证码工具——vue3-puzzle-vcode纯前端防人机图形滑动验证码和kaptcha图片文字验证码

一.vue3-puzzle-vcode Vue 纯前端的拼图人机验证、右滑拼图验证 官网&#xff1a; vue3-puzzle-vcode - npm (npmjs.com)https://www.npmjs.com/package/vue3-puzzle-vcode 1.1基本使用步骤 安装 npm install vue-puzzle-vcode --save 简单例子 点击开始验证按钮弹出验证弹…

linux从入门到精通-从基础学起,逐步提升,探索linux奥秘(十一)--rpm管理和计划任务

linux从入门到精通-从基础学起&#xff0c;逐步提升&#xff0c;探索linux奥秘&#xff08;十一&#xff09;–rpm管理和计划任务 一、rpm管理&#xff08;重点&#xff09; 1、rpm管理 作用&#xff1a; rpm的作用类似于windows上的电脑管家中“软件管理”、安全卫士里面“…

【机器学习】集成学习|Boosting|随机森林|Adaboost|GBDT梯度提升树|XGBoost 极限梯度提升树 及案例实现

文章目录 集成学习集成学习思想概述集成学习分类Bagging 思想Boosting思想Bagging 和 Boosting 的对比 随机森林算法随机森林实现步骤随机森林算法apiAPI 代码实现 Adaboost 算法实现步骤整体过程实现 算法推导Adaboost 案例 葡萄酒数据 GBDT (梯度提升树)提升树 BDT (Boosting…

WPF 中的 StackPanel 详解

Windows Presentation Foundation&#xff08;WPF&#xff09;是微软开发的一种用于创建桌面客户端应用程序的用户界面框架。WPF 提供了一套丰富的控件和布局能力&#xff0c;使得开发者可以轻松构建出功能强大、视觉优美的用户界面。在 WPF 的布局系统中&#xff0c;StackPane…

Git上传命令汇总

进入企业&#xff0c;每日需要上传执行用例记录到gitlab平台上&#xff0c;本文记录了常用git上传命令&#xff0c; 并用github演示。 1、本地建立分支&#xff0c;克隆远程仓库 在gitlab中&#xff0c;每个人需要创建自己的分支&#xff0c;一般以自己的名字命名&#xff0c;…

新品牌Sesame Street《芝麻街》商标版权双维权,尚未TRO

案件基本情况起诉时间&#xff1a;2024-10-8案件号&#xff1a;24-cv-09713品牌&#xff1a;Sesame Street原告&#xff1a;Sesame Workshop原告律所&#xff1a;TME起诉地&#xff1a;伊利诺伊州北部法院品牌介绍Sesame Street《芝麻街》是美国公共广播协会&#xff08;PBS&…

5个IO控制20个LED灯的方案详解

工程师们经常为了节省一两个IO口想各种方案想到抠脑壳&#xff0c;今天给大家整点活儿&#xff0c;介绍一种超级节省IO口的LED灯控制方案。 5个IO口控制20个LED灯&#xff0c;而且可以对每个LED灯实现单独控制。电路结构如下&#xff1a; 注意一下这种电路网络&#xff0c;其…

ctf.bugku-baby lfi

题目来源&#xff1a;baby lfi - Bugku CTF平台 访问页面&#xff0c; 翻译解析&#xff1a;百度翻译-您的超级翻译伙伴&#xff08;文本、文档翻译&#xff09; (baidu.com) LFI Warmups - 本地文件包含&#xff08;Local File Inclusion&#xff0c;简称LFI&#xff09; H…

【最新华为OD机试E卷-支持在线评测】喊7的次数重排(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…