本文属于【Azure 架构师学习笔记】系列
本文属于【Azure AI】系列
接上文 【Azure 架构师学习笔记 】- Azure AI(11)-Azure OpenAI(2)-进阶demo

前言

前两篇教程,我们已经完成了 Azure OpenAI GPT-4o Mini 的「基础Demo调用」和「进阶实操」(提示工程+多轮对话),成功打通从本地环境到Azure云端的全链路。
本章聚焦 费用管控 和 全维度监控 —— 这是进阶最容易忽略、但实操中必不可少的一步。介绍如何精准监控Token消耗、控制费用、设置告警,彻底避免“免费额度耗尽不知情”“付费订阅超额扣费”的坑。

基础知识点:

  1. 查看模型费用:可以通过下面网址,或者从foundry的模型页面查看:
    Foundry Models pricing
    在这里插入图片描述
  2. 多轮对话、长文本提问会导致Token消耗翻倍,进而增加费用,需重点监控。
  3. Token计算规则——1个中文汉字≈1个Token,1个英文单词≈1个Token,空格、标点不计入Token统计,可大致估算每次调用的消耗。

实操1 代码层监控

代码层监控是“实时提醒”,适合在实操中快速了解每次调用的消耗和花费,可直接嵌入前两篇的基础Demo、多轮对话代码。

1. 基础版:单次调用监控(基础Demo)

封装Token+费用监控函数,调用模型后自动输出消耗和花费,直接复制替换你基础Demo的调用部分即可:

from openai import AzureOpenAI

# 基础初始化(替换成你的信息,和前两篇一致)
client = AzureOpenAI(
    azure_endpoint="https://你的资源名.openai.azure.com/",
    api_key="你的Key",
    api_version="2024-08-01-preview" #从endpoint中获取
)
DEPLOYMENT_NAME = "你的部署名"  # 从Azure AI Foundry复制的部署名

# 核心:Token+费用监控函数
def monitor_token_cost(response):
    # 1. 提取Token消耗数据(从模型响应中获取,精准无误差)
    prompt_tokens = response.usage.prompt_tokens  # 输入Token(你的提问)
    completion_tokens = response.usage.completion_tokens  # 输出Token(模型回复)
    total_tokens = response.usage.total_tokens  # 单次总消耗Token
    
    # 2. 计算单次调用费用
    prompt_cost = (prompt_tokens / 1000) * 0.00015  # 输入费用(美元)
    completion_cost = (completion_tokens / 1000) * 0.0006  # 输出费用(美元)
    total_cost = prompt_cost + completion_cost  # 单次总花费
    
    # 3. 直观输出监控信息
    print("\n===== Token+费用监控 ======")
    print(f"输入Token:{prompt_tokens} | 输出Token:{completion_tokens}")
    print(f"单次总消耗Token:{total_tokens}")
    print(f"输入费用:${prompt_cost:.6f} | 输出费用:${completion_cost:.6f}")
    print(f"单次调用总花费:${total_cost:.6f}")
    print("==========================\n")
    
    return total_tokens, total_cost

# 测试:基础Demo调用+监控
response = client.chat.completions.create(
    model=DEPLOYMENT_NAME,
    messages=[
        {"role": "user", "content": "用30字介绍Azure OpenAI GPT-4o Mini的核心优势"}
    ]
)
# 输出模型回复
print("模型回复:", response.choices[0].message.content.strip())
# 调用监控函数,查看消耗和花费
monitor_token_cost(response)

在这里插入图片描述

2. 进阶版:多轮对话监控

在多轮对话中加入监控,不仅能查看单次调用花费,还能统计整个对话的总花费,避免长时间对话导致额度耗尽,代码可直接复制运行:

from openai import AzureOpenAI
import sys

# 基础初始化(不变)
client = AzureOpenAI(
    azure_endpoint="",  # 你的 Endpoint
    api_key="XXXX",# 你的 Key
    api_version=""
)
DEPLOYMENT_NAME = "你的部署名"

# 复用监控函数
def monitor_token_cost(response):
    prompt_tokens = response.usage.prompt_tokens
    completion_tokens = response.usage.completion_tokens
    total_tokens = response.usage.total_tokens
    prompt_cost = (prompt_tokens / 1000) * 0.00015
    completion_cost = (completion_tokens / 1000) * 0.0006
    total_cost = prompt_cost + completion_cost
    print("\n===== Token+费用监控 ======".encode('utf-8').decode('utf-8'))
    print(f"输入Token:{prompt_tokens} | 输出Token:{completion_tokens}".encode('utf-8').decode('utf-8'))
    print(f"单次总消耗Token:{total_tokens} | 单次总花费:${total_cost:.6f}".encode('utf-8').decode('utf-8'))
    print("==========================\n".encode('utf-8').decode('utf-8'))
    return total_tokens, total_cost

# 进阶:多轮对话+总花费统计
def multi_turn_chat_with_monitor(max_history=5):
    # 系统提示词用英文,避免中文编码冲突,同时保证功能正常
    messages = [{"role": "system", "content": "You are a professional Azure OpenAI assistant, answer concisely and professionally."}]
    total_all_tokens = 0  # 统计整个对话的总Token消耗
    total_all_cost = 0    # 统计整个对话的总花费
    # 中文输出统一做utf-8编码处理,无需依赖setdefaultencoding
    print("多轮对话已启动(实时监控费用),输入'exit'退出\n".encode('utf-8').decode('utf-8'))
    
    while True:
        user_input = input("你:".encode('utf-8').decode('utf-8'))
        if user_input.lower() == "exit":
            print(f"\n===== 对话总结 =====".encode('utf-8').decode('utf-8'))
            print(f"本次对话总Token消耗:{total_all_tokens}".encode('utf-8').decode('utf-8'))
            print(f"本次对话总花费:${total_all_cost:.6f}".encode('utf-8').decode('utf-8'))
            print("====================".encode('utf-8').decode('utf-8'))
            break
        
        # 加入历史上下文
        messages.append({"role": "user", "content": user_input})
        # 限制历史消息长度,节省额度和费用
        if len(messages) > max_history + 1:
            messages = [messages[0]] + messages[-max_history:]
        
        # 调用模型(无需额外处理,英文提示词已避免编码异常)
        response = client.chat.completions.create(
            model=DEPLOYMENT_NAME,
            messages=messages
        )
        
        # 提取回复并加入上下文
        assistant_reply = response.choices[0].message.content.strip()
        messages.append({"role": "assistant", "content": assistant_reply})
        print(f"GPT-4o Mini:{assistant_reply}\n".encode('utf-8').decode('utf-8'))
        
        # 累加总消耗和总花费
        single_tokens, single_cost = monitor_token_cost(response)
        total_all_tokens += single_tokens
        total_all_cost += single_cost

# 启动多轮对话
if __name__ == "__main__":
    multi_turn_chat_with_monitor()

在这里插入图片描述

实操2:云端监控

代码层监控是“实时提醒”,但无法主动告警,云端监控(Azure门户+Azure AI Foundry)是“兜底保障”,能设置额度告警、查看消耗明细,即使忘记查看代码输出,也能避免超额。

第一步:Azure AI Foundry 查看消耗明细(实时掌握每日/每周花费)

这里能精准查看Token消耗、费用明细,知道每一笔花费的来源(单次调用/多轮对话):

  1. 打开浏览器,访问 Azure AI Foundry:ai.azure.com,登录你的Azure账号;

  2. 左侧导航栏按照下图找到你要查看的模型:
    在这里插入图片描述

第二步:Azure门户 设置预算+告警(核心,避免超额)

这是最关键的一步,设置预算后,当费用达到阈值(比如剩余10%额度),会自动给你发送邮件/短信提醒,彻底避免额度耗尽不知情:

  1. 登录 Azure portal 搜索cost management;
  2. 配置预算:

在这里插入图片描述

  1. 设置告警:

在这里插入图片描述

进阶:费用优化技巧(减少消耗,延长额度使用时间)

监控的同时,我们可以通过简单的优化,减少Token消耗和费用,尤其适合免费订阅用户,延长额度使用时间,同时也是面试中“成本优化”的高频考点:

    1. 限制对话上下文长度:多轮对话中,通过max_history限制历史消息数量(建议5-8条),避免上下文过长导致Token消耗翻倍;
    1. 优化提示词:提示词简洁明了,避免冗余描述,减少输入Token消耗(比如“用30字介绍XXX”比“详细介绍XXX,越详细越好”更省Token);
    1. 限制模型回复长度:调用模型时,加入max_tokens参数,限制输出Token数量(比如max_tokens=100),避免模型回复过长;
    1. 避免频繁测试:测试时,尽量复用代码,避免重复调用模型,减少不必要的消耗。

小结

这一章主要展示了如何在成本上进行管理和监控。下一章继续尝试Azure OpenAI的其他功能。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐