AI编程系列01:裸 API 账单场景下,如何自建 LLM 用量可视化看板

AI编程系列01:裸 API 账单场景下,如何自建 LLM 用量可视化看板

AI编程系列01:裸 API 账单场景下,如何自建 LLM 用量可视化看板

在AI应用开发中,直接调用OpenAI、Claude等大语言模型(LLM)的裸API(即未通过第三方平台封装)是一种常见场景。这类API通常按Token计费,但官方控制台可能仅提供基础的账单数据,缺乏细粒度的用量可视化(如按模型、时间段、用户维度的消耗趋势)。本文将深入剖析裸API账单数据的采集、存储与可视化原理,并提供可运行的代码示例,帮助你自建一套轻量级的LLM用量看板。### 原理剖析:从API调用到可视化看板裸API场景下的账单数据流通常如下:1.调用触发:每次LLM请求(如GPT-4的聊天补全)由客户端发起,请求中包含模型、输入Token数等信息。2.响应返回:API响应中通常会返回usage字段,包括prompt_tokens(输入Token数)、completion_tokens(输出Token数)和total_tokens。3.数据采集:需要在客户端或代理层拦截这些数据,并持久化到数据库(如SQLite、PostgreSQL)。关键字段包括时间戳、模型名、Token消耗、请求ID等。4.聚合计算:按时间(如小时、天)、模型等维度聚合Token消耗,并转换为费用(根据API定价公式)。5.可视化展示:使用图表库(如ECharts、Plotly)渲染趋势图、饼图等。核心挑战在于:官方API通常不提供细粒度的用量日志,你必须自建埋点。下面通过两个可运行的代码示例,分别演示数据采集和可视化看板的构建。### 数据采集:构建Token使用记录器首先,我们需要在调用LLM API时,自动记录每次请求的用量数据。以下是一个Python示例,使用openai库模拟调用,并将数据写入SQLite数据库。pythonimport sqlite3import timefrom datetime import datetimefrom openai import OpenAI # 需要安装: pip install openai# 初始化SQLite数据库def init_db(): conn = sqlite3.connect('llm_usage.db') cursor = conn.cursor() cursor.execute(''' CREATE TABLE IF NOT EXISTS usage_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, timestamp REAL, model TEXT, prompt_tokens INTEGER, completion_tokens INTEGER, total_tokens INTEGER, cost REAL ) ''') conn.commit() conn.close()# 记录单次API调用def log_usage(model, prompt_tokens, completion_tokens): total_tokens = prompt_tokens + completion_tokens # 示例定价:GPT-4每1K输入Token $0.03,输出Token $0.06 cost = (prompt_tokens / 1000) * 0.03 + (completion_tokens / 1000) * 0.06 conn = sqlite3.connect('llm_usage.db') cursor = conn.cursor() cursor.execute(''' INSERT INTO usage_log (timestamp, model, prompt_tokens, completion_tokens, total_tokens, cost) VALUES (?, ?, ?, ?, ?, ?) ''', (time.time(), model, prompt_tokens, completion_tokens, total_tokens, cost)) conn.commit() conn.close() return total_tokens# 模拟调用并记录def simulate_api_call(): client = OpenAI(api_key="your-api-key") # 替换为你的API Key try: response = client.chat.completions.create( model="gpt-4", messages=[{"role": "user", "content": "写一首关于AI的诗"}] ) # 获取API返回的Token用量 usage = response.usage log_usage( model=response.model, prompt_tokens=usage.prompt_tokens, completion_tokens=usage.completion_tokens ) print(f"记录成功: {datetime.now()}, 总Token数: {usage.total_tokens}") except Exception as e: print(f"调用失败: {e}")if __name__ == "__main__": init_db() # 模拟多次调用以生成数据 for _ in range(5): simulate_api_call() time.sleep(1) # 避免频率限制代码解释:-init_db()创建usage_log表,包含时间戳、模型名、各类型Token数和费用。-log_usage()根据定价公式计算费用(此处为示例,实际需根据API文档调整)。-simulate_api_call()调用OpenAI API并自动记录数据。此方法可扩展到任何LLM服务(如Claude、Gemini),只需调整定价公式和API调用方式。### 可视化看板:使用Python构建实时图表接下来,我们用FlaskPlotly创建一个轻量级Web看板,展示Token消耗趋势和费用分布。以下代码运行后将开启本地服务器,访问http://127.0.0.1:5000即可查看。pythonfrom flask import Flask, render_template_stringimport sqlite3import plotly.express as pximport pandas as pdfrom datetime import datetimeapp = Flask(__name__)# 从数据库读取聚合数据def load_data(): conn = sqlite3.connect('llm_usage.db') df = pd.read_sql_query(''' SELECT strftime('%Y-%m-%d %H', datetime(timestamp, 'unixepoch')) as hour, model, SUM(total_tokens) as total_tokens, SUM(cost) as total_cost FROM usage_log GROUP BY hour, model ORDER BY hour ''', conn) conn.close() return df# 生成HTML图表def generate_charts(df): # 时间序列趋势图 - 按模型分类 fig1 = px.line(df, x='hour', y='total_tokens', color='model', title='按小时的Token消耗趋势', labels={'hour': '时间', 'total_tokens': '总Token数'}) chart1 = fig1.to_html(full_html=False) # 费用饼图 - 模型占比 cost_by_model = df.groupby('model')['total_cost'].sum().reset_index() fig2 = px.pie(cost_by_model, values='total_cost', names='model', title='各模型费用占比') chart2 = fig2.to_html(full_html=False) return chart1, chart2# 主页面模板HTML_TEMPLATE = '''<!DOCTYPE html><html><head> <title>LLM用量看板</title> <script src="https://cdn.plot.ly/plotly-latest.min.js"></script></head><body> <h1>LLM API用量可视化看板</h1> <p>更新时间: {{ now }}</p> <div>{{ chart1|safe }}</div> <div>{{ chart2|safe }}</div></body></html>'''@app.route('/')def dashboard(): df = load_data() chart1, chart2 = generate_charts(df) return render_template_string(HTML_TEMPLATE, chart1=chart1, chart2=chart2, now=datetime.now())if __name__ == '__main__': app.run(debug=True)代码解释:-load_data()使用SQL按小时和模型聚合Token消耗与费用。-generate_charts()利用Plotly生成折线图和饼图,并转换为HTML嵌入。- 通过Flask返回动态渲染的页面,每次刷新从数据库读取最新数据。运行后,你将看到如图表所示的看板,可直观监控API使用情况。若数据量较大,可优化为异步加载或使用数据库索引。### 进阶优化-实时流式处理:若API调用频繁,可使用Redis缓存写入,再批量入库以避免数据库压力。-多维度分析:增加用户ID、请求类型等字段,支持按用户维度分摊成本。-告警机制:当Token消耗超过阈值时,通过邮件或Webhook发送通知。-成本优化:结合模型选择策略(如降级到GPT-3.5),自动调整API调用。### 总结自建LLM用量可视化看板的核心在于:在API调用层埋点采集细粒度数据,存储到结构化数据库,再通过聚合查询和图表库呈现。本文提供的两个代码示例分别覆盖了数据采集和可视化两大环节,可直接运行并扩展。通过这种自建方案,你不仅能摆脱对官方控制台的依赖,还能实现按需定制(如用户级计费、实时告警),这对于管理多个项目或团队的成本尤为关键。后续系列将探讨如何结合流处理框架(如Kafka)实现高吞吐量场景下的用量监控,敬请期待。