当前位置:   article > 正文

使用langchain异步获取网络信息_langchain 异步请求

langchain 异步请求

前言

从来没想过在接入通义千问的时候还会遇到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)
  • 1
  • 2
  • 3
  • 4

如果把这段直接接入streamlit,那就直接报错:

NotImplementedError

比较离谱的是,只有这么一个错误,没有其他信息。

分析问题

很难理解为什么是这个错。

随着排查的进行,发现问题好像出在AsyncChromiumLoader中。

AsyncChromiumLoader继承自BaseLoader,而BaseLoaderload方法中,调用的却是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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

看着很直观,检测html是否有返回值。

如果真这么简单的话我也不会把它写在这里(声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/821336

推荐阅读
相关标签