AI(学习笔记第五课) 使用langchain进行AI开发 load documents(web)

文章目录

  • AI(学习笔记第五课) 使用langchain进行AI开发 load documents(web)
  • 学习内容:
    • 1.load documents(web)
      • 1.1 学习`url`
      • 1.2 提前安装`python`的`package`
      • 1.2 使用`WebBaseLoader`进行`webpage`的`load`
      • 1.3 使用`BeautifulSoup4`进行`webpage`的部分截取
      • 1.4 使用`UnstructuredURLLoader`的部分截取
      • 1.5 使用`UnstructuredULoader`的截取父子关系的节点
        • 1.5.1 使用时候的注意点
        • 1.5.2 代码解析
        • 1.5.3 代码执行
    • 2. 使用定位结果进行检索`Vector search over page content`
      • 2.1 最终代码
      • 2.2 执行结果

AI(学习笔记第五课) 使用langchain进行AI开发 load documents(web)

  • 使用langchain如何解析web page
  • 使用vector_store searchdocs进行ai检索

学习内容:

  • webpage中构建vector store,并使用进行检索

1.load documents(web)

1.1 学习url

langchain的load documents(web)文档。

1.2 提前安装pythonpackage

langchain-community
beautifulsoup4
langchain_core

1.2 使用WebBaseLoader进行webpageload

import asyncio
import bs4,os
from langchain_community.document_loaders import WebBaseLoader, UnstructuredURLLoader
from typing import List
from langchain_core.documents import Document
page_url = "https://python.langchain.com/docs/how_to/chatbots_memory/"
# 设置USER_AGENT避免警告
os.environ["USER_AGENT"] = "MyApp/1.0"
async def load_whole_web():loader = WebBaseLoader(web_paths=[page_url])pages = []async for page in loader.alazy_load():pages.append(page)print(f"{pages[0].metadata}\n")print(pages[0].page_content[:500].strip())asyncio.run(load_whole_web())

这里,使用WebBaseLoader对代码对指定的webpage进行loadpages变量中,之后使用metadatapage_content进行输出。
metadata输出如下json
在这里插入图片描述

1.3 使用BeautifulSoup4进行webpage的部分截取

实际上,很可能需要对特定的<div>或者特定的class,来对特定的webpage部分进行截取。

async def load_partial_web():loader = WebBaseLoader(web_paths=[page_url],bs_kwargs={"parse_only": bs4.SoupStrainer(class_="theme-doc-markdown markdown"),},bs_get_text_kwargs={"separator": " | ", "strip": True},)docs = []async for doc in loader.alazy_load():docs.append(doc)assert len(docs) == 1doc = docs[0]print(f"{doc.metadata}\n")print(doc.page_content[:500])print(doc.page_content[-500:])
asyncio.run(load_partial_web())

在这里插入图片描述
这样保证,截取的是<div class="theme-doc-markdown markdown">的部分。
在这里插入图片描述

1.4 使用UnstructuredURLLoader的部分截取

pdfloader一样,想要对内容进行洗的切分,可以使用UnstructuredURLLoader
注意,这里练习时候使用的UnstructuredURLLoader的版本较低,对示例的代码进行了调整。

async def load_web_with_unstructured():loader = UnstructuredURLLoader(urls=[page_url],  # 替换为实际URLmode="elements",strategy='fast')docs = []async for doc in loader.alazy_load():docs.append(doc)for doc in docs[:5]:print(f'{doc.metadata["category"]}: {doc.page_content}')return docsasyncio.run(load_web_with_unstructured())

可以看出,这里将web内容解析到doc中,保存起来,并将前5个doc进行categorypage_content进行打印。
在这里插入图片描述

1.5 使用UnstructuredULoader的截取父子关系的节点

1.5.1 使用时候的注意点

这里需要注意两点:

  • 不是from langchain_community.document_loaderUnstructuredURLLoader,这里需要换成from langchain_unstructure的UnstructuredLoader`
  • langchain_unstructured的包,版本需要>=0.1.5在这里插入图片描述
1.5.2 代码解析
import asyncio
import bs4,os
from langchain_community.document_loaders import WebBaseLoader,UnstructuredURLLoader
from langchain_unstructured import UnstructuredLoader
from typing import List
from langchain_core.documents import Document
async def get_setup_docs():page_urls = ["https://python.langchain.com/docs/how_to/chatbots_memory/","https://python.langchain.com/docs/how_to/chatbots_tools/",]setup_docs = []for url in page_urls:page_setup_docs = await _get_setup_docs_from_url(url)setup_docs.extend(page_setup_docs)for doc in setup_docs[:3]:print(f'{doc.metadata["category"]}: {doc.page_content}')return setup_docsasync def _get_setup_docs_from_url(url: str) -> List[Document]:loader = UnstructuredLoader(web_url=url)setup_docs = []parent_id = -1async for doc in loader.alazy_load():metadata = doc.metadataif metadata.get("category") == "Title" and doc.page_content.startswith("Setup"):parent_id = metadata.get("element_id")if metadata.get("parent_id") == parent_id:setup_docs.append(doc)return setup_docsasyncio.run(get_setup_docs())

这里,可以看出是定位到category==Title并且startWith(Setup)的部分,之后记录下parent_id,之后接下来便利其他doc,如果parent_id是上面记录的parent_id那么就将该doc都作为setup的说明文档,保存起来。

1.5.3 代码执行

在这里插入图片描述

2. 使用定位结果进行检索Vector search over page content

2.1 最终代码

import asyncio
import bs4,os
from langchain_community.document_loaders import WebBaseLoader,UnstructuredURLLoader
from langchain_unstructured import UnstructuredLoader
from typing import List
from langchain_core.documents import Document
from langchain_ollama.embeddings import OllamaEmbeddings
from langchain_core.vectorstores import InMemoryVectorStorepage_url = "https://python.langchain.com/docs/how_to/chatbots_memory/"
# 设置USER_AGENT避免警告
os.environ["USER_AGENT"] = "MyApp/1.0"# 替换 OpenAIEmbeddings 配置为 Ollama 本地模型
embeddings = OllamaEmbeddings(model="nomic-embed-text",  # 或其他支持的本地模型如 "mistral", "nomic-embed-text"base_url="http://192.168.2.208:11434"  # Ollama 默认地址
)
async def _get_setup_docs() -> List[Document]:page_urls = ["https://python.langchain.com/docs/how_to/chatbots_memory/","https://python.langchain.com/docs/how_to/chatbots_tools/",]setup_docs = []for url in page_urls:page_setup_docs = await _get_setup_docs_from_url(url)setup_docs.extend(page_setup_docs)return setup_docsasync def _get_setup_docs_from_url(url: str) -> List[Document]:loader = UnstructuredLoader(web_url=url)setup_docs = []parent_id = -1async for doc in loader.alazy_load():metadata = doc.metadataif metadata.get("category") == "Title" and doc.page_content.startswith("Setup"):parent_id = metadata.get("element_id")if metadata.get("parent_id") == parent_id:setup_docs.append(doc)return setup_docsasync def search_vector_store():setup_docs =await _get_setup_docs()vector_store = InMemoryVectorStore.from_documents(setup_docs, embeddings)retrieved_docs = vector_store.similarity_search("Install Tavily", k=2)for doc in retrieved_docs:print(f'Page {doc.metadata["url"]}: {doc.page_content[:300]}\n')asyncio.run(search_vector_store())

这里看出,使用本地构建的ollama模型nomic-embed-text,进行ai的检索。

2.2 执行结果

在这里插入图片描述
基于webpageai大模型给出了检索结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88769.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用macvlan实现容器的跨主机通信

使用环境&#xff1a; 两台运行docker的服务器 A机器网段&#xff1a;192.168.86.61 B机器网段&#xff1a;192.168.86.62 运行的容器需装有ping指令&#xff0c; 实验参数解释&#xff1a; -d macvlan 指定创建网络驱动类型 --subnet 指定子网范围 -gateway 指定网关地址 -o p…

深度学习_全连接神经网络

1.什么是神经网络神经网络中信息只向一个方向移动&#xff0c;即从输入节点向前移动&#xff0c;通过隐藏节点&#xff0c;再向输出节点移 动&#xff0c;网络中没有循环或者环。其中的基本构件是&#xff1a; 输入层&#xff1a;即输入x的那一层 输出层&#xff1a;即输出y的那…

OpenLayers使用

初学ol&#xff0c;实现了高德地图不同图层的切换、交互性地图飞行以及加载本地JSON数据。说一下不同图层切换的想法&#xff1a;1.对于标准地图和卫星地图&#xff1a;二者最初便挂载到map上&#xff0c;两个图层是叠加显示的&#xff1b;当点击按钮时&#xff0c;其实是使用 …

day4--上传图片、视频

1. 分布式文件系统 1.1 什么是分布式文件系统 文件系统是负责管理和存储文件的系统软件&#xff0c;操作系统通过文件系统提供的接口去存取文件&#xff0c;用户通过操作系统访问磁盘上的文件。 下图指示了文件系统所处的位置&#xff1a; 常见的文件系统&#xff1a;FAT16/FA…

极矢量与轴矢量

物理量分为标量和矢量&#xff0c;矢量又分为极矢量和轴矢量。 矢量是既有大小又有方向并按平行四边形法则相加的量。矢量有极矢量和轴矢量两种&#xff0c;其间的区别是在镜像反射变换下遵循不同的变换规律,许多物理量都是矢量,同样,其中也有极矢量和轴矢量的区分,在力学中,例…

文章发布易优CMS(Eyoucms)网站技巧

为了更快的上手数据采集及发布到易优CMS(eyoucms)网站&#xff0c;特地总结了些新手常常会遇到的操作问题与技巧&#xff0c;如下&#xff1a; 免费易优CMS采集发布插件下载&#xff0c;兼容火车头、八爪鱼、简数采集等 目录 1. 发布到易优CMS指定栏目 2. 发布文章到易优CM…

INA226 数据手册解读

INA226是一款数字电流检测放大器&#xff0c;配备I2C和SMBus兼容接口。该器件可提供数字电流、电压以及功率读数&#xff0c;可灵活配置测量分辨率&#xff0c;并具备连续运行与触发操作模式。该芯片通常由一个单独的电源供电&#xff0c;电压范围为 2.7V 至 5.5V引脚说明​​引…

Linux 中替换sed

以下是关于 sed&#xff08;Stream Editor&#xff09;的深度详解和日常高频使用场景&#xff0c;结合实用示例说明&#xff1a;一、sed 核心概念 流式编辑器&#xff1a;逐行处理文本&#xff0c;不直接修改源文件&#xff08;除非使用 -i 选项&#xff09;正则支持&#xff1…

ADB 调试日志全攻略:如何开启与关闭 `ADB_TRACE` 日志

ADB 调试日志全攻略&#xff1a;如何开启与关闭 ADB_TRACE 日志 ADB&#xff08;Android Debug Bridge&#xff09;是 Android 开发的核心工具&#xff0c;但在排查问题时&#xff0c;默认日志可能不够详细。通过设置环境变量 ADB_TRACE&#xff0c;可以开启 全量调试日志&…

实现druid数据源密码加密

生成加密密码集成了druid链接池的&#xff0c;可以实现数据源密码加密。加密方式如下构建单元测试&#xff0c;并输入密码即可生成加密密码以及加密公钥Test public void testPwd() throws Exception {String password "123456";String[] arr com.alibaba.druid.fi…

【TCP/IP】20. 因特网安全

20. 因特网安全20. 因特网安全20.1 安全威胁20.2 安全服务20.3 基本安全技术20.3.1 密码技术20.3.2 报文鉴别技术20.3.3 身份认证技术20.3.4 数字签名技术20.3.5 虚拟专用网&#xff08;VPN&#xff09;技术20.3.6 防火墙技术20.3.7 防病毒技术20.4 IP 层安全20.5 传输层安全20…

数据结构之位图和布隆过滤器

系列文章目录 数据结构之ArrayList_arraylist o(1) o(n)-CSDN博客 数据结构之LinkedList-CSDN博客 数据结构之栈_栈有什么方法-CSDN博客 数据结构之队列-CSDN博客 数据结构之二叉树-CSDN博客 数据结构之优先级队列-CSDN博客 常见的排序方法-CSDN博客 数据结构之Map和Se…

Web攻防-PHP反序列化魔术方法触发条件POP链构造变量属性修改黑白盒角度

知识点&#xff1a; 1.WEB攻防-PHP反序列化-序列化和反序列化 2.WEB攻防-PHP反序列化-常见魔术方法触发规则 3.WEB攻防-PHP反序列化-反序列化漏洞产生原因 4.WEB攻防-PHP反序列化-黑白盒&POP链构造 一、演示案例-WEB攻防-PHP反序列化-序列化和反序列化 什么是反序列化操作…

C# VB.NET多进程-管道通信,命名管道(Named Pipes)

要向已运行的进程发送特定命令&#xff08;如/exit&#xff09;&#xff0c;而不是启动新进程&#xff0c;需要使用进程间通信&#xff08;IPC&#xff09;机制。以下是几种常见的实现方法&#xff1a;一、使用命名管道&#xff08;Named Pipes&#xff09;如果ABC.EXE支持通过…

C++ 右值引用 (Rvalue References)

右值引用是C11引入的革命性特性&#xff0c;它彻底改变了C中资源管理和参数传递的方式。下面我将从多个维度深入讲解右值引用。一、核心概念1. 值类别(Value Categories)lvalue (左值): 有标识符、可取地址的表达式int x 10; // x是左值 int* p &x; // 可以取地址rvalue…

反激变换器设计全流程(一)——电路拓扑及工作流程

一、电路拓扑原理 拓扑结构概述 开关反激电源采用反激式拓扑结构&#xff0c;主要由开关管&#xff08;通常为 MOSFET&#xff09;、变压器、输出整流二极管、输出滤波电容以及控制电路等组成。其基本工作原理是通过开关管的周期性开关动作&#xff0c;将输入直流电压转换为高…

uniapp语音播报天气预报微信小程序

1.产品展示2.页面功能(1)点击上方按钮实现语音播报4天天气情况。3.uniapp代码<template><view class"container"><view class"header"><text class"place">地址:{{city}}</text><text class"time"&g…

Pycharm 报错 Environment location directory is not empty 如何解决

好长时间不看不写代码了&#xff0c;人也跟着犯糊涂。今天在Pycharm 导入虚拟环境时&#xff0c;一直报错&#xff1a;“Environment location directory is not empty”&#xff0c;在网上百度很多很多方法都无法解决&#xff0c;直到我翻出我之前自己写的导入虚拟环境的详细过…

React强大且灵活hooks库——ahooks入门实践之场景类(scene)hook详解

什么是 ahooks&#xff1f; ahooks 是一个 React Hooks 库&#xff0c;提供了大量实用的自定义 hooks&#xff0c;帮助开发者更高效地构建 React 应用。其中场景类 hooks 是 ahooks 的一个重要分类&#xff0c;专门针对特定业务场景提供解决方案。 安装 ahooks npm install …

大模型之Langchain篇(二)——RAG

写在前面 跟着楼兰老师学习【LangChain教程】2025吃透LangChain框架快速上手与深度实战&#xff0c;全程干货无废话&#xff0c;三天学完&#xff0c;让你少走百分之99弯路&#xff01;_哔哩哔哩_bilibili 计算相似度 一般用的余弦相似度&#xff0c;这里只是演示计算。 fr…