一、为什么要了解LangChain?

近两年来,大语言模型(如ChatGPT、DeepSeek、Claude)持续火爆,从写文案、AI绘图,到写代码、AI智能客服,几乎“无所不能”。并且大语言模型的调用成本越来越低,作为程序员的你可能已经开始尝试用OpenAI、DeepSeek的API做些小应用,但是很快可能就会遇到一些问题:

  • 提示词(Prompt)无法复用,而且内容过长不易管理。
  • 每个大模型都有自己的API,想用多个模型切换很困难,代码耦合很严重。
  • 想自己实现复杂功能,比如多轮对话、工具调用、知识库等功能,导致逻辑混乱。
  • 不同的Prompt、大模型、工具的使用没有统一规范。

因此,LangChain 就出现了,它可以帮助开发者把模型调用、提示词管理、记忆模块、外部工具调用等等模块标准化,不同的模块可自由组合。

二、LangChain是什么?

LangChain 是一个基于Python语言的大语言模型应用开源框架,LangChain可以帮你快速搭好项目架构,下图为LangChain技术体系的示意图。

LangChain技术体系主要包括以下模块:

langchain-core : 封装好的基础聊天模型和其他组件。

integrations:LangChain集成包,目前LangChain会将一些重要的集成包单独拆分出来(例如 langchain-openailangchain-anthropic 等),让集成包更轻量级,这些包将会由LangChain团队和集成包的开发者共同维护。

langchain : 构成AI应用的链、AI agent和检索器。

langchain-community : 社区维护的第三方集成包。

langgraph : LangGraph 专门用于构建能处理 复杂任务流程的 AI 应用。它的核心思想是用 “图”(Graph) 来管理任务流程,就像画一张路线图,让 AI 知道何时该执行什么操作、何时需要循环或分支判断,还能自动记住执行到哪一步了。

langsmith:LangSmith 是 LLM 应用的全生命周期管理平台,覆盖开发→测试→部署→监控全流程,可以观察到AI应用运行的每一个步骤,它与 LangChain深度集成,但它不仅适用于 LangChain,也可以用于监控任何使用 LLM 的应用。

LangChain 目前支持两个主要版本:

  • Python 版(最成熟,社区最大)
  • JavaScript/TypeScript 版(适合前端和Node.js应用)

三、LangChain核心模块简介

在学习LangChain,先了解一些在LangChain框架中,甚至AI应用开发中一些核心的概念和模块,一定要首先清楚地知道是什么,之后再研究怎么做,下图展示了一个LangChain框架开发的应用的核心运行流程。

3.1 LLM接口

LangChain 封装了不同模型的调用方式,它统一了各种模型的接口,切换变得轻松。如下示例,创建了一个gpt-3.5-turbo的LLM模型。

from langchain_community.chat_models import ChatOpenAI

# 创建大语言模型
llm = ChatOpenAI(model="gpt-3.5-turbo")

3.2 PromptTemplate提示词模板

大模型的输出质量在很大程度上取决于提示词(Prompt)的设计,在LangChain 把提示词封装成模板,支持变量动态替换,管理起来更清晰,能灵活控制 Prompt 内容,避免硬编码。

如下示例,一个模板中包含了两条消息,分别是人类消息和系统消息,并且设置了name和question两个动态变量,使用invoke方法进行动态替换,这里invoke之后返回的是渲染后Prompt的内容。

from langchain_core.prompts import ChatPromptTemplate

system_chat_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个AI大模型,我是{name}"),
])
human_chat_prompt = ChatPromptTemplate.from_messages([
("human", "{question}")
]) chat_prompt = system_chat_prompt + human_chat_prompt print(chat_prompt.invoke({"name": "alice",
"question": "你好,请问你是?"}))

3.3 Chain链

Chain链是 LangChain 的核心思想之一,一个 Chain 就是将多个模块串起来完成一系列操作,Chain链可以将上一步操作的结果交给下一步进行执行,比如用提示词模板生成 Prompt,将渲染后的提示词交给大模型生成回答,再将大模型的回答将结果输出到控制台,Chain和Linux中的管道符十分类似,每一步的输出自动作为下一步输入,实现模块串联。

如下是Chain链的基本实例,它将提示词模板、LLM、输出解析器连接在一起。

prompt = ChatPromptTemplate.from_template("{question}")
llm = ChatOpenAI(model="gpt-3.5-turbo")
parser = StrOutputParser() chain = prompt | llm | parser print(chain.invoke({"question": "要把大象装冰箱总共分几步"}))

3.4 RAG检索

在一些LLM的使用场景,需要使用一些特定的文档让LLM根据这些文档的内容进行回复,而这些特定的文档通常不在LLM的训练数据中,此时RAG检索就有用武之地。

在LangChain中,可以读取文档使用知识库,来进行大模型的增强搜索,LangChain封装各种类型的文档读取器,可以将读取文档得到的数据,通过LangChain文档分割器对文档进行分割,通过文本嵌入模型对文本进行向量化,将文本的向量信息保存到向量数据库。

当用户向AI发起提问时,在向量数据库中检索出与提问相关的文档,然后与用户问题一起发送给大模型,这个过程就叫做RAG(检索增强生成,Retrieval-Augmented Generation),RAG 能让大模型回答特定领域的问答变得更加精准、实时,避免出现幻觉。

下面代码示例,展示了LangChain中提供了文档读取相关加载类,对知识库中的文档进行读取。

from langchain_community.document_loaders import TextLoader

textLoader = TextLoader("./项目API文档.txt", encoding="utf-8")

# 加载文档
documents = textLoader.load()

3.5. Memory记忆

在和大模型对话时,大模型本身并不具备有记忆历史对话的功能,但是在ChatGPT、DeepSeek等大模型时,发现它们在同一个会话内有“上下文记忆”的能力,这样能使对话更加连贯。

LangChain 也提供了类似的记忆功能。通过 memory,可以把用户的历史对话保存下来,使大模型拥有历史记忆的能力,如下示例,每一轮对话会从ConversationSummaryBufferMemory中读取历史对话,渲染到Prompt供大模型使用。

对话结束之后,会将对话内容保存到ConversationSummaryBufferMemory,如果历史记忆超过一定大小,为了节省和大模型之间调用的token消耗,会对历史记忆进行摘要提取、压缩之后再保存,这样大模型拥有了记忆功能。

prompt = ChatPromptTemplate.from_messages([
('system', "你是OpenAI开发的AI机器人"),
MessagesPlaceholder("history_chat"),
("human", "{question}")
]) memory = ConversationSummaryBufferMemory(max_token_limit=400,return_messages=True,
input_key="question",llm=ChatOpenAI())
llm = ChatOpenAI()
chain = RunnablePassthrough.assign(
history_chat=RunnableLambda(memory.load_memory_variables) | itemgetter("history_chat")
) | prompt | llm | StrOutputParser() # 循环进行对话
while True:
...

3.6 Tool工具调用

大语言模型本身是一种基于大量数据训练而成的人工智能,它本身是基于大量的数据为基础对结果进行预测,因此,大模型可能会出现给出1+1=3这种情况,大模型本身是不会“上网”, 也不会算数的,因此可以给大模型接入各种各样的工具如Google搜索、高德地图定位信息查询、图像生成等等。

那么大模型是怎么使用工具的呢?在现如今,很多的大模型都支持了工具调用,也就是将可用的工具信息列表在调用大模型时传递过去,这些信息包括工具的用途、参数说明等等,大模型会根据这些工具的作用确定调用哪些工具,并且根据参数的描述,来返回调用工具的参数。

最终将工具调用结果返回给大模型,完成用户交给的任务,整个过程中,大模型会根据任务判断是否调用工具,并组织执行,这个自动决策执行的过程,就是由 agent 完成的。

agent 会自己思考、分步骤执行,非常适合复杂任务处理,后续我们也会深入介绍如何通过 LangChain 创建一个完整的 agent,自动协调多个工具完成复杂任务。

对于那些不支持工具调用的大模型,也可以根据提示词将可选的工具和调用方法传递给大模型,但是大模型的预测有很强的不确定性,返回结果的准确率会显著下降。

四、总结

LangChain 是一个强大又灵活的大模型开发框架,它将 LLM 的调用和创建、提示词管理、记忆、知识库、RAG检索、工具调用等模块化,通过LangChain快速构建 AI 应用。

如果你被各种不同厂商的LLM提供的API写出很多不好维护的代码,那么LangChain就是你最好的选择,本文主要介绍了LangChain框架是什么以及它的核心模块,接下来我们将深入介绍 LangChain 中的每个模块,逐步构建你自己的智能应用,敬请期待下一篇《LangChain框架入门 02:PromptTemplate 提示词模板用法》。欢迎继续关注~

LangChain框架入门01:LangChain是什么?的更多相关文章

  1. DWR3.0框架入门(2) —— DWR的服务器推送

    DWR3.0框架入门(2) —— DWR的服务器推送 DWR 在开始本节内容之前,先来了解一下什么是服务器推送技术和DWR的推送方式.   1.服务器推送技术和DWR的推送方式   传统模式的 Web ...

  2. 【爬虫入门01】我第一只由Reuests和BeautifulSoup4供养的Spider

    [爬虫入门01]我第一只由Reuests和BeautifulSoup4供养的Spider 广东职业技术学院  欧浩源 1.引言  网络爬虫可以完成传统搜索引擎不能做的事情,利用爬虫程序在网络上取得数据 ...

  3. CI框架入门1

    CI框架入门: 1.url的特点             2.目录结构/布局             3.MVC分别在哪里,如何依葫芦画瓢             4.安全性             ...

  4. 【原创】NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战

    概述 本文演示的是一个Android客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo. 当前由于NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能. ...

  5. 【原创】NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战

    前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo.服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了.同 ...

  6. 【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示

    前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty ...

  7. 【原创】NIO框架入门(一):服务端基于Netty4的UDP双向通信Demo演示

    申明:本文由作者基于日常实践整理,希望对初次接触MINA.Netty的人有所启发.如需与作者交流,见文签名,互相学习. 学习交流 更多学习资料:点此进入 推荐 移动端即时通讯交流: 215891622 ...

  8. CodeIgniter框架入门教程——第一课 Hello World!

    本文转载自:http://www.softeng.cn/?p=45 今天开始,我将在这里连载由我自己编写的<CodeIgniter框架入门教程>,首先,这篇教程的读着应该是有PHP基础的编 ...

  9. C#.Net EF实体框架入门视频教程

    当前位置: 主页 > 编程开发 > C_VC视频教程 > C#.Net EF实体框架入门视频教程 > kingstone金士顿手机内存卡16G仅65元 1.EF实体框架之增加查 ...

  10. 不用搭环境的10分钟AngularJS指令简易入门01(含例子)

    不用搭环境的10分钟AngularJS指令简易入门01(含例子) `#不用搭环境系列AngularJS教程01,前端新手也可以轻松入坑~阅读本文大概需要10分钟~` AngularJS的指令是一大特色 ...

随机推荐

  1. git命令--拉取代码和切换分支

      git一般有很多分支,我们clone到本地的代码都是master分支,那么如何切换到其它分支呢?本文介绍主要操作流程和命令,包括拉取仓库代码.查看分支和切换分支,至于如何提交代码,需要的童鞋自己查 ...

  2. Web前端入门第 61 问:JavaScript 各种对象定义与对象取值方法

    曾经有人说 JS 语言中万物皆对象,虽然这种说法不一定完全准确,但也有一定的道理.原因是 JS 的语法看起来所有的数据类型都像是一个对象,包括原始类型. const a = 1.234; consol ...

  3. pytorch入门 - 微调huggingface大模型

    在自然语言处理(NLP)领域,预训练语言模型如BERT已经成为主流.HuggingFace提供的Transformers库让我们能够方便地使用这些强大的模型. 本文将详细介绍如何使用PyTorch微调 ...

  4. cuda grid block size

    编译命令:nvcc hello.cu -o hello 运行:./hello #include <stdio.h> __global__ void helloWorldKernel() { ...

  5. Linux c 运行时获取动态库所在路径

    记录一下如何在Linux环境下运行时获取动态库路径. 只讨论Linux amd64和arm64环境,因为使用的办法都是平台相关的不具备可移植性. 准备 一般来说动态库并不需要关心自己所在的文件系统上的 ...

  6. 鸿蒙Next仓颉语言开发实战教程:订单列表

    大家上午好,最近不断有友友反馈仓颉语言和ArkTs很像,所以要注意不要混淆.今天要分享的是仓颉语言开发商城应用的订单列表页. 首先来分析一下这个页面,它分为三大部分,分别是导航栏.订单类型和订单列表部 ...

  7. AI 运维诊断全攻略,深入浅出 OceanBase 系列直播重磅来袭!

    社区的 #数据库 与 #AI 爱好者们 当 SQL 遇见 AI 的系列直播即将开启! 今晚 19:30,聚焦#AI 时代的运维与诊断,带你共享 #大模型辅助数据库运维 的一线实战经验,探索 #Ocea ...

  8. MongoDB入门实战教程(8)

    前面我们学习了模型设计中的内嵌模式与引用模式的使用,本篇我们来看看在模型设计中如何套用常见的设计模式来降低设计难度,提高查询效率. 1 MongoDB也有设计模式? 在使用C#/Java等开发语言的时 ...

  9. Spark知识点汇总

    一.Spark架构设计 二.Spark常用算子 tips1: 数据处理的生命周期tips2: repartition vs coalesce区别: 可以使用 repartition 算子随意调整(提升 ...

  10. Docker永远在“docker desktop starting .”Settings 一直在转圈

    一些用户抱怨Docker 需要很长时间才能启动.这是一个众所周知的问题,用户多年来一直报告.因此,如果您是遇到此问题的用户之一,请不要担心.您可以通过在计算机上执行这些简单的步骤轻松解决问题. 有些用 ...