成本分析
每次调用大型语言模型都会产生一定费用 - 例如,OpenAI的gpt-3.5-turbo模型每千个标记收费0.002美元。构建索引和查询的成本取决于
- 所使用的LLM类型
- 所使用的数据结构类型
- 构建过程中使用的参数
- 查询期间使用的参数
构建和查询每个索引的成本在参考文档中是一个待办事项。与此同时,我们提供以下信息:
- 指数成本结构的高层次概览。
- 一个您可以直接在LlamaIndex中使用的令牌预测器!
以下索引在构建过程中完全不需要LLM调用(零成本):
SummaryIndexSimpleKeywordTableIndexSimpleKeywordTableIndex - 使用正则表达式关键词提取器从每个文档中提取关键词RAKEKeywordTableIndexRAKEKeywordTableIndex - 使用RAKE关键词提取器从每个文档中提取关键词
使用LLM调用的索引
Section titled “Indices with LLM calls”以下索引在构建期间确实需要调用LLM:
TreeIndexTreeIndex - 使用LLM对文本进行分层摘要以构建树结构KeywordTableIndexKeywordTableIndex - 使用LLM从每个文档中提取关键词
在查询期间,总会进行 >= 1 次 LLM 调用,以合成最终答案。
某些索引在索引构建和查询之间存在成本权衡。例如,SummaryIndex 的构建是免费的,
但在摘要索引上运行查询(无需过滤或嵌入查找)将调用 LLM {math}N 次。
以下是一些关于每个索引的说明:
SummaryIndex: 默认需要 {math}N次 LLM 调用,其中 N 表示节点数量。TreeIndex: 默认需要 {math}\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 提供令牌预测器来预测LLM和嵌入调用的令牌使用量。 这使您能够在进行任何相应的LLM调用之前,在1)索引构建和2)索引查询过程中估算成本。
令牌计数使用 TokenCountingHandler 回调函数完成。有关设置详情请参阅示例笔记本。
使用MockLLM
Section titled “Using MockLLM”要预测LLM调用的令牌使用量,请按如下所示导入并实例化MockLLM。max_tokens参数用作“最坏情况”预测,其中每个LLM响应将恰好包含该数量的令牌。如果未指定max_tokens,则它将简单地返回提示内容作为预测。
from llama_index.core.llms import MockLLMfrom llama_index.core import Settings
# use a mock llm globallySettings.llm = MockLLM(max_tokens=256)然后您可以在索引构建和查询过程中使用此预测器。
您也可以使用 MockEmbedding 来预测嵌入调用的令牌使用量。
from llama_index.core import MockEmbeddingfrom llama_index.core import Settings
# use a mock embedding globallySettings.embed_model = MockEmbedding(embed_dim=1536)阅读完整使用模式了解更多详情!