【2024最全最细Lanchain教程-8】Langchain数据库查询链-CSDN博客
上一节课我们介绍了数据库查询的方法,我们可以通过自然语言、借助langchain的数据库查询链实现SQL的自动生成、执行和回答。除了数据库,互联网也是我们丰富的数据来源。本节课介绍如何将互联网网页的信息进行抓取和查询。
因为我们调用互联网查询和检索工具,要用到Chromium一款浏览器的异步方法,这个异步方法应该是和Jupyter有冲突,所以本节课要展示的内容没办法用Jupyter演示,只能用Pycharm来进行演示。
首先引入必要用的包,注意这里的“Loader_Transformer ” 和 “transformer ”是我自己构造的两个类,等会儿会提到;构造一个Loader_Transformer 的实例,输入的参数是“www.baidu.com”的首页,然后调用Loader_Transformer 的url_to_text方法,输入是一个url,输出是一段文本:
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
from Loader_Transformer import Loader_Transformer
from transformer import text_to_vectorstore
if __name__ == '__main__':
loader = Loader_Transformer("https://www.baidu.com")
text = loader.url_to_text()
我们来看Loader_Transformer 里面的具体代码:
import re
from langchain_community.document_loaders import AsyncChromiumLoader
from langchain_community.document_transformers import BeautifulSoupTransformer
class Loader_Transformer:
'''该类的url_to_text方法输入一个url,并将该页面的全部中文字符获取下来,拼接后返回一个大的字符串作为函数的输出 '''
def __init__(self, url):
self.url = url
def display_info(self):
print(f"URL: {self.url}")
def url_to_text(self):
loader = AsyncChromiumLoader([self.url])
html = loader.load()
# print(html)
bs_transformer = BeautifulSoupTransformer()
docs_transformed = bs_transformer.transform_documents(
html,
tags_to_extract=["span", "li", "p", "div", "a"]
)
# print(type(docs_transformed))
# object_size = sys.getsizeof(docs_transformed)
# print(f"Object Size: {object_size} bytes")
chinese_text = re.findall("[\u4e00-\u9fa5]+", docs_transformed[0].page_content)
# print(type(chinese_text), chinese_text)
text = ''
for i in chinese_text:
text = text + ',' + str(i)
return text
该方法首先构造一个 AsyncChromiumLoader,这是一个异步的浏览器加载器,用于加载网页,然后调用 AsyncChromiumLoader 的load()方法,加载和返回一个网页文件 html。
构造一个BeautifulSoupTransformer,使用BeautifulSoupTransformer的transform_documents 方法来把这个html文件进行切分,就是把 等标签里面的东西提取出来,得到一个转化后的文档。
然后用一个正则表达式把这个文档里面的中文字符都抽取出来:
chinese_text = re.findall("[\u4e00-\u9fa5]+", docs_transformed[0].page_content)
抽取出来的chinese_text是一个列表,再把列表里的每个元素拼接出来形成一个大的str文本作为函数的结果返回
从transformer中引入text_to_vectorstore这个类,实例化一个text_to_vectorstore类,并调用这个类的text_to_vect 方法,将一段文本转化为一个向量数据库:
vector = text_to_vectorstore(text)
vectorstore = vector.text_to_vect()
text_to_vectorstore类以及text_to_vect方法的代码在下方:
import os
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
class text_to_vectorstore:
''' 调用text_to_vect()方法,将输入的一段文本存储在向量数据库里,并将该向量数据库作为结果返回'''
def __init__(self, text):
self.text = text
def display_info(self):
print(f"Input text as : {self.text}")
def text_to_vect(self):
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=100,
chunk_overlap=20,
length_function=len,
)
splitter_content = text_splitter.split_text(self.text)
api_key = os.getenv("OPENAI_API_KEY")
persist_path = r'C:\Users\PycharmProjects\langchain'
vectorstore = Chroma.from_texts(
splitter_content,
embedding=OpenAIEmbeddings(
openai_api_key=api_key,
base_url="https://wdapi7.61798.cn/v1"),
persist_directory = persist_path
)
return vectorstore
我们可以根据页面内容问一个问题,比如“韩国什么视频爆红?”,然后进行一下向量相似度检索:
query = '韩国什么视频爆红?'
search_result = vectorstore.similarity_search_with_score(query)
print(search_result[0])
我们可以查看一下相似度检索的结果,需要注意的是并不是每次得分最低的就是准确的结果,也有可能是第二第三的,这个有一定不确定性。
构造一个检索器,进行问题检索,这块代码是我们之前写过的【2024最全最细Lanchain教程-7】Langchain数据增强之词嵌入、存储和检索-CSDN博客 这里我们基本就照抄过来的:
retriever = vectorstore.as_retriever()
template = """Answer the question based only on the following context and use chinese to answer:
{context}
Question: {question}
"""
setup_and_retrieval = RunnableParallel(
{"context": retriever, "question": RunnablePassthrough()}
)
prompt = ChatPromptTemplate.from_template(template)
output_parser = StrOutputParser()
llm = ChatOpenAI(
model_name="gpt-3.5-turbo",
temperature=0.7,
base_url="https://wdapi7.61798.cn/v1"
)
chain = setup_and_retrieval | prompt | llm | output_parser
result = chain.invoke(query)
print(result)
我们看一下问题的回答是否结果:
你可以把这个代码继续扩展,然后就可以得到专门用于检索中文内容的爬虫了,希望能对你有所启发。
项目git地址:https://github.com/jerry1900/jupyter
项目视频地址:【2024最全最细】Langchain之互联网查询_哔哩哔哩_bilibili
需要openai国内节点账号的同学站内私信聊。