LangChain 是什么
Langchain 是一个开源框架,它允许开发人员将大型语言模型与外部的计算和数据源结合起来,是一个通过组合模块和能力抽象来扩展 LLM 的助手
为什么需要 LangChain
-
增强语言模型的功能: LangChain 提供了可以将语言模型与各种数据源(如数据库、WebAPI、文档、搜索引擎等)连接的工具,使得语言模型能够在处理复杂任务时提供更丰富的回答。
-
流水线(Pipelines)支持: LangChain 允许构建复杂的“流水线”,即多个步骤的组合。例如,开发者可以设计一个任务,在多个步骤中使用不同的语言模型和数据源。这对于处理多阶段推理或需要上下文依赖的任务非常有用。
-
与外部工具的集成: LangChain 支持与其他外部服务和工具的集成,如数据库、搜索引擎、API等。这使得它特别适合构建需要动态获取外部数据、并基于这些数据生成响应的应用。
-
聊天和对话管理: LangChain 提供了内建的对话管理功能,能够追踪对话上下文,处理多轮对话,以及确保对话的连贯性。这对于构建对话型应用,如聊天机器人、虚拟助手等非常重要。
-
分布式和并行计算: 对于大型任务或高并发应用,LangChain 提供了并行处理和分布式计算的能力,这能够有效提升处理速度和效率。
-
自动化任务和工作流: 通过 LangChain,开发者可以构建自动化的工作流(如数据抓取、文本生成等),这些任务可以被组合成复杂的应用。
LangChain 典型使用场景
Langchain 的应用场景非常广泛,包括但不限于:
个人助手:可以帮助预订航班、转账、缴税等。
学习辅助:可以参考整个课程大纲,帮助你更快地学习材料。
数据分析和数据科学:连接到公司的客户数据或市场数据,极大地促进数据分析的进展。
总之,Langchain 打开了一个充满可能性的新世界,让AI技术更加贴近我们的实际需求和数据,使得机器学习应用的发展更加多样化和个性化。
LangChain 基础概念与模块化设计
LangChain 核心模块
标准化的大模型抽象:Model I/O
- Model I/O 是 LangChain 为开发者提供的一套面向 LLM 的标准化模型接口,包括模型本身(Models),模型输入(Prompts)和模型输出(Output Parsers)。
模型:Models
- 语言模型(LLMs): LangChain 的核心组件。LangChain并不提供自己的LLMs,而是为与许多不同的LLMs(OpenAI、Cohere、Hugging Face等)进行交互提供了一个标准接口。
- 聊天模型(Chat Models): 语言模型的一种变体。虽然聊天模型在内部使用了语言模型,但它们提供的接口略有不同。与其暴露一个“输入文本,输出文本”的API不同,它们提供了一个以“聊天消息”作为输入和输出的接口。
语言模型(LLMs)
类继承关系:
BaseLanguageModel --> BaseLLM --> LLM --> <name> # Examples: HuggingFaceHub, OpenAI
BaseLanguageModel Class (所有语言模型的封装器都应从 BaseLanguageModel 继承。)
# 定义 BaseLanguageModel 抽象基类,它从 Serializable, Runnable 和 ABC 继承
class BaseLanguageModel(
Serializable, Runnable[LanguageModelInput, LanguageModelOutput], ABC
):
这个基类为语言模型定义了一个接口,该接口允许用户以不同的方式与模型交互(例如通过提示或消息)。generate_prompt 是其中的一个主要方法,它接受一系列提示,并返回模型的生成结果。
主要提供三种方法 (每种方法都有对应的异步方法):
- generate_prompt: 为一系列的提示值生成语言模型输出。提示值是可以转换为任何语言模型输入格式的模型输入(如字符串或消息)。
- predict: 将单个字符串传递给语言模型并返回字符串预测。
- predict_messages: 将一系列 BaseMessages(对应于单个模型调用)传递给语言模型,并返回 BaseMessage 预测。
# 定义一个抽象方法 generate_prompt,需要子类进行实现
@abstractmethod
def generate_prompt(
self,
prompts: List[PromptValue], # 输入提示的列表
stop: Optional[List[str]] = None, # 生成时的停止词列表
callbacks: Callbacks = None, # 回调,用于执行例如日志记录或流式处理的额外功能
**kwargs: Any, # 任意的额外关键字参数,通常会传递给模型提供者的 API 调用
) -> LLMResult:
使用此方法时:
1. 希望利用批处理调用,
2. 需要从模型中获取的输出不仅仅是最顶部生成的值,
3. 构建与底层语言模型类型无关的链(例如,纯文本完成模型与聊天模型)。
参数:
prompts: 提示值的列表。提示值是一个可以转换为与任何语言模型匹配的格式的对象(对于纯文本生成模型为字符串,对于聊天模型为 BaseMessages)。
stop: 生成时使用的停止词。模型输出在这些子字符串的首次出现处截断。
callbacks: 要传递的回调。用于执行额外功能,例如在生成过程中进行日志记录或流式处理。
kwargs: 任意的额外关键字参数。通常这些会传递给模型提供者的 API 调用。
返回值: LLMResult,它包含每个输入提示的候选生成列表以及特定于模型提供者的额外输出。
BaseLLM Class
# 定义 BaseLLM 抽象基类,它从 BaseLanguageModel[str] 和 ABC(Abstract Base Class)继承
class BaseLLM(BaseLanguageModel[str], ABC):
"""Base LLM abstract interface.
It should take in a prompt and return a string."""
# 定义可选的缓存属性,其初始值为 None
cache: Optional[bool] = None
# 定义 verbose 属性,该属性决定是否打印响应文本
# 默认值使用 _get_verbosity 函数的结果
verbose: bool = Field(default_factory=_get_verbosity)
"""Whether to print out response text."""
# 定义 callbacks 属性,其初始值为 None,并从序列化中排除
callbacks: Callbacks = Field(default=None, exclude=True)
# 定义 callback_manager 属性,其初始值为 None,并从序列化中排除
callback_manager: Optional[BaseCallbackManager] = Field(default=None, exclude=True)
# 定义 tags 属性,这些标签会被添加到运行追踪中,其初始值为 None,并从序列化中排除
tags: Optional[List[str]] = Field(default=None, exclude=True)
"""Tags to add to the run trace."""
# 定义 metadata 属性,这些元数据会被添加到运行追踪中,其初始值为 None,并从序列化中排除
metadata: Optional[Dict[str, Any]] = Field(default=None, exclude=True)
"""Metadata to add to the run trace."""
# 内部类定义了这个 pydantic 对象的配置
class Config:
"""Configuration for this pydantic object."""
# 允许使用任意类型
arbitrary_types_allowed = True
这段代码定义了一个名为 BaseLLM 的抽象基类。这个基类的主要目的是提供一个基本的接口来处理大型语言模型 (LLM),使用了 Pydantic 的功能,特别是 Field 方法,用于定义默认值和序列化行为。BaseLLM 的子类需要提供实现具体功能的方法。
LLM Class
# 继承自 BaseLLM 的 LLM 类
class LLM(BaseLLM):
"""Base LLM abstract class.
The purpose of this class is to expose a simpler interface for working
with LLMs, rather than expect the user to implement the full _generate method.
"""