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

news2024/12/25 1:00:54

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 TextLoader

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

在这里插入图片描述

示例二:csv加载

from langchain.document_loaders.csv_loader import CSVLoader

loader = 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 HuggingFaceEmbeddings


model_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 CharacterTextSplitter


model_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 CharacterTextSplitter


model_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.coloradmin.cn/o/1005961.html

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

相关文章

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

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

SG-Former实战:使用SG-Former实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

Vue-video-player下载失败(npm i 报错)

Vue-video-player下载失败 最近在做项目时涉及到视频的播放组件,看了一下选择了Vue-video-player这个工具,实际在操作中是遇到许多问题的。 Q1:不支持谷歌 对于 “vue-video-player” 使用时出现 Adobe Flash 不再支持的提示,这是因为 Ado…

[maven] maven 简述及使用 maven 管理单个项目

maven 简述及使用 maven 管理单个项目 简单的说就是 maven 是一个项目管理工具,同时也是一个依赖管理工具。 使用 maven 生成的项目结构大致如下: project|- src/main/java|- src/main/resources|- src/test/java|- src/test/resources本篇笔记带一些…

服务器访问本机图片nginx配置

下面是Nginx的配置 然后是yml文件配置 后端返回给前端的数据直接返回这个地址就可以了 {"success": true,"code": "200","msg": "操作成功","data": [{"趋势": "https://120.26.98.185:8090/s…

Day62|图part1:深度优先搜索理论基础、797. 所有可能的路径

深度优先搜索&#xff08;DFS&#xff09;理论基础 图的实质和存储方式 图实际上就是一棵多叉树&#xff0c;可以用以下的数据结构进行表示&#xff1a; class Vertex {int id;vector<Vertex*> neighbors; };多叉树的&#xff1a; /* 基本的 N 叉树节点 */ class Tre…

第一章 计算机系统概述 八、虚拟机

目录 一、传统虚拟机的结构 二、两类虚拟机管理程序 &#xff08;1&#xff09;定义&#xff1a; &#xff08;2&#xff09;区别&#xff1a;&#xff08;考点&#xff09; 一、传统虚拟机的结构 二、两类虚拟机管理程序 &#xff08;1&#xff09;定义&#xff1a; &…

电子企业MES管理系统实施的功能和流程有哪些

MES生产管理系统是一种应用于电子企业的管理系统&#xff0c;旨在提高生产效率、降低浪费、优化资源利用&#xff0c;并实时监控和改善生产过程。在电子企业中&#xff0c;实施MES管理系统对于实现精细化管理、增强信息互联、提高产品质量和交货期等方面具有重要作用。 一、MES…

模电课设:用Multisim了解三极管特性及计算静态工作点

1 课设内容 1&#xff09;绘制三极管输入特性曲线、输出特性曲线、放大倍数的幅频特性&#xff1b; 2&#xff09;测试三极管放大倍数β与VBE的关系、放大倍数与温度的关系&#xff1b; 3&#xff09;利用Multisim计算静态工作点。 2 模型搭建 电路一&#xff1a;绘制三极管…

字节一面:如何实现单行/多行文本溢出的省略样式?

前言 最近博主在字节面试中遇到这样一个面试题&#xff0c;这个问题也是前端面试的高频问题&#xff0c;作为一名前端开发工程师&#xff0c;css是我们的必备技能&#xff0c;文本溢出问题也是我们经常遇到的问题&#xff0c;我们不仅只是处理这种情况&#xff0c;还要考虑他的…

微信小程序 通过 pageScrollTo 滚动到界面指定位置

我们可以先创建一个page 注意 一定要在page中使用 因为pageScrollTo控制的是页面滚动 你在组件里用 他就失效了 我们先来看一个案例 wxml 代码如下 <view><button bindtap"handleTap">回到指定位置</button><view class "ControlHeight…

证件照电子版怎么做?学会这个方法自己就会做证件照

自己制作证件照的好处在于可以根据需要调整照片的大小、背景颜色以及美颜等设置&#xff0c;以满足不同场景下的使用需求。此外&#xff0c;自己制作证件照还可以更好地保护个人隐私&#xff0c;避免使用公共设备拍摄证件照时泄露个人信息。 总的来说&#xff0c;自己制作证件…

Webpack Sourcemap文件泄露漏洞

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

Revit SDK 介绍:CurtainSystem 幕墙系统

前言 这个例子介绍如何创建和修改幕墙系统。 内容 如图所示&#xff0c;创建一个幕墙系统&#xff0c;这个系统里有三个面。 创建幕墙系统 // 遍历体量元素的几何&#xff0c;得到所有的面&#xff0c;保存在 m_mydocument.MassFaceArray // 获取用户选中的面 FaceArray …

哪种IP更适合你的数据抓取需求?

程序员大佬们好&#xff01;今天我要和大家分享一个关于数据抓取的话题&#xff0c;那就是Socks5爬虫ip和动态IP之间的比较。在进行数据抓取时&#xff0c;选择适合自己需求的工具和技术是非常重要的。Socks5爬虫ip和动态IP都是常见的网络工具&#xff0c;它们在数据抓取方面都…

节能灯与led灯哪个对眼睛好一点?精选好用的led护眼灯

节能灯和led灯相比&#xff0c;肯定是led灯更加护眼一点的。 首先节能灯最大的优点就是节能&#xff0c;可以使用的寿命长。可是和led灯相比&#xff0c;led灯的转换效率会更好一点&#xff0c;也更加节能&#xff0c;可使用寿命也很长。其次节能灯他启动会比较慢&#xff0c;散…

DC电源模块在节省能源方面上的优秀表现

BOSHIDA DC电源模块在节省能源方面上的优秀表现 DC电源模块是现代电子产品中广泛应用的一种电源转换设备&#xff0c;其能够将交流电转换成直流电&#xff0c;并为电子设备提供稳定、可靠的电源供应。相比于传统的交流电源&#xff0c;DC电源模块在节省能源方面上具有优秀的表…

【开发】React框架下如何集成H.265网页流媒体EasyPlayer.js视频播放器?

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;可支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff0c;能支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#…

人形机器人闭门研讨会报名丨青源Workshop第24期

青源Workshop丨No.24 人形机器人主题闭门研讨会 在全球普遍面临人口老龄化问题的情况下&#xff0c;人形机器人作为一种新兴的技术领域&#xff0c;正逐步在工业、服务、医疗等领域崭露头角&#xff0c;为制造业、农业以及各种服务业带来了新的机遇与解决方案。与传统的工业机器…

激活函数总结(三十二):激活函数补充(Serf、FReLU)

激活函数总结&#xff08;三十二&#xff09;&#xff1a;激活函数补充 1 引言2 激活函数2.1 Serf激活函数2.2 FReLU激活函数 3. 总结 1 引言 在前面的文章中已经介绍了介绍了一系列激活函数 (Sigmoid、Tanh、ReLU、Leaky ReLU、PReLU、Swish、ELU、SELU、GELU、Softmax、Soft…