当我们使用各类大语言模型生成内容时,你是否也好奇:这些模型到底有多"高效"?它们每秒能生成多少字?完成一段内容需要多长时间?内容量化指标如何?作为开发者,这些数据不仅满足我们的好奇心,更能帮助我们优化应用性能和用户体验。
今天,我要分享一个我为 Open WebUI 开发的实用小工具 —— 一个能够实时统计文本生成效率的 Python 函数。这个工具能够精确计算中英文混合文本的字符数,并提供生成速度、总字数等关键指标,帮助开发者更好地评估和优化 AI 模型性能。
这个 Filter 类主要实现了三个核心指标的统计:
首先,让我们看看整个函数的基本结构:
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
这个函数最精妙的部分是它能同时处理中英文混合文本,针对不同语言特点采用不同的计数策略:
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 模型进行参数管理,让用户可以根据需要灵活开关不同的统计功能:
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="显示每秒字数")
整个数据处理分为输入和输出两个环节: