tnblog
首页
视频
资源
登录

LangChain 数据连接(学习笔记)

3682人阅读 2023/9/9 15:35 总访问:3467347 评论:0 收藏:0 手机
分类: python

LangChain 数据连接(学习笔记)

什么是数据连接?


LLM应用往往需要用户特定的数据,而这些数据并不属于模型的训练集。
LangChain 的数据连接概念,通过提供以下组件,实现用户数据的加载、转换、存储和查询:
——文档加载器:从不同的数据源加载文档
——文档转换器:拆分文档,将文档转换为问答格式,去除冗余文档,等等
——文本嵌入模型:将非结构化文本转换为浮点数数组表现形式,也称为向量
——向量存储:存储和搜索嵌入数据(向量)
——检索器:提供数据查询的通用接口

数据连接实践


在LLM应用连接用户数据时,通常我们会以如下步骤完成:
1.加载文档
2.拆分文档
3.向量化文档分块
4.向量数据存储
这样,我们就可以通过向量数据的检索器,来查询用户数据。接下来我们看看每一步的代码实现示例。最后,我们将通过一个完整的示例来演示如何使用数据连接。

加载文档


Langchain 提供了多种文档加载器,用于从不同的数据源加载不同类型的文档。
比如,我们可以从本地文件系统加载文档,也可以通过网络加载远程数据。
想了解 Langchain 所支持的所有文档加载器,请参考Document Loaders

在本节课程中,我们将使用最基本的 TextLoader 来加载本地文件系统中的文档。代码如下:

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


在上述代码中,我们使用 TextLoader 加载了本地文件系统中的 ./README.md 文件。
TextLoaderload 方法返回一个 Document 对象数组(DocumentLangchain 提供的文档类,包含原始内容和元数据)。
我们可以通过 Document 对象的 page_content 属性来访问文档的原始内容。

拆分文档


拆分文档是文档转换中最常见的操作。
拆分文档的目的是将文档拆分为更小的文档块,以便更好地利用模型。
当我们要基于长篇文本构建QA应用时,必须将文本分割成块,这样才能在数据查询中,基于相似性找到与问题最接近的文本块。
这也是常见的AI问答机器人的工作原理。

Langchain 提供了多种文档拆分器,用于将文档拆分为更小的文档块。我们逐个看看这些拆分器的使用方法。

按字符拆分


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

  1. from langchain.text_splitter import CharacterTextSplitter
  2. text_splitter = CharacterTextSplitter(
  3. separator = "\n\n",
  4. chunk_size = 1000,
  5. chunk_overlap = 200,
  6. length_function = len,
  7. )
  8. split_docs = text_splitter.split_documents(docs)

拆分代码


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

  1. from langchain.text_splitter import RecursiveCharacterTextSplitter, Language
  2. PYTHON_CODE = """
  3. def hello_langchain():
  4. print("Hello, Langchain!")
  5. # Call the function
  6. hello_langchain()
  7. """
  8. python_splitter = RecursiveCharacterTextSplitter.from_language(
  9. language=Language.PYTHON, chunk_size=50, chunk_overlap=0
  10. )
  11. python_docs = python_splitter.create_documents([PYTHON_CODE])
  12. python_docs

Markdown文档拆分


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

  1. from langchain.text_splitter import MarkdownHeaderTextSplitter
  2. 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"
  3. headers_to_split_on = [
  4. ("#", "Header 1"),
  5. ("##", "Header 2"),
  6. ("###", "Header 3"),
  7. ]
  8. splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
  9. splits = splitter.split_text(markdown_document)
  10. splits

按字符递归拆分


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

  1. from langchain.text_splitter import RecursiveCharacterTextSplitter
  2. text_splitter = RecursiveCharacterTextSplitter(
  3. # Set a really small chunk size, just to show.
  4. chunk_size = 100,
  5. chunk_overlap = 20,
  6. length_function = len,
  7. )
  8. texts = text_splitter.split_documents(docs)
  9. texts

按token拆分


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

注,OpenAI所使用的是tiktoken

  1. from langchain.text_splitter import CharacterTextSplitter
  2. text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
  3. chunk_size=100, chunk_overlap=0
  4. )
  5. split_docs = text_splitter.split_documents(docs)

向量化文档分块


LangchainEmbeddings 类实现与文本嵌入模型进行交互的标准接口。
当前市场上有许多嵌入模型提供者(如OpenAI、Cohere、Hugging Face等)。
嵌入模型创建文本片段的向量表示。
这意味着我们可以在向量空间中处理文本,并进行语义搜索等操作,从而查找在向量空间中最相似的文本片段。

注:文本之间的相似度由其向量表示的欧几里得距离来衡量。
欧几里得距离是最常见的距离度量方式,也称为L2范数。对于两个n维向量a和b,欧几里得距离可以通过以下公式计算:

  1. d(a, b) = √((a? - b?)2 + (a? - b?)2 + ... + (a? - b?)2)


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

  1. # 安装tiktoken
  2. %pip install -q tiktoken
  1. from langchain.embeddings import OpenAIEmbeddings
  2. embeddings_model = OpenAIEmbeddings(openai_api_key="你的有效openai api key")
  3. embeddings = embeddings_model.embed_documents(
  4. [
  5. "你好!",
  6. "Langchain!",
  7. "你真棒!"
  8. ]
  9. )
  10. embeddings


你应该能看到如下输出:

注:当我们在环境变量中设置了 OPENAI_API_KEY,在上述代码 OpenAIEmbeddings(openai_api_key="你的有效openai api key") 中,参数 openai_api_key 可以省略。

  1. export OPENAI_API_KEY="..."

向量数据存储


向量数据存储,或成为向量数据库,负责存储文本嵌入的向量表现,并提供向量检索的能力。
Langchain 提供了多种开源或商业向量数据存储,包括:Chroma, FAISS, Pinecone等。
本讲以Chroma为例。

存储


Langchain 提供了 Chroma 包装类,封装了chromadb的操作。
在进行以下代码执行前,需要安装 Chroma 的包:

  1. %pip install -q chromadb
  1. from langchain.document_loaders import TextLoader
  2. from langchain.embeddings.openai import OpenAIEmbeddings
  3. from langchain.text_splitter import CharacterTextSplitter
  4. from langchain.vectorstores import Chroma
  5. text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
  6. documents = text_splitter.split_documents(docs)
  7. db = Chroma.from_documents(documents, OpenAIEmbeddings())

检索


向量数据库提供的重要接口就是相似性查询。
如上述内容提到,文本相似性的衡量,由文本的向量表示的欧几里得距离来衡量。
向量数据库提供了该接口,用于查询与给定文本最相似的文本。

  1. query = "什么是WTF Langchain?"
  2. docs = db.similarity_search(query)
  3. print(docs[0].page_content)

学习链接


更多学习内容,可以关注一下五里墩茶社大佬
https://space.bilibili.com/615957867?spm_id_from=333.337.0.0


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

LangChain 简单应用(学习笔记)

LangChain 简单应用(学习笔记)[TOC] Langchain 简介大型语言模型(LLM)正在成为一种具有变革性的技术,使开发人员能够构...

LangChain 模型(学习笔记)

LangChain 模型(学习笔记)[TOC] Langchain 模型简介Langchain所封装的模型分为两类:——大语言模型 (LLM)——聊天模型 (C...

LangChain 提示词(学习笔记)

LangChain 提示词(学习笔记)[TOC] 什么是提示词?提示词(Prompt)是指向模型提供的输入。这个输入通常由多个元素构成。La...

LangChain 输出解析器(学习笔记)

LangChain 输出解析器(学习笔记)[TOC] 简介LLM的输出为文本,但在程序中除了显示文本,可能希望获得更结构化的数据。这就...

LangChain 链(学习笔记)

LangChain 链(学习笔记)[TOC] 单一的LLM对于简单的应用场景已经足够,但是更复杂的应用程序需要将LLM串联在一起,需要多LL...

LangChain 记忆组件(学习笔记)

LangChain 记忆组件(学习笔记)[TOC] 单一的LLM对于简单的应用场景已经足够,但是更复杂的应用程序需要将LLM串联在一起,需...

LangChain 代理 Agent(学习笔记)

LangChain 代理 Agent(学习笔记)[TOC] 简介Agent 也就是代理,它的核心思想是利用一个语言模型来选择一系列要执行的动作。...

LangChain 回调 (Callback)

LangChain 回调 (Callback)[TOC] 简介Callback 是 LangChain 提供的回调机制,允许我们在 LLM 应用程序的各个阶段使用 Hoo...

LangChain 一个完整的例子

LangChain 一个完整的例子[TOC] 简介这是该 LangChain 极简入门系列的最后一讲。我们将利用过去9讲学习的知识,来完成一个...
这一世以无限游戏为使命!
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术