LangChain 入门到进阶:掌握大模型开发的第一步

581 阅读8分钟

一、介绍

LangChain 是一个开源框架,旨在帮助开发者高效构建基于大语言模型(LLM)的复杂智能应用。通过模块化设计与链式调用理念,LangChain 提供了连接语言模型、提示模板、记忆机制、工具系统与外部数据源的统一方式,大幅降低了 AI 应用开发的门槛。

二、框架组成

LangChain 的架构由以下核心模块构成:

模块名称描述
LangSmith一个开发者平台,让你可以调试、测试、评估和监控基于任何 LLM 框架构建的链,并且与 LangChain 无缝集成
LangServe支持将 LangChain 构建的链部署为 REST API 的工具
LangChain 模板提供各类任务的参考架构模板,适合快速部署和二次开发
LangChain 库提供 Python 与 JavaScript SDK,包含组件接口、运行时引擎,以及预构建的链与代理

三、核心概念

1.模型能力与输入输出机制

LangChain 封装了多种模型接口与输入输出机制,帮助开发者更高效地使用 LLM 实现定制化任务,包括提示模板管理、结构化输出、嵌入生成、示例选择与多模态处理。

概念说明
Chat Models支持多轮消息输入输出的对话模型
Embedding Models将文本或多模态数据映射为向量表示
Prompt Templates模板化管理提示词,便于复用与版本控制
Few-shot Prompting通过示例提升模型在特定任务中的表现
Structured Output输出结构化数据,如 JSON,便于程序处理
Output Parsers将模型原始输出转换为规范格式
Example Selectors自动选择示例用于 few-shot 提示词生成
Multimodality支持处理文本、图像、音频、视频等多模态数据

2.对话管理与记忆机制

LangChain 提供丰富的对话管理能力,支持消息对象封装、上下文历史存储与调用,并通过记忆机制实现对长时上下文或状态的持续跟踪,使模型具备更强的连贯性与上下文理解能力。

概念说明
Messages聊天中的最小信息单元,支持角色与内容定义
Chat History对话消息序列记录,支持上下文管理
Memory长/短期记忆模块,支持跨轮调用历史信息

3.工具调用与智能代理

为了扩展语言模型的能力,LangChain 引入工具系统与智能代理架构。工具允许模型调用外部函数或 API,代理系统则支持模型根据任务自动规划行动步骤,逐步完成复杂指令。

概念说明
Tools具备结构化参数定义的外部函数或 API
Tool Calling支持 LLM 自动识别并调用工具的机制
Agents具备自主决策能力的智能体,可动态调用多个工具完成任务

4.知识库与 RAG(Retrieval-Augmented Generation)

LangChain 原生支持构建检索增强生成(RAG)系统,将外部知识引入大模型,提升上下文相关性与准确性。

概念说明
Document Loaders加载文本、PDF、网页等数据为文档对象
Text Splitters长文本分块,利于向量化与检索
Vector Stores文档向量与元数据的存储与搜索系统
Retrievers从知识库中返回最相关文档的接口
RAG 机制将检索结果注入 Prompt,提高模型对事实的掌握能力

5.编排与运行机制

LangChain 提供灵活的运行接口与表达式语言,支持组件级组合与异步执行,帮助开发者搭建清晰高效的处理流程。

概念说明
Runnable 接口LangChain 所有模块的统一运行接口
LangChain Expression Language(LCEL)通过链式语法组合各类组件,实现流程编排
Async Programming原生支持异步执行,适配大规模并发场景
Streaming支持流式输出,如 token 级实时生成

6.调试、测试与评估体系

LangChain 提供完善的链路追踪、回调钩子与测试评估工具,助力 AI 应用质量保障与问题定位。

概念说明
Callbacks自定义钩子函数,可用于日志、指标或流式输出
Tracing可视化链路分析工具,支持从输入到输出的全过程追踪
Evaluation对模型响应进行质量评估,包括准确性、一致性等指标
Testing验证链或代理在不同输入下的稳定性与正确性

四、LangChain与同类框架对比

在大语言模型应用开发领域,除了 LangChain,还存在如 LlamaIndex、Haystack、DSPy 等热门框架。它们在设计理念、功能侧重、易用性与扩展能力等方面各具特色。

框架核心定位核心特点典型应用场景开源与许可
LangChain通用 LLM 应用开发框架模块化设计,支持链式组合与智能代理,多工具集成,插件生态活跃对话机器人、智能客服、工具调用、流程自动化✅ MIT License
LlamaIndexLLM 的数据接口与索引框架聚焦数据连接与索引构建,支持多种检索器与索引结构,便于与 LLM 集成私有知识库问答、文档检索、RAG 系统✅ MIT License
Haystack面向生产的 NLP/RAG 应用框架支持端到端 NLP 管道,兼容传统与现代检索模型,集成 ElasticSearch、FAISS 等企业级问答系统、FAQ 管理、文档搜索引擎✅ Apache 2.0
DSPy声明式 Prompt 编排与优化框架以编程方式构建提示链,自动调整提示策略,注重提示质量与推理性能Prompt 研究、策略调优、复杂推理任务✅ MIT License

五、LangChain快速入门

下面开始通过检索增强生成 (RAG) 的技术构建一个问答聊天机器人,一个典型的RAG(检索增强生成)应用包含两个主要组件。

  1. 索引构建:从数据源摄取数据并建立索引。
  • 加载 :首先我们需要加载我们的数据。这是通过 Document Loader 完成的。
  • 拆分 文本拆分器将大型文档拆分为较小的块。这对于索引数据以及将其传递到模型中都很有用,因为大块更难搜索,并且不适合模型的有限上下文窗口。
  • Store:我们需要某个地方来存储和索引我们的 split,以便以后可以搜索它们。这通常是使用 VectorStoreEmbeddings 模型完成的。

  1. 检索与生成:实际的RAG链,在运行时接收用户查询,从索引中检索相关数据,然后将结果传递给生成模型。
  • Retrieve:给定用户输入,使用 Retriever 从存储中检索相关分片。
  • 生成ChatModel / LLM 使用提示生成答案,该提示包括问题和检索到的数据

搭建RAG问答聊天机器人

本次实战基于 Python 3.11.9 和 LangChain v0.3 实现一个简单的 RAG(检索增强生成)问答系统,将在 Jupyter Notebook 中进行。

  1. 环境准备(可选)

若希望记录调用链信息,可设置 LangSmith 环境变量开启 LangSmith 追踪功能。可访问LangSmith生成LANGSMITH_API_KEY。

在终端中运行:

export LANGSMITH_TRACING="true"
export LANGSMITH_API_KEY="..."

或在 Jupyter Notebook 中设置:

import getpass, os
​
os.environ["LANGSMITH_TRACING"] = "true"
os.environ["LANGSMITH_API_KEY"] = getpass.getpass()
  1. 安装依赖项
pip install -qU "langchain[openai]"
pip install -qU langchain-openai
pip install -qU langchain-core
  1. 初始化模型
  • 初始化 Chat 模型,可以使用国内代理访问openai api,使用代理后需要在环境变量设置代理OPENAI_API_BASE。
import getpass, os
​
if not os.environ.get("OPENAI_API_KEY"):
    os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter API key for OpenAI: ")
​
from langchain.chat_models import init_chat_model
​
llm = init_chat_model("gpt-4o-mini", model_provider="openai")
  • 初始化 Embedding 模型
from langchain_openai import OpenAIEmbeddings
​
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
  1. 构建向量存储
from langchain_core.vectorstores import InMemoryVectorStore
​
vector_store = InMemoryVectorStore(embeddings)
  1. 加载和预处理文档
  • 加载网页内容

使用 WebBaseLoader 加载 Lilian Weng 的代理相关博客文章内容:

import bs4
from langchain_community.document_loaders import WebBaseLoader
​
loader = WebBaseLoader(
    web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",),
    bs_kwargs=dict(
        parse_only=bs4.SoupStrainer(
            class_=("post-content", "post-title", "post-header")
        )
    ),
)
docs = loader.load()
  • 分割文本为块

使用递归式文本切分器分割长文为可处理的段落:

from langchain_text_splitters import RecursiveCharacterTextSplitter
​
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
all_splits = text_splitter.split_documents(docs)
  • 构建索引

将文档块添加至向量存储中:

_ = vector_store.add_documents(documents=all_splits)
  1. 构建 RAG 问答链
  • 加载问答提示模板
from langchain import hub
​
prompt = hub.pull("rlm/rag-prompt")
  • 定义系统状态结构
from langchain_core.documents import Document
from typing_extensions import List, TypedDict
​
class State(TypedDict):
    question: str
    context: List[Document]
    answer: str
  • 定义检索步骤
def retrieve(state: State):
    retrieved_docs = vector_store.similarity_search(state["question"])
    return {"context": retrieved_docs}
  • 定义生成步骤
def generate(state: State):
    docs_content = "\n\n".join(doc.page_content for doc in state["context"])
    messages = prompt.invoke({"question": state["question"], "context": docs_content})
    response = llm.invoke(messages)
    return {"answer": response.content}
  • 编译 LangGraph 应用
from langgraph.graph import START, StateGraph
​
graph_builder = StateGraph(State).add_sequence([retrieve, generate])
graph_builder.add_edge(START, "retrieve")
graph = graph_builder.compile()
  1. 执行问答任务

通过调用 graph.invoke() 发起问题并获取答案:

response = graph.invoke({"question": "What is Task Decomposition?"})
print(response["answer"])

六、总结

LangChain 为大语言模型(LLM)应用的开发提供了模块化、可组合的能力支持,覆盖提示管理、记忆机制、工具集成、检索增强、流程编排与评估测试等核心环节。它已成为构建对话机器人、智能客服、搜索问答与 RAG 系统等应用的主流开发框架之一,具备良好的扩展性与工程落地能力。