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_keyyour-api-key) # 替换为你的API Key try: response client.chat.completions.create( modelgpt-4, messages[{role: user, content: 写一首关于AI的诗}] ) # 获取API返回的Token用量 usage response.usage log_usage( modelresponse.model, prompt_tokensusage.prompt_tokens, completion_tokensusage.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构建实时图表接下来我们用Flask和Plotly创建一个轻量级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, xhour, ytotal_tokens, colormodel, title按小时的Token消耗趋势, labels{hour: 时间, total_tokens: 总Token数}) chart1 fig1.to_html(full_htmlFalse) # 费用饼图 - 模型占比 cost_by_model df.groupby(model)[total_cost].sum().reset_index() fig2 px.pie(cost_by_model, valuestotal_cost, namesmodel, title各模型费用占比) chart2 fig2.to_html(full_htmlFalse) return chart1, chart2# 主页面模板HTML_TEMPLATE !DOCTYPE htmlhtmlhead titleLLM用量看板/title script srchttps://cdn.plot.ly/plotly-latest.min.js/script/headbody h1LLM API用量可视化看板/h1 p更新时间: {{ now }}/p div{{ chart1|safe }}/div div{{ chart2|safe }}/div/body/htmlapp.route(/)def dashboard(): df load_data() chart1, chart2 generate_charts(df) return render_template_string(HTML_TEMPLATE, chart1chart1, chart2chart2, nowdatetime.now())if __name__ __main__: app.run(debugTrue)代码解释-load_data()使用SQL按小时和模型聚合Token消耗与费用。-generate_charts()利用Plotly生成折线图和饼图并转换为HTML嵌入。- 通过Flask返回动态渲染的页面每次刷新从数据库读取最新数据。运行后你将看到如图表所示的看板可直观监控API使用情况。若数据量较大可优化为异步加载或使用数据库索引。### 进阶优化-实时流式处理若API调用频繁可使用Redis缓存写入再批量入库以避免数据库压力。-多维度分析增加用户ID、请求类型等字段支持按用户维度分摊成本。-告警机制当Token消耗超过阈值时通过邮件或Webhook发送通知。-成本优化结合模型选择策略如降级到GPT-3.5自动调整API调用。### 总结自建LLM用量可视化看板的核心在于在API调用层埋点采集细粒度数据存储到结构化数据库再通过聚合查询和图表库呈现。本文提供的两个代码示例分别覆盖了数据采集和可视化两大环节可直接运行并扩展。通过这种自建方案你不仅能摆脱对官方控制台的依赖还能实现按需定制如用户级计费、实时告警这对于管理多个项目或团队的成本尤为关键。后续系列将探讨如何结合流处理框架如Kafka实现高吞吐量场景下的用量监控敬请期待。