langchain主要模块(二):数据连接

langchain2之数据连接

  • langchain
    • 1.概念
    • 2.主要模块
        • 模型输入/输出 (Model I/O)
        • 数据连接 (Data connection)
        • 链式组装 (Chains)
        • 代理 (Agents)
        • 内存 (Memory)
        • 回调 (Callbacks)
    • 3.数据连接
      • 1.数据加载:
      • 2.文档分割:
      • 3.文档向量化:
      • 4.存储和检索向量数据:
      • 5.检索器:

langchain

1.概念

什么是LangChain?

源起:LangChain产生源于Harrison与领域内的一些人交谈,这些人正在构建复杂的LLM应用,他在开发方式上看到了一些可以抽象的部分。一个应用可能需要多次提示LLM并解析其输出,因此需要编写大量的复制粘贴。

LangChain使这个开发过程更加简单。一经推出后,在社区被广泛采纳,不仅有众多用户,还有许多贡献者参 与开源工作。

还有大模型本身的问题,无法感知实时数据,无法和当前世界进行交互。

LangChain是一个用于开发大语言模型的框架。

主要特性:

  1. 数据感知:能够将语⾔模型与其他数据源进⾏连接。

  2. 代理性:允许语⾔模型与其环境进⾏交互。可以通过写⼯具的⽅式做各种事情,数据的写⼊更新。

主要价值:

1、组件化了需要开发LLM所需要的功能,提供了很多工具,方便使用。

2、有一些现成的可以完整特定功能的链,也可以理解为提高了工具方便使用。

2.主要模块

在这里插入图片描述

LangChain 为以下模块提供了标准、可扩展的接口和外部集成,按照复杂程度从低到高列出:

模型输入/输出 (Model I/O)

与语言模型进行接口交互

数据连接 (Data connection)

与特定于应用程序的数据进行接口交互

链式组装 (Chains)

构造调用序列

代理 (Agents)

根据高级指令让链式组装选择要使用的工具

内存 (Memory)

在链式组装的多次运行之间持久化应用程序状态

回调 (Callbacks)

记录和流式传输任何链式组装的中间步骤

3.数据连接

在这里插入图片描述

Data Connection = DocumentLoader + Transformer + Embedding + Vector + Retriever

1.数据加载:

从多种不同的源加载⽂档。

已经支持的文本格式:

  • txt
  • csv
  • md
  • html
  • json
  • pdf
  • ipynb

示例一:文本加载

from langchain.document_loaders import TextLoaderloader = TextLoader("/datas/work/lnn2/langchain/LangChain_Example/data/story.txt")
loader.load()

在这里插入图片描述

示例二:csv加载

from langchain.document_loaders.csv_loader import CSVLoaderloader = CSVLoader(file_path='/datas/work/lnn2/langchain/LangChain_Example/data/story.csv')
loader.load()

在这里插入图片描述

其他:

from langchain.document_loaders import UnstructuredHTMLLoader
from langchain.document_loaders import JSONLoader
from langchain.document_loaders import UnstructuredMarkdownLoader
from langchain.document_loaders import PyPDFLoader
from langchain.document_loaders import NotebookLoader

2.文档分割:

分割⽂档,将⽂档转换为问答格式,删除冗余⽂档等。

文本分割器(Text splitters):当你需要处理长文本时,将文本分割成块是经常要用到的。虽然听起来很简单,但实际上可能存在很多复杂性。理想情况下,你希望将语义相关的文本部分保持在一起。"语义相关"的含义可能取决于文本的类型。

工作原理:

1、将文本分割成小的、语义有意义的块(通常是句子)。

2、开始将这些小块组合成一个较大的块,直到达到某个大小(由某个函数测量)。

3、一旦达到那个大小,就将该块作为自己的文本片段,然后开始创建一个新的文本块,其中有一些重叠(以保持块之间的上下文)。

我们可以定制的部分:

1、文本如何被分割

2、块大小(chunk size)如何被测量

from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(# 文本块的最大大小,由length_function测量得出。# 例如,如果你设置chunk_size为1000,那么每个分割出来的文本块的长度(由length_function计算)都不会超过1000。chunk_size = 100,# 块之间的最大重叠。有一些重叠可以在块之间保持文本上下文的连续性chunk_overlap  = 20,# 用于计算每个块的长度length_function = len,# 决定是否在元数据中包含每个块在原始文档中的起始位置。add_start_index = True,
)
# This is a long document we can split up.
with open('/datas/work/lnn2/langchain/LangChain_Example/data/story.txt') as f:state_of_the_union = f.read()
texts = text_splitter.create_documents([state_of_the_union])
print(len(texts))
print(texts[0])
print(texts[1])
print(texts[2])

在这里插入图片描述

3.文档向量化:

将⾮结构化⽂本转换为⼀系列浮点数。

Embeddings 类是一个用于与文本嵌入模型进行交互的类。有很多嵌入模型提供者(OpenAI、Cohere、Hugging Face 等)-这个类旨在为所有这些模型提供一个标准接口。

Embeddings 创建了一个文本的向量表示。这很有用,因为它意味着我们可以在向量空间中思考文本,并做一些类似语义搜索的事情,我们在向量空间中寻找最相似的文本片段。

from langchain.embeddings import HuggingFaceEmbeddingsmodel_name = "/mnt/code/LLM_Service/text_model/text2vec-large-chinese/"
model_kwargs = {'device': 'cpu'}
encode_kwargs = {'normalize_embeddings': False}
embeddings_model = HuggingFaceEmbeddings(model_name=model_name,model_kwargs=model_kwargs,encode_kwargs=encode_kwargs
)embeddings = embeddings_model.embed_documents(["Hi there!","Oh, hello!","What's your name?","My friends call me World","Hello World!"]
)
len(embeddings), len(embeddings[0])
embedded_query = embeddings_model.embed_query("What was the name mentioned in the conversation?")
embedded_query[:5]

[0.1727541834115982, 0.4848562180995941, -0.7204862236976624, -0.11009161174297333, -0.21702571213245392]

4.存储和检索向量数据:

存储和搜索非结构化数据最常见的方法之一是对其进行嵌入并存储生成的嵌入向量 ,然后在查询时对非结构化查询进行嵌入并检索与嵌入查询“最相似”的嵌入向量。向量存储负责存储嵌入数据并执行向量搜索 。

向量存储

from langchain import FAISS
from langchain.document_loaders import TextLoader
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.text_splitter import CharacterTextSplittermodel_name = "/mnt/code/LLM_Service/text_model/text2vec-large-chinese/"
model_kwargs = {'device': 'cpu'}
encode_kwargs = {'normalize_embeddings': False}
embeddings_model = HuggingFaceEmbeddings(model_name=model_name,model_kwargs=model_kwargs,encode_kwargs=encode_kwargs
)
# 加载文本
story = TextLoader('/datas/work/lnn2/langchain/LangChain_Example/data/story.txt').load()
# transform定义
text_splitter = CharacterTextSplitter(separator = "\n\n",chunk_size = 100,chunk_overlap  = 20,length_function = len,
)
# transform出来
texts = text_splitter.split_documents(story)
print(len(texts))
# 加载到vector store
db = FAISS.from_documents(documents=texts,embedding=embeddings_model 
)

文本相似度搜索

query = "托马斯是一名时间旅行者?"
docs = db.similarity_search(query,k=1)
print(len(docs))
print(docs)

1

[Document(page_content=‘故事三:时间旅行者的恋情\n托马斯是一名时间旅行者,他在不同的时代中穿梭。在一次时间旅行中,他在18世纪遇到了美丽的女子艾米丽。托马斯深深地爱上了艾米丽,但他们因时代的差异而不能在一起。在经历了一系列的冒险和挑战后,托马斯最终决定留在18世纪,与艾米丽共度一生。’, metadata={‘source’: ‘/datas/work/lnn2/langchain/LangChain_Example/data/story.txt’})]

向量相似度搜索

embedding_vector = embeddings_model.embed_query(query)
docs = db.similarity_search_by_vector(embedding_vector,k=1)
print(len(docs))
print(docs)

1

[Document(page_content=‘故事三:时间旅行者的恋情\n托马斯是一名时间旅行者,他在不同的时代中穿梭。在一次时间旅行中,他在18世纪遇到了美丽的女子艾米丽。托马斯深深地爱上了艾米丽,但他们因时代的差异而不能在一起。在经历了一系列的冒险和挑战后,托马斯最终决定留在18世纪,与艾米丽共度一生。’, metadata={‘source’: ‘/datas/work/lnn2/langchain/LangChain_Example/data/story.txt’})]

5.检索器:

一个检索器(Retriever)是一个接口,它可以返回一个非结构化查询(Unstructured Query)对应的文档。它比向量存储(Vector Store)更加通用。一个检索器(Retriever)不需要存储文档,只需要能够返回(或检索)文档。向量存储(Vector Store)可以作为检索器(Retriever)的主体,但是也有其他类型的检索器(Retriever)。

文本向量化及存储

from langchain import FAISS
from langchain.document_loaders import TextLoader
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.text_splitter import CharacterTextSplittermodel_name = "/mnt/code/LLM_Service/text_model/text2vec-large-chinese/"
model_kwargs = {'device': 'cpu'}
encode_kwargs = {'normalize_embeddings': False}
embeddings_model = HuggingFaceEmbeddings(model_name=model_name,model_kwargs=model_kwargs,encode_kwargs=encode_kwargs
)
# 加载文本
story = TextLoader('/datas/work/lnn2/langchain/LangChain_Example/data/story.txt').load()
# transform定义
text_splitter = CharacterTextSplitter(separator = "\n\n",chunk_size = 100,chunk_overlap  = 20,length_function = len,
)
# transform出来
texts = text_splitter.split_documents(story)
print(len(texts))
# 加载到vector store
db = FAISS.from_documents(documents=texts,embedding=embeddings_model 
)

指定检索器取几个参数

retriever = db.as_retriever(search_kwargs={"k": 1})
docs = retriever.get_relevant_documents("托马斯是一名时间旅行者?")
print(docs)

[Document(page_content=‘故事三:时间旅行者的恋情\n托马斯是一名时间旅行者,他在不同的时代中穿梭。在一次时间旅行中,他在18世纪遇到了美丽的女子艾米丽。托马斯深深地爱上了艾米丽,但他们因时代的差异而不能在一起。在经历了一系列的冒险和挑战后,托马斯最终决定留在18世纪,与艾米丽共度一生。’, metadata={‘source’: ‘/datas/work/lnn2/langchain/LangChain_Example/data/story.txt’})]

检索类型

# 检索类型,默认情况下,向量存储检索器使用相似度搜索。如果底层向量存储支持最大边际相关性搜索,则可以将其指定为搜索类型。
# 最大边际相关性检索的主要思想是在选择结果时,不仅要考虑结果与查询的相关性,还要考虑结果之间的差异性。也就是说,它试图在相关性和多样性之间找到一个平衡,以提供更有价值的信息。
# 具体来说,最大边际相关性检索会首先选择与查询最相关的结果,然后在后续的选择中,会优先选择与已选择结果差异较大的结果。这样,返回的结果既能覆盖查询的主要相关信息,又能提供多样的视角和内容,从而减少冗余。
retriever = db.as_retriever(search_type="mmr",search_kwargs={"k": 1})
docs = retriever.get_relevant_documents("托马斯是一名时间旅行者?")
print(docs)

[Document(page_content=‘故事三:时间旅行者的恋情\n托马斯是一名时间旅行者,他在不同的时代中穿梭。在一次时间旅行中,他在18世纪遇到了美丽的女子艾米丽。托马斯深深地爱上了艾米丽,但他们因时代的差异而不能在一起。在经历了一系列的冒险和挑战后,托马斯最终决定留在18世纪,与艾米丽共度一生。’, metadata={‘source’: ‘/datas/work/lnn2/langchain/LangChain_Example/data/story.txt’})]

检索器设置相似度阈值

retriever = db.as_retriever(search_type="similarity_score_threshold", search_kwargs={"score_threshold": 0.5})
docs = retriever.get_relevant_documents("托马斯是一名时间旅行者?")

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

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

相关文章

Webpack Sourcemap文件泄露漏洞

Webpack Sourcemap文件泄露漏洞 前言一、Webpack和Sourcemap1.1 什么是Webpack1.2 什么是Sourcemap 二、漏洞利用2.1 使用reverse-sourcemap工具2.1 直接看前端代码 三、漏洞挖掘漏洞修复 前言 Webpack主要是用于前端框架进行打包的工具,打包后形成.js.map文件&…

单例模式-饿汉模式、懒汉模式

单例模式,是设计模式的一种。 在计算机这个圈子中,大佬们针对一些典型的场景,给出了一些典型的解决方案。 目录 单例模式 饿汉模式 懒汉模式 线程安全 单例模式 单例模式又可以理解为是单个实例(对象) 在有些场…

LeetCode 35. 搜索插入位置

题目链接 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目解析 该题我们可以采用二分查找的方式,我们可以把数组分为,小于target的一边儿和大于等于target的一边儿。 当midleft(right-left)下标所对应的数大于等于targ…

多版本CUDA安装切换

系统中默认的安装CUDA为12.0,现在需要在个人用户下安装CUDA11.7。 CUDA 下载 CUDA官网下载 安装 Log file not open.Segmentation fault (core dumped)错误 将/tmp/cuda-installer.log删除即可。重新安装,去掉驱动的安装,设置Toolkit的安装…

骨科常用评估量表汇总,详细评分标准分享,建议收藏!

根据骨科医生的量表使用情况,笔者整理了9个常用的骨科量表,可在线评测并直接出结果,还可转发或生成二维码使用,或创建项目进行数据管理,有需要的小伙伴赶紧收藏! Harris髋关节评分系统 Harris髋关节评分系…

3D点云处理:Opencv Pcl实现深度图转点云(附源码)

文章目录 0. 测试效果1. 代码实现文章目录:3D视觉个人学习目录0. 测试效果 处理结果1. 代码实现 文章中提供的深度图像,深度图像一般以.tiff和.png保存,可以通过Opencv中的 c v : : i m r

fabirc 将图像绘制原点定为图形内部

添加元素时,设置属性: originX: center, originY: center, 如我定义两个矩形: addrect () { // 矩形1var rect new fabric.Rect({top: 50,left: 100,width: 100,height: 70,fill: #F56C6C,strokeUniform: true // 限制边框宽度缩放})canva…

LINUX 网络管理

目录 一、NetworkManager的特点 二、配置网络 1、使用ip命令临时配置 1)查看网卡在网络层的配置信息 2)查看网卡在数据链路层的配置信息 3)添加或者删除临时的网卡 4)禁用和启动指定网卡 2、修改配置文件 3、nmcli命令行…

时序分解 | MATLAB实现基于SSA奇异谱分析的信号分解分量可视化

时序分解 | MATLAB实现基于LMD局部均值分解的信号分解分量可视化 目录 时序分解 | MATLAB实现基于LMD局部均值分解的信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 奇异谱分解奇异谱分析SSA 可直接替换txt数据运行 Matlab 1.包含3D分解效果图 频谱图等…

深圳唯创知音电子将参加IOTE 2023第二十届国际物联网展•深圳站

​ 2023年9月20~22日,深圳唯创知音电子将在 深圳宝安国际会展中心(9号馆9B1)为您全面展示最新的芯片产品及应用方案,助力传感器行业的发展。 作为全球领先的芯片供应商之一,深圳唯创知音电子一直致力于为提供高质量、…

分类预测 | Matlab实现基于BP-Adaboost数据分类预测

分类预测 | Matlab实现基于BP-Adaboost数据分类预测 目录 分类预测 | Matlab实现基于BP-Adaboost数据分类预测效果一览基本介绍研究内容程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于BP-Adaboost数据分类预测(Matlab完整程序和数据) 2.多特征输入…

K8S基础概念

1、Node Node作为集群中的工作节点,运行真正的应用程序,在Node上Kubernetes管理的最小运行单元是Pod。Node上运行着Kubernetes的Kubelet、kube-proxy服务进程,这些服务进程负责Pod的创建、启动、监控、重启、销毁、以及实现软件模式的负载均…

UMA 2 - Unity Multipurpose Avatar☀️二.概念介绍

文章目录 🟥 UMA核心🟧 UMA Data 数据类1️⃣ DNA2️⃣ Slots 插槽Overlays 纹理贴图🟨 Base Recipe 基础人形Recipes🟩 Wardrobe Recipes 服饰Recipes🟥 UMA核心 UMA核心组件是 DynamicCharacterAvatar ,后续我们跟插件交互的API,例如捏脸的参数,都是与之交互完成的…

基于Android的生鲜农产品商城交易设计与实现

摘 要 人们生活水平随着发展不断的提升,人们对生鲜产品消费比越来越依赖,都希望吃到新鲜的食品。消费的加大给生鲜了全新的供应链及销售模式,那种传统的生鲜配送模式也在发生着变化。生鲜系统电商平台在我国目前是属于盛行的电商行业&#x…

算法:经典贪心算法--跳一跳[2]

1、题目: 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处: 返回到达 nums[n - 1] 的最小跳跃次数。生…

消息队列MQ

一、消息队列 网络端的Http请求默认采用的是同步请求方式,客户端与服务器端是基于请求和响应模式进行通信的。也就意味着,客户端发起请求。必须要等待服务器端完成处理结果给客户端才能继续进行下一步操作,如果服务器发送网络延迟、宕机、卡顿…

Redis哨兵集群的介绍及搭建

Redis 是一款开源的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。然而,作为一个单点服务,Redis 在面临硬件故障或者网络问题时可能会导致服务不可用。为了解决这个问题,Redis 提供了哨兵模式,一个…

jmeter采集ELK平台海量业务日志( 采用Scroll)

由于性能测试需要,需采集某业务系统海量日志(百万以上)来使用,做稳定性压测使用。但Elasticsearch的结果分页size单次最大为10000(运维同事为保证ES安全)。为了能够快速采集ELK平台业务日志,可以…

Tomcat多实例 + Tomcat负载均衡、动静分离(Nginx联动)

多实例联动 一、Tomcat 多实例1.1 什么是Tomcat多实例?1.2 配置思路1.3 配置实现1.3.1 安装jdk1.3.2 安装tomcat1.3.3 配置 tomcat 环境变量1.3.4 修改端口号1.3.5 修改各 tomcat 实例中的 startup.sh 和 shutdown.sh 文件,添加 tomcat 环境变量1.3.6 启…

Java实现合并多个excel操作

涉及较多封装的工具类,所有依赖的工具类均提供代码,根据名称新建对应的类,在每个工具类中再引入相应的依赖即可 首先需要明确的是,需要合并的每个excel的表头名称必须是相同的, 针对表头,建立传输的dto&a…