所有文章 > API生命周期 > 使用OpenAI API时的成本控制
使用OpenAI API时的成本控制

使用OpenAI API时的成本控制

OpenAI API 提供了一种强大的方式,将大语言模型LLM)的功能集成到应用程序中。然而,频繁使用可能导致成本迅速上升。本文将探讨一些有效的成本管理策略,帮助您在实现预期效果的同时,控制开支。


注意成本管理

管理 OpenAI API 使用成本的第一步是随时了解您的使用情况。OpenAI 提供的仪表板在 使用 选项卡下,详细展示了每日 API 调用次数、消耗的代币(tokens)以及相关成本。通过定期监控这些数据,您可以识别潜在的浪费并采取措施减少不必要的开支。


清点代币使用情况

了解代币的使用情况是控制成本的关键。以下是一个 Python 示例代码,用于计算输入文本的代币数量:

import tiktoken

def get_number_of_tokens(prompt_text, model_name):

# 获取模型的编码方式
 encoding = tiktoken.encoding_for_model('gpt-4o-mini')

# 将文本编码为代币列表
 list_of_tokens = encoding.encode(prompt_text)
 return len(list_of_tokens)

注意隐藏代币

  1. 函数调用
    使用 OpenAI API 时,所有函数名称、描述和额外参数都会计入输入代币。如果使用多个函数,累积的代币使用量可能会显著增加。OpenAI 提供了 代码示例 来帮助统计这些输入代币。

  2. 内存机制
    像 LangChain 这样的框架通常内置内存机制,会收集先前调用的上下文信息。这些上下文虽然有助于提高模型的连贯性,但也会增加代币使用量。为了控制成本,可以通过 缓冲摘要选择性保留 等策略来管理内存。

  3. 推理代币
    新一代模型(如 gpt-4o 和 gpt-4o-mini)会使用内部推理代币。这些代币虽然不会出现在用户的输出中,但仍然会计入成本。

检查实际使用数据

API 调用的使用数据可以提供详细的成本分解,包括输入代币、缓存代币和推理代币。以下是一个示例代码:

def create_chat_completion_object(query):
 response = client.chat.completions.create(
 model="gpt-4o-mini",
 messages=[
 {"role": "system", "content": "You are a helpful assistant."},
 {"role": "user", "content": f"{query}"}
 ],
 )
 return response

# 示例调用
chat_object = create_chat_completion_object("What is the capital of India?")
print('Response:', chat_object.choices[0].message.content)
print('Usage:', chat_object.usage)

输出示例:

Response: The capital of India is New Delhi.
Usage: CompletionUsage(completion_tokens=8, prompt_tokens=24, total_tokens=32)

使用缓存优化成本

缓存是一种强大的功能,可以优化涉及大上下文的 API 调用。例如,当需要对一篇长文进行多次提问时,可以通过缓存复用初始上下文,从而降低成本。

缓存的工作原理

  • 缓存适用于长度超过 1024 个代币 的上下文。
  • 匹配的代币段以 128 个代币为单位 进行比较。
  • 缓存代币的费用为标准输入代币成本的 50%

注意事项:

  • 一旦文本偏离缓存结果,剩余代币将按常规输入代币收费。
  • 缓存数据在 5-10 分钟的非活动时间 内保持有效。

更多详情请参考 OpenAI 的 Prompt Caching 指南


使用批处理降低成本

批处理允许您同时发送多个请求,从而显著降低每次请求的成本。OpenAI 对批处理任务的输入和输出代币提供 50% 的折扣

应用场景

  1. 批量嵌入(Batch Embedding)
    适用于大规模数据的高效处理。具体优化指南可以参考 批量嵌入教程

  2. 批量聊天请求(Batch Chat Requests)
    使用 OpenAI 的框架,可以高效处理批量聊天任务。更多信息请参考 OpenAI 的 批处理指南


限制输入代币:上下文过滤

在处理大文本时,许多信息可能是无关的,直接使用会增加成本并降低性能。以下是两种常见的上下文过滤策略:

  1. 基于嵌入的过滤

    • 将文本分割为小块。
    • 使用嵌入模型生成每个块和查询的嵌入。
    • 比较嵌入以识别与查询最相关的块。
    • 仅将相关块组装为上下文。
  2. 基于廉价模型的判断过滤

    • 使用较便宜的模型(如 gpt-4o-mini)评估每个块是否与查询相关。
    • 仅保留相关块,并将其传递给更强大的模型。

限制输出代币:结构化输出

输出代币的成本是输入代币的三倍,因此减少输出代币是优化成本的关键。通过结构化输出,可以确保 API 仅生成所需的信息,从而避免不必要的代币浪费。

结构化输出的应用场景

  1. 分类/验证任务
    当需要对数据进行分类或验证时,结构化输出可以减少冗余代币。

  2. 数据提取
    如果目标是提取特定信息(如数值),结构化输出可以确保仅返回所需数据。

  3. 模型链式调用
    在多步骤流程中,结构化输出可以确保输出的兼容性并减少开销。

以下是一个使用结构化输出的示例代码:

from pydantic import BaseModel

class custom_output(BaseModel):
 a: list[bool]

completion = client.beta.chat.completions.parse(
 model="gpt-4o-mini",
 messages=[
 {"role": "system", "content": "You will receive a list of animals, for each animal return True if they are a mammal, else return False, output as a list of booleans nothing else."},
 {"role": "user", "content": "Lion, Eagle, Dolphin, Crocodile, Elephant, Snake, Kangaroo, Frog, Tiger, Penguin, Whale, Shark, Giraffe, Octopus, Bear, Turtle, Deer, Lizard, Rabbit, Butterfly"}
 ],
 response_format=custom_output,
)

result = completion.choices[0].message.parsed
print(result.a)
print(completion.usage)

输出示例:

[True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False]
CompletionUsage(completion_tokens=24, prompt_tokens=138, total_tokens=162)

通过以上策略,您可以有效地管理 OpenAI API 的使用成本,同时确保实现预期的功能和性能。


原文链接: https://medium.com/@mikehpg/controlling-cost-when-using-openai-api-fd5a038fa391
#你可能也喜欢这些API文章!

我们有何不同?

API服务商零注册

多API并行试用

数据驱动选型,提升决策效率

查看全部API→
🔥

热门场景实测,选对API

#AI文本生成大模型API

对比大模型API的内容创意新颖性、情感共鸣力、商业转化潜力

25个渠道
一键对比试用API 限时免费

#AI深度推理大模型API

对比大模型API的逻辑推理准确性、分析深度、可视化建议合理性

10个渠道
一键对比试用API 限时免费