【AI大模型应用开发】【LangChain系列】实战案例2:通过URL加载网页内容 - LangChain对爬虫功能的封装

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
简介: 【AI大模型应用开发】【LangChain系列】实战案例2:通过URL加载网页内容 - LangChain对爬虫功能的封装
  • 大家好,我是同学小张,日常分享AI知识和实战案例
  • 欢迎 点赞 + 关注 👏,持续学习持续干货输出
  • +v: jasper_8017 一起交流💬,一起进步💪。
  • 微信公众号也可搜【同学小张】 🙏

本站文章一览:


Web检索是AI大模型应用的一个热门应用方向。其涉及的主要步骤如下:

参考:https://python.langchain.com/docs/use_cases/web_scraping

(1)用户提问,联网检索

(2)通过URLs记载网页HTML数据

(3)加载到的数据通过转换,获取关注的内容,形成文本

(4)对文本进行分块、向量化、存储

(5)调用大模型进行总结、答案生成

其实就是RAG的基本流程,只不过知识库不再局限在你自己的知识库,而是利用在线检索,搜罗互联网上的数据作为相关知识。

搜罗数据的过程,可以有两种方法,一种是调用检索的API,例如GoogleSearch的API,直接获取检索结果。另一种方法,就是靠爬虫,将网页数据抓取下来,存入向量数据库使用。

本文我们探讨一下爬虫的相关的使用方法。

0. LangChain接口

LangChain中,将爬虫功能分成了两个模块,LoadingTransforming

  • Loading模块的功能是将 URL 加载转换成 HTML 内容。封装的类包括:AsyncHtmlLoader类、AsyncChromiumLoader类等。
  • Transforming模块的功能是将 HMTL 内容转换成需要的文本。封装的类包括:HTML2Text类、Beautiful Soup类等。

0.1 Loading模块简介

  • AsyncHtmlLoader: 使用aiohttp库生成异步HTTP请求,适用于更简单、轻量级的抓取。
  • AsyncChromiumLoader:使用Playwright启动Chromium实例,该实例可以处理JavaScript渲染和更复杂的web交互。Chromium是Playwright支持的浏览器之一,Playwright是一个用于控制浏览器自动化的库。

0.2 Transforming模块简介

  • HTML2Text:将HTML内容直接转换为纯文本,而无需任何特定的标记操作。它最适合于目标是提取人类可读文本而不需要操作特定HTML元素的场景。
  • Beautiful Soup:对HTML内容提供了更细粒度的控制,支持特定的标记提取、删除和内容清理。它适用于需要提取特定信息并根据需要清理HTML内容的情况。

1. 快速上手 - Quick Start

1.1 Demo代码

urls = ["https://mp.weixin.qq.com/s/Zklc3p5uosXZ7XMHD1k2QA"]
from langchain_community.document_loaders import AsyncChromiumLoader
from langchain_community.document_transformers import BeautifulSoupTransformer
# Load HTML
loader = AsyncChromiumLoader(urls)
html = loader.load()
print("============= html =====================")
print(html)
# Transform
bs_transformer = BeautifulSoupTransformer()
docs_transformed = bs_transformer.transform_documents(html, tags_to_extract=["span"])
print("================= doc_transformed ===============")
print(docs_transformed)

1.2 代码解释

(1)该程序使用了 AsyncChromiumLoader 类来加载URL为HTML内容。

注意:AsyncChromiumLoader 接收的参数是一个URL数组,这意味着它可以同时加载多个URL。

(2)使用了 BeautifulSoupTransformer 类作为transform来将HTML内容转换成文本内容

注意:transform_documents 函数中的 tags_to_extract 参数,指定了将 HTML 中的什么 tag 内的内容提取成文本。

1.3 运行效果

  • URL转HTML内容结果如下:

抓出来的其实是HTML脚本语言,程序代码。并不是我们想要的文本信息。所以后面有个Transform步骤。

  • Transform步骤后的结果:

可以看到经过 Transform 步骤后,出现了我们需要的文本信息。

原网页内容如下:经过对比,发现提取的文本丢失了很多内容。主要的原因是tags_to_extract 参数设置的问题。

1.4 效果改善

HTML脚本语言的常用的文本标签 tags 大体有 <h>, <p>, <li>, <div> 和 <a> :

  • <h1> 到 <h6>:标题标签,用于定义标题的级别,<h1> 是最高级别的标题,依次递减。
  • <p>:段落标签,用于定义段落。
  • <a>:链接标签,用于创建超链接,通过href属性指定链接目标。
  • <span>:内联容器标签,用于包裹一小段文本或行内元素。
  • <div>:块级容器标签,用于组合和布局其他元素。
  • <strong>:强调文本标签,使文本加粗显示。
  • <em>:强调文本标签,使文本以斜体显示。
  • <br>:换行标签,用于插入一个换行符。

要改善上面的提取结果,使其能提取出更多的文本,我们可以修改提取的 tags 参数,如下,提取出<span>, <p> 和 <code> 的内容:

docs_transformed = bs_transformer.transform_documents(html, tags_to_extract=["span", "code", "p"])

修改后运行效果如下:已经将里面的文字和代码全部提取出来了(虽然还有些特殊符号,不过没关系,后面可以再过滤一层去掉):

1.5 怎么确认 tags_to_extract 的参数

那上面我是怎么确认要提取 "span", "code", "p" 这三个tag内的文本的呢?

(1)打开你要爬取的网页,按 F12 打开网页调试工具

(2)找到 “元素” 选项卡,然后点击左上角的这个图标(如图)

(3)将鼠标悬浮在你想提取的文字上面,它就会自动展示当前文字所在的标签 tag 是什么。如下面图片:

(4)将这些tag全部填到参数里,就OK了。

2. 高级方法 - 使用大模型的Function Calling提取所需文本

该方法是在以上方法的基础上,在得到文本后,再利用大模型,从文本中二次提取出所关注的文本内容。

这种方法的好处在于,对于网页内容和结构变化时,我们不需要再去频繁的调整提取tag等参数,而是最后利用大模型统一提取关心内容即可。

2.1 Demo代码

def scraping_with_extraction():
    from langchain_openai import ChatOpenAI
    llm = ChatOpenAI(temperature=0, model="gpt-3.5-turbo-0613")
    
    from langchain.chains import create_extraction_chain
    schema = {
        "properties": {
            "article_title": {"type": "string"},
            "article_content": {"type": "string"},
            "article_example_python_code": {"type": "string"},
        },
        "required": ["article_title", "article_content", "article_example_python_code"],
    }
    def extract(content: str, schema: dict):
        return create_extraction_chain(schema=schema, llm=llm).run(content)
    
    import pprint
    from langchain.text_splitter import RecursiveCharacterTextSplitter
    def scrape_with_playwright(urls, schema):
        from langchain_community.document_loaders import AsyncChromiumLoader
        from langchain_community.document_transformers import BeautifulSoupTransformer
        loader = AsyncChromiumLoader(urls)
        docs = loader.load()
        bs_transformer = BeautifulSoupTransformer()
        docs_transformed = bs_transformer.transform_documents(
            docs, tags_to_extract=["span", "code", "p"]
        )
        print("Extracting content with LLM")
        # Grab the first 1000 tokens of the site
        splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
            chunk_size=1000, chunk_overlap=0
        )
        splits = splitter.split_documents(docs_transformed)
        # Process the first split
        extracted_content = extract(schema=schema, content=splits[0].page_content)
        pprint.pprint(extracted_content)
        return extracted_content
    extracted_content = scrape_with_playwright(urls, schema=schema)
    
scraping_with_extraction()

2.2 代码解释

(1)schema定义

定义一个模式来指定要提取的数据类型。在这里,key的名称很重要,因为这是告诉LLM我们想要什么样的信息。所以,尽可能详细。

(2)正常走上面的流程,获取网页数据 docs_transformed

(3)代码中还做了 split,将全部文本分块了,可能是为了避免超出 LLM 的Token长度限制?

(4)最重要、最灵魂的几句,将文本内容,和模式传入 create_extraction_chain 来获取输出:

def extract(content: str, schema: dict):
       return create_extraction_chain(schema=schema, llm=llm).run(content)
extracted_content = extract(schema=schema, content=splits[0].page_content)

2.3 运行效果

输出的结果不是很好。

2.4 create_extraction_chain 源码解析

该函数源码如下:

其做的事儿,也比较简单,就是通过 _get_extraction_function 函数将上面我们定义的 schema 转换成了 function calling 中的 function 的结构。

然后创建了一个 LLMChain 链。

看下它内置的Prompt,让大模型提取出在 information_extraction 函数中定义的 properties相关信息 :

_EXTRACTION_TEMPLATE = """Extract and save the relevant entities mentioned \
in the following passage together with their properties.
Only extract the properties mentioned in the 'information_extraction' function.
If a property is not present and is not required in the function parameters, do not include it in the output.
Passage:
{input}
"""

很明显,这个 Prompt 比较简单,要想大模型提取的结果好,information_extraction 函数中定义的 properties必须要尽可能详细。怎么提供详细的说明呢?看下我之前的Function calling的文章,可以看到参数下面可以加一个描述来详细描述该参数的含义。

仿照这个方法,我们可以优化schema:

schema = {
    "properties": {
        "文章标题": {"type": "string", "description": "文章题目"},
        "文章正文全部内容": {"type": "string", "description": "文章的正文内容,不要包含Python代码,只输出文字"},
        "文章中的示例Python代码": {"type": "string", "description": "文章中的Python代码,只输出代码,用markdonw格式输出,可能存在多段代码,多段代码之间分开"},
    },
    "required": ["文章标题", "文章正文全部内容", "文章中的示例Python代码"],
}

还有一种方法,create_extraction_chain 函数的参数接收一个额外的 Prompt,我们也可以通过此参数来调优提取结果。

然而最终结果并没有多少改善… 待继续研究怎么优化。

该方法有点过于依赖大模型的能力,并且会大量消耗Token,目前还没看到有实际的落地效果,处于探索阶段。

如果觉得本文对你有帮助,麻烦点个赞和关注呗 ~~~


  • 大家好,我是同学小张,日常分享AI知识和实战案例
  • 欢迎 点赞 + 关注 👏,持续学习持续干货输出
  • +v: jasper_8017 一起交流💬,一起进步💪。
  • 微信公众号也可搜【同学小张】 🙏

本站文章一览:

相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
1天前
|
人工智能
AniDoc:蚂蚁集团开源 2D 动画上色 AI 模型,基于视频扩散模型自动将草图序列转换成彩色动画,保持动画的连贯性
AniDoc 是一款基于视频扩散模型的 2D 动画上色 AI 模型,能够自动将草图序列转换为彩色动画。该模型通过对应匹配技术和背景增强策略,实现了色彩和风格的准确传递,适用于动画制作、游戏开发和数字艺术创作等多个领域。
30 16
AniDoc:蚂蚁集团开源 2D 动画上色 AI 模型,基于视频扩散模型自动将草图序列转换成彩色动画,保持动画的连贯性
|
11天前
|
人工智能 安全 测试技术
EXAONE 3.5:LG 推出的开源 AI 模型,采用 RAG 和多步推理能力降低模型的幻觉问题
EXAONE 3.5 是 LG AI 研究院推出的开源 AI 模型,擅长长文本处理,能够有效降低模型幻觉问题。该模型提供 24 亿、78 亿和 320 亿参数的三个版本,支持多步推理和检索增强生成技术,适用于多种应用场景。
62 9
EXAONE 3.5:LG 推出的开源 AI 模型,采用 RAG 和多步推理能力降低模型的幻觉问题
|
13天前
|
机器学习/深度学习 人工智能
SNOOPI:创新 AI 文本到图像生成框架,提升单步扩散模型的效率和性能
SNOOPI是一个创新的AI文本到图像生成框架,通过增强单步扩散模型的指导,显著提升模型性能和控制力。该框架包括PG-SB和NASA两种技术,分别用于增强训练稳定性和整合负面提示。SNOOPI在多个评估指标上超越基线模型,尤其在HPSv2得分达到31.08,成为单步扩散模型的新标杆。
55 10
SNOOPI:创新 AI 文本到图像生成框架,提升单步扩散模型的效率和性能
|
13天前
|
人工智能 搜索推荐 开发者
Aurora:xAI 为 Grok AI 推出新的图像生成模型,xAI Premium 用户可无限制访问
Aurora是xAI为Grok AI助手推出的新图像生成模型,专注于生成高逼真度的图像,特别是在人物和风景图像方面。该模型支持文本到图像的生成,并能处理包括公共人物和版权形象在内的多种图像生成请求。Aurora的可用性因用户等级而异,免费用户每天能生成三张图像,而Premium用户则可享受无限制访问。
54 11
Aurora:xAI 为 Grok AI 推出新的图像生成模型,xAI Premium 用户可无限制访问
|
11天前
|
编解码 人工智能 监控
VISION XL:支持四倍超分辨率的 AI 视频修复处理工具,提供去除模糊、修复缺失等功能
VISION XL是一款基于潜在扩散模型的高效视频修复和超分辨率工具,能够修复视频缺失部分、去除模糊,并支持四倍超分辨率。该工具优化了处理效率,适合快速处理视频的应用场景。
59 6
VISION XL:支持四倍超分辨率的 AI 视频修复处理工具,提供去除模糊、修复缺失等功能
|
11天前
|
机器学习/深度学习 人工智能 物联网
AI赋能大学计划·大模型技术与应用实战学生训练营——电子科技大学站圆满结营
12月05日,由中国软件行业校园招聘与实习公共服务平台携手阿里魔搭社区共同举办的AI赋能大学计划·大模型技术与产业趋势高校行AIGC项目实战营·电子科技大学站圆满结营。
AI赋能大学计划·大模型技术与应用实战学生训练营——电子科技大学站圆满结营
|
14天前
|
存储 人工智能 PyTorch
【AI系统】模型转换流程
本文详细介绍了AI模型在不同框架间的转换方法,包括直接转换和规范式转换两种方式。直接转换涉及从源框架直接生成目标框架的模型文件,而规范式转换则通过一个中间标准格式(如ONNX)作为桥梁,实现模型的跨框架迁移。文中还提供了具体的转换流程和技术细节,以及模型转换工具的概览,帮助用户解决训练环境与部署环境不匹配的问题。
33 5
【AI系统】模型转换流程
|
14天前
|
机器学习/深度学习 存储 人工智能
【AI系统】模型转换基本介绍
模型转换技术旨在解决深度学习模型在不同框架间的兼容性问题,通过格式转换和图优化,将训练框架生成的模型适配到推理框架中,实现高效部署。这一过程涉及模型格式转换、计算图优化、算子统一及输入输出支持等多个环节,确保模型能在特定硬件上快速、准确地运行。推理引擎作为核心组件,通过优化阶段和运行阶段,实现模型的加载、优化和高效执行。面对不同框架的模型文件格式和网络结构,推理引擎需具备高度的灵活性和兼容性,以支持多样化的应用场景。
37 4
【AI系统】模型转换基本介绍
|
14天前
|
机器学习/深度学习 存储 人工智能
【AI系统】模型剪枝
本文概述了模型剪枝的概念、方法及流程,旨在通过移除神经网络中冗余或不重要的参数,实现模型规模的减小和效率的提升。剪枝不仅有助于降低模型的存储和计算需求,还能增强模型的泛化能力。文章详细介绍了剪枝的定义、分类、不同阶段的剪枝流程,以及多种剪枝算法,如基于参数重要性的方法、结构化剪枝、动态剪枝和基于优化算法的全局剪枝策略。通过这些方法,可以在保持模型性能的同时,显著提高模型的计算速度和部署灵活性。
28 2
【AI系统】模型剪枝
|
13天前
|
人工智能 自然语言处理 算法
AI时代的企业内训全景图:从案例到实战
作为一名扎根在HR培训领域多年的“老兵”,我越来越清晰地感受到,企业内训的本质其实是为企业持续“造血”。无论是基础岗的新人培训、技能岗的操作规范培训,还是面向技术中坚力量的高阶技术研讨,抑或是管理层的战略思维提升课,内训的价值都是在帮助企业内部提升能力水平,进而提高组织生产力,减少对外部资源的依赖。更为重要的是,在当前AI、大模型、Embodied Intelligence等新兴技术快速迭代的背景下,企业必须不断为人才升级赋能,才能在市场竞争中保持领先。
下一篇
DataWorks