LangChain 深度解析:构建 LLM 应用的终极框架

本文深入解析 LangChain,一个简化大型语言模型 (LLM) 应用开发的开源 Python 框架。了解其模块化架构、核心组件(如链、代理、内存、工具、索引)、常见用例,并与其他流行框架进行比较,助您快速入门并构建高效的 LLM 应用。

阅读时长: 14 分钟
共 6584字
作者: eimoon.com

大型语言模型(LLM)的兴起,促使开发者需要更高级的编排方式来构建实际应用,而不仅仅是简单的 API 调用。LangChain 是一个开源的 Python 框架,旨在简化 LLM 应用程序生命周期的每个步骤。它为聊天模型、嵌入(Embeddings)、向量存储(Vector Stores)以及数百个提供商的集成提供了标准接口。

关键要点

  • 模块化框架: LangChain 是一个模块化、开源的 Python 框架,用于简化高级 LLM 应用程序的构建,提供模型、嵌入、向量存储、工具和内存的标准化接口。
  • 简化集成: 它抽象了集成复杂性,使开发者能够用最少的代码更改将任何 LLM(如 OpenAI、Anthropic、Hugging Face)与外部数据源、API 和自定义工具连接起来。
  • 可复用构建块: LangChain 提供链(Chains)、代理(Agents)、内存(Memory)、工具(Tools)和索引(Indexes)等可复用构建块,使得开发者能够构建复杂的、多步骤的 AI 工作流、聊天机器人、RAG 管道和自主代理。
  • 快速开发与部署: 它易于安装,并提供了简洁的 Python API,可用于快速原型设计和部署实际的 AI 应用程序及实验性工作。
  • 灵活切换与混合解决方案: 该框架支持模型提供商和后端之间的无缝切换和编排。它还可以与 LlamaIndex(检索)和 Haystack(搜索管道)等替代工具结合使用,以实现混合解决方案。

什么是 LangChain?

LangChain 是一个通用接口,可连接任何 LLM,是 LLM 驱动应用程序开发的中心枢纽。它由 Harrison Chase 和 Ankush Gola 于 2022 年末推出,迅速成为最受欢迎的开源 AI 项目之一。

简而言之,LangChain 通过为最常见的 LLM 任务(提示模板、模型调用、向量嵌入等)提供预构建模块和 API,简化了生成式 AI 应用程序(如聊天机器人、虚拟助手、自定义问答系统等)的构建。这使得开发者无需每次都“重新发明轮子”。

LangChain 的核心思想是:LLM 必须连接到正确的数据和工具。LLM 只是预训练的统计模型,通常缺乏最新事实或领域知识。LangChain 可以帮助您将 LLM(如 GPT-4)连接到外部源(数据库、文档、Web API,甚至您的代码),从而使 AI 模型能够使用实时上下文信息回答问题。

例如,当用户提问时,由 LangChain 支持的聊天机器人可能会检索公司文档或调用天气 API 获取当前数据,然后才做出回应。

image1

如果没有框架,您需要从头开始为每个功能开发集成代码。LangChain 的架构通过为调用任何 LLM 提供标准接口,并集成数据检索和操作工具,从而抽象了这些细节。这使得尝试不同的模型或在单个应用程序中组合多个模型变得更加容易。

关键组件:链、代理、内存、工具、索引

LangChain 为 LLM 应用程序提供了几个核心构建块。这些组件协同工作以构建复杂的 AI 工作流:

链 (Chains)

链(Chain)是一系列步骤(每个步骤可以是 LLM 调用、数据检索或其他操作),其输出作为下一个步骤的输入。LangChain 提供了一个强大的框架,用于在 Python 或 JavaScript 中构建和执行此类链。LangChain 包含几种内置链类型:

  • LLMChain (已弃用但尚未移除):最简单的链类型,封装了单个提示和 LLM 调用。已被 RunnableSequenceLangChain Expression Language (LCEL) 等更灵活的编程模式取代。
  • SimpleSequentialChain:将一个 LLM 步骤的输出直接传递给下一个步骤作为输入的链。
  • SequentialChainSimpleSequentialChain 的超集,可以有分支或多个输入/输出,适用于更复杂的工作流。
  • RouterChain:可以根据输入动态选择运行哪个子链的链(基本上是链的 if/else 或 switch 语句)。

您可以构建一个将文本翻译成法语然后进行摘要的链,或者一个从用户输入中提取关键信息、创建数据库查询并使用结果响应用户的链。通过将任务分解为一系列较小的 LLM 调用,链可以执行分步推理。

代理 (Agents)

代理(Agent)是一个基于 LLM 的程序,可以自主决定下一步采取什么行动。它观察对话或用户查询,推理(通过一次或多次 LLM 调用),然后决定按顺序执行哪些动作或工具。工具可以是计算器、搜索引擎、代码解释器、自定义 API 等。

LangChain 包含以下类型的代理:

  • ZeroShotAgent:使用 ReAct 框架(推理 + 行动)来决定采取何种行动,无需基于示例的行动。
  • ConversationalAgent:一个类似聊天机器人的代理,它跟踪对话历史并以对话方式使用工具(例如,借助搜索回答用户的问题)。
  • Plan-and-Execute Agents:一种更新、更鲁棒的代理构建方法。代理首先规划一系列步骤(使用 LLM),然后逐一执行。这在涉及多步骤研究或推理的复杂任务中可能更鲁棒。

注意ZeroShotAgentConversationalAgent 等代理类型自 0.1.0 版本起已被弃用。对于新项目,建议使用 LangGraph 进行代理编排。LangGraph 更灵活,支持有状态执行,并具有更高级的编排能力。

例如,一个 LangChain 代理可以解释用户的请求,判断需要搜索 Wikipedia,执行 API 调用检索结果,然后格式化响应。

以下是一个简化的 Python 风格 LangChain 代理示例:

# Install required packages (run this in your terminal, not in the script)
# pip install langchain langchain-openai langchain-community openai

import os
from langchain_openai import OpenAI
from langchain.agents import initialize_agent, AgentType
from langchain_community.tools import WikipediaQueryRun, DuckDuckGoSearchRun, RequestsGetTool
from langchain_community.utilities import WikipediaAPIWrapper

# 0. Set your OpenAI API key (recommended: set as environment variable)
os.environ["OPENAI_API_KEY"] = "your-openai-api-key-here"  # Replace with #your actual OpenAI API key

# 1. Set up the LLM and tools
llm = OpenAI(model="gpt-3.5-turbo-instruct", temperature=0)
wikipedia = WikipediaQueryRun(api_wrapper=WikipediaAPIWrapper())  # No API key needed for Wikipedia
web_search = DuckDuckGoSearchRun()
api_tool = RequestsGetTool()

# 2. Add all tools to the agent
tools = [wikipedia, web_search, api_tool]

agent = initialize_agent(
    tools=tools,
    llm=llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,  # ReAct-style agent
    verbose=True
)

# 3. User input
user_query = "What's the latest news about NASA on Wikipedia and the web? Also, fetch the NASA API homepage."

# 4. Agent workflow: will pick the right tool for each part of the request
response = agent.run(user_query)
print(response)

该代理将解析用户复杂的查询,决定使用哪些工具(Wikipedia 用于百科信息,DuckDuckGo 用于最新新闻,RequestsGetTool 用于 API 获取),并将结果组合到其响应中。AgentType.ZERO_SHOT_REACT_DESCRIPTION 定义了如何构建一个 ReAct 风格的代理,该代理可以推理为用户查询的每个部分使用哪个工具。

内存 (Memory)

与单个 LLM 调用不同,许多应用程序(如聊天机器人)必须保留先前交互的上下文。LangChain 的内存模块存储对话历史、摘要或其他状态。对于 LLM 的每个新提示,相关历史信息从内存中检索并作为上下文包含在内。

最常用的内存类型包括:

  • ConversationBufferMemory:将整个对话历史存储在单个顺序缓冲区中。
  • ConversationBufferWindowMemory:只存储最后 N 条消息。当完整历史记录过长(超出上下文长度限制)时,可以使用此“窗口”来保存最新交流。
  • ConversationSummaryMemory:与 ConversationBufferMemory 类似,但它维护过去交互的运行摘要,而不是直接存储所有消息。这对于从长对话中提取突出信息非常有用。
  • VectorStore-backed Memory:将事实或嵌入存储在向量数据库中,实现长期记忆和超越近期文本的语义搜索能力。

其他内存类型包括 ConversationSummaryBufferMemory(缓冲区和摘要内存的混合)和 EntityStoreMemory(跟踪实体)。然而,对于新项目,最好使用最新的内存管理模式,如 RunnableWithMessageHistory,以获得更大的灵活性和控制。

例如,聊天机器人链可以检索之前的对话回合以保持对话的连贯性。这使得应用程序能够在长时间的聊天中保持上下文,这对于连贯的多轮响应至关重要。

image2

关键点:

  • 用户发送消息,消息被添加到内存中。
  • 聊天机器人访问内存以保持连续性和连贯性。
  • 如有必要,聊天机器人会使用外部工具收集信息,然后做出响应。

工具 (Tools)

在 LangChain 中,工具(Tools)代表代理可以调用的任何外部函数或 API。 LangChain 拥有大量内置工具,包括:

  • Web 搜索 API (SerpAPI) – LLM 可以要求它搜索互联网。
  • Python REPL – 运行 Python 代码(对数学、数据操作等有用)。
  • 数据库查询工具 – 例如,连接到 SQL 数据库并查询它。
  • 浏览器或爬虫 – 浏览网页(通常通过 Playwright 或类似包装器使用)。
  • 计算器 – 一个简单的数学评估器。
  • …还有更多,但您也可以创建自己的工具(任何 Python 函数都可以是一个工具)。

工具使 LLM 能够获取数据或执行其训练数据和能力之外的操作。当运行代理时,LLM 可能会输出一个“动作”,指示要运行哪个工具以及使用什么输入。这有助于防止幻觉并将 AI 的输出基于真实数据。

索引 (Vector Stores)

大多数 LangChain 应用程序使用检索增强生成(Retrieval Augmented Generation, RAG),其中 LLM 的答案基于文档语料库。为了实现 RAG,LangChain 支持与向量数据库(也称为向量存储)集成,向量数据库使用嵌入(Embeddings)对文档进行索引。向量存储允许您 add_documents(...),然后根据查询嵌入执行相似性搜索。

实际上,这意味着您可以将 PDF/网页等加载到 LangChain 兼容的向量存储中,当 LLM 请求相关事实时,LangChain 会检索最相似的文档。这些“索引”提供了对大型文本语料库的快速语义搜索。LangChain 通过通用接口支持多种向量数据库后端(如 Pinecone、Weaviate、Chroma 等)。

LangChain 架构

LangChain 提供了模块化、分层的架构。每个层都有特定的作用。这种设计使开发者能够构建、扩展和定制 LLM 驱动的应用程序。其生态系统组织如下:

  • langchain-core:此库包含 LLM、提示、消息和底层 Runnable 接口等基本抽象。此包定义了构建 LangChain 功能的标准构建块。
  • Integration Packages:对于每个支持的 LLM 提供商或外部工具(OpenAI、Google、Redis 等),都有一个集成包(如 langchain-openailangchain-googlelangchain-redis 等),其中包含轻量级适配器。这些适配器封装了提供商的 API,并将其公开为 LangChain 组件。
  • langchain (Meta-Package):此元包包含预构建的链、代理和检索链。安装 LangChain 将为您提供核心框架以及 LLM 工作流编排最流行的功能。
  • langchain-community:包含社区开发的连接器和集成。这是一个协作空间,供社区构建对新数据库、API 和第三方工具的支持,以扩展 LangChain 的集成。
  • LangGraph:LangGraph 提供了一个灵活的编排层,适用于更高级的场景。开发者可以通过编排多个链和代理,并具有持久性和强大的状态管理,来构建有状态、流式、生产就绪的 LLM 应用程序。虽然它与 LangChain 紧密集成,但您也可以使用它来管理更复杂的工作流和编排需求。

实际上,您需要安装 LangChain,然后导入所需的组件。例如,链可以在 langchain.chains 中找到,代理在 langchain.agents 中,还有用于模型、嵌入、内存等的子包。使用 LangChain,您可以抽象模型提供商之间的差异。这样,您的代码可以通过更改模型规范轻松地在 OpenAI、Anthropic、Azure、Hugging Face 等之间切换。

以下是切换 LLM 提供商的示例代码:

# Install: pip install langchain langchain-openai langchain-anthropic

import os
from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic
from langchain.prompts import ChatPromptTemplate

# 1. Set your API key(s)
# For OpenAI:
os.environ["OPENAI_API_KEY"] = "your-openai-api-key-here"  # Replace with #your OpenAI API key

# For Anthropic (if you want to use Claude):
os.environ["ANTHROPIC_API_KEY"] = "your-anthropic-api-key-here"  # Replace #with your Anthropic API key

# 2. Choose a model provider (swap between OpenAI and Anthropic)
# Uncomment one of the following lines depending on the provider you want to #use:

llm = ChatOpenAI(model="gpt-3.5-turbo")  
# llm = ChatAnthropic(model="claude-3-opus")

# 3. Create a prompt template
prompt = ChatPromptTemplate.from_template("Tell me a fun fact about {topic}.")

# 4. Compose the chain using the chaining operator
chain = prompt | llm

# 5. Run the chain with user input
response = chain.invoke({"topic": "space"})
print(response.content)

关键点:

  • OpenAI: 使用 ChatOpenAI (来自 langchain_openai)。
  • Anthropic: 使用 ChatAnthropic (来自 langchain_anthropic)。
  • 同步调用: 使用 chain.invoke() 进行同步调用。
  • 模型切换: 可以通过一行代码轻松切换 llm = ChatOpenAI(...)llm = ChatAnthropic(...)
  • API 密钥: 必须将 API 密钥(例如 OPENAI_API_KEYANTHROPIC_API_KEY)设置为环境变量或传递给模型构造函数。

流行用例

LangChain 旨在帮助开发者和技术负责人构建快速、高效的 LLM 驱动应用程序,以解决各种实际挑战。LangChain 支持以下用例:

用例 概述 LangChain 功能 优点
检索增强问答 (RAG) 构建基于您数据的问答系统,减少幻觉并确保最新响应。 文档加载器、文本分割器 → 嵌入 → 向量存储检索器 → RetrievalQA 链;支持 Pinecone、FAISS 等 准确、可验证的答案,动态更新,无需重新训练模型。
聊天机器人与对话代理 创建具有完整历史记录、内存和流式/角色支持的有状态聊天机器人。 RunnableWithMessageHistory 内存模块和提示模板 上下文丰富的对话和连贯、以角色为导向的对话管理。
自主代理 自主规划和执行多步工作流的代理,保持对先前步骤的记忆。 规划-执行代理、ReAct 代理、代理循环框架、内存 实现自主工作流中的规划、工具执行和运行时适应。
数据问答与摘要 对 PDF、电子表格、文章等进行自然语言查询或摘要。支持对文档进行分步推理。 文档加载器、文本分割器、嵌入、思维链提示 高效处理长文本,支持分层摘要和问答。

总而言之,如果您的 LLM 应用程序需要将多个步骤链接在一起,集成外部数据或维护上下文,LangChain 可以提供帮助。上述列表远非详尽无遗——开发者正在通过独特地组合 LangChain 构建块来构建全新类型的应用程序。

LangChain 与替代方案对比

以下是 LangChain 与其两个最广泛使用的替代方案 LlamaIndex 和 Haystack 的比较,以帮助您就哪种工具最适合您的项目做出明智的决定:

框架 主要特点与比较
LlamaIndex 专为 RAG 构建: 提供简单的 API 来加载数据、构建向量索引并高效地查询它们。优势: 具有最少配置的闪电般快速的文档检索和搜索。LangChain vs LlamaIndex: 虽然 LangChain 擅长代理、多步工作流和 LLM 编排(例如聊天机器人、助手、管道),但 LlamaIndex 专注于检索和语义搜索。LlamaIndex 正在增加更多工作流和代理支持,但 LangChain 仍然是复杂、多组件应用程序更灵活的选择。
Haystack 用于 NLP 和 RAG 的强大 Python 框架: 最初是一个提取式问答工具,现在支持搜索、检索和生成管道。优势: 高级接口,非常适合以搜索为中心或生产级的检索系统。LangChain vs Haystack: LangChain 提供更深入的代理工具、可组合性和自定义代理设计。Haystack 最近的“Haystack Agents”增加了多步推理,但 LangChain 仍然为高度定制的代理系统提供更多灵活性。混合方法: 许多团队将 LangChain 的代理编排与 Haystack 的检索器或管道结合使用,利用两个生态系统的优点。
其他工具 包括 Microsoft Semantic Kernel、OpenAI Function Calling 等。大多数都专注于特定场景,例如搜索或对话编排。LangChain 优势: 拥有最大的可重用代理、链和编排原语集合,支持真正的端到端 LLM 应用程序和复杂工作流的快速原型设计。

重要的是要注意,每种工具都有其优点。通常,开发团队可以一起使用它们,以受益于高级检索功能和灵活的编排。在选择框架时权衡项目的复杂性和目标(如果需要,不要害怕尝试混合方法)。

Python LangChain 入门

以下是 Python LangChain 入门的循序渐进指南,从安装到运行您的第一个演示。

1. 先决条件

在开始之前,请确保您的环境中具备以下条件:

  • Python 3.8 或更高版本
  • pip(Python 包管理器)
  • (可选,但推荐)使用 虚拟环境 来管理依赖项

2. 安装

打开终端或命令提示符并运行以下命令以安装核心 LangChain 包:

pip install langchain

要使用 OpenAI 模型和其他流行的提供商,您需要安装相应的集成包。对于 OpenAI,运行:

pip install langchain-openai

LangChain 的模块化方法允许您只安装所需的集成。

3. 设置您的 API 密钥

选项 1:设置为环境变量。

  • 在 macOS/Linux 上: export OPENAI_API_KEY="your_openai_api_key_here"
  • 在 Windows 上: set OPENAI_API_KEY="your_openai_api_key_here"

选项 2:使用 .env 文件(推荐用于本地开发):

  • 安装 python-dotenvpip install python-dotenv
  • 在您的项目目录中创建一个 .env 文件: OPENAI_API_KEY=your_openai_api_key_here
  • 在您的 Python 脚本顶部添加:
    from dotenv import load_dotenv
    load_dotenv()
    

4. 运行简单的 LangChain 演示

让我们考虑使用 OpenAI 的 GPT-3.5 Turbo Instruct 模型的简单代码示例:

# If using a .env file, load environment variables
from dotenv import load_dotenv
load_dotenv()

from langchain_openai import OpenAI
from langchain_core.prompts import PromptTemplate

# Create a prompt template
prompt = PromptTemplate.from_template("Answer concisely: {query}")

# Initialize the OpenAI LLM
llm = OpenAI(model="gpt-3.5-turbo-instruct", temperature=0)

# Compose the chain
chain = prompt | llm

# Run the chain with a sample query
answer = chain.invoke({"query": "What is LangChain used for?"})
print(answer)

关键点:

  • 导入: 导入 langchain_openai 用于 OpenAI 模型,以及 langchain_core.prompts 用于提示模板。
  • PromptTemplate: 使用占位符定义提示的结构。
  • 链式操作: | 运算符将提示传递给模型。
  • 调用: 使用输入调用 chain.invoke() 以获取响应。

LangChain 在底层管理所有 API 调用和格式化。您无需编写自己的 HTTP 请求或手动管理对话令牌。在构建应用程序时,您可能会合并额外的链、工具支持的代理或内存组件。然而,即使这个基本演示也说明了 LangChain 代码可以多么简洁。

结论

LangChain 是一个灵活、模块化的框架,它简化了高级 LLM 驱动应用程序的构建。其基于组件的架构、丰富的构建块和集成能力使您可以轻松地将语言模型连接到外部数据、工具和工作流。

无论您是构建聊天机器人、RAG 驱动的助手,还是复杂的多代理系统,LangChain 都提供了启动 AI 项目的基础和灵活性。随着生态系统的发展,它还可以与其他工具(如 LlamaIndex、Haystack 等)结合使用,以增强应用程序的功能。

如果您有密集的 LLM 工作负载(大型模型、长上下文),您将需要利用 GPU 支持的环境。DigitalOcean 的 GPU Droplets 等云提供商具有成本效益,可用于启动针对大规模运行 LangChain 模型优化的 GPU 实例。

要开始使用,请按照上面提供的设置说明进行操作。您还可以查看 LangChain 的官方文档和不断增长的社区资源。

关于

关注我获取更多资讯

公众号
📢 公众号
个人号
💬 个人号
使用 Hugo 构建
主题 StackJimmy 设计