成本分析#
概念#
每次调用 LLM 都将花费一定的费用——例如,OpenAI 的 gpt-3.5-turbo 每 1k token 花费 $0.002。构建索引和查询的成本取决于
- 使用的 LLM 类型
- 使用的数据结构类型
- 构建时使用的参数
- 查询时使用的参数
构建和查询每个索引的成本是参考文档中的 TODO。在此期间,我们提供以下信息:
- 索引成本结构的高级概述。
- 一个可以直接在 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_k
或chunk_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)
使用模式#
阅读完整使用模式了解更多详情!