赞
踩
从来没想过在接入通义千问的时候还会遇到NotImplementedError
。实在难以理解,处理过后才明白问题。现在总结后给出结果。
我们来看个例子。就比如这段代码:
摘自ranying666/langchain_tongyi_practical中的5-langchain-search-document_loaders.py
loader = AsyncChromiumLoader(["https://dataea.cn/okr-keyresult-checklist/"])
html = loader.load()
html2text = Html2TextTransformer()
docs_transformed = html2text.transform_documents(html)
如果把这段直接接入streamlit
,那就直接报错:
NotImplementedError
比较离谱的是,只有这么一个错误,没有其他信息。
很难理解为什么是这个错。
随着排查的进行,发现问题好像出在AsyncChromiumLoader
中。
AsyncChromiumLoader
继承自BaseLoader
,而BaseLoader
的load
方法中,调用的却是lazy_load
。先不用看这个方法的具体内容,就看这个方法的名字,你大概也能猜出来什么问题了:
懒加载带来的未能实例化的问题。
简单地说,就是:streamlit
已在前面飞,loader.load()
还在后面追。终于,追不上了,就爆炸了。而刚好的是,lazy_load
中抛出的异常就是这个NotImplementedError
。
众所周知,streamlit
构建网页的过程是单线程的。
所以,当我们需要请求内容的时候,使用异步请求的AsyncChromiumLoader
就会出现这种问题。
那么,该怎么办呢?
怎么办呢?阻塞,对吧?很容易想到。
于是会想当然的这么用:
loader = AsyncChromiumLoader(["https://dataea.cn/okr-keyresult-checklist/"])
html = loader.load()
while html is None:
time.sleep(1)
html2text = Html2TextTransformer()
docs_transformed = html2text.transform_documents(html)
看着很直观,检测html
是否有返回值。
如果真这么简单的话我也不会把它写在这里(
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。