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

这篇具有很好参考价值的文章主要介绍了langchain主要模块(二):数据连接。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

langchain

1.概念

什么是LangChain?

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

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

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

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

主要特性:

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

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

主要价值:

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

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

2.主要模块

langchain主要模块(二):数据连接,langchain,大模型,深度学习,Baichuan-13b,Dataconnection

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

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

与语言模型进行接口交互

数据连接 (Data connection)

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

链式组装 (Chains)

构造调用序列

代理 (Agents)

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

内存 (Memory)

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

回调 (Callbacks)

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

3.数据连接

langchain主要模块(二):数据连接,langchain,大模型,深度学习,Baichuan-13b,Dataconnection

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()

langchain主要模块(二):数据连接,langchain,大模型,深度学习,Baichuan-13b,Dataconnection

示例二:csv加载

from langchain.document_loaders.csv_loader import CSVLoader

loader = CSVLoader(file_path='/datas/work/lnn2/langchain/LangChain_Example/data/story.csv')
loader.load()

langchain主要模块(二):数据连接,langchain,大模型,深度学习,Baichuan-13b,Dataconnection

其他:

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])

langchain主要模块(二):数据连接,langchain,大模型,深度学习,Baichuan-13b,Dataconnection

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’})]

检索器设置相似度阈值文章来源地址https://www.toymoban.com/news/detail-708654.html

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

到了这里,关于langchain主要模块(二):数据连接的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [LangChain核心模块]模型的输入和输出->Language models

    ⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章 ⭐作者主页:@逐梦苍穹 ⭐所属专栏:人工智能。 语言模型 ( Language models ) LangChain提供了两种类型模型的接口和集成: ● LLMs: 输入为文本字符串,输出为文本字符串的模型 ● Chat models: 由语言模

    2024年02月16日
    浏览(37)
  • [LangChain核心模块]模型的输入输出->output_parsers

    ⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章 ⭐作者主页:@逐梦苍穹 ⭐所属专栏:人工智能。 输出解析器 output_parsers 语言模型输出文本。但很多时候,您可能希望获得比仅文本更结构化的信息。这就是输出解析器的作用。 输出解析器是帮助结

    2024年02月16日
    浏览(35)
  • 使用MobaXterm连接服务器并利用Anaconda进行安装pytoch框架跑深度学习模型(使用学校服务器+显卡进行深度学习)

    在开始之前你需要找学校服务器负责人 申请服务器账号和密码 以及 校内外网IP和端口号 ;另外还需要知道学校 服务器显卡cuda版本 ,以及去pytorch官网查看显卡cuda版本对应的 pytorch版本 一、安装MobaXterm 1.下载MobaXterm 软件的下载可以去这里:我都已经给大家准备好了。 在我网

    2024年02月07日
    浏览(46)
  • LangChain大模型应用落地实践(二):使用LLMs模块接入自定义大模型,以ChatGLM为例

    angChain版本:0.0.147 ;(没想到第二更LangChain已经更新到147了) 图1 大模型时间线(2023-arxiv-A Survey of Large Language Models) 模型名称 企业/高校 发布时间 ERNIE Bot(文心一言) 百度 2023年3月 ChatGLM 清华大学 2023年3月 通义千问 阿里 2023年4月 MOSS 复旦大学 2023年4月 从图1中可以看出,

    2024年02月09日
    浏览(31)
  • 深度学习数据对模型的影响

    本人作为一个深度学习小白,往往读论文只关注文章的pipeline是如何work的。忘记考虑数据对于模型的影响,也就导致对于论文的实验部分不太重视。对于同一个模型在不同数据集上性能差距很大也没有关注,故本文简单介绍一下数据对于模型性能的影响。 数据增强是很多论文

    2024年02月08日
    浏览(25)
  • 机器学习&&深度学习——NLP实战(情感分析模型——数据集)

    👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习深度学习——BERT(来自transformer的双向编码器表示) 📚订阅专栏:机器学习深度学习 希望文章对你们有所帮助 预训练文本表示可以通过不同模型架构,放入不同的下游自然语言处理任务。

    2024年02月11日
    浏览(30)
  • 11、动手学深度学习——语言模型和数据集:代码详解

    我们了解了如何将文本数据映射为词元,以及将这些词元可以视为一系列离散的观测,例如单词或字符。 假设长度为 T T T 的文本序列中的词元依次为 x 1 , x 2 , … , x T x_1, x_2, ldots, x_T x 1 ​ , x 2 ​ , … , x T ​ 。于是, x t x_t x t ​ ( 1 ≤ t ≤ T 1 leq t leq T 1 ≤ t ≤ T )可以

    2024年02月17日
    浏览(30)
  • LangChain与大模型的学习ing

    解决办法 调用有时会失败,除了网络原因,还有本身调用的频率问题,免费的openai调用的次数在每分钟内是有上限的,当然,付费的肯定也有,如果有必要,可以发邮件申请提高上线。 当OpenAI调用频次受限时,可以考虑以下几种处理方式: 优化调用方式:减少调用OpenAI的频

    2024年02月13日
    浏览(21)
  • 分布式深度学习中的数据并行和模型并行

    🎀个人主页: https://zhangxiaoshu.blog.csdn.net 📢欢迎大家:关注🔍+点赞👍+评论📝+收藏⭐️,如有错误敬请指正! 💕未来很长,值得我们全力奔赴更美好的生活! 对于深度学习模型的预训练阶段,海量的训练数据、超大规模的模型给深度学习带来了日益严峻的挑战,因此,经

    2024年01月24日
    浏览(32)
  • 【AIGC】baichuan-7B大模型

    百川智能|开源可商用的大规模预训练语言模型baichuan-7B大模型 概述 baichuan-7B 是由百川智能开发的一个开源可商用的大规模预训练语言模型。基于 Transformer 结构,在大约1.2万亿 tokens 上训练的70亿参数模型,支持中英双语,上下文窗口长度为4096。在标准的中文和英文权威 b

    2024年02月09日
    浏览(21)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包