前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Open WebUI 文本效率分析工具

Open WebUI 文本效率分析工具

作者头像
程序员 NEO
发布2025-03-07 09:10:19
发布2025-03-07 09:10:19
5000
代码可运行
举报
文章被收录于专栏:前端必修课前端必修课
运行总次数:0
代码可运行

当我们使用各类大语言模型生成内容时,你是否也好奇:这些模型到底有多"高效"?它们每秒能生成多少字?完成一段内容需要多长时间?内容量化指标如何?作为开发者,这些数据不仅满足我们的好奇心,更能帮助我们优化应用性能和用户体验。

今天,我要分享一个我为 Open WebUI 开发的实用小工具 —— 一个能够实时统计文本生成效率的 Python 函数。这个工具能够精确计算中英文混合文本的字符数,并提供生成速度、总字数等关键指标,帮助开发者更好地评估和优化 AI 模型性能。

核心功能一览

这个 Filter 类主要实现了三个核心指标的统计:

  1. 总字符数统计:区分统计中文字符、英文单词和标点符号
  2. 响应时间计算:精确到毫秒的内容生成耗时
  3. 文本生成速度:每秒生成的字符数,直观展示模型效率

代码实现详解

首先,让我们看看整个函数的基本结构:

代码语言:javascript
代码运行次数:0
复制
from pydantic import BaseModel, Field
from typing import Optional, Callable, Any, Awaitable
import re
import time
from open_webui.utils.misc import get_last_assistant_message

def count_characters(text: str) -> int:
    chinese_chars = re.findall(r"[\u4e00-\u9fff]", text)
    english_words = re.findall(r"\b\w+\b", text)
    punctuation_marks = re.findall(r"[^\w\s]", text)

    total_count = len(chinese_chars) + len(english_words) + len(punctuation_marks)
    return total_count

class Filter:
    class Valves(BaseModel):
        priority: int = Field(default=5, description="过滤器操作的优先级")
        elapsed_time: bool = Field(default=True, description="启用以获取高级统计信息")
        chars_no: bool = Field(default=True, description="显示总字数")
        chars_per_sec: bool = Field(default=True, description="显示每秒字数")

    def __init__(self):
        self.valves = self.Valves()
        self.start_time = None

    def inlet(self, body: dict):
        self.start_time = time.time()
        return body

    asyncdef outlet(
        self,
        body: dict,
        __event_emitter__: Callable[[Any], Awaitable[None]],
        __model__: Optional[dict] = None,
    ) -> dict:
        end_time = time.time()
        elapsed_time = end_time - self.start_time
        response_message = get_last_assistant_message(body["messages"])
        chars = count_characters(response_message)  
        chars_per_sec = chars / elapsed_time
        stats_array = []

        if self.valves.chars_per_sec:
            stats_array.append(f"🚀{chars_per_sec:.2f}字/秒")
        if self.valves.chars_no:
            stats_array.append(f"📝{chars}字")
        if self.valves.elapsed_time:
            stats_array.append(f"⏱️{elapsed_time:.2f}秒")

        stats = " | ".join(stat for stat in stats_array)
        await __event_emitter__(
            {
                "type": "status",
                "data": {
                    "description": stats,
                    "done": True,
                },
            }
        )
        return body

字符计数的核心算法

这个函数最精妙的部分是它能同时处理中英文混合文本,针对不同语言特点采用不同的计数策略:

代码语言:javascript
代码运行次数:0
复制
def count_characters(text: str) -> int:
    chinese_chars = re.findall(r"[\u4e00-\u9fff]", text)
    english_words = re.findall(r"\b\w+\b", text)
    punctuation_marks = re.findall(r"[^\w\s]", text)

    total_count = len(chinese_chars) + len(english_words) + len(punctuation_marks)
    return total_count

在中国开发环境中,这种中英文混合文本的处理尤为重要。与只考虑英文字符的国外工具不同,这个函数针对中文场景进行了专门优化。

灵活的配置选项

函数内部使用 Pydantic 模型进行参数管理,让用户可以根据需要灵活开关不同的统计功能:

代码语言:javascript
代码运行次数:0
复制
class Valves(BaseModel):
    priority: int = Field(default=5, description="过滤器操作的优先级")
    elapsed_time: bool = Field(default=True, description="启用以获取高级统计信息")
    chars_no: bool = Field(default=True, description="显示总字数")
    chars_per_sec: bool = Field(default=True, description="显示每秒字数")

实时数据处理流程

整个数据处理分为输入和输出两个环节:

  1. 入口处理:记录开始时间,为后续计算做准备
  2. 出口处理:计算各项指标并格式化输出统计结果
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-02-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员 NEO 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 核心功能一览
  • 代码实现详解
    • 字符计数的核心算法
    • 灵活的配置选项
    • 实时数据处理流程
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档