共计 2871 个字符,预计需要花费 8 分钟才能阅读完成。
背景与痛点
随着 AI 大模型在各类应用中的广泛使用,Token 计费已成为开发者必须面对的挑战之一。Token 作为大模型 API 调用的基本计费单位,其消耗量直接关系到成本控制。然而,手动记录和管理 Token 使用情况存在诸多弊端:

- 人工记录容易出错,难以保证数据的准确性
- 频繁的 API 调用导致数据量庞大,手动处理效率低下
- 缺乏实时监控,难以及时发现异常消耗
- 账单格式不统一,不利于财务对账和管理
技术选型
在构建自动化账单截图系统时,我们对比了几种主流方案:
- 纯文本账单 :简单但可视化效果差,不利于快速查看
- PDF 生成 :格式统一但生成速度较慢,不适合高并发场景
- HTML+ 截图 :灵活性强,可定制化程度高,生成速度快
综合考虑后,我们选择了 Python+OpenCV 的方案,原因在于:
- Python 生态系统丰富,有成熟的图像处理库
- OpenCV 性能优异,适合批量处理截图任务
- 整体方案轻量级,易于集成到现有系统中
核心实现
账单数据可视化
我们首先需要将原始 Token 使用数据转换为可视化的 HTML 模板:
from jinja2 import Template
def generate_html_bill(user_data):
"""生成 HTML 格式的账单"""
template_str = """
<html>
<head>
<title>Token Usage Bill</title>
<style>
body {font-family: Arial; margin: 20px;}
.header {color: #333; border-bottom: 1px solid #eee;}
.detail {margin-top: 15px;}
.total {font-weight: bold; margin-top: 10px;}
</style>
</head>
<body>
<div class="header">
<h2>AI 服务 Token 使用账单 </h2>
<p> 用户: {{user_id}} | 周期: {{period}}</p>
</div>
<div class="detail">
<p> 基础模型调用: {{base_model_tokens}} tokens</p>
<p> 高级模型调用: {{premium_model_tokens}} tokens</p>
<p> 其他服务: {{other_tokens}} tokens</p>
</div>
<div class="total">
<p> 总计: {{total_tokens}} tokens</p>
<p> 费用估算: ${{estimated_cost}}</p>
</div>
</body>
</html>
"""
template = Template(template_str)
return template.render(**user_data)
截图功能实现
使用 OpenCV 进行截图前,我们需要先将 HTML 转换为图像:
import cv2
import numpy as np
from pyvirtualdisplay import Display
from selenium import webdriver
def html_to_image(html_content, output_path):
"""将 HTML 内容转换为图片"""
# 使用虚拟显示
display = Display(visible=0, size=(800, 600))
display.start()
# 配置浏览器选项
options = webdriver.ChromeOptions()
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
# 使用 Selenium 渲染 HTML
driver = webdriver.Chrome(options=options)
driver.get('data:text/html;charset=utf-8,' + html_content)
# 获取页面截图
screenshot = driver.get_screenshot_as_png()
driver.quit()
display.stop()
# 使用 OpenCV 处理图像
nparr = np.frombuffer(screenshot, np.uint8)
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
# 保存图像
cv2.imwrite(output_path, img)
return True
完整流程整合
将以上两个部分整合成完整的账单生成流程:
def generate_token_bill(user_data, output_path):
"""生成 Token 账单截图"""
try:
# 生成 HTML 账单
html_content = generate_html_bill(user_data)
# 转换为图片
success = html_to_image(html_content, output_path)
if success:
print(f"账单已成功生成并保存至: {output_path}")
return True
else:
print("账单生成失败")
return False
except Exception as e:
print(f"生成账单时出错: {str(e)}")
return False
性能优化
在高并发场景下,账单生成系统可能面临性能瓶颈。以下是几种优化策略:
- 异步处理 :使用 Celery 或 RQ 等任务队列,将账单生成任务放入后台处理
# Celery 任务示例
@app.task
def async_generate_bill(user_data, output_path):
return generate_token_bill(user_data, output_path)
-
缓存机制 :对相同参数的账单请求,直接返回缓存结果
-
资源池 :维护浏览器实例池,避免频繁创建销毁
-
批量处理 :对多个账单请求进行合并处理
安全考量
账单数据涉及财务信息,必须确保安全:
- 数据传输 :使用 HTTPS 加密通信
- 存储加密 :对敏感字段进行加密存储
- 访问控制 :实现基于角色的访问权限系统
- 日志审计 :记录所有账单访问操作
避坑指南
在实际部署中,我们遇到了以下问题及解决方案:
- 中文字符显示异常
-
解决方案:确保 HTML 模板指定 UTF- 8 编码
-
截图不完整
-
解决方案:调整浏览器窗口大小,确保所有内容可见
-
内存泄漏
-
解决方案:正确关闭浏览器实例和虚拟显示
-
并发限制
- 解决方案:限制同时进行的截图任务数量
总结与展望
本文介绍了基于 Python 和 OpenCV 的 AI 大模型 Token 账单截图系统的完整实现方案。从技术选型到具体实现,再到性能优化和安全考量,我们覆盖了一个生产级系统需要考虑的主要方面。
值得思考的是,随着 AI 服务的复杂化,单纯的 Token 计数可能不足以反映真实的资源消耗。未来的计费系统可能需要考虑:
- 不同模型层级的差异化计费
- 实时消耗预警机制
- 更细粒度的使用分析报表
- 与财务系统的深度集成
你认为还有哪些功能可以完善这个计费监控系统?如何平衡功能的丰富性和系统的简洁性?欢迎分享你的想法。
