主题
概念
每次调用 LLM 都会产生一定费用——比如 OpenAI 的 gpt-3.5-turbo 是每 1k token 0.002 美元。构建索引与查询的成本取决于:
- 所用的 LLM 类型
- 所用的数据结构类型
- 构建时使用的参数
- 查询时使用的参数
每个索引的构建与查询费用,在参考文档里仍标注为待补充。在此之前,我们提供以下信息:
- 各类索引成本结构的高层概览。
- 一个可以直接在 LlamaIndex 里使用的 token 预测器!
成本结构概览
不产生 LLM 调用的索引
下面这些索引在构建阶段完全不需要 LLM 调用(成本为 0):
SummaryIndexSimpleKeywordTableIndex—— 用正则关键词抽取器从每个文档中抽取关键词RAKEKeywordTableIndex—— 用 RAKE 关键词抽取器从每个文档中抽取关键词
需要 LLM 调用的索引
下面这些索引在构建阶段确实需要 LLM 调用:
TreeIndex—— 用 LLM 对文本做层级式摘要,从而构建这棵树KeywordTableIndex—— 用 LLM 从每个文档中抽取关键词
查询阶段
查询阶段必定会有至少 1 次 LLM 调用,用来合成最终回答。有些索引在「构建」与「查询」之间存在成本上的取舍。比如 SummaryIndex 构建是免费的,但在摘要索引上跑一次查询(不做过滤或嵌入检索)会调用 LLM N 次。
以下是关于各类索引的一些说明:
SummaryIndex:默认需要N次 LLM 调用,N 为节点数量。TreeIndex:默认需要log(N)次 LLM 调用,N 为叶子节点数量。- 把
child_branch_factor=2会比默认的child_branch_factor=1贵得多(多项式对数级差别),因为每个父节点要遍历 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 用量。这让你在 1) 构建索引和 2) 查询索引时,能在相应 LLM 调用真正发生之前就估算出成本。
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
嵌入调用的 token 用量同样可以用 MockEmbedding 来预测。
from llama_index.core import MockEmbedding
from llama_index.core import Settings
# use a mock embedding globally
Settings.embed_model = MockEmbedding(embed_dim=1536)使用方式
更多细节请阅读完整使用方式!