这是本人最近在做langchain教程过程中的遇到的报错,不分先后顺序。
报错:TypeError: 'NoneType' object is not iterable
这个报错很常见,咱们要看原始报错的位置是哪里,下面是我的截图:
找到源头之后,就在源头的位置打个断点:
然后启用debug模式 shift+F9,如果不懂断点模式,自行学习下先。
这里就能看到提示代理错误。再回到上面源码的位置,这是由于咱们在使用LLMs工具时,没有正常访问到大语言模型平台,这里用的是openai的代理,检查发现这是由于OPENAI-KEY代理商的问题,不支持默认的 text-embedding-ada-002 ,更换成其他代理商,就可以了。
以下这几个LLM都有可能报错:请注意检查自己的openai-key代理商都支持那些models。
报错:Python-dotenv could not parse statement starting at line 2
直接检查配置文件 .env 格式是否正确,由于刚更新了最新的pycharm编辑器,使用快捷注释 ctrl + / ,直接采用 ; 进行注释而不是标准的 # ,改回正常注释即可,如图:
报错:openai.RateLimitError: Error code: 429 - {'error': {'message': 'Request too large for text-embedding-ada-002 in organization org-LuuLZeqq6vQg5xm5ykGftEgo on tokens per min (TPM): Limit 150000, Requested 301143. The input or output tokens must be reduced in order to run successfully.
原因如错误信息所示,速率限制。 问题是请求者最小( rpm )过多。
官方文档:https://platform.openai.com/docs/guides/embeddings/use-cases
解决方案:
作为解决方案,通过在一个请求中获取多行的嵌入表示来降低RPM。
首先,计数每行的令牌数。
import tiktoken
embedding_encoding = "cl100k_base" # this the encoding for text-embedding-ada-002
encoding = tiktoken.get_encoding(embedding_encoding)
df["num_tokens"]=df["embedding_text"].map(lambda x: len(encoding.encode(x)))
通过以接近TMP上限的令牌数请求,避免受到限制。
import time
embedding_model="text-embedding-ada-002"
embedding_texts=[]
token_sum=0
max_input=2048 # inputのlistの最大長は2048 https://github.com/openai/openai-python/issues/519
max_tmp=150000*2/3
responses=[]
for i,row in df.iterrows():token_sum+=row["num_tokens"]if (token_sum>=max_tmp) or (len(embedding_texts)>=max_input):print(i,"/",df.shape[0],len(embedding_texts),token_sum-row["num_tokens"])response=client.embeddings.create(input = embedding_texts, model=embedding_model)responses+=response.datatoken_sum=row["num_tokens"]embedding_texts=[row["embedding_text"]]time.sleep(65)else:embedding_texts+=[row["embedding_text"]]responses+=client.embeddings.create(input = embedding_texts, model=embedding_model).data
df["ada_embedding"]=[r.embedding for r in responses]
除了数据过多( 200*150000令牌以上)以外,这样应该不会影响速率限制。
报错:This model's maximum context length is 4097 tokens. However, your messages resulted in 7998 tokens. Please reduce the length of the messages.
此模型的最大上下文长度为4097个标记。但是,您的消息产生了7998个令牌。请缩短信息的长度。
解决方案:
其实就是openAI的model都有限制上下文大小,具体的model大小看下面:
model_token_mapping = {"gpt-4": 8192,"gpt-4-0314": 8192,"gpt-4-0613": 8192,"gpt-4-32k": 32768,"gpt-4-32k-0314": 32768,"gpt-4-32k-0613": 32768,"gpt-3.5-turbo": 4096,"gpt-3.5-turbo-0301": 4096,"gpt-3.5-turbo-0613": 4096,"gpt-3.5-turbo-16k": 16385,"gpt-3.5-turbo-16k-0613": 16385,"gpt-3.5-turbo-instruct": 4096,"text-ada-001": 2049,"ada": 2049,"text-babbage-001": 2040,"babbage": 2049,"text-curie-001": 2049,"curie": 2049,"davinci": 2049,"text-davinci-003": 4097,"text-davinci-002": 4097,"code-davinci-002": 8001,"code-davinci-001": 8001,"code-cushman-002": 2048,"code-cushman-001": 2048,}
目前现有的OpenAI model的上下文大小
按照提示来说,最好是更换成gtp-4或者是gpt-3.5-turbo-16k,如果追求更好性能的就gpt-4,如果想性价比高,价格便宜的就gpt-3.5的,价格差了将近20倍。