给rwkv-pytorch 写个chat ui demo

在这里插入图片描述

rwkv-pytorch 项目地址

rwkv-pytorch

from nicegui import ui

message_dict = {1: [{"name":"Assistant","text":"你好"}]}
current_name = 1
import aiohttp


async def get_text_async(text="Hello, how are you?"):
    # 定义API的URL
    url = "http://127.0.0.1:8000/generate/"

    # 定义要发送的数据
    data = {"text": text}

    # 发送POST请求
    async with aiohttp.ClientSession() as session:
        async with session.post(url, json=data) as response:
            # 解析响应内容
            res = await response.json()
            print(res)
            return res["response"].split("\n\n")[1][11:]


async def send_message_async(text,name):
    # 获取输入文本
    input_text = text.value
    # 将响应消息添加到消息字典
    message_dict[current_name].append({"name": "User", "text": text.value})

    # 刷新聊天窗口
    chat_win_refresh.refresh()

    # 发送消息并等待响应
    response_text = await get_text_async(name+":"+input_text+"\n\nAssistant:")

    # 将响应消息添加到消息字典
    message_dict[current_name].append({"name":"Assistant","text":response_text})

    # 刷新聊天窗口
    chat_win_refresh.refresh()





def basic_left_layout():
    with ui.column():
        ui.label("这是设置")
        ui.label('I\'m a column')
        ui.label('I\'m a column')
        ui.label('I\'m a column')
        ui.label('I\'m a column')
        ui.label('I\'m a column')
        ui.label('I\'m a column')
        ui.label('I\'m a column')
        ui.label('I\'m a column')
        ui.label('I\'m a column')


@ui.refreshable
def chat_win_refresh():
    with ui.scroll_area().style("height: {}px; width: {}px;".format(500, 725)) as area:
        for history in message_dict[current_name]:
            if history["name"]=="User":
                ui.chat_message(history["text"],
                                name=history["name"],
                                stamp='now',
                                avatar='https://robohash.org/ui',sent=True).style("margin-right: 1px;margin-left: auto;")
            else:
                ui.chat_message(history["text"],
                                name=history["name"],
                                stamp='now',
                                avatar='https://robohash.org/ui', sent=False).style("margin-left: 1px;")

        area.scroll_to(percent=1)


def basic_right_layout_children():
    with ui.column().style("margin-top: 5px;"):
        with ui.card().style("width:780px; margin-top: 5px;"):
            chat_win_refresh()
        with ui.card().style("width:780px;"):
            with ui.row():
                text = ui.textarea(label='Text', placeholder='start typing').style("width:605px;")
                # button 可以是一个图片表示区别机器方可
                ui.button('Click me!', on_click=lambda: send_message_async(text,"User"))


def basic_main_layout():
    with ui.column().style("margin:auto;"):
        with ui.card().style("height: {}px; width: {}px;".format(60, 1016)):
            ui.label("I'm a card")
        with ui.row():
            with ui.card().style("height: {}px; width: {}px;margin-top: 25px;".format(725, 200)):
                with ui.scroll_area().style("height: {}px; width: {}px;".format(800, 200)):
                    basic_left_layout()
            # with ui.card().style("height: {}px; width: {}px;".format(1000, 800)):
            with ui.scroll_area().style("height: {}px; width: {}px;".format(1000, 816)):
                basic_right_layout_children()


basic_main_layout()
ui.run(host="127.0.0.1", port=808)

服务

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import torch
from src.model import RWKV_RNN
from src.sampler import sample_logits
from src.rwkv_tokenizer import RWKV_TOKENIZER

app = FastAPI()

# 定义请求体模型
class MessageRequest(BaseModel):
    text: str

# 定义响应体模型
class MessageResponse(BaseModel):
    response: str

# 初始化模型和分词器
def init_model():
    args = {
        'MODEL_NAME': 'weight/RWKV-x060-World-1B6-v2-20240208-ctx4096',
        'vocab_size': 65536,
        'device': "cpu",
        'onnx_opset': '12',
    }
    device = args['device']
    assert device in ['cpu', 'cuda', 'musa', 'npu']

    if device == "musa":
        import torch_musa
    elif device == "npu":
        import torch_npu

    model = RWKV_RNN(args).to(device)
    tokenizer = RWKV_TOKENIZER("asset/rwkv_vocab_v20230424.txt")
    return model, tokenizer, device

model, tokenizer, device = init_model()

# 生成文本的函数
def generate_text(input_text):
    # 设置续写的初始字符串和参数
    batch_size = 1
    TEMPERATURE = 2.5
    TOP_P = 0.1
    LENGTH_PER_TRIAL = 50

    encoded_input = tokenizer.encode([input_text] * batch_size)
    token = torch.tensor(encoded_input).long().to(device)
    state = torch.zeros(batch_size, model.state_size[0], model.state_size[1]).to(device)

    with torch.no_grad():
        token_out, state_out = model.forward_parallel(token, state)

    out = token_out[:, -1]

    for step in range(LENGTH_PER_TRIAL):
        token_sampled = sample_logits(out, TEMPERATURE, TOP_P)
        token = torch.cat((token, token_sampled.unsqueeze(1)), 1)
        with torch.no_grad():
            out, state = model.forward(token_sampled, state)

    decoded_sequences = tokenizer.decode(token.cpu().tolist())
    return decoded_sequences[-1]

# 定义路由
@app.post("/generate/", response_model=MessageResponse)
async def create_message(message_request: MessageRequest):
    try:
        response_text = generate_text(message_request.text)
        return MessageResponse(response=response_text)
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

# 运行FastAPI应用
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

简单的请求

import requests

# 定义API的URL
url = "http://127.0.0.1:8000/generate/"

# 定义要发送的数据
data = {"text": "你好,这是一个测试。"}

# 发送POST请求
response = requests.post(url, json=data)

# 打印响应内容
print(response.json()["response"])

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

统一SQL-支持CHAR和VARCHAR2 (size BYTE|CHAR)转换

统一SQL介绍 https://www.light-pg.com/docs/LTSQL/current/index.html 源和目标 源数据库:Oracle 目标数据库:Postgresql,TDSQL-MySQL,达梦8,LightDB-Oracle 操作目标 在Oracle中的CHAR和VARCHAR2数据类型&…

stm32二刷-GPIO

一 什么是 GPIO: GPIO(general porpose intput output), 通用输入输出端口 . 二 我们先认识芯片控制 GPIO 输出控制。 2.1LED 硬件原理如图: 当电流从这根电线流通, LED 亮。当电流不通过这根电线, LED 灭。 上面 PF** ,芯片电…

Windows下使用SDKMAN对JDK(Java)进行多版本管理

Windows下使用SDKMAN对JDK(Java)进行多版本管理 1.背景2.基于msys2工具2.1. msys2简介2.2. 安装与配置2.2. Windows环境变量配置参考2.3 结果确认 3. 基于WSL 1.背景 前端有nvm,python有miniconda,miniforge等,java呢?java在Linu…

【机器学习】Q-Learning算法:在序列决策问题中的实践与探索

在序列决策问题中的实践与探索 一、Q-Learning算法概述二、Q-Learning算法实例分析三、Q-Learning算法代码实现四、总结与展望 在人工智能领域,序列决策问题一直是一个核心挑战。面对复杂的环境和动态变化的状态,智能体如何做出最优决策,以达…

电动汽车充电站的最优选址定容(matlab程序)

0.代码链接 电动汽车充电站的最优选址定容(matlab程序)_电动汽车充电站配置程序资源-CSDN文库 1.简述 随着经济的快速发展,环境污染和能源紧缺问题越来越严重,电动汽车的出现可以起到保护环境,节约能源的作用。未来随着我国电动汽车数量的快速增加,充电…

OpenHarmony实战开发-如何视频弹幕功能。

介绍 本示例介绍如何使用ohos.danmakuflamemaster和ohos.gsyvideoplayer开发支持视频弹幕的播放器。可以自定义弹幕样式、占据屏幕宽度,发送弹幕,开关弹幕视图。 效果图预览 使用说明 点击播放按钮,进行视频播放,弹幕自动开启点…

Linux的学习之路:14、文件(1)

摘要 有一说一文件一天学不完,细节太多了,所以这里也没更新完,这里部分文件知识,然后C语言和os两种的文件操作 目录 摘要 一、文件预备 二、c文件操作 三、OS文件操作 1、系统文件I/O 2、接口介绍 四、思维导图 一、文件…

基于STM32实现流水灯【Proteus仿真】

详情更多 wechat:嵌入式工程师成长日记 https://mp.weixin.qq.com/s?__bizMzg4Mzc3NDUxOQ&mid2247485624&idx1&sn4e553234c2624777409bd2067a07aad8&chksmcf430de0f83484f6189b119d9d83ea6e6f2a85d13afaa04d218483918231c38e6382d3007061&tok…

nginx-ingress详解

一、ingress概述 1、概述 Kubernetes是一个拥有强大故障恢复功能的集群,当pod挂掉时,集群会重新创建一个pod出来,但是pod的IP也会随之发生变化,为了应对这种情况,引入了service,通过service的标签匹配&am…

aspx页面 ASP.NET Web Forms中的DropDownList添加搜索功能使用select2

.NET兼职社区 select2依赖jquery JS直接去官网下载&#xff1a;https://select2.org/getting-started/basic-usage或者https://www.bootcdn.cn/ <% Page Title"Home Page" Language"C#" MasterPageFile"~/Site.Master" AutoEventWireup&qu…

uniapp_微信小程序_预约时间组件的使用

一、官方文档 DatetimePicker 选择器 | uView 2.0 - 全面兼容 nvue 的 uni-app 生态框架 - uni-app UI 框架 (uviewui.com) 二、完成的效果 之前使用的是Calendar 日历 这个太耗性能了&#xff0c;直接页面卡顿&#xff0c;所以就换成以上选择器了 三、代码 <u-datetime-p…

Spring Boot集成fastdfs快速入门Demo

1.什么是fastdfs FastDFS 是一个开源的高性能分布式文件系统&#xff08;DFS&#xff09;。它的主要功能包括&#xff1a;文件存储&#xff0c;文件同步和文件访问&#xff0c;以及高容量和负载平衡。主要解决了海量数据存储问题&#xff0c;特别适合以中小文件&#xff08;建议…

UDP文件传输工具之UDP怎么限流

UDP&#xff08;用户数据报协议&#xff09;以其低延迟和高速度的特点&#xff0c;在实时应用和大数据传输中扮演着重要角色。然而&#xff0c;UDP作为一种无连接的协议&#xff0c;并不保证数据包的顺序、完整性或可靠性。 因此&#xff0c;企业在寻求一种方式&#xff0c;有…

PCA(Principal Component Analysis,主成分分析)与矩阵X的协方差矩阵之间的联系

PCA&#xff08;Principal Component Analysis&#xff0c;主成分分析&#xff09;是一种常用的降维技术&#xff0c;用于将高维数据集投影到低维空间中。在PCA中&#xff0c;投影方程将原始特征向量 ( x 1 , x 2 , … , x p ) (x_1, x_2, \ldots, x_p) (x1​,x2​,…,xp​)映射…

服务器基本故障和排查方法

前言 服务器运维工作中遇到的问题形形色色&#xff0c;无论何种故障&#xff0c;都需要结合具体情况&#xff0c;预防为主的思想&#xff0c;熟悉各种工具和技术手段&#xff0c;养成良好的日志分析习惯&#xff0c;同时建立完善的应急预案和备份恢复策略&#xff0c;才能有效…

45、二叉树-二叉树的右视图

思路 层序遍历 从左向右遍历每一层取最后一个数&#xff0c;代码如下&#xff1a; public List<Integer> rightSideView(TreeNode root) {if (rootnull){return new ArrayList<>();}Queue<TreeNode> queue new LinkedList<>();List<Integer> …

Unity 中(提示框Tweet)

using UnityEngine; using UnityEngine.UI; using DG.Tweening; using System; public class Message : MonoBehaviour {public float dropDuration 0.5f; // 掉落持续时间public float persisterDuration 1f; // 持续显示时间public float dorpHeight;public static Message…

鸿蒙系列--ArkTS

一、ArkUI开发框架 ArkUI框架提供开发者两种开发方式&#xff1a;基于ArkTS的声明式开发范式和基于JS扩展的类Web开发范式。声明式开发范式更加简洁&#xff0c;类 Web 开发范式对 Web 及前端开发者更友好 二、ArkTS声明式开发范式 对比类 Web 开发范式代码更为精简&#xf…

用FRP配置toml文件搭建内网穿透

需求场景 1、一台外网可访问的有固定ip的云服务器&#xff0c;Ubuntu系统 2、一台外网无法访问的无固定ip的本地家用电脑&#xff0c;Ubuntu系统 需求&#xff1a;将云服务器搭建为一台内网穿透服务器&#xff0c;实现通过外网访问家用电脑&#xff08;网页&#xff09;的功能。…

奇怪的 NRST 管脚异常复位问题

1. 引言 本文探讨一个奇怪的 MCU NRST 管脚异常复位现象。 2. 复位问题及排查 这个问题是客户对开发的平台做 EMS 浪涌测试的时候发生的&#xff0c; 平台上使用了一个STM32G474 RCT6 MCU 。在某个等级的 EMS 测试中&#xff0c; 客户发现 MCU 有时候会异常复位而影响平台的…
最新文章