LangChain是什么?
LangChain 是一个开源的自然语言处理框架,旨在帮助开发者更容易地构建和部署基于LLM的应用(构建和运行AI工作流)
LangChain主要解决什么问题?
LLM 的局限性:
在实际的场景中,LLM 擅长在常规上下文下对提示做出响应,但在未接受过训练的特定领域却会遇到挑战。 人们用Prompts来引导 LLM 生成回复,为了让 LLM 在特定领域发挥更佳效果,机器学习工程师需要将其与组织内部数据来源整合,并应用提示工程技术。
LangChain 的出现简化了开发数据响应式应用程序的中间步骤,并提高了 Prompt Engineering 的效率。同时,提供了一套易用、直观的工具和界面,使开发人员能够轻松地将 LLM 与数据源和提示工程技术进行整合。
LangChain可以做什么?
-
知识库
-
聊天机器人
-
智能助理
-
文本摘要
-
。。。 。。。
LangChain的优势
-
简化LLM的集成:LangChain 支持广泛的 LLM(OpenAI 的 ChatGPT、Google 的 BERT等),并抽象了与特定模型或提供商交互的细节,使您可以轻松地在不同的LLM之间切换,而无需大量修改应用程序代码
-
模块化组件:LangChain的核心思想是我们可以将不同的组件 “ 链 ” 在一起,以创建更高级的 LLMs 用例
-
可扩展性:开发者可以无缝创建自定义组件或将它们与其他库和工具集成
-
不断发展的社区和丰富的生态系统:LangChain拥有一个蓬勃发展的开发者社区,包含大量由社区贡献的工具和模块。
LangChain的安装
pip install langchain
pip install langchain-community
LangChain的核心组件
LangChain 的独特之处之一便是其灵活性和模块化。通过将自然语言处理管道分解为单独的组件,开发人员可以轻松混合和匹配这些构建块,以创建满足其特定需求的自定义工作流程,从而使得 LangChain 成为一个高度适应性的框架,可用于为广泛的用例和行业构建对话式人工智能应用程序。
-
Chains:“链”是指调用序列(无论是LLM、工具还是数据预处理步骤)。主要支持的方法是使用 LCEL
-
Model I/O:与任何语言模型进行接口交互的基本组件
-
Retrieval (Data Connection):用于检索外部数据,然后在执行生成步骤时将其传递给 LLM
-
Agents:使用语言模型来选择要采取的一系列操作。在链中,一系列操作被硬编码(在代码中)。在代理中,语言模型被用作推理引擎来确定要采取哪些操作以及按什么顺序。
-
Memory:提供存储过去交互信息的能力
-
Callbacks:回调系统,允许您连接到 LLM 申请的各个阶段。这对于日志记录、监控、流传输和其他任务非常有用
组件:Chains
链( Chains )是一个非常通用的概念,它指的是将一系列模块化组件(或其他链)以特定方式组合起来,以实现共同的用例。
“链”是指调用序列(无论是LLM、工具还是数据预处理步骤)。主要支持的方法是使用 LCEL
LangChain表达式(LCEL)
LCEL的特点:
-
简洁:通过
|
符号将不同的组件链接在一起,将一个组件的输出作为下一个组件的输入chain = prompt | model | output_parser
-
流式支持
-
异步支持
-
重试和回退
-
访问中间结果
基本示例:
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
# 创建提示语
prompt = ChatPromptTemplate.from_template("给我讲一个关于{topic}的笑话")
# 创建模型
model = ChatOpenAI(model="gpt-4")
# 创建输出解析器
output_parser = StrOutputParser()
# 定义流程(链)
chain = prompt | model | output_parser
# 执行链
chain.invoke({"topic": "小狗"})
流式示例:
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
# 创建提示语
prompt = ChatPromptTemplate.from_template("给我讲一个关于{topic}的笑话")
# 创建模型
model = ChatOpenAI(model="gpt-4")
# 定义流程(链)
chain = prompt | model
# 执行链
for s in chain.stream({"topic": "比特币"}):
print(s.content, end="|", flush=True)组件:Agents
组件:Model I/O
针对模型的输入/输出,LangChain 提供了与任何语言模型进行接口交互的基本组件。
-
提示 prompts : 将模型输入模板化、动态选择和管理
-
语言模型 models : 通过标准接口调用语言模型
-
输出解析器 output_parsers : 从模型输出中提取信息
提示 prompts
一个简单的提示模版创建过程:
from langchain import PromptTemplate
# 创建一个提示模版
template = """/
你是一个数据开发的专家,负责为我解答相关的问题,言简意赅即可,我的问题是: {question}?
"""
prompt = PromptTemplate.from_template(template)
prompt.format(question="周期事实表与事务事实表有什么区别")
语言模型 models
LangChain提供了两种类型模型的接口和集成:
-
LLMs: 输入一个文本字符串并返回一个文本字符串的模型
-
聊天模型: 由语言模型支持的模型,接受一个聊天消息列表作为输入并返回一个聊天消息**(封装)**
LLMs和聊天模型在细微但重要的方面有所不同。LangChain中的LLMs是指纯文本完成模型调用。它们包装的API接受一个字符串提示作为输入,并输出一个字符串完成。 聊天模型不是接受单个字符串作为输入,而是接受一个聊天消息列表作为输入。通常,这些消息带有发言者标签(通常是“系统”,“AI”和“人类”之一)。它们返回一个AI聊天消息作为输出。
LangChain的聊天模型,目前支持的消息类型有“AIMessage”,