ChatGLM流式输出的报错修复

news2025/2/27 14:26:19

 ChatGLM中的openai_api.py中的代码如下:

# coding=utf-8
# Implements API for ChatGLM2-6B in OpenAI's format. (https://platform.openai.com/docs/api-reference/chat)
# Usage: python openai_api.py
# Visit http://localhost:8000/docs for documents.


import time
import torch
import uvicorn
from pydantic import BaseModel, Field
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from contextlib import asynccontextmanager
from typing import Any, Dict, List, Literal, Optional, Union
from transformers import AutoTokenizer, AutoModel
from sse_starlette.sse import ServerSentEvent, EventSourceResponse

@app.post("/v1/chat/completions", response_model=ChatCompletionResponse)
async def create_chat_completion(request: ChatCompletionRequest):
    global model, tokenizer

    if request.messages[-1].role != "user":
        raise HTTPException(status_code=400, detail="Invalid request")
    query = request.messages[-1].content

    prev_messages = request.messages[:-1]
    if len(prev_messages) > 0 and prev_messages[0].role == "system":
        query = prev_messages.pop(0).content + query

    history = []
    if len(prev_messages) % 2 == 0:
        for i in range(0, len(prev_messages), 2):
            if prev_messages[i].role == "user" and prev_messages[i+1].role == "assistant":
                history.append([prev_messages[i].content, prev_messages[i+1].content])

    if request.stream:
        generate = predict(query, history, request.model)
        return EventSourceResponse(generate, media_type="text/event-stream")

    response, _ = model.chat(tokenizer, query, history=history)
    choice_data = ChatCompletionResponseChoice(
        index=0,
        message=ChatMessage(role="assistant", content=response),
        finish_reason="stop"
    )

    return ChatCompletionResponse(model=request.model, choices=[choice_data], object="chat.completion")


async def predict(query: str, history: List[List[str]], model_id: str):
    global model, tokenizer

    choice_data = ChatCompletionResponseStreamChoice(
        index=0,
        delta=DeltaMessage(role="assistant"),
        finish_reason=None
    )
    chunk = ChatCompletionResponse(model=model_id, choices=[choice_data], object="chat.completion.chunk")
    yield "{}".format(chunk.json(exclude_unset=True, ensure_ascii=False))

    current_length = 0

    for new_response, _ in model.stream_chat(tokenizer, query, history):
        if len(new_response) == current_length:
            continue

        new_text = new_response[current_length:]
        current_length = len(new_response)

        choice_data = ChatCompletionResponseStreamChoice(
            index=0,
            delta=DeltaMessage(content=new_text),
            finish_reason=None
        )
        chunk = ChatCompletionResponse(model=model_id, choices=[choice_data], object="chat.completion.chunk")
        yield "{}".format(chunk.json(exclude_unset=True, ensure_ascii=False))


    choice_data = ChatCompletionResponseStreamChoice(
        index=0,
        delta=DeltaMessage(),
        finish_reason="stop"
    )
    chunk = ChatCompletionResponse(model=model_id, choices=[choice_data], object="chat.completion.chunk")
    yield "{}".format(chunk.json(exclude_unset=True, ensure_ascii=False))
    yield '[DONE]'



if __name__ == "__main__":
    tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True)
    model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).cuda()
    # 多显卡支持,使用下面两行代替上面一行,将num_gpus改为你实际的显卡数量
    # from utils import load_model_on_gpus
    # model = load_model_on_gpus("THUDM/chatglm2-6b", num_gpus=2)
    model.eval()

    uvicorn.run(app, host='0.0.0.0', port=8000, workers=1)

代码中使用了chunk.json,这个已经过时了, 

 测试代码:

import os

# import socket, socks
#
# socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 1080)
# socket.socket = socks.socksocket

import openai

openai.api_base = "http://localhost:8000/v1"
openai.api_key = "none"
response = openai.ChatCompletion.create(
    model="chatglm2-6b",
    messages=[
        {"role": "user", "content": "你好"}
    ],
    stream=True
)

for chunk in response:
    if hasattr(chunk.choices[0].delta, "content"):
        print(chunk.choices[0].delta.content, end="", flush=True)


运行会报错:

解决办法如下:

将所有的

chunk.json(exclude_unset=True, ensure_ascii=False)

改成

chunk.model_dump_json(exclude_unset=True)

再次启动,运行,则不会报错!!!

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

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

相关文章

为什么要学习python

Python 越来越火爆 Python 在诞生之初,因为其功能不好,运转功率低,不支持多核,根本没有并发性可言,在计算功能不那么好的年代,一直没有火爆起来,甚至很多人根本不知道有这门语言。 随着时代的…

MySQL常用命令02

今天主要总结下命令行模式下创建数据库、查看数据库以及删除的命令。 1.创建数据库的命令:CREATE DATABASE [IF NOT EXISTS] 数据库名称; 创建一个名为db_teaching的数据库 库已经创建成功,重复创建报错: 提示改数据库已经存在。 我们在创…

调整C / C ++编译器以在多核应用程序中获得最佳并行性能:第二部分

下面的图5.10 描述了此过程,该过程包括四个步骤:点击领取嵌入式物联网学习路线 1.表征应用程序。 2.优先进行编译器优化。 3.选择基准。 4.评估编译器优化的性能。 图5.10:编译器优化过程 使用编译器的优化始于 对应用程序的表征。此步骤…

Python 实训教学,更便捷的学生邀请及内容分发|ModelWhale 版本更新

中秋国庆假期结束,ModelWhale 又迎来了新一轮的版本更新,让我们调整好节奏,一起奔赴新的旅程! 本次更新中,ModelWhale 主要进行了以下功能迭代: 新增 一键邀请外部用户加入课程(团队版✓&#…

欢迎大家关注我的个人公众号-这个豆包有点粘

欢迎大家关注我的个人公众号-这个豆包有点粘 如果大家不嫌弃的话,可以帮忙关注一下公众号,谢谢大家,个人准备长期运营此账号,文章内容种类繁多,前端学习、时事新闻、心灵鸡汤、幽默段子,一定有一款适合你。…

【学习笔记】minIO分布式文件服务系统

MinIO 一、概述 1.1 minIO是什么? MinIO是专门为海量数据存储、人工智能、大数据分析而设计的对象存储系统。(早前流行的还有FastDFS) 据官方介绍,单个对象最大可存储5T,非常适合存储海量图片、视频、日志文件、备…

培训考试系统如何满足个性化学习需求?

随着科技的不断发展,培训考试系统逐渐成为满足个性化学习需求的重要工具。个性化学习强调根据每个学员的特点和需求,量身定制学习内容和方式,提高学习效果和学习兴趣。 培训考试系统通过个性化内容推荐满足学员的学习需求。系统会根据学员的…

SELECT COUNT(*)会不会导致全表扫描引起慢查询

SELECT COUNT(*)会不会导致全表扫描引起慢查询呢? SELECT COUNT(*) FROM SomeTable 网上有一种说法,针对无 where_clause 的 COUNT(*),MySQL 是有优化的,优化器会选择成本最小的辅助索引查询计数,其实反而性能最高&…

支付宝企业转账到个人账号[新接口版](php源码,亲测)

前言 之前专栏写过一篇企业支付宝转账到个人的文章,里面用的是老接口,官方已经不再维护。最近有人找到帮忙使用新接口实现这个功能,看了下文档以及官方的sdk,为了这一个接口,我还要去下载官方庞大的sdk,而且php低版本的还不支持composer,就很离谱,经过一天的研究,把单…

科技为饮食带来创新,看AI如何打造智能营养时代

在当今社会,快节奏的生活方式、便捷的食品选择以及现代科技的快速发展正深刻地重塑着我们对健康的认知和实践,它已经不再仅仅是一个话题,而是一个备受关注的社会焦点。在这个纷繁复杂的交汇点上,AI技术的介入为我们开辟了前所未有…

项目管理包含哪些内容?

做好项目管理不是一件容易的事儿,只有掌握了正确的技巧,才能事半功倍地完成项目。 下面就按照项目管理的流程来讲一讲项目管理的主要内容包括哪些、如何做好项目管理。 项目管理是指运用系统的理论方法,在有限的条件和资源下,对…

Google SGE 正在添加人工智能图像生成器,现已推出:从搜索中的生成式 AI 中获取灵感的新方法

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

学信息系统项目管理师第4版系列25_项目绩效域(上)

1. 绩效评估是指以员工与组织的共同发展为目标,通过正式的结构化的制度或方法,评价和测量在一定的周期内团队或员工个人的工作行为和工作成果,全面了解员工的发展潜力 1.1. 【高23上选13】 2. 干系人绩效域 2.1. 涉及与干系人相关的活动和…

react native app开发环境搭建

Reactjs是一个响应式的、多场景的web前后端应用开发框架,react native是一种使用reactjs开发框架与native移动设备应用开发技术混合开发的技术,使用react native技术开发出的应用支持跨设备、多终端,本文主要描述react native开发环境搭建。 …

1.Cesium For Unity插件安装

1.Unity安装 先安装Unity Hub,然后在里面安装Unity。 2.新建工程 新建项目 选择项目类型 3. 导入Cesium包 打开新建的项目,在菜单栏选择Edit->Project Settings->Package Manager.并添加Cesium的包信息。 Name: Cesium URL: https://unity.pkg.cesium.com Sco…

CRM系统:快速实现外勤出差人员远程访问企业提升工作效率!

🎬 鸽芷咕:个人主页 🔥 个人专栏:《速学数据结构》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活! 文章目录 快速实现外勤出差人员远程访问企业CRM系统前言1. 无需公网IP,高效低成本实现CRM系统远程访问1.1 下…

推荐5款小众软件,感兴趣自行下载

​ 今天推荐5款十分小众的软件,知道的人不多,但是每个都是非常非常好用的,有兴趣的小伙伴可以自行搜索下载。 1.重复文件清理——Duplicate Cleaner ​ Duplicate Cleaner 是一款专业的重复文件清理工具,可以快速扫描电脑上的重…

【深度学习】DDPM,Diffusion,概率扩散去噪生成模型,原理解读

看过来看过去,唯有此up主,非常牛: Video Explaination(Chinese) 1. DDPM Introduction q q q - 一个固定(或预定义)的正向扩散过程,逐渐向图像添加高斯噪声,直到最终得到纯噪声。 p θ p_θ p…

JavaScript基础入门

javaScript基础知识 $的作用 如果在jquery框架里面的话它代表jquery本身。 其它时候它只是一个变量名,仅此而已。 比如 var $ function(id) { return document.getElementById(id); }; 那么现在 就代表一个函数了,直接 就代表一个函数了,直…

centos下安装elasticsearch-head

1、安装npm sudo yum install npm 2、下载elasticsearch-head cd /home/packages sudo git clone https://github.com/mobz/elasticsearch-head.git 3、将npm镜像换为国内镜像 npm config set registry http://registry.npm.taobao.org/ 4、安装phantomjs sudo npm install p…