跳到内容

成本分析#

概念#

每次调用 LLM 都将花费一定的费用——例如,OpenAI 的 gpt-3.5-turbo 每 1k token 花费 $0.002。构建索引和查询的成本取决于

  • 使用的 LLM 类型
  • 使用的数据结构类型
  • 构建时使用的参数
  • 查询时使用的参数

构建和查询每个索引的成本是参考文档中的 TODO。在此期间,我们提供以下信息:

  1. 索引成本结构的高级概述。
  2. 一个可以直接在 LlamaIndex 中使用的 token 预测器!

成本结构概述#

无 LLM 调用的索引#

以下索引在构建期间完全不需要 LLM 调用(0 成本)

  • SummaryIndex
  • SimpleKeywordTableIndex - 使用正则表达式关键字提取器从每个文档中提取关键字
  • RAKEKeywordTableIndex - 使用 RAKE 关键字提取器从每个文档中提取关键字

有 LLM 调用的索引#

以下索引在构建时需要 LLM 调用

  • TreeIndex - 使用 LLM 分层总结文本以构建树
  • KeywordTableIndex - 使用 LLM 从每个文档中提取关键字

查询时间#

在查询时总是会有 >= 1 次 LLM 调用,以便合成最终答案。一些索引在索引构建和查询之间存在成本权衡。例如,SummaryIndex 构建是免费的,但对 SummaryIndex 运行查询(不进行过滤或嵌入查找)将调用 LLM {math}N 次。

以下是关于每个索引的一些说明

  • SummaryIndex: 默认情况下需要 {math}N 次 LLM 调用,其中 N 是节点的数量。
  • TreeIndex: 默认情况下需要 {math}\log (N) 次 LLM 调用,其中 N 是叶节点的数量。
  • child_branch_factor 设置为 2 将比默认值 1 更昂贵(多项式 vs 对数),因为对于每个父节点,我们遍历 2 个子节点而不是 1 个。
  • KeywordTableIndex: 默认情况下需要 LLM 调用来提取查询关键字。
  • 可以使用 index.as_retriever(retriever_mode="simple")index.as_retriever(retriever_mode="rake") 在查询文本上使用正则表达式/RAKE 关键字提取器。
  • VectorStoreIndex: 默认情况下,每次查询需要一次 LLM 调用。如果您增加 similarity_top_kchunk_size,或者更改 response_mode,则此数字会增加。

使用模式#

LlamaIndex 提供了 token 预测器,用于预测 LLM 和嵌入调用的 token 使用量。这使您能够在进行任何 LLM 调用之前估算 1) 索引构建和 2) 索引查询的成本。

Token 使用 TokenCountingHandler 回调进行计数。有关设置的详细信息,请参阅示例 notebook

使用 MockLLM#

要预测 LLM 调用的 token 使用量,请按如下所示导入并实例化 MockLLM。max_tokens 参数用作“最坏情况”预测,其中每个 LLM 响应都将包含精确数量的 token。如果未指定 max_tokens,则它只会预测返回提示。

from llama_index.core.llms import MockLLM
from llama_index.core import Settings

# use a mock llm globally
Settings.llm = MockLLM(max_tokens=256)

然后,您可以在索引构建和查询期间使用此预测器。

使用 MockEmbedding#

您还可以使用 MockEmbedding 预测嵌入调用的 token 使用量。

from llama_index.core import MockEmbedding
from llama_index.core import Settings

# use a mock embedding globally
Settings.embed_model = MockEmbedding(embed_dim=1536)

使用模式#

阅读完整使用模式了解更多详情!