LangChain简介

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

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

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

当然,LangChain也并非没有缺点,它是一个典型的被严重过度设计的框架,LangChain的过度抽象让其使用方式也是十分“抽象”,许多高度封装的组件表现的像一个黑盒,看不懂、底层逻辑不透明且无法定制修改,在需要高度定制的场景下非常不灵活。最为致命的是LangChain现在仍在快速迭代开发中,框架充斥着Bug,API也经常大幅修改,过度的抽象封装更是提高了调试的难度,如果你仅使用OpenAI的API还好,如果你想要使用其它厂商的API那么灾难随时都可能发生。

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

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

LangChain框架

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

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

LangChain Community:用于和各种在线或本地LLM及周边功能的集成

LangGraph:LangGraph是基于LangChain之上的一个Agent状态机框架,用于定义和执行LLM和Agent之间的交互逻辑。然而这个框架设计的很糟糕,它和OpenAI深度绑定基本无法在其它LLM下流畅使用,其封装的基本组件也是非常的扭曲、繁琐和难用,我们还需要持续观望,看未来是否会做出改进

LangServe:LangChain官方提供的专用于部署LangChain应用的服务端框架,目前个人认为这个东西意义不明,实际开发中我们通常要将AI能力集成到一些业务逻辑里,即使是作为Web服务也大多使用Django、FastAPI等框架,基本不需要使用这个LangServe框架

LangSmith:LangChain官方提供的一个开发平台,提供免费和收费的云服务,主要用于调试和采集运行时信息等场景,个人认为这个平台用处不大,更是基本无法在生产环境中使用,我们不必关注

LangChain框架简单入门

安装LangChain框架

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

pip install langchain

配置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_community

安装完成后,我们还需要启动本地的Ollama服务,有关Ollama的使用可以参考Ollama相关章节,这里不再赘述。

例子代码

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

from langchain.globals import set_debug, set_verbose
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_community.chat_models 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:8b-instruct-q5_K_M', 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的llama3:8b-instruct-q5_K_M这一模型,并且设置了temperature参数为1。最后我们组装了一个链,它在链的末尾还拼接了一个StrOutputParser对象,LLM返回信息除了生成的文本以外还有一些元信息,StrOutputParser用于从大模型的返回信息中提取输出文本。我们最终组成了输入Prompt | LLM | 输出内容解析器这样一条简单的链。

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

¡Hola, mundo!
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap