LangChain是一个用于在LLM(大语言模型)之上进行应用层开发的框架,相比直接使用基础的Python代码调用LLM,使用LangChain能让我们更方便的进行应用层开发,而不必过多关心底层代码的编写。
使用LangChain有很多优势,例如:
当然,LangChain也并非没有缺点,它是一个典型的被严重过度设计的框架,LangChain的过度抽象让其使用方式也是十分“抽象”,许多高度封装的组件表现的像一个黑盒,看不懂、底层逻辑不透明且无法定制修改,在需要高度定制的场景下非常不灵活。最为致命的是LangChain现在仍在快速迭代开发中,框架充斥着Bug,API也经常大幅修改,过度的抽象封装更是提高了调试的难度,如果你仅使用OpenAI的API还好,如果你想要使用其它厂商的API那么灾难随时都可能发生。
官方文档:https://www.langchain.com/
备注:实际上除了Python版本,LangChain还提供了JavaScript/TypeScript版本,但功能落后很多,此外也有基于Java/C#/GoLang等语言的非官方实现,不过我们这里还是只介绍主流的Python版本。
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框架非常简单,我们首先用venv
创建一个虚拟环境,然后在虚拟环境中执行以下命令用pip
安装即可。
pip install langchain
LLM是LangChain应用的核心,在LangChain中LLM其实是被完全当作黑盒使用的,LLM接收输入字符串(可能还包括temperature
、top-p
、top-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!