LlamaIndex中的成本分析:优化LLM应用的经济效益
概念
每次调用LLM都会产生一定的费用——例如,OpenAI的gpt-3.5-turbo每1000个标记(tokens)的费用是$0.002。构建索引和查询的成本取决于:
- 使用的LLM类型
- 使用的数据结构类型
- 构建时使用的参数
- 查询时使用的参数
在参考文档中,构建和查询每个索引的成本是一个待办事项(TODO)。在此期间,我们提供以下信息:
- 索引成本结构的高层次概述
- 你可以在LlamaIndex中直接使用的标记预测器
成本结构概述
无需LLM调用的索引
以下索引在构建过程中完全不需要LLM调用(0成本):
- SummaryIndex
- SimpleKeywordTableIndex - 使用正则表达式关键词提取器从每个文档中提取关键词
- RAKEKeywordTableIndex - 使用RAKE关键词提取器从每个文档中提取关键词
需要LLM调用的索引
以下索引在构建过程中确实需要LLM调用:
- TreeIndex - 使用LLM对文本进行层次化总结以构建树
- KeywordTableIndex - 使用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(多项式 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提供了标记预测器来预测LLM和嵌入调用的标记使用情况。这允许你在1)索引构建和2)索引查询之前估计你的成本,而无需进行任何LLM调用。
标记计数使用TokenCountingHandler回调进行。有关详细信息,请参见示例笔记本。
使用MockLLM
要预测LLM调用的标记使用情况,请按如下所示导入并实例化MockLLM。max_tokens参数用作“最坏情况”预测,其中每个LLM响应将包含确切数量的标记。如果未指定max_tokens,则它将简单地预测回提示。
from llama_index.core.llms import MockLLM
from llama_index.core import Settings
# 全局使用mock llm
Settings.llm = MockLLM(max_tokens=256)
然后,你可以在索引构建和查询期间使用此预测器。
使用MockEmbedding
你也可以使用MockEmbedding预测嵌入调用的标记使用情况。
from llama_index.core import MockEmbedding
from llama_index.core import Settings
# 全局使用mock embedding
Settings.embed_model = MockEmbedding(embed_dim=1536)
使用模式
阅读完整的使用模式以获取更多详细信息!
通过LlamaIndex,我们不仅提供了一个强大的工具集,还构建了一个充满活力的社区,致力于推动LLMs在各种应用中的潜力。无论你是初学者还是经验丰富的开发者,LlamaIndex都为你提供了探索和实现上下文增强LLM应用的途径。加入我们,一起解锁LLMs的无限可能!