一、介绍
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 |
LlamaIndex | LLM 的数据接口与索引框架 | 聚焦数据连接与索引构建,支持多种检索器与索引结构,便于与 LLM 集成 | 私有知识库问答、文档检索、RAG 系统 | ✅ MIT License |
Haystack | 面向生产的 NLP/RAG 应用框架 | 支持端到端 NLP 管道,兼容传统与现代检索模型,集成 ElasticSearch、FAISS 等 | 企业级问答系统、FAQ 管理、文档搜索引擎 | ✅ Apache 2.0 |
DSPy | 声明式 Prompt 编排与优化框架 | 以编程方式构建提示链,自动调整提示策略,注重提示质量与推理性能 | Prompt 研究、策略调优、复杂推理任务 | ✅ MIT License |
五、LangChain快速入门
下面开始通过检索增强生成 (RAG) 的技术构建一个问答聊天机器人,一个典型的RAG(检索增强生成)应用包含两个主要组件。
- 索引构建:从数据源摄取数据并建立索引。
- 加载 :首先我们需要加载我们的数据。这是通过 Document Loader 完成的。
- 拆分 : 文本拆分器将大型
文档
拆分为较小的块。这对于索引数据以及将其传递到模型中都很有用,因为大块更难搜索,并且不适合模型的有限上下文窗口。- Store:我们需要某个地方来存储和索引我们的 split,以便以后可以搜索它们。这通常是使用 VectorStore 和 Embeddings 模型完成的。
- 检索与生成:实际的RAG链,在运行时接收用户查询,从索引中检索相关数据,然后将结果传递给生成模型。
- Retrieve:给定用户输入,使用 Retriever 从存储中检索相关分片。
搭建RAG问答聊天机器人
本次实战基于 Python 3.11.9
和 LangChain v0.3 实现一个简单的 RAG(检索增强生成)问答系统,将在 Jupyter Notebook 中进行。
- 环境准备(可选)
若希望记录调用链信息,可设置 LangSmith 环境变量开启 LangSmith 追踪功能。可访问LangSmith生成LANGSMITH_API_KEY。
在终端中运行:
export LANGSMITH_TRACING="true"export LANGSMITH_API_KEY="..."
或在 Jupyter Notebook 中设置:
import getpass, osos.environ["LANGSMITH_TRACING"] = "true"os.environ["LANGSMITH_API_KEY"] = getpass.getpass()
- 安装依赖项
pip install -qU "langchain[openai]"pip install -qU langchain-openaipip install -qU langchain-core
- 初始化模型
- 初始化 Chat 模型,可以使用国内代理访问openai api,使用代理后需要在环境变量设置代理OPENAI_API_BASE。
import getpass, osif 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_modelllm = init_chat_model("gpt-4o-mini", model_provider="openai")
- 初始化 Embedding 模型
from langchain_openai import OpenAIEmbeddingsembeddings = OpenAIEmbeddings(model="text-embedding-3-large")
- 构建向量存储
from langchain_core.vectorstores import InMemoryVectorStorevector_store = InMemoryVectorStore(embeddings)
- 加载和预处理文档
- 加载网页内容
使用 WebBaseLoader
加载 Lilian Weng 的代理相关博客文章内容:
import bs4from langchain_community.document_loaders import WebBaseLoaderloader = 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 RecursiveCharacterTextSplittertext_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)all_splits = text_splitter.split_documents(docs)
- 构建索引
将文档块添加至向量存储中:
_ = vector_store.add_documents(documents=all_splits)
- 构建 RAG 问答链
- 加载问答提示模板
from langchain import hubprompt = hub.pull("rlm/rag-prompt")
- 定义系统状态结构
from langchain_core.documents import Documentfrom typing_extensions import List, TypedDictclass 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, StateGraphgraph_builder = StateGraph(State).add_sequence([retrieve, generate])graph_builder.add_edge(START, "retrieve")graph = graph_builder.compile()
- 执行问答任务
通过调用 graph.invoke()
发起问题并获取答案:
response = graph.invoke({"question": "What is Task Decomposition?"})print(response["answer"])
六、总结
LangChain 为大语言模型(LLM)应用的开发提供了模块化、可组合的能力支持,覆盖提示管理、记忆机制、工具集成、检索增强、流程编排与评估测试等核心环节。它已成为构建对话机器人、智能客服、搜索问答与 RAG 系统等应用的主流开发框架之一,具备良好的扩展性与工程落地能力。