LangChain简介

LangChain是一个用于在LLM(大语言模型)之上进行应用层开发的框架,相比直接使用基础的Python代码调用LLM,使用LangChain能让我们更方便的进行应用层开发,而不必过多关心底层代码的编写。

官方文档:https://www.langchain.com/

LangChain的优缺点

使用LangChain有很多优势,例如:

  1. LangChain像是一个胶水框架,它可以很方便的集成各种在线LLM的API、本地LLM、各种向量数据库、Embedding模型、Agent工具等,LangChain对各种模型和接口做了统一的接口抽象,这意味着如果我们在同类的不同组件之间切换,基本只需要改一行代码
  2. LangChain对AI应用中的概念进行了很多基础封装,实现聊天机器人、RAG、Agent等功能时使用这些现成的组件能省去很多手写基础代码的麻烦
  3. LangChain提供了“链(Chain)”的概念,我们基于这个“链”可以很方便的组装各种前置和后置的处理器,如组织提示词、解析返回数据等,以此来实现我们所需要的最终目标

当然,LangChain也并非没有缺点。LangChain最为致命的问题是它是一个典型的被严重过度设计的框架,LangChain的过度抽象让其使用方式也是十分“抽象”,许多高度封装的组件表现的像一个黑盒,看不懂、底层逻辑不透明且难以定制,在真实项目开发场景下非常不灵活。LangChain的用法是极度封装的,很多API甚至表现得像一种全新的DSL而非我们所熟知的语法,这犯了和世界上最难用的构建系统Gradle类似的问题(“怎么写都能编译,怎么运行都报错”)!LangChain另一个较小的缺点是它现在仍在快速迭代开发中,API也经常大幅修改,框架版本一旦升级不出问题不太可能。此外LangChain文档目前也不完善,对于一个参数可能文档里只有潦草的解释,连具体能取哪些值都未说明,除了翻阅源码,正确用法就只能靠猜了。最后,LangChain的很多模块是社区维护的,这些模块充斥Bug,使用它们也需要你有强大的编程水平和解决问题能力。

总而言之,个人认为在生产环境中引入LangChain要谨慎,或者仅使用其中的低级组件封装,当成一个胶水框架来使用。不过尽管LangChain有诸多缺点,它仍然十分值得学习,其中的一些思想我们可以借鉴并应用到我们自己的项目中。

备注:实际上除了Python版本,LangChain还提供了JavaScript版本,但功能落后很多,此外也有基于Java/C#/GoLang等语言的非官方实现,不过我们这里还是只介绍主流的Python版本。

LangChain框架

LangChain框架主要包含这样几个部分:

LangChain和LangChain Core:框架的核心内容,包括基础功能和类的封装和实现

LangChain Community:用于和各种在线或本地LLM及周边功能的集成,大多由社区维护,质量参差不齐,随着版本迭代,有些成熟的模块会从其中独立出来,因此API经常发生新增和移除,我们需要对其文档持续关注

LangGraph:LangGraph是基于LangChain之上的一个Agent状态机框架,用于定义和执行LLM和Agent之间的交互逻辑。然而这个框架封装的基本组件也是非常扭曲、繁琐和难用,我们还需要持续观望,看未来是否会做出改进

LangServe:LangChain官方提供的专用于部署LangChain应用的服务端框架,能将你编写的“链”部署为Web服务。目前个人认为这个框架更类似于一种花哨的噱头,没有太多实际意义。实际开发中业务逻辑通常是复杂和定制性的,很难用上这个LangServe框架

LangSmith:LangChain官方提供的一个遥测监控平台,提供免费和收费的云服务,主要用于调试和采集运行时信息等场景。使用LangSmith能图形化的展示我们的“链”上执行了哪些步骤,每一步的输入输出是什么。然而个人认为这个平台实际意义也不大,毕竟我们不可能在内网生产环境中使用,不过在学习阶段还是比较有用的。

LangChain框架简单入门

安装LangChain框架

安装LangChain框架非常简单,我们首先用venv创建一个虚拟环境,然后在虚拟环境中执行以下命令用pip安装即可。

pip install langchain

我这里使用的是最新的0.3.17版本。

配置LLM

LLM是LangChain应用的核心,在LangChain中LLM其实是被完全当作黑盒使用的,LLM接收输入字符串(可能还包括temperaturetop-ptop-k等参数)并输出一个字符串(及一些元信息,例如你本地调用消耗了多少token等,各个厂商的API可能有不同的元信息)。

LangChain支持与许多种在线或本地的LLM集成,官方文档中大多使用了OpenAI提供的API,但鉴于OpenAI一点也不“Open”,API价格也是比较昂贵,如果仅用于学习用途推荐尝试申请谷歌Gemini或Cohere的免费API,如果是在本地或自己搭建的服务器上运行LLM,我们也可以使用Ollama、vllm等大模型基座服务部署LLM。这里我们以本地部署的Ollama服务运行开源LLM来编写例子代码。

安装LangChain集成Ollama的相关依赖。

pip install langchain-ollama

安装完成后,我们还需要启动本地的Ollama服务,有关Ollama的使用可以参考Ollama相关章节,这里不再赘述。运行工程时,则需要配置环境变量OLLAMA_HOSTOLLAMA_PORT指定Ollama服务的地址。

例子代码

下面是一个简单的例子,代码能够实现将用户输入的内容翻译为另一种语言。

from langchain.globals import set_debug, set_verbose
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_ollama import ChatOllama

# 输出额外的调试信息,通常仅用于开发阶段
set_debug(True)
set_verbose(True)

# 创建Prompt模板
prompt_template = ChatPromptTemplate.from_template(
    'Translate the following text to {lang} and print the result without extra information: {text}')

# 创建LLM对象
model = ChatOllama(model='llama3.1:8b', temperature=1)

# 组装链
chain = prompt_template | model | StrOutputParser()

# 调用链并输出结果
result = chain.invoke({'lang': 'Spanish', 'text': 'Hello, world!'})
print(result)

代码其实比较好理解,prompt_template是输入到LLM中的信息,它使用ChatPromptTemplate.from_template()来构建,本质上就是基于模板来构建的Prompt。model实际上是基于LangChain提供的一个抽象类BaseChatModel,它包含了调用LLM的各种接口,我们创建model时指定了使用Ollama部署的模型,并且设置了temperature参数为1。最后我们组装了一个“链”,它在链的末尾还拼接了一个StrOutputParser对象,LLM返回信息除了生成的文本以外还有一些元信息,StrOutputParser用于从大模型的返回信息中提取输出文本。我们最终组成了输入Prompt | LLM | 输出内容解析器这样一条简单的链。

经过这一系列的抽象封装和链的拼接,我们最后调用了chain对象的invoke()方法,传入了Prompt模板所需的变量,最后打印了输出结果,此时我们就实现了一个最简单的基于LangChain的AI应用。

¡Hola, mundo!

使用LangSmith

使用LangSmith需要注册账号并获取APIKey。注册后我们还需要配置环境变量。

LANGSMITH_TRACING=true
LANGSMITH_ENDPOINT="https://api.smith.langchain.com"
LANGSMITH_API_KEY="<APIKey>"
LANGSMITH_PROJECT="<项目名>"

注意:在生产环境中,将遥测数据发送到一个第三方平台绝对是个坏主意,LangSmith目前并不开源也不能免费私有化部署,因此其用途有限,通常仅限于学习阶段。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。