AI|谁都能懂的LangChain解读指南

818 阅读7分钟

LangChain是帮助开发者利用大模型进行APP开发的脚手架,那么,究竟什么是LangChain,为什么大模型APP开发需要LangChain?读完这篇文章,你就懂了。

image.png

1.LLM大语言模型

LLM(large language model)大语言模型随着ChatGPT的横空出世而一炮走红,相信点进这篇文章的各位对于ChatGPT都不陌生(以下介绍由ChatGPT生成): ---------------ChatGPT生成-------------- ChatGPT是一个基于最新的自然语言处理技术的聊天机器人。它使用的核心技术是GPT(Generative Pre-trained Transformer),一种领先的语言理解模型。这种模型通过分析大量的文本数据学习语言的用法和模式,从而能够理解和生成自然的人类语言。GPT模型的特点是能够进行深入的语言理解和生成,使其在进行对话、创作文本以及理解复杂的问题方面表现出色。 ChatGPT的几个关键特点包括:

  1. 对话能力:它可以与用户进行流畅的对话,回答问题、提供信息、参与讨论等。
  2. 学习能力:虽然它基于预先训练的模型,但也能够根据与用户的互动不断优化回应。
  3. 多领域知识:它能够覆盖广泛的话题,从科技、历史到娱乐文化等。
  4. 文本生成:除了回答问题,ChatGPT还能创作故事、诗歌、甚至是代码等。 需要注意的是,ChatGPT依赖于其训练数据,所以其知识是截至到最近一次训练时的。这意味着最新的事件或信息可能不在其知识范围内。此外,尽管它试图提供准确的信息,但它不是完美的,有时也可能会产生不准确或无关的回答。 ChatGPT是自然语言处理技术的一个重要里程碑,是AI在人机交互领域的一大步,但仍在不断发展和完善中。 --------------ChatGPT生成--------------- 我们最为熟悉的ChatGPT交互模式是如下的对话机器人:

image.png

然而,在我们开发AI产品时,就不会仅仅局限于对话机器人的形式了,我们更需要的,是借助AI的能力,为问题得到一个合适的答案,之后,在给予我们各自的产品形态,以不同的方式展现给用户。

image.png 在我们的服务器调用大模型的API时,其实就和对话式的交互类似,我们把问题发送给大模型,大模型将答案返还给我们。

2.prompt模板

既然与大模型的交互本质上还是一个沟通的过程,那么就像我们现实生活中的沟通一样,为了提高沟通的效率,我们往往会按照一定的路数进行交流,比如描述一个问题,我们会按照“思维模板”描述背景、问题、影响等等。prompt模板就像是我们交流时的思维模板,可以更好的帮助我们与大模型交流。

一种常见的prompt模板的方法是对大模型进行身份以及条件限制,如果我们将大模型理解为一个脑海里有无数资料的天才,那么我们的prompt模板就是帮助他进行知识的初筛,以便得到更精准的回答,比如我们想让大模型帮我们写java代码,我们就可以把prompt模板设计为:

你是一个精通java语言的工程师,请你帮我回答这个问题:{}

而在LangChain中,有专门的prompt template组建,提供了一些封装好的组件,帮助我们开箱即用,也提供了扩展能力,让我们自定义自己的模板。

3.Models

model就是我们最终要调用的大模型,我们可以选择自己想用的模型,通过配置API_KEY进行调用。

4. Memory

当我们调用API时,每次与大模型的交互都是独立的,我们是无法得知上一次的调用与模型返回的结果的,但是,当我们以对话的形式与大模型交互式,我们可以发现,有些模型是有之前聊天的记忆的:

image.png

这就是靠memory模块来实现的。

LangChain使用Memory组件保存和管理历史消息,这样可以跨多轮进行对话,在当前会话中保留历史会话的上下文。那么,我们该如何实现memory的管理呢,回顾我们与大模型交互的逻辑。我们与大模型仅通过调用API时的传参交流。

image.png

因此,我们可以在这一点上做文章:

  • 以原始形式保存所有的对话记录,将这些与我们的新问题一起发送给大模型。这样的好处是可以全量的记录所有对话信息。但,着有一个很大的问题,一般,我们传给大模型的问题越长,大模型处理起来越慢,更重要的是,收费越贵。
  • 以原始形式保存最新的n条记录,将这些与我们的新问题一起发送给大模型。这样可以一定程度避免第一种方案的问题,但是会导致大模型忘记较早的记忆片段。
  • 让大模型帮忙总结历史对话记录,将摘要与我们的新问题一起发送给大模型。这样的好处是在控制长度的情况下,尽量更多的保留记忆,但是这会重复的调用大模型。

5.Agent

Agent之前的概念都是很好理解的,而到了Agent,就是LangChain自创的概念了,为了更好的理解,我们就需要首先知道LangChain为什么会引入Agent的概念。

通过model+prompt+memory+agent,我们已经能很好的让大模型为我们提供问题的答案了。然而,大模型的想象力就仅限于此吗?难道大模型仅仅只能作为一个问答机器人?我们能不能用它实现一些更有想象力的事情!

比如科幻电影中,我们的主人公通过和AI提出需求,AI就能自动搜索全网的信息,之后反馈给我们的主角想要的答案?

这肯定是有可能的,虽然语言大模型只能“口嗨”,但是如果我们能为其提供实现想法的“工具”,拿大模型就有了自主实现功能的能力。

回到上例,如果我们能提供一个接口,可以搜索全网信息,并在prompt中告知大模型,大模型判断自己需要搜索信息时自动调用该接口,将搜索到的答案自动处理,之后返回给我们,就完成了上述功能。

在这个流程中,这个prompt+大模型+搜索接口,就构成了一个搜索Agent,而我们提供的搜索接口,就是LangChain中的tool。

6.Chain

chain就是他的字面意义,链条的意思,Langchain通过chain将各个组件进行链接,以及chain之间进行链接,用于简化复杂应用程序的实现。

这个概念也是LangChain自己引入的,其实他就是一组组件的组合或者集成。

这里我更想讨论的是LangChain中引入的chain与agent的关系,这两者不是包含的,而是你中有我,我中有你,agent可以作为某条chain中的一个组件,chain也有可能是一个agent的tool,明白了这一点,再去理解LangChain就容易多了。

image.png

7.Index

为了理解index,我们需要先理解大模型现在面对的一个问题:大模型不知道训练数据集以外的知识。

语言类大模型本质上也是基于数据进行训练的,而这种训练的时间与经济成本都是很高的,这就意味着,大模型在训练完成之后,并不能实时热更新自己的知识,那么,如何帮助大模型在不进行训练的情况下掌握新知识呢,这就是RAG(Retrieval and generation)技术。

RAG技术,通俗的讲就是大模型的预备知识库,我们将热知识处理后存入知识库,在需要的时候拿出来,结合prompt一起给大模型,帮助其更好的处理问题。

LangChain中的index解决的也是这个问题,他可以帮助大模型从外部数据获取答案: 1)通过Document Loaders加载各种不同类型的数据源 2)通过Text Splitters进行文本语义分割 3)通过Vectorstore进行非结构化数据的向量存储 4)通过Retriever进行文档数据检索

image.png