WTF Langchain极简入门: 03. 数据连接

news2024/12/26 12:56:17

加载文档

langchain提供多种文档加载器,支持多种格式、来源的文件。可以从本地存储系统加载文件,也可以从网上加载远端文件。想了解LangChain所支持的所有文档加载器,请参考Document Loaders。

在本系列课程中,我们将使用最基本的TextLoader来加载本地文件系统中的文档。

代码如下:

# 从langchain.document_loader文件中导入文件加载类TextLoder
from langchain.document_loaders import TextLoader

# TextLoader加载"./README.md",实例化loader对象
loader = TextLoader("./README.md")

# loader调用load方法生成一个Document类型的文件doc
doc = loader.load()


docs

使用TextLoader加载"./README.md"文件,调用TextLoader的load函数生成一个Document对象数组。Document是langchain中的文档类,存放原始内容和元数据,还可以通过Document类的content属性访问原内容。

拆分文档

拆分文档是最常见的文档转换操作。拆分文档将文档拆分为更小的文档块,为了更好地利用模型。

在基于长篇文本的问答(QA)系统中, 必须将文本拆分为多个文本块,这样才能在数据搜索中,基于文本相似性匹配到与问题最相近的文本块。这也是常见的AI问答机器人的基本工作原理。

langchain提供多种文档拆分器,将文档拆分为更小的文档块。

按字符拆分

langchain中最基础的文档拆分器——CharacterTextSplitter,它将文档拆分为固定长度文本块。

# 从langchain.text_splitter中导入CharacterTextSplitter类
from langchain.text_splitter import CharacterTextSplitter

# CharacterTextSplitter实例化对象text_splitter
# 参数separator是分割符,chunk_size是切块大小,chunk_overlap是块与块重叠部分
text_splitter = CharacterTextSplitter(
    separator = "\n\n",
    chunk_size = 1000,
    chunk_overlap = 200,
    length_function = len,
)

# text_splitter调用split_documents处理docs文件
split_docs = text_splitter.split_documents(docs)
print(len(docs[0].page_content))
for split_doc in split_docs:
  print(len(split_doc.page_content))

应该看到下面的输出

3316

996

963

864

913

296

拆分代码

RecursiveCharacterTextSplitter的from_language函数,能够根据编程语言的特性,将代码分为恰当的文本块。

# 写python代码hello_chain
PYTHON_CODE = """
def hello_langchain():
    print("Hello, LangChain!")

# Call the function
hello_langchain()
"""

# 导入RecursiveCharacterTextSplitter文本分块类
from langchain.text_splitter import RecursiveCharacterTextSplitter,Language

# 实例化python_splitter。
# RecursiveCharacterTextSplitter的from_language方法识别Python代码
python_splitter = RecursiveCharacterTextSplitter.from_language(
    language = Language.PYTHON, chunk_size = 50, chunk_overlap = 0,
)

# create_documents对PYTHON_CODE切块
python_docs = python_splitter.create_documents([PYTHON_CODE])
python_docs

应该看到下面这个输出

[Document(page_content='def hello_langchain():', metadata={}), Document(page_content='print("Hello, LangChain!")', metadata={}),

Document(page_content='# Call the function\nhello_langchain()', metadata={})]

Markdown文件拆分

MarkdownHeaderTextSplitter能够将Markdown文件按照段落结构,基于Markdowm语法进行文本拆分。代码如下

# 从langchain.text_splitter导入MarkdownHeaderTextSplitter类
from langchain.text_splitter import MarkdownHeaderTextSplitter

# 设置mark_document文件
markdown_document = "# Chapter 1\n\n    ## Section 1\n\nHi this is the 1st section\n\nWelcome\n\n ### Module 1 \n\n Hi this is the first module \n\n ## Section 2\n\n Hi this is the 2nd section"

# 设置切分参数
headers_to_split_on = [("#", "Header 1"),("##", "Header 2"),("###", "Header 3")]

# MarkdownHeaderTextSplitter类实例化splitter对象
splitter = MarkdownHeaderTextSplitter(headers_to_split_on = headers_to_split_on)

# splitter调用split_text方法切分Markdown文件,生成splits
splits = splitter.split_text(markdown_document)

# 显示splits
splits

应该能看到下面这个输出

[Document(page_content='Hi this is the 1st section \nWelcome', metadata={'Header 1': 'Chapter 1', 'Header 2': 'Section 1'}), Document(page_content='Hi this is the first module', metadata={'Header 1': 'Chapter 1', 'Header 2': 'Section 1', 'Header 3': 'Module 1'}), Document(page_content='Hi this is the 2nd section', metadata={'Header 1': 'Chapter 1', 'Header 2': 'Section 2'})]

按字符递归拆分

这是常见的一种拆分方式,使用拆分符号不断拆分文本,尽量使文本尺寸减小。默认的参数是["\n\n","\n",","],它尽可能保证语义的完整性,保持段落、句子、单词的完整。

# 导入RecursiveCharacterTextSplitter类
from langchain.text_splitter import RecursiveCharacterTextSplitter

# RecursiveCharacterTextSplitter实例化text_splitter对象
# 设置初始化参数
text_splitter = RecursiveCharacterTextSplitter(
    # Set a really small chunk size, just to show.
    chunk_size = 100,
    chunk_overlap = 20,
    length_function = len,                         
)

# text_splitter切分器调用split_documents方法切分docs文件
doc = text_splitter.split_documents(docs)
doc

按token拆分

一些语言模型,在API的使用过程中,交互时都有token数的限制。可见,拆分文本时,按照token数目拆分也是不错的方法。目前有许多token化工具,在统计文本token数时,请使用对应的token化工具。

注:OpenAI所使用的是tiktoken。

from langchain.text_splitter import CharacterTextSplitter

text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
                     chunk_size = 100, chunk_overlap = 20)

doc = text_splitter.split_documents(docs)
doc

向量化文档

langchain框架中的embeddings类,是与文本嵌入模型的进行交互地标准接口。当前有许多文本嵌入模型,如如OpenAI、Cohere、Hugging Face等,本文选用的是OpenAI的嵌入模型,也可以使用其他的模型。

嵌入模型对文本进行向量化,这种转化能够在向量空间中处理文本,通过向量空间的相似性,进行文本语义的搜索。

注:文本的相似性常由其向量表示的欧几里得距离来衡量,也称第二范式。对于n维的两个向量a,b,欧几里得距离可通过以下公式计算:

我们使用如下代码来创建文本片段的向量表示:

# 导入OpenAIEmbeddings类
from langchain.embeddings import OpenAIEmbeddings

# 实例化embeddings_model对象
embeddings_model = OpenAIEmbeddings(openai_api_key = "您的openai_api_key")

# embeddings_model调用embed_documents方法对文本向量化
embeddings = embeddings_model.embed_documents(
    ["你好",
    "Langchain",
    "你真棒"
    ])
embeddings

您应该看到类似的输出

[[0.001767348474591444,
  -0.016549955833298362,
  0.009669921232251705,
  -0.024465152668289573,
  -0.04928377577655549,
  ...],
  [...
  -0.026084684286027195,
  -0.0023797790465254626,
  0.006104789779720747,
  ...]]

向量数据存储

langchain支持多种向量存储,如Chroma, FAISS, Pinecone等。本文以Chroma为例

langchain框架提供Chroma包装类,封装了chromadb的操作。

需要先安装Chroma

pip install -q chromadb

接下来进行数据存储

from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma

# 下载README.md
!wget https://raw.githubusercontent.com/WTFAcademy/WTF-Langchain/main/01_Hello_Langchain/README.md

# TextLoader实例化对象loader,加载README.md生成docs文件
loader = TextLoader("./README.md")
docs = loader.load()

# 切分docs文件为documents
text_splitter = CharacterTextSplitter(
    chunk_size = 1000, chunk_overlap = 0)
documents = text_splitter.split_documents(docs)

# 实例化嵌入模型
embedding_model = OpenAIEmbeddings(openai_api_key = "您的openai_api_key")

# 存储向量化文本
db = Chroma.from_documents(documents, embedding_model)
db

检索

向量数据库最常用来查询给定文本的相似文本,通过similarity_search方法来获取。

query = " 什么是 WTF langchain"
docs = db.similarity_search(query)
docs

docs = db.similarity_search_with_score(query)
docs

总结:

本文我们学习了Langchain的数据连接部分

1.数据的加载

2.数据的切分

3.数据的嵌入向量化

4.数据的向量化存储以及查询

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

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

相关文章

Docker 搭建 LNMP + Wordpress(详细步骤)

目录 一、项目模拟 1. 项目环境 2. 服务器环境 3.任务需求 二、Linux 系统基础镜像 三、Nginx 1. 建立工作目录 2. 编写 Dockerfile 脚本 3. 准备 nginx.conf 配置文件 4. 生成镜像 5. 创建自定义网络 6. 启动镜像容器 7. 验证 nginx 四、Mysql 1.…

快速学习GO语言总结

备注:本博客将自己初步学习GO的总结进行分享,希望大家通过本博客可以在短时间内快速掌握GO的基本程序编码能力,如有错误请留言指正,谢谢! 一、初步了解Go语言 (一)Go语言诞生的主要问题和目标…

shell脚本——expect脚本免交互

目录 一.Here Document 1.1.定义 1.2.多行重定向 二.expect实现免交互 2.1.基础免交互改密码 2.2.expect定义 2.3.expect基本命令 2.4.expect实现免交互ssh主机 一.Here Document 1.1.定义 使用I/O重定向的方式将命令列表提供给交互式程序,是标准输 入的一…

uniapp开发小程序,上传图片和视频功能

1.需求&#xff1a; 可以上传图片和视频&#xff0c;并且都可以删除&#xff0c;图片可以预览。 2.效果图 3.代码&#xff1a; <template><!-- 上传start --><view style"display: flex; flex-wrap: wrap;"><view class"update-file&quo…

FPGA解析串口指令控制spi flash完成连续写、读、擦除数据

前言 最近在收拾抽屉时找到一个某宝的spi flash模块&#xff0c;如下图所示&#xff0c;我就想用能不能串口来读写flash&#xff0c;大致过程就是&#xff0c;串口向fpga发送一条指令&#xff0c;fpga解析出指令控制flah&#xff0c;这个指令协议目前就是&#xff1a; 55 AA …

达梦数据库表空间创建和管理

概述 本文将介绍在达梦数据库如何创建和管理表空间。 1.创建表空间 1.1表空间个数限制 理论上最多允许有65535个表空间&#xff0c;但用户允许创建的表空间 ID 取值范围为0~32767&#xff0c; 超过 32767 的只允许系统使用&#xff0c;ID 由系统自动分配&#xff0c;ID不能…

周易卦爻解读笔记——小过

第六十二卦小过 雷山小过 震上艮下 小过卦为母卦&#xff0c;象征小有过越。 小过卦是中孚卦的错卦&#xff0c;序卦传【有信者必行之&#xff0c;故受之以小过】 小过&#xff1a;亨&#xff0c;利贞&#xff0c;可小事&#xff0c;不可大事。飞鸟遗之音&#xff0c;不宜上宜…

NEO-6M GPS模块 +无线透传模块组成短距离数据空中传输

NEO-6M GPS模块 无线透传模块组成短距离数据空中传输 &#x1f4cc;相关篇《GY-NEO6MV2 GPS模块测试》 &#x1f33f;NEO-6M GPS模块 &#x1f33f;透传模块采用的是GC2400-TC017 ✨数据的一收一发&#xff0c;需要配合一个USB转TTL工具&#xff0c;在电脑端通过串口调试助…

7-5 螺旋方阵

分数 20 全屏浏览题目 切换布局 作者 C课程组 单位 浙江大学 所谓“螺旋方阵”&#xff0c;是指对任意给定的N&#xff0c;将1到NN的数字从左上角第1个格子开始&#xff0c;按顺时针螺旋方向顺序填入NN的方阵里。本题要求构造这样的螺旋方阵。 输入格式&#xff1a; 输入在…

第3步---MySQL的DDL和DML操作

第3步---MySQL的DDL和DML操作 1.DDL操作 Data Defination Language 数据定义语言。创建数据库和表的不涉及到数据的操作。 1.1DDL基本操作 1.1.1数据库相关操作 ddl&#xff1a;创建数据库&#xff0c;创建和修改表 对数据库常见的操作&#xff1a; 操作数据库 -- 展示数据…

Unity 之 Input类

文章目录 总述具体介绍 总述 Input 类是 Unity 中用于处理用户输入的重要工具&#xff0c;它允许您获取来自键盘、鼠标、触摸屏和控制器等设备的输入数据。通过 Input 类&#xff0c;您可以轻松地检测按键、鼠标点击、鼠标移动、触摸、控制器按钮等用户输入事件。以下是关于 I…

拥塞控制(TCP限制窗口大小的机制)

拥塞控制机制可以使滑动窗口在保证可靠性的前提下&#xff0c;提高传输效率 关于滑动窗口的属性以及部分机制推荐看TCP中窗口和滑动窗口的含义以及流量控制 拥塞控制出现的原因 看了上面推荐的博客我们已经知道了&#xff0c;由于接收方接收数据的能力有限&#xff0c;所以要通…

js IntersectionObserver简单案例

效果 源码 <!DOCTYPE html> <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&q…

IP库新增经过实践的Verilog 库

网上严重缺乏实用的 Verilog 设计。Project F 库是尝试让 FPGA 初学者变得更好部分。 设计包括 Clock- 时钟生成 (PLL) 和域交叉Display - 显示时序、帧缓冲区、DVI/HDMI 输出Essential- 适用于多种设计的便捷模块Graphics- 绘制线条和形状Maths- 除法、LFSR、平方根、正弦....…

Vue--》打造个性化医疗服务的医院预约系统(七)完结篇

今天开始使用 vue3 + ts 搭建一个医院预约系统的前台页面,因为文章会将项目的每一个地方代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的GithHub上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关…

Android OpenCV(七十四): Android OpenCV SDK 升级至 4.8.0

前言 如昨日文章所述,OpenCV 4.8.0 已经发布,虽然系列文章已经停更很久,但是版本升级工作笔者是很乐意快速完成的。 OpenCV 4.8.0 Android SDK:https://github.com/opencv/opencv/releases/download/4.8.0/opencv-4.8.0-android-sdk.zip 更新日志:https://github.com/o…

Apache Doris IP变更问题详解

Apache Doris IP变更问题详解 一、背景二、环境硬件信息软件信息 三、FE恢复3.1 异常日志3.2 获取当前ip3.3 重置ip信息3.4 重置元数据记录3.5 元数据模式恢复3.6 重置fe集群节点3.7 关闭元数据模式重启fe 四、BE恢复4.1 获取当前ip4.2 重置ip信息4.3 重置be集群节点 一、背景 …

简单、快速、无需注册的在线 MockJs 工具

简单、快速、无需注册的 MockJs 工具。通过参数来返回数据&#xff0c;传入什么参数就返回什么数据。 使用 接口只支持返回文本类数据&#xff0c;不支持图片、流数据等。 json 调用接口 https://mock.starxg.com/?responseBody{“say”:“hello”}&contentTypeapplic…

13.减少磁盘延迟方法

第四章 文件管理 13.减少磁盘延迟时间的方法 ​   (盘面号&#xff0c;柱面号&#xff0c;扇区号)&#xff0c;且需要连续读取物理地址(00&#xff0c;000&#xff0c;000)&#xff5e;(00&#xff0c;001&#xff0c;111)的扇区。先读取(00&#xff0c;000&#xff0c;000)…

qiuzhiji3

本篇想介绍一下慧与&#xff0c;这里的工作氛围和企业文化令人难忘&#xff0c;希望更多人了解它 也想探讨一下不同的文化铸就的不同企业&#xff0c;究竟有哪些差别。 本篇将从我个人角度出发描述慧与。 2022/3/16至2023/7/31 本篇初次写于2023年8月20日 说起来在毕业之前那段…