0基础实战langchain系列讲义【2】LangChain 的数据连接

文章目录

  • 前言
    • 1、数据连接定义?
    • 2、数据的加载、拆分过程
      • 2.1 TextLoader 加载文档
      • 2.2 拆分文档
        • 2.2.1 字符拆分
        • 2.2.2 拆分代码
        • 2.2.3 Markdown文档拆分
        • 2.2.4 按字符递归拆分
        • 2.2.5 按token拆分
    • 3 文本向量化和向量数据库存储查询
      • 3.1 文本向量化分块
      • 3.2 向量化存储、检索
        • 存储
        • 检索
        • 本地加载代码:

前言

上一期里学会LangChian 里的 hello world,算是跑通了个pipeline。所以讲道理,我们这期该回到人工智能最重要的血肉基础这一扒,数据部分

1、数据连接定义?

LLM应用往往需要用户特定的数据微调,但这些数据并不属于模型的训练集,例如:私有数据或行业数据等。

LangChain 的数据连接就是解决这些数据与LLM之间连接的,如果没有这些数据连接,只能通过LLM训练学习,这成本非常高,于是langchain的五大组件,就实现这种用户数据的加载、转换、存储和查询:

1 文档加载器:

可以从不同的数据源加载文档,例如pdf、json、Excel等,这在企业落地的时候,提供很大的便利。当然,这也可以线上或本地的!等下会详细讲;

2 文档转换器:

拆分文档,将文档转换为问答格式,去除冗余文档等

3文本嵌入模型:

将非结构化文本转换为浮点数数组表现形式,也称为向量的过程

4 向量存储:

存储和搜索嵌入数据(向量)

5 检索器:

提供数据查询的通用接口

2、数据的加载、拆分过程

LLM应用连接用户数据时,一般会有以下步骤:

加载文档(对应Load)
拆分文档
向量化文档分块
向量数据存储

这样4步,实现通过向量数据的检索器,来查询用户数据。

2.1 TextLoader 加载文档

TextLoader ,是一种最基本的加载器,用来加载本地文件系统中的文档。

from langchain.document_loaders import TextLoaderloader = TextLoader("./README.md")
docs = loader.load()

我们可以通过Document对象的page_content属性来访问文档的原始内容。

2.2 拆分文档

顾名思义,拆分文档的目的就是将文档拆分为更小的文档块。

Langchain 提供了多种文档0拆分器,用于将文档拆分为更小的文档块。每一种拆分器,对应着不同的拆分方法,我们简单罗列以下几种方法

2.2.1 字符拆分

CharacterTextSplitter 是最简单的文档拆分器,它将文档拆分为固定长度的文本块。代码如下:

from langchain.text_splitter import CharacterTextSplittertext_splitter = CharacterTextSplitter(        separator = "\n\n",chunk_size = 1000,chunk_overlap  = 200,length_function = len,
)split_docs = text_splitter.split_documents(docs)
2.2.2 拆分代码

RecursiveCharacterTextSplitter 的 from_language 函数,可以根据编程语言的特性,将代码拆分为合适的文本块。代码如下:

PYTHON_CODE = """
def hello_langchain():print("Hello, Langchain!")#Call the functionhello_langchain()
"""
python_splitter = RecursiveCharacterTextSplitter.from_language(language=Language.PYTHON, chunk_size=50, chunk_overlap=0
)
python_docs = python_splitter.create_documents([PYTHON_CODE])
python_docs
2.2.3 Markdown文档拆分

MarkdownHeaderTextSplitter 可以将Markdown文档按照段落结构,基于Markdown语法进行文档分块。代码如下:

from langchain.text_splitter import MarkdownHeaderTextSplittermarkdown_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"),
]splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
splits = splitter.split_text(markdown_document)
2.2.4 按字符递归拆分

这也是对于普通文本的推荐拆分方式。它通过一组字符作为参数,按顺序尝试使用这些字符进行拆分,直到块的大小足够小为止。默认的字符列表是[“\n\n”, “\n”, " ", “”]。它尽可能地保持段落,句子,单词的完整,因此尽可能地保证语义完整。

from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(# Set a really small chunk size, just to show.chunk_size = 100,chunk_overlap  = 20,length_function = len,
)
texts = text_splitter.split_documents(docs)
2.2.5 按token拆分

语言模型,例如OpenAI,有token限制。在API调用中,不应超过token限制。看来,在将文本分块时,根据token数来拆分也是不错的主意。有许多令牌化工具,因此当计算文本的token数时,应该使用与语言模型相同的令牌化工具。

注,OpenAI所使用的是tiktoken。

from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(chunk_size=100, chunk_overlap=0
)
split_docs = text_splitter.split_documents(docs)

3 文本向量化和向量数据库存储查询

3.1 文本向量化分块

好比图像识别或者推荐算法一样,同样文本里也是需要把多维的数据量化,

那接下来我们需要把这些数据在Langchain里面进行向量化,为了做向量化langchain和LLM模型里面都有一个接口,这就是Embeddings类接口。

当前市场上有许多嵌入模型提供者(如OpenAI、Cohere、Hugging Face等等)。

嵌入模型创建文本片段的向量表示。这意味着我们可以在向量空间中处理文本,并进行语义搜索等操作,从而查找在向量空间中最相似的文本片段,而不是整个文档了,提升我们的效率和结果准确度!

当使用OpenAI的文本嵌入模型时,我们使用如下代码来创建文本片段的向量表示:

向量化前!

from langchain.embeddings import OpenAIEmbeddings
embeddings_model = OpenAIEmbeddings(openai_api_key="你的有效openai api key")
embeddings = embeddings_model.embed_documents(["hello!","Langchain!","world!"]
)

embeddings
向量化后!

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

3.2 向量化存储、检索

向量数据存储,或成为向量数据库,负责存储文本嵌入的向量表现,并提供向量检索的能力。Langchain 提供了多种开源或商业向量数据存储,包括:Chroma, FAISS, Pinecone等等,我们可以理解为网盘,把数据存到上面去!

本讲以Chroma为例。

存储

在进行以下代码执行前,需要安装Chroma的包:

pip install -q chromadbfrom langchain.document_loaders import TextLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chromatext_splitter=CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(docs)
db = Chroma.from_documents(documents, OpenAIEmbeddings())
检索

向量数据库提供的重要接口就是相似性查询。如上述内容提到,文本相似性的衡量,由文本的向量表示的欧几里得或者其他距离来衡量。

向量数据库提供了该接口,用于查询与给定文本最相似的文本。

query = “什么是Langchain?”
docs = db.similarity_search(query)
print(docs[0].page_content)

本地加载代码:

安装langchain

pip install -q langchain==0.0.235 openai

注意:

原项目地址:https://github.com/langchain-ai/langchain

讲义统一使用V0.0.235版本

从数据的接入、数据的分割,到向量的构建、向量的存储、向量的搜索,每一步可供选择的有很多,具体还是要结合实际的业务,当然这也是我们后续学习中需要掌握的!

这里有很多不懂的,可以在群里切磋!

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

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

相关文章

Html+Css+JavaScript实现完整的轮播图功能

概要 这个案例具备常见轮播图完整的功能,大家可以根据自己的需求去修改; 代码可以直接复制运行,需要安装sass 主要功能: (1)鼠标移入轮播图,左右两边的按钮出现,离开则隐藏按钮&a…

proteus8.15安装教程

proteus8.15安装教程 1.管理员运行 2.一直NEXT到这一步,需要注意,一定要选这一个 3.选中后出现 4.一直下一步到更新 这边结束后准备激活: 1.安装激活插件,先关闭防火墙 2.下一步 3.最后,将数据库放在根目录下 …

从零开始配置pwn环境:sublime配置并解决pwn脚本报错问题

1.sublime安装 Download - Sublime Text ──(holyeyes㉿kali2023)-[~] └─$ sudo dpkg -i sublime-text_build-4169_amd64.deb [sudo] password for holyeyes: Selecting previously unselected package sublime-text. (Reading database ... 409163 files and directori…

LeetCode——二叉树

二叉树 思路【labuladong】 1)是否可以通过遍历一遍二叉树得到答案?如果可以,用一个traverse函数配合外部变量来实现——回溯 2)是否可以定义一个递归函数,通过子问题的答案推导出原问题的答案?如果可以…

Halcon模板图像gen_contour_region_xld/find_shape_model

Halcon模板图像 文章目录 Halcon模板图像1. 从参考图像的特定区域中创建模板2. 使用XLD轮廓创建模板 本文将讲述如何创建合适的模板。可以从参考图像的特定区域中创建,也可以使用XLD轮廓创建合适的模板。接下来将分别介绍这两种方法。 1. 从参考图像的特定区域中创建…

【万字解析】Webpack 优化构建性能(分析->优化)

Webpack 优化构建性能 1. 分析构建性能 分析构建体积 全局安装 webpack-bundle-analyzer 插件 npm i -g webpack-bundle-analyzer运行 webpack-bundle-analyzer webpack-bundle-analyzer分析构建速度 // webpack.config.jsconst SpeedMeasurePlugin require("speed-me…

玩转浏览器开发者工具:发现前端世界的秘密花园

解锁网页背后的奥秘 对于许多前端开发者和网页设计师来说,浏览器的开发者工具是不可或缺的利器。通过这些工具,我们可以深入了解网页的内部结构、调试代码、测试设计以及优化性能。在本文中,我们将带你探索浏览器开发者工具的奥秘&#xff0…

huggingface学习 | 云服务器使用hf_hub_download下载huggingface上的模型文件

系列文章目录 huggingface学习 | 云服务器使用git-lfs下载huggingface上的模型文件 文章目录 系列文章目录一、hf_hub_download介绍二、找到需要下载的huggingface文件三、准备工作及下载过程四、全部代码 一、hf_hub_download介绍 hf_hub_download是huggingface官方支持&…

快速上手Flask(二) flask-restful以及全局响应配置

文章目录 快速上手Flask(二) flask-restful以及全局响应配置什么是flask-restful安装flask_restfulflask_restful 使用flask 使用app.route 装饰器自定义路由 全局响应配置flask的自带的jsonify方法JSONIFY_PRETTYPRINT_REGULARJSONIFY_MIMETYPE重写jsonify方法 快速上手Flask(…

力扣【四数之和】

一、题目描述 18. 四数之和 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复&#x…

大数据开发之电商数仓(hadoop、flume、hive、hdfs、zookeeper、kafka)

第 1 章:数据仓库 1.1 数据仓库概述 1.1.1 数据仓库概念 1、数据仓库概念: 为企业制定决策,提供数据支持的集合。通过对数据仓库中数据的分析,可以帮助企业,改进业务流程、控制成本,提高产品质量。 数据…

C#中chart控件

C#中chart控件 图表的5大集合 例子 第一步:创建工程 放入chart控件 series集合 选择图标类型 选择绘制曲线的宽度和颜色。 显示数据标签 Title集合 添加标题 调整标题字体:大小和颜色 CharsArea集合 对坐标轴进行说明 设置间隔 设置刻度…

【线性代数与矩阵论】矩阵的谱半径与条件数

矩阵的谱半径与条件数 2023年11月18日 文章目录 矩阵的谱半径与条件数1. 矩阵的谱半径2. 谱半径与范数的关系3. 矩阵的条件数下链 1. 矩阵的谱半径 定义 设 A ∈ C n n {A\in \mathbb C^{n \times n} } A∈Cnn , λ 1 , λ 2 , ⋯ , λ n { \lambda_1,\lambda_2…

第11章_常用类和基础API拓展练习(字符串相关练习,日期时间API练习,比较器练习,其它API练习)

文章目录 第11章_常用类和基础API拓展练习字符串相关练习1:阅读题1、length说明2、阅读代码,分析结果3、阅读代码,分析结果4、阅读代码,分析结果5、阅读代码,分析结果6、阅读代码,分析结果7、阅读代码&…

【Linux】Linux基本操作(二):rm rmdir man cp mv cat echo

承接上文: 【【Linux】Linux基本操作(一):初识操作系统、ls、cd、touch、mkdir、pwd 】 目录 1.rmdir指令 && rm 指令: rmdir -p #当子目录被删除后如果父目录也变成空目录的话,就连带父目录一…

Elasticsearch 字段更新机制

目录 不支持原地更新 更新过程 段合并(Segment Merge) 结论 不支持原地更新 Elasticsearch 不支持原地更新(in-place update)索引中的单个字段。由于 Elasticsearch 使用了不可变的倒排索引,一旦文档被写入&#x…

崩溃了!我说用attach进行问题定位,面试官问我原理

Arthas(阿尔萨斯)是一款开源的Java诊断和监控工具,可以在生产环境中进行实时的应用程序分析和故障排查。Arthas的实现原理主要基于Java Instrumentation API和Java Agent技术。 Java Agent 是 Java 编程语言提供的一种特殊机制,允…

多模态是什么意思,在生活工业中有哪些应用?

问题描述:多模态是什么意思,在生活工业中有哪些应用? 问题解答: 多模态(Multimodal)指的是同时利用多种不同模式或传感器的情境、系统或技术。在不同领域,多模态可以涉及到多种感官或信息源的…

第4周:综合应用和实战项目 Day 25-27: 模型调优和优化学习高级技巧

第4周:综合应用和实战项目 Day 25-27: 模型调优和优化学习高级技巧 在这个阶段,我们将专注于提高模型的性能,通过使用高级技巧如正则化、dropout、批标准化等。这些技术对于防止过拟合和提高模型的泛化能力非常重要。 重点学习内容&#xff…

springboot(ssm电子产品销售网站 在线购物商城系

springboot(ssm电子产品销售网站 在线购物商城系统Java系统 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0)…