langchain源码阅读系列(二)之数据接入层

news2024/11/23 16:45:35

原文首发于博客文章OpenAI 文档解读

LangChain 主体分为 6 个模块,分别是对(大语言)模型输入输出的管理、外部数据接入、链的概念、(上下文记忆)存储管理、智能代理以及回调系统,通过文档的组织结构,你可以清晰了解到 LangChain的侧重点,以及在大语言模型开发生态中对自己的定位。从本节langchian源码阅读系列第二篇,下面进入Data Connection模块👇

Data Connection

打通外部数据的管道,包含文档加载,文档转换,文本嵌入,向量存储几个环节。

文档加载

重点包括了csv(CSVLoader),html(UnstructuredHTMLLoader),json(JSONLoader),markdown(UnstructuredMarkdownLoader)以及pdf(因为pdf的格式比较复杂,提供了PyPDFLoader、MathpixPDFLoader、UnstructuredPDFLoader,PyMuPDF等多种形式的加载引擎)几种常用格式的内容解析,但是在实际的项目中,数据来源一般比较多样,格式也比较复杂,重点推荐按需去查看与各种数据源
集成的章节说明,Discord、Notion、Joplin,Word等数据源。

文档拆分

重点关注按照字符递归拆分的方式 RecursiveCharacterTextSplitter ,这种方式会将语义最相关的文本片段放在一起。

文本嵌入

嵌入包含两个方法,一个用于嵌入文档,接受多个文本作为输入;一个用于嵌入查询,接受单个文本。文档中示例使用了OpenAI的嵌入模型text-embedding-ada-002,但提供了很多第三方嵌入模型集成可以按需查看。

from langchain.embeddings import OpenAIEmbeddings
embeddings_model = OpenAIEmbeddings()
# 嵌入文本
embeddings = embedding_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 = embedding_model.embed_query("What was the name mentioned in the conversation?")
embedded_query[:5]

向量存储

这个就是对常用矢量数据库(FAISS,Milvus,Pinecone,PGVector等)封装接口的说明,详细的可以前往嵌入专题查看。大概流程都一样:初始化数据库连接信息——>建立索引——>存储矢量——>相似性查询,下面以 Pinecone为例:

from langchain.document_loaders import TextLoader
from langchain.embeddings.openai import OpenAIEmbeddings
import pinecone
loader = TextLoader("../../../state_of_the_union.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

embeddings = OpenAIEmbeddings()

pinecone.init(
    api_key=PINECONE_API_KEY, 
    environment=PINECONE_ENV,
)
index_name = "langchain-demo"
docsearch = Pinecone.from_documents(docs, embeddings, index_name=index_name)
query = "What did the president say about Ketanji Brown Jackson"
docs = docsearch.similarity_search(query)

数据查询

这节重点关注数据压缩,目的是获得相关性最高的文本带入prompt上下文,这样既可以减少token消耗,也可以保证LLM的输出质量。

from langchain.llms import OpenAI
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor
from langchain.document_loaders import TextLoader
from langchain.vectorstores import FAISS

documents = TextLoader('../../../state_of_the_union.txt').load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
retriever = FAISS.from_documents(texts, OpenAIEmbeddings()).as_retriever()
docs = retriever.get_relevant_documents("What did the president say about Ketanji Brown Jackson")
# 基础检索会返回一个或两个相关的文档和一些不相关的文档,即使是相关的文档也有很多不相关的信息
pretty_print_docs(docs)

llm = OpenAI(temperature=0)
compressor = LLMChainExtractor.from_llm(llm)
# 迭代处理最初返回的文档,并从每个文档中只提取与查询相关的内容
compression_retriever = ContextualCompressionRetriever(base_compressor=compressor, base_retriever=retriever)

compressed_docs = compression_retriever.get_relevant_documents("What did the president say about Ketanji Jackson Brown")
pretty_print_docs(compressed_docs)

针对基础检索得到的文档再做一次向量相似性搜索进行过滤,也可以取得不错的效果。

from langchain.retrievers.document_compressors import EmbeddingsFilter

embeddings = OpenAIEmbeddings()
embeddings_filter = EmbeddingsFilter(embeddings=embeddings, similarity_threshold=0.76)
compression_retriever = ContextualCompressionRetriever(base_compressor=embeddings_filter, base_retriever=retriever)

最后一点就是自查询(SelfQueryRetriever)的概念,其实就是结构化查询元数据,因为对文档的元信息查询和文档内容的概要描述部分查询效率肯定是高于全部文档的。

资源推荐

  1. LangGPT:一种面向大模型的 prompt 编程语言

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

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

相关文章

将数组中所有元素依次向右或向左移动指定的n个位置 从右侧移出的元素从左侧补入 从左侧移出的元素从右侧补入 numpy.roll()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 将数组中所有元素依次向右 或向左移动指定的n个位置 从右侧移出的元素从左侧补入 从左侧移出的元素从右侧补入 numpy.roll() [太阳]选择题 请问关于以下代码的最后输出正确的是?…

chatgpt赋能python:Python编程:如何赚取高薪?

Python编程:如何赚取高薪? Python语言是一门被广泛使用的编程语言,因其简单易学,而在软件开发、数据分析、机器学习及人工智能等领域中得到了广泛应用。随着这些领域的不断发展,对Python开发人才的需求也越来越高涨。…

基于Java彩妆小样售卖商城的设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

Python爬虫之数据解析技术

Python爬虫需要数据解析的原因是,爬取到的网页内容通常是包含大量标签和结构的HTML或XML文档。这些文档中包含所需数据的信息,但是需要通过解析才能提取出来,以便后续的处理和分析。 以下是一些使用数据解析的原因: 数据提取&…

基于Java高校实验室管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

通过Web3Js网页代码在MetaMask辅助下完成用户发送操作

上文 html通过web3JS 获取当前连接的区块链信息和账号信息在html中通过 Web3.0.js 获取了本地虚拟的区块链信息 和通过 公钥获取了账号的 ETH 那么 之前我们文章 Web3通过 MetaMask简单演示对ganache虚拟环境账号进行管理操作演示了通过MetaMask在本地发送ETH给其他账号 那么 …

springboot+vue基于java的健美操体操舞蹈视频评分系统

健美操评分系统采用B/S架构,数据库是MySQL。系统的搭建与开发采用了先进的JAVA进行编写,使用了springboot框架。该系统从三个对象:由管理员、裁判员和用户来对系统进行设计构建。主要功能包括首页,个人中心,裁判员管理…

【Linux】遇事不决,可先点灯,LED驱动的进化之路---2

【Linux】遇事不决,可先点灯,LED驱动的进化之路---2 前言: 一、Pinctrl子系统重要概念 1.1 重要概念 1.1.1 pin controller 1.1.2 client device 1.1.3 补充概念 二、GPIO子系统重要概念 2.1 在设备树指定GPIO引脚 2.2 在驱动代码中…

代码质量平台实践-SonarQube

代码质量平台实践-SonarQube 目录 推荐文章 https://www.yuque.com/xyy-onlyone/aevhhf?# 《玩转Typora》 本节实战 实战名称💘 实践:Scanner进行项目代码扫描(测试成功)-2023.6.24💘 实践:Jenkins集成SonarQube(命令行方式)(测…

java8新特性之--函数式接口加方法引用与构造器引用详细讲解

函数式(Functional)接口 什么是函数式(Functional)接口 只包含一个抽象方法的接口,称为函数式接口。 你可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda 表达式 抛出一个受检异常(即:非运行时异常),那么该异常需要在目标…

Java集合容器面试题

集合 什么是集合 集合就是用于存储数据的容器,只能存储引用类型,所以集合非常适合用来存储对象。而且集合是长度可变,所以对象个数不确定的时候适合使用集合 集合的特点 1、集合只能存储引用数据类型。集合用于存储对象。 2、对象的个数…

centos版本的EDA虚拟机搭建3

0、参考博客 1、CentOS 7 下 rar unrar的安装 1、配置虚拟机与主机共享文件夹。 **前提,虚拟机关机。**之后进行虚拟机设置,选项-共享文件夹,点击总是启用,之后添加共享文件夹名称。 之后打开虚拟机,命令行输入v…

【Leetcode60天带刷】day34贪心—— ​860. 柠檬水找零​,406.根据身高重建队列

​ 题目: 860. 柠檬水找零 在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。 每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。…

Python零基础入门(五)——超详细的列表和元组介绍

系列文章目录 个人简介:机电专业在读研究生,CSDN内容合伙人,博主个人首页 Python入门专栏:《Python入门》欢迎阅读,一起进步!🌟🌟🌟 码字不易,如果觉得文章不…

Mysql 学习总结(88)—— Mysql 官方为什么不推荐用雪花 id 和 uuid 做 MySQL 主键

问题 在 MySQL 中设计表的时候,MySQL 官方推荐不要使用 uuid 或者不连续不重复的雪花 id(long 型且唯一),而是推荐连续自增的主键 id,官方的推荐是 auto_increment,那么为什么不建议采用 uuid,使用 uuid 究竟有什么坏处? MySQL 和程序实例 1、要说明这个问题,我们首先…

开关电源-6中常用的防反接电路

6种常用防反接电路介绍 电源反接,会给电路造成损坏,电源反接是不可避免的。所以我们就需要给电路中加入保护电路,达到即使接反电源,也不会损坏的目的,下面介绍几种常用防反接电路。 一、单二极管防反接电路 二极管防…

RabbitMQ 2023面试5题(一)

一、RabbitMQ延时队列可以用于哪些场景 RabbitMQ延时队列可以用于以下场景: 订单处理:在电商网站中,订单处理是一个常见的业务流程。如果订单需要立即处理,可以使用RabbitMQ的延时队列来实现延迟处理。例如,可以将订单…

SpringBoot + Vue前后端分离项目实战 || 三:Spring Boot后端与Vue前端连接

文章目录 前后端对接前端接口修改对接后端后端总体配置后端编写登录登出业务代码 测试后端所有代码 前后端对接 前端接口修改对接后端 src\api\user.js中修改请求地址,与后端保持一致 记录下前端的src\utils\request.js中的X-Token字段 改变开发环境中的请求地…

Golang每日一练(leetDay0108) 灯泡开关I\II Bulb Switcher

目录 319. 灯泡开关 Bulb Switcher 🌟🌟 672. 灯泡开关II Bulb Switcher ii 🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每…

基于Java校园快递一站式服务系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…