当前位置:   article > 正文

【2024最全最细Lanchain教程-9】Langchain互联网查询_如何增强langchain的联网搜索能力

如何增强langchain的联网搜索能力

【2024最全最细Lanchain教程-8】Langchain数据库查询链-CSDN博客

        上一节课我们介绍了数据库查询的方法,我们可以通过自然语言、借助langchain的数据库查询链实现SQL的自动生成、执行和回答。除了数据库,互联网也是我们丰富的数据来源。本节课介绍如何将互联网网页的信息进行抓取和查询。

Jupyter有同步问题,无法进行演示

        因为我们调用互联网查询和检索工具,要用到Chromium一款浏览器的异步方法,这个异步方法应该是和Jupyter有冲突,所以本节课要展示的内容没办法用Jupyter演示,只能用Pycharm来进行演示。

代码实现输入URL将该页面的中文数据全部抓取下来以供查询

1. url_to_text方法实现输入URL返回一段str文本

        首先引入必要用的包,注意这里的“Loader_Transformer ” 和 “transformer ”是我自己构造的两个类,等会儿会提到;构造一个Loader_Transformer 的实例,输入的参数是“www.baidu.com”的首页,然后调用Loader_Transformer 的url_to_text方法,输入是一个url,输出是一段文本:

  1. from langchain_openai import ChatOpenAI
  2. from langchain_core.prompts import ChatPromptTemplate
  3. from langchain_core.runnables import RunnableParallel, RunnablePassthrough
  4. from langchain_core.output_parsers import StrOutputParser
  5. from Loader_Transformer import Loader_Transformer
  6. from transformer import text_to_vectorstore
  7. if __name__ == '__main__':
  8. loader = Loader_Transformer("https://www.baidu.com")
  9. text = loader.url_to_text()

        我们来看Loader_Transformer 里面的具体代码:

  1. import re
  2. from langchain_community.document_loaders import AsyncChromiumLoader
  3. from langchain_community.document_transformers import BeautifulSoupTransformer
  4. class Loader_Transformer:
  5. '''该类的url_to_text方法输入一个url,并将该页面的全部中文字符获取下来,拼接后返回一个大的字符串作为函数的输出 '''
  6. def __init__(self, url):
  7. self.url = url
  8. def display_info(self):
  9. print(f"URL: {self.url}")
  10. def url_to_text(self):
  11. loader = AsyncChromiumLoader([self.url])
  12. html = loader.load()
  13. # print(html)
  14. bs_transformer = BeautifulSoupTransformer()
  15. docs_transformed = bs_transformer.transform_documents(
  16. html,
  17. tags_to_extract=["span", "li", "p", "div", "a"]
  18. )
  19. # print(type(docs_transformed))
  20. # object_size = sys.getsizeof(docs_transformed)
  21. # print(f"Object Size: {object_size} bytes")
  22. chinese_text = re.findall("[\u4e00-\u9fa5]+", docs_transformed[0].page_content)
  23. # print(type(chinese_text), chinese_text)
  24. text = ''
  25. for i in chinese_text:
  26. text = text + ',' + str(i)
  27. return text

        该方法首先构造一个 AsyncChromiumLoader,这是一个异步的浏览器加载器,用于加载网页,然后调用 AsyncChromiumLoader 的load()方法,加载和返回一个网页文件 html。

        构造一个BeautifulSoupTransformer,使用BeautifulSoupTransformer的transform_documents 方法来把这个html文件进行切分,就是把 <span>等标签里面的东西提取出来,得到一个转化后的文档。

        然后用一个正则表达式把这个文档里面的中文字符都抽取出来:

chinese_text = re.findall("[\u4e00-\u9fa5]+", docs_transformed[0].page_content)

        抽取出来的chinese_text是一个列表,再把列表里的每个元素拼接出来形成一个大的str文本作为函数的结果返回

2.  text_to_vect 方法实现str文本向量化并返回一个向量数据库

        从transformer中引入text_to_vectorstore这个类,实例化一个text_to_vectorstore类,并调用这个类的text_to_vect 方法,将一段文本转化为一个向量数据库:

  1. vector = text_to_vectorstore(text)
  2. vectorstore = vector.text_to_vect()

        text_to_vectorstore类以及text_to_vect方法的代码在下方:

  1. import os
  2. from langchain.text_splitter import RecursiveCharacterTextSplitter
  3. from langchain_community.vectorstores import Chroma
  4. from langchain_openai import OpenAIEmbeddings
  5. class text_to_vectorstore:
  6. ''' 调用text_to_vect()方法,将输入的一段文本存储在向量数据库里,并将该向量数据库作为结果返回'''
  7. def __init__(self, text):
  8. self.text = text
  9. def display_info(self):
  10. print(f"Input text as : {self.text}")
  11. def text_to_vect(self):
  12. text_splitter = RecursiveCharacterTextSplitter(
  13. chunk_size=100,
  14. chunk_overlap=20,
  15. length_function=len,
  16. )
  17. splitter_content = text_splitter.split_text(self.text)
  18. api_key = os.getenv("OPENAI_API_KEY")
  19. persist_path = r'C:\Users\PycharmProjects\langchain'
  20. vectorstore = Chroma.from_texts(
  21. splitter_content,
  22. embedding=OpenAIEmbeddings(
  23. openai_api_key=api_key,
  24. base_url="https://wdapi7.61798.cn/v1"),
  25. persist_directory = persist_path
  26. )
  27. return vectorstore

3. 设置一个问题,然后可以先做一下向量相似度检索

        我们可以根据页面内容问一个问题,比如“韩国什么视频爆红?”,然后进行一下向量相似度检索:

  1. query = '韩国什么视频爆红?'
  2. search_result = vectorstore.similarity_search_with_score(query)
  3. print(search_result[0])

    我们可以查看一下相似度检索的结果,需要注意的是并不是每次得分最低的就是准确的结果,也有可能是第二第三的,这个有一定不确定性。

4. 也可以构造一个检索器,进行问题的检索

        构造一个检索器,进行问题检索,这块代码是我们之前写过的【2024最全最细Lanchain教程-7】Langchain数据增强之词嵌入、存储和检索-CSDN博客 这里我们基本就照抄过来的:

  1. retriever = vectorstore.as_retriever()
  2. template = """Answer the question based only on the following context and use chinese to answer:
  3. {context}
  4. Question: {question}
  5. """
  6. setup_and_retrieval = RunnableParallel(
  7. {"context": retriever, "question": RunnablePassthrough()}
  8. )
  9. prompt = ChatPromptTemplate.from_template(template)
  10. output_parser = StrOutputParser()
  11. llm = ChatOpenAI(
  12. model_name="gpt-3.5-turbo",
  13. temperature=0.7,
  14. base_url="https://wdapi7.61798.cn/v1"
  15. )
  16. chain = setup_and_retrieval | prompt | llm | output_parser
  17. result = chain.invoke(query)
  18. print(result)

              我们看一下问题的回答是否结果:

        你可以把这个代码继续扩展,然后就可以得到专门用于检索中文内容的爬虫了,希望能对你有所启发。

项目git地址:https://github.com/jerry1900/jupyter

项目视频地址:【2024最全最细】Langchain之互联网查询_哔哩哔哩_bilibili

需要openai国内节点账号的同学站内私信聊。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/688341
推荐阅读
相关标签
  

闽ICP备14008679号