LangChain基础知识

这篇文档介绍了LangChain大模型应用开发框架的入门知识和核心内容,包括LangChain是什么、为什么需要它、典型使用场景、基础概念与模块化设计等。同时,还详细阐述了该框架的核心模块如标准化的大模型抽象、大模型应用的最佳实践、赋予应用记忆的能力、框架原生的数据处理流等。

LangChain 简介

LangChain 是什么

LangChain:一个快速崛起的开源项目
LangChain
LangChain从最开始的开源社区的一个开源项目,引起广大人群的关注,逐步做起来变成公司型的项目,再逐步进新行多轮融资。最后从图中可以看出,其受关注度及影响力飞速增长。
LangChain: 通过组合模块和能力抽象来扩展 LLM 的助手
LangChain
大模型应用的开发框架怎么能够帮助我们快速开发大模型应用呢?主要基于LangChain的可组合性,具体体现在它有一堆组件,并且这些组件的核心主要包括六大模块:Model l/O、Data connection、Chains、Memory、Agents、Callbacks。
AIGC 应用开发生态
AIGC 应用开发生态
所有的开源项目或者开源框架主要分成三类。第一类是基础建设,简称“基建”。随着时代发展,机械类的操作技术都会逐步实现自动化、框架化但目前底层的基础设施建设还没有达到一个高度发达的程度。从云时代到来以后,越来越多基础设施被提出来,包括云原生下的K8S、Rancher等。但是云计算的时代不可能实现一台机器完成开发环境的开发部署,基于这个需求,就需要研究管理多个机器的工具,或者说云时代下的分布式操作系统。当成功让很多分布式的大批量的集群被管理起来并用起来后,而web时代又存在很多的流量,需要部署很多服务器实现弹性扩容的机制。可以说,云原生项目带来基础设施能力的跃升,让我们终于能够批量使用资源。

为什么需要 LangChain

Q:为什么开发者要用 LangChain 而不是直接使用 OpenAl 或者Hugging Face 上的模型?
A:Hugging Face、OpenAl、Cohere 可以提供底座模型和 API, 但是在产品中集成和使用它们仍然需要大量的工作。
可以理解为,LangChain 框架有利于应用开发者通过调用一个统一的接口,代替产品研发过程中模型、数据结构等变动因素,从而实现相同接口直接调用,而不是单一修改源代码或模型。为上面的应用开发者提供了便利,那对下面的模型也是一样啊,因为下面的模型不管你怎么迭代,你最终一个大模型。

LangChain 典型使用场景

产品示例1: OpenAI-Translator

产品示例
技术框架 :将一篇英文文档,基于大模型应用中的提示词模板和大模型对接的服务,输出为翻译后的中文文档。
技术路线
大模型应用的技术路线
大模型应用服务

LangChain 典型使用场景:RAG (Retrieval-Augmented Generation)

RAG
LangChain 处于一个最核心的位置,既跟用户去做人机交互,实现基于用户的提问提供最终答案的效果,同时,LangChain连接了三种不同的技术生态。

  • Embedding Model:将文本变成高维向量;
  • 向量数据库:存储高维向量,是大语言模型的第二大脑;
  • 大语言模型:解码向量数据库的内容后,可以通过prompt实现大语言模型来完成任务总结并返回用户的过程。

LangChain 基础概念与模块化设计

LangChain 核心模块入门与实战

LangChain实现抽象的模块化设计
图示 LangChain实现抽象的模块化设计
LLM
首先大语言模型LLM既有私有化的open AI,也有开源社区的HuggingFace等等。除了大模型以外,为了使大模型用起来,最重要的功能模块就是prompt提示词。一个真正的大模型应用,其实就是要不断地复用提示词。然后对于大模型来说,prompt又是大模型的输入。所以在LangChain内部设计了大量的prompt模版以供参考学习。
模型输入 Prompts
一个语言模型的提示是用户提供的一组指令或输入,用于引导模型的响应,帮助它理解上下文并生成相关和连贯的基于语言的输出,例如回答问题、完成句子或进行对话。

  • 提示模板(Prompt Templates):参数化的模型输入,Prompt Templates 提供了一种预定义、动态注入、模型无关和参数化的提示词生成方式,以便在不同的语言模型之间重用模板。一个模板可能包括指令、少量示例以及适用于特定任务的具体背景和问题。
  • 示例选择器(Example Selectors):动态选择要包含在提示中的示例

Memory
第三个重要功能模块就是Memory,实现记忆历史对话内容。大多数LLM应用都具有对话界面。对话的一个重要组成部分是能够引用先前在对话中介绍过的信息。至少,一个对话系统应该能够直接访问一些过去消息的窗口。更复杂的系统将需要拥有一个不断更新的世界模型,使其能够保持关于实体及其关系的信息。大模型本身是概率模型,基于前置条件,即输入和分布,即可得出对应输出。但是整个流程是一次性的,对于初始的且没有经过任何处理的大模型,是不具备记忆存储功能,这个功能模块是需要应用开发者进行开发的。
Agent
最后就是Agent,包括应用实际运行起来的运行时,典型的内置实现叫做Agent Executor。由于大模型只有一个大脑,成为真正的智能体应用就需要连接并调用外部的工具,Langchain也预定义了很多Toolkits。
对于data connection功能模块,实现了数据的连接转换。那怎么体现data connection呢?其实从上图可以看到主要的四个模块,包括chain和最终的应用。这些流动的链条实质是各种各样类型的数据,而不同格式、不同类型、形态等的数据转换其实就是data connection模块所解决的问题。那Chain应该怎么理解呢?就是提供数据流动的管道。

标准化的大模型抽象:Model I/O

Model I/O是LangChain 为开发者提供的一套面向 LLM 的标准化模型接口,包括模型输入(Prompts)、模型输出(Output Parsers)和模型本身(Models)。

  • Prompts:模板化、动态选择和管理模型输入;
  • Models:以通用接口调用语言模型;
  • Output Parser:从模型输出中提取信息,并规范化内容。
    Model I/O

Model I/O顾名思义就是模型的输入输出。上图前中后三部分就将模型分成了输入模型和输出模型。模型的输入就是自然语言。像左图有两个阶段,第一个阶段就是定义两个变量,x,y。第二个阶段是基于提示词模版,通过format方法传入变量。整体再传入到大模型,而模型又分成两种类型,LLM和Chat Model。

第一类是模型抽象Model语言模型(LLMs): LangChain 的核心组件。LangChain并不提供自己的LLMs,而是为与许多不同的LLMs(OpenAI、Cohere、Hugging Face等)进行交互提供了一个标准接口。LLMs属于较低层次的大语言模型,因为该阶段的大语言模型只有生成能力,还没有对话能力。

第二类聊天模型(Chat Models): 语言模型的一种变体。虽然聊天模型在内部使用了语言模型,但它们提供的接口略有不同。与其暴露一个“输入文本,输出文本”的API不同,它们提供了一个以“聊天消息”作为输入和输出的接口。该模型是优化了模型对话能力的提升后的大模型,例如Open AI的GPT系列。该模型存在角色概念以及Memory存储功能,将这些功能进行抽象后在最终应用层面体现为不同类型的Agents。当下游获取大模型的反馈结果后,其输出结果是一个统一格式,以便于后续基于结果再加工处理。针对该问题引入了一个抽象功能,即output parser。这个功能是根据输出parser类型转变为一预期特定的数据结构,例如json、key-value以及字符串模版等形式。

  • Chat Models类继承关系:
    BaseLanguageModel --> BaseChatModel --> name(Examples: ChatOpenAI, ChatGooglePalm
  • Chat Models主要抽象:
    AIMessage, BaseMessage, HumanMessage

输出解析器 Output Parser
语言模型的输出是文本。
但很多时候,用户可能希望获得比纯文本更结构化的信息。这就是输出解析器的价值所在。
输出解析器是帮助结构化语言模型响应的类。它们必须实现两种主要方法:

  • “获取格式指令”:返回一个包含有关如何格式化语言模型输出的字符串的方法。
  • “解析”:接受一个字符串(假设为来自语言模型的响应),并将其解析成某种结构。

然后还有一种可选方法:

  • “使用提示进行解析”:接受一个字符串(假设为来自语言模型的响应)和一个提示(假设为生成此响应的提示),并将其解析成某种结构。在需要重新尝试或修复输出,并且需要从提示中获取信息以执行此操作时,通常会提供提示。

LangChain 设计:实现联网查询

实现联网查询
第二代New Bing的搜索引擎原理。整个过程可以概述为一个大语言模型的应用基于提示词模板,输入信息后通过format得到一个输出,再把这个输出结果利用output parser转变成了一个特定的格式作为搜索引擎检索关键词后的反馈。搜索引擎基于反馈的搜索结果,补充完善到下一个Prompt模板里,再经过多次反馈形成第二个阶段的大模型,每次反馈到用户的内容都是最优结果。整个流程就会发现,model I/O内的输入、输出和提示词模板大模型共同组成了一个最基础的单元。

LangChain 设计:结合联网与向量数据库

结合向量数据库
为了实现数据持久化,引入了向量数据库,成功实现了存储大模型生成的结果以及检索结果等。

大模型应用的最佳实践:Chains

LLMChain: 整合语言模型和提示模板的最简单链

LLMChain 是 LangChain 中最简单的链,作为其他复杂 Chains 和 Agents 的内部调用,被广泛应用。
一个LLMChain由PromptTemplate和语言模型(LLM or Chat Model)组成。它使用直接传入(或 memory 提供)的 key-value 来规范化生成 Prompt Template(提示模板),并将生成的 prompt (格式化后的字符串)传递给大模型,并返回大模型输出。
整合语言模型和提示模板的最简单链
Chains可以整合一个语言模型和一个提示词模版,从而将每一次大语言模型生成的结果得以复用。
示例:给LLMChain公司取名
给LLMChain公司取名

SequentialChain: 串联式调用语言模型链

串联式调用语言模型(将一个调用的输出作为另一个调用的输入)。
顺序链(Sequential Chain)允许用户连接多个链并将它们组合成执行特定场景的流
水线(Pipeline)。有两种类型的顺序链:

  • SimpleSequentialChain:最简单形式的顺序链,每个步骤都具有单一输入/输出,
    并且一个步骤的输出是下一个步骤的输入。
  • SequentialChain:更通用形式的顺序链,允许多个输入/输出。

SimpleSequentialChain: 单输入/输出串联调用
单输入/输出串联调用
Sequential chain就是调用一个LLMChain A的输出作为另一个的输入LLMChain B。
LLMChain 实战:synopsis_chain 根据剧目的标题撰写简介
图示 输入一个变量并基于Prompt模版,通过大语言模型处理后输出简介。
synopsis_chain 根据剧目的标题撰写简介
review_chain 戏剧评论
下图为当用户将基于第一次输出的标题简介结果作为输入变量后,并提供新的提示词模版,在大语言模型应用时反馈给用户新的生成内容reviews。
review_chain 戏剧评论
整个过程的原理即为下图,SequntialChain: 语言模型串联式调用链。
SequntialChain: 语言模型串联式调用链
SimpleSequentialChain 戏剧评论代码实现
SimpleSequentialChain 戏剧评论

SequentialChain: 多输入/输出串联调用

多输入/输出串联调用
多输入/输出串联调用本质是不局限于将第一次生成的结果作为第二次的输入变量,也可以将第一生成的中间结果抽象成最终输出结果。
代码实现

TransformChain: 处理超长文本的转换链

对于简单的大模型应用,单独使用语言模型(LLMs)是可以的。但更复杂的大模型应用需要将 LLMs 和 Chat Models 链接在一起 - 要么彼此链接,要么与其他组件链接。LangChain 为这种“链式”应用程序提供了 Chain 接口。LangChain 以通用方式定义了 Chain,它是对组件进行调用序列的集合,其中可以包含其他链。
转换链本质是将各种各样python的函数嵌套到transformChain内使其具备处理超文本的能力,然后transformChain与LLMChain以流水线的方式内化为SequentialChain的一部分,共同完成Summary。
超文本转化链

RouterChain: 实现条件判断的大模型调用

RouterChain实现条件判断的方式就是通过LLMRouterChain对不同输入进行条件判断,LLMChain A和LLMChain B就类似于条件判断的If ,else等实现不同功能的判断,然后将不同的输出结果作为output A和output B进行存储。
主要逻辑: 从prompt_infos创建多个LLMChain对象,并将它们保存在一个字典中,然后创建一个默认的ConversationChain,最后创建一个带有路由功能的MultiPromptChain。
实现条件判断的大模型调用
示例:实现文本摘要和翻译聊天助手
SequentialChain实现不同功能的视实现工作流。
技术路线

赋予应用记忆的能力:Memory

LangChain提供了许多用于向应用/系统中添加 Memory 的实用工具。这些工具可以单独使用,也可以无缝地集成到链中。
一个记忆系统(Memory System)需要支持两个基本操作:读取(READ)和写入(WRITE)。
每个链都定义了一些核心执行逻辑,并期望某些输入。其中一些输入直接来自用户,但有些输入可能来自 Memory。
在一个典型 Chain 的单次运行中,将与其 Memory System 进行至少两次交互:

  1. 在接收到初始用户输入之后,在执行核心逻辑之前,链将从其 Memory 中读取并扩充用户输入。
  2. 在执行核心逻辑之后但在返回答案之前,一个链条将把当前运行的输入和输出写入 Memory ,以便在未来的运行中可以引用它们。

Memory分为长期和短期记忆,短期记忆内容存储在内存和buffer中,表现出的特征为占用较小内存,记忆很少信息,而长期记忆就存储到向量数据库或其它数据库等位置。存储后就需要了解什么时候存储,什么时候调用存储内容?以及从哪里进行调用?主要基于相关内容的检索能力和存储路径等回调功能,例如关键词等。
Memory System
Memory System: 高度定制化
大模型模型内置了Memory的功能后,就可以实现将系统能力加以扩展,实现基于应用场景设置自定义的Memory 系统。
定制化的Memory系统

框架原生的数据处理流:Data Connection

框架原生的数据处理流的整个过程可以概括为:加载各种各样的数据源,然后通过Transform转化进入到Embedding Model,对于长文本处理,则这个转化过程可以理解为文本切割来满足输入内容的颗粒度在embedding model tokenizer的范围内,或未超过Embedding Model输入上限。然后将embedding model处理后的数据转变为向量并存储在向量数据库中以供用户检索。
框架原生的数据处理流Document Loaders: 快速接入各类数据源
使用文档加载器从源中加载数据作为文档。一个文档是一段文字和相关的元数据。
快速接入各类数据源
在快速接入各类数据源的过程中,数据源的格式多样化,包括:
典型数据格式:

  • CSV
  • HTML
  • JSON
  • Markdown
  • PDF
  • File Directory

部分典型数据源:

  • ArXiv
  • BiiBii
  • Discord
  • Figma
  • GitHub
  • Reddit
  • TensorFlow Datasets

加载好数据后,就需要两个重要的抽象BaseLoader 和 Document实现加载内容变成Document的列表。
Document类允许用户与文档的内容进行交互,可以查看文档的段落、摘要,以及使用查找功能来查询文档中的特定字符串。
BaseLoader 类定义了如何从不同的数据源加载文档,并提供了一个可选的方法来分割加载的文档。使用这个类作为基础,开发者可以为特定的数据源创建自定义的加载器,并确保所有这些加载器都提供了加载数据的方法。load_and_split方法还提供了一个额外的功能,可以根据需要将加载的文档分割为更小的块。
ArxivLoader 类专门用于从Arxiv平台获取文档。用户提供一个搜索查询,然后加载器与Arxiv API交互,以检索与该查询相关的文档列表。这些文档然后以标准的Document格式返回。
UnstructuredURLLoader 加载网页内容:使用非结构化分区函数(Unstructured)来检测MIME类型并将文件路由到适当的分区器(partitioner)。支持两种模式运行加载程序:“single"和"elements”。如果使用"single"模式,文档将作为单个langchain Document对象返回。如果使用"elements"模式,非结构化库将把文档拆分成标题和叙述文本等元素。
向量数据库
向量数据库的价值和定位主要体现在两个最常见的场景,一个是作为第二大脑提供需要补充的知识,第二个就是提供一个缓存能力。从而在LangChain生态中可以很好对接到其他功能模块形成一种应用,比如RAG。其本质为存储和搜索非结构化数据最常见的方法之一是将其嵌入并存储生成的嵌入向量,然后在查询时将非结构化查询进行嵌入,并检索与嵌入查询“最相似”的嵌入向量。可以理解为在Load、transform、Embedding过程中将各种各样的数据源从原始数据转变为向量库内的数据。从而将实际使用场景里的Query转变为Embedding的结果并作为语义信息存储在向量数据库,再通过高维空间的数学方法将语义信息解码为一种概率,检索时计算相似度的相关概率定位及反馈对应语义信息。
向量数据库最佳实践
Text Embedding Models
Embeddings类是一个专门用于与文本嵌入模型进行交互的类。有许多嵌入模型提供者(OpenAI、Cohere、Hugging Face等)

  • 这个类旨在为所有这些提供者提供一个标准接口。

嵌入将一段文本创建成向量表示。这非常有用,因为它意味着我们可以在向量空间中思考文本,并且可以执行语义搜索等操作,在向量空间中寻找最相似的文本片段。
LangChain中基础的Embeddings类公开了两种方法:一种用于对文档进行嵌入,另一种用于对查询进行嵌入。前者输入多个文本,而后者输入单个文本。之所以将它们作为两个独立的方法,是因为某些嵌入提供者针对要搜索的文件和查询(搜索查询本身)具有不同的嵌入方法。

  1. Document 类:Document的类,允许用户与文档的内容进行交互,可以查看文档的段落、摘要,以及使用查找功能来查询文档中的特定字符串。
  2. 使用 OpenAIEmbeddings 调用 OpenAI 嵌入模型
  • 使用 embed_documents 方法嵌入文本列表
  • 使用 embed_query 方法嵌入问题

Retrieves: 数据检索器
从向量数据库中检索信息关键在于检索效率和检索方法。

  • Amazon Kendra
  • Arxiv
  • Azure Cognitive Search
  • BM25
  • Chaindesk
  • ChatGPT Plugin
  • Cohere Reranker
  • DocArray Retriever
  • KNN
  • LOTR (Merger Retriever)
  • Metal
  • Pinecone Hybrid Search
  • PubMed
  • RePhraseQueryRetriever
  • SVM
  • TF-IDF
  • Vespa
  • Weaviate Hybrid Search
  • Wikipedia
  • Zep
    Retrieves: 数据检索器

LangChain Data 生态

LangChain Data 生态

LangChain 基于知识库的对话机器人最佳实践

LangChain 基于知识库的对话机器人

  • 20
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Whitney_mao

您的认可和鼓励是持续分享的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值