前言
一个风和日丽的下午,我还在寝室撸代码,撸完代码准备看个剧,突然电脑微信提示音急促响起,我像往常一样迟疑了三秒。
这个时间点会是谁?
我打开微信一看: WC!!!
直接原地中奖 2500 字"自我能力分析及提升报告"电子稿! , 附带打印稿!
微笑中透着无奈的同时,我邪魅一笑,习惯性的双击"豆包姐姐",直接在输入框中输入:豆包姐姐,能否帮我生成一篇 3000 字的自我能力分析及提升报告,要求是要和结合计算机专业及其行业情况。不出片刻,3000 字搞定,我 Ctrl C + Ctrl V,稍加修改后,直接发给学委,而后躺着刷 B 站!
B 站刷累后,我靠在椅子上,看着豆包的图标有点走神🤭,不禁思考 Ai 是用什么框架开发的?一个激灵,我开始到处寻找资料,首先问了下豆包,可我却不知所云😥,在各大平台找寻很多信息后,我发现了一个出现率极高的字眼: Langchain
我开始浏览着这些碎片化的介绍,一篇又一篇,了解了些后,我开始不断发问:
- LangChain 是什么?
- 为什么使用 LangChain?
- 如何使用 LangChain?
直到我在图书馆发现这本书 <<LangChain 技术机密>>,我迟来的顿悟才势不可挡地涌来。
LangChain 是什么?
LangChain 是一个基于大语言模型 的应用程序开发框架,旨在简化创建大模型应用程序的过程。它提供了一套完整的工具、组件和接口,使开发者能够轻松地利用大语言模型来实现各种复杂的任务,如
- 聊天机器人
- 文档问答
- 文档摘要
- 处理复杂任务的代理系统
LangChain的核心思想 是将不同的组件像搭积木一样"链"在一起,以创建更高级、更复杂的大语言模型应用,这也是其名字中 Chain的含义。
目前,LangChain官方提供了两种语言版本
- Python
- JavaScript
所谓人生苦短,我爱 python,LangChain项目的Python版本已经获得了超过61000个星标(star),
而JavaScript 版本在短短半年内也积累了超过8000个星标。其他语言版本的也在被努力的搞出来😍。
为什么使用 LangChain?
主要是两个方面:
Data-aware(数据感知)
LangChain提供了强大的数据感知 能力,它能够与多种数据源进行紧密连接,将不同的数据源 (包括数据库、本地各种格式的文件、网页等)视为大语言模型的知识库。这意味着LangChain能够从各种数据源中提取信息,使大语言模型更具见识,能够更全面地回答用户的问题,提供更有深度和广度的知识支持。
我查询了一些资料
- 与数据库连接:当用户询问关于特定客户的交易记录、合作历史等相关问题时,LangChain 能从数据库中提取对应信息,再借助大语言模型进行整理和回复,让回复基于准确且实时的业务数据,而非只是通用的知识内容。
- 整合本地文件 对于本地的各种格式文件,像文本文件(.txt)、Word 文档(.docx)、Excel 表格(.xlsx)、PDF 文件等也能有效整合。
- 关联网页 还可以与网页建立联系,通过网页爬取技术或者调用网页的公开 API 等方式获取网页上的信息,实时从各大新闻网站、行业资讯网站等抓取最新的消息内容,然后配合大语言模型来回应用户对于当下热点新闻、行业动态等方面的疑问。
Agentic(代理交互)
基于LangChain的应用不仅仅是一个被动的工具,它还具备代理交互的能力,可以与其所处的环境进行积极互动。这使得基于LangChain的应用能够协助用户完成系列复杂任务,如
- 自动帮助用户预订机票、
- 定期总结用户的电子邮箱内容
这种主动性 让基于 LangChain的应用不仅是一个问题回答引擎 ,还是一个真正的合作伙伴可以在多个领域为用户提供实际的帮助和支持,增强了用户体验并提高了工作效率。
我又查了一下资料
- 安排行程与活动提醒:除了预订机票,还能进一步规划整个旅行行程,包括预订酒店、安排当地交通(如租车、预订接送服务等),并且根据行程设置提醒事项。比如用户计划去欧洲旅行,它能结合用户喜好、预算以及目的地热门景点等因素,合理规划每天的行程安排,自动预订好各个环节所需的服务,并适时提醒用户各项活动的时间节点,这个就很主动了。
- 客户关系维护:定期收集客户在社交媒体、企业反馈渠道等留下的意见和诉求,分析客户情绪倾向,帮助企业及时回复客户并制定针对性的客户关怀策略。比如一家电商企业,应用可实时监测各大电商平台上客户对其产品的评价和咨询,将重要信息反馈给客服团队以便快速响应,同时分析客户反馈数据,为市场部制定个性化的客户营销活动提供依据,以增强客户满意度和忠诚度。
LangChain 特别强调支持这两方面的能力时,我们需要深入了解现有大语言模型 的一些缺陷,才能知道 LangChain 解决了什么问题😁。
我画个图来理解一下它是如何工作的:
从图中可以看出,我们可以将大语言模型抽象成一个包含输入 、处理 和输出的系统。在这个系统中,输入可以是自然语言或者一个特定明确的提示(Prompt)。经过大语言模型处理后的输出,可以是
- 文本、
- 结构化数据(比如JSON),
- 可以是一段代码
这就引出了以下两个关键问题。
(1)如何有效地构建输入的Prompt?
在一些简单的场景中,比如提问"11 月 11 号是什么节日"🐶或"苹果手机的基本功能介绍"时,我们可以直接提出问题,不需要考虑太多 。但当我们需要用大语言模型总结一本书的内容、根据某个文件进行提问或者向它询问今天的新闻热点时,大语言模型的限制就显现了出来。虽然GPT4的Token支持已经扩展到了128000个,但它们仍然存在一定的上限。因此,LangChai的第一个能力Data-aware(数据感知) 就解决了这个问题,它可以使大语言模型能够访问多种数据源,弥补了大语言模型数据陈旧、无法实时获取新数据,以及无法对特定数据源进行读取的缺陷。
我来测试豆包姐姐能不能答出来😎
天气这种东西, 的确具有实时性! Ai 不可能预先知道,因为大模型是提前训练好的。就像大学生点的外卖可能是预制菜, 不可能是新鲜的🐶。
现在我来思考一下他是如何做到的?
我曾经在使用 java 框架 SpringAi 的时候学习到 function-call 的相关知识 , 或许这个原理可以是一种可能
如下图: 调用天气的 Api , 获取的结果 和 Prompt 一起交给基础大模型处理,得到的结果在返回给应用程序,
至于 LangChain 如何实现的,我需要进一步学习, 有大佬路过 ,可以教教我 ,我是个清澈的"大学牲"😥。
(2)如何进一步处理模型的输出内容?
当大语言模型根据我们的提问生成输出后,输出既可能是结构化数据 ,也可能是一段可执行的代码 。然而,由于当前的大语言模型只能输出文本内容,所以不管输出是什么,都会以文本的形式呈现。但实际上我们希望输出能够以更符合需求的方式呈现。
如果输出是UML代码,则我们希望能够自动渲染成一张思维导图;
如果输出是可执行的代码,则我们希望能够直接执行这段代码并获取结果 ,或者对代码进行测试及修复代码中的Bug。
在这种情况下,大语言模型的另一个关键限制就显现了出来,它既无法调用第三方API来执行结果,也无法与外部工具进行对接。
LangChain 的第二个能力Agentic(代理交互) 就解决了这个问题,它的目标是使大语言模型生成的结果具备执行能力,能够将执行结果反馈给大语言模型,以便大语言模型可以生成新的结果并进一步执行,从而实现多任务推理。 (好像和我上面的图原理类似😎)
下面我们讨论当前大语言模型的一些缺点。
- 模型内部数据过时:随着时间的推移,模型内部的数据可能会变得陈旧。
- 无法实时联网: 有时实时性非常重要,但许多大语言模型无法实时访问互联网以获取最新信息。
- Max Token 限制: 大语言模型通常受到最大 Token 数的限制,导致对长文本的处理受到限制。
- 无法调用第三方 API: 大语言模型无法直接调用第三方API来执行特定任务。
- 无法对接外部工具: 大语言模型无法与外部工具或应用程序集成。
- 数学逻辑运算能力差: 大语言模型在数学逻辑运算方面表现不佳,难以处理复杂的数学问题。
- 无法回答特定领域问题: 大语言模型在特定领域问题上表现不佳。
- 各种大语言模型 API不统一: 市场上存在多个大语言模型,它们的API不同,难以统一管理和使用。输出结果不稳定:在某些情况下,大语言模型的输出结果不稳定,导致对相同问题的回答不同。
- 数据隐私问题: 使用大语言模型可能涉及用户数据隐私问题。
而 LangChain 解决了这些问题,它具有以下特点:
- 集成性强: LangChain核心特性是强大集成性,整合多种大语言模型并标准化调用方法,降低用户学习成本。还集成多种数据源加载器,可将数据库、本地文件、网页等数据源作为知识源,丰富模型背景知识。
- 可智能交互 LangChain让知识更具互动性,用户通过数据加载器能对知识进行问答、总结、扩写、翻译等操作。
- 模块化构建 LangChain倡导模块化开发,像搭积木般方便用户构建应用程序。它有高度封装的可复用模块,可按需组合,简化开发流程、提高效率,助力开发新应用或扩展现有功能。
- 任务链与代理 LangChain引入任务链和代理概念,能处理复杂任务。可将大任务拆分成小任务并串联,每个任务可用不同模型或方法,提高大语言模型处理复杂任务能力,适用于自动化流程、多步骤问题解决等广泛场景。
如何使用 LangChain?
(1) Model (模型) : LangChain 集成多种流行语言模型并提供统一接口,便于切换。模型分两类,大语言模型 以文本字符串为输入输出,聊天模型则以聊天消息列表为输入输出。
(2) Prompt (提示) :面向模型编程即写 Prompt,它是自然语言和机器语言的中间态 。与大语言模型交互时,需通过 Prompt 告知模型角色和职责,以获取期望内容。Prompt 可单句或多句组合,可含变量和条件语句,作为模型输入,编写高质量 Prompt 对发挥人工智能能力关键。
[Prompt 告知模型角色和职责 ] 这一点就很重要 , 所以我那份实验报告的Prompt ,就没写好,应该加上: 假设你是一个学生, 老师要你写一篇 3000 字自我能力分析报告 .要求是和计算机专业及其行业相关。
(3) Data Connection (数据链接):LangChain 数据链接有 4 个功能,包括加载数据源的 DocumentLoader、分割数据的 DocumentTransformer、存储嵌入数据与执行向量搜索的 Vector Store、获取文档的 Retriever。
(4) Chain (链):是 LangChain 核心,用于构建复杂大语言模型应用,可链接多个模型或组件简化复杂应用实现。可与 Prompt、Index 和 Memory 配合,Prompt 作输入模板,Index 提供知识库,Memory 存储检索对话历史以理解用户意图和上下文。
(5) Memory (记忆) :Chain 和 Agent 默认无状态,在聊天机器人等应用中,记忆交互对维护上下文和提高理解能力重要,Memory 可提升对话质量。
我们可以测试一下,只要你和豆包聊天越多,她的生成速度就越慢,就是因为使用了Memory , 每次对话要将前面的对话加到现有的提问中!
(6) Agent (代理):Agent 利用大语言模型选择执行动作,解决模型知识过时和逻辑计算差问题。在 Chain 中动作序列预设,Agent 则将语言模型作推理引擎,给定目标可自动规划实现,更灵活智能,可克服模型局限,有更强知识更新和逻辑推理能力,为应对复杂问题提供新方法。
犹记得大一上学期的时候 , 向 gtp-3.5 问了个算法题 , 直接在胡言乱语💩 ,不过现在 , 我感觉我的算法能力还没 Ai 强(Ai 有些题目也做不来,对于一些固定的模板,好像挺有效果的) , 可恶 ,我连人机都不如🤡。
(7) Callback (回调):开发高质量产品需对 Prompt、Chain 等定制、调试和迭代,LangChain 的回调系统允许在各阶段 Hook 处理,对日志记录、监控、流式处理等有用,可记录运行日志、监控性能和 Token 使用量并优化。
感悟
今天就码到这里了, 夜已经深了 , 室友们打完游戏都去睡了 ,寝室异常安静 , 他们不知道的是, 这寂静背后 , 实则波涛汹涌 , AIGC 的浪潮势不可挡 , 你我他亦将成为这滔天浪潮的朵朵浪花 !