LangChain—大语言模型应用开发框架的体系化架构解析

1. 什么是LangChain

🍋LangChain是一个基于大语言模型的开发框架,旨在帮助开发者构建端到端的语言模型应用。它提供丰富的工具套件和接口,支持实现文本生成图像、智能问答、聊天机器人等多种复杂任务。类似于 Java 中的 SpringPython 中的 Django

官网地址https://python.langchain.com/docs/introduction/
中文地址https://www.langchain.com.cn/docs/introduction/
源码地址https://github.com/langchain-ai/langchain


LangChain介绍:

python 复制代码
🎉LangChain is a framework for developing applications powered by large language models (LLMs).

LangChain simplifies every stage of the LLM application lifecycle:

 - Development: Build your applications using LangChain's open-source building blocks, components, and third-party integrations. Use LangGraph to build stateful agents with first-class streaming and human-in-the-loop support.
 
 - Productionization: Use LangSmith to inspect, monitor and evaluate your chains, so that you can continuously optimize and deploy with confidence.
 
 - Deployment: Turn your LangGraph applications into production-ready APIs and Assistants with LangGraph Cloud.

LangChain简化了LLM应用程序生命周期的各个阶段:

  • 开发阶段 :使用LangChain的开源构建块和组件构建应用程序,利用第三方集成和模板快速启动。
  • 生产化阶段 :使用LangSmith检查、监控和评估您的链,从而可以自信地持续优化和部署。
  • 部署阶段 :使用LangServe将任务链转化为API

2. 大模型框架的重要性

2.1 多步骤串联(包含多轮思考与逻辑判断)

你想让 LLM:先调用知识库;再判断答案是否不完整;如果不完整,再调用另一个模型补足。 你怎么办?原始代码写死逻辑就麻烦了。框架可以让你用链(Chain) Agent 来封装这类流程,非常容易扩展。

python 复制代码
response = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[{"role": "user", "content": "请推荐三本书"}]
)

2.2 多模型、多任务融合

你希望系统: 用户提问 → Claude 回答; 遇到结构草图 → 用 GPT-4; 编程代码 → 用kimi k2; 语义分析 → 用本地模型; 你要怎么切换?怎么统一接口?怎么路由调用逻辑?框架可以一键适配 OpenAI、Anthropic、本地模型、HuggingFace 等,统一抽象出 Model 类调用接口。 而且还能一点点扩展,而且避免你代码中充满下面代码

python 复制代码
if model == 'gpt-3.5':
    pass
elif model == 'claude-3':
    pass

Langchain的核心组件

  • 模型(Models :包含各大语言模型的LangChain接口和调用细节,以及输出解析机制。
  • 提示模板(Prompts:使提示工程流线化,进一步激发大语言模型的潜力。
  • 数据检索(Indexes:构建并操作文档的方法,接受用户的查询并返回最相关的文档,轻松搭建本地知识库。
  • 记忆(Memory :通过短时记忆和长时记忆,在对话过程中存储和检索数据,让ChatBot记住你。
  • 链(ChainsLangChain中的核心机制,以特定方式封装各种功能,并通过一系列的组合,自动而灵活地完成任务。
  • 代理(Agents :另一个LangChain中的核心机制,通过"代理"让大模型自主调用外部工具和内部工具,使智能Agent成为可能。

封装了多个功能模块

模型 I/O 封装,包括:

  • LLMs:大语言模型
  • ChatModels:一般基于 LLMs,但按对话结构重新封装
  • Prompt:提示词模板
  • OutputParser:解析输出

Retrieval 数据连接与向量检索封装,包括:

  • Retriever: 向量的检索
  • Document Loader:各种格式文件的加载器
  • Embedding Model:文本向量化表示,用于检索等操作
  • Verctor Store: 向量的存储Text Splitting:对文档的常用操作

Agents 根据用户输入,自动规划执行步骤,自动选择每步需要的工具,最终完成用户指定的功能,包括:

  • Tools:调用外部功能的函数,例如:调 google 搜索、文件 I/O、Linux Shell ...
  • Toolkits:操作某软件的一组工具集,例如:操作 DB 、操作 Gmail ...

开源库组成

  • langchain-core :基础抽象和 LangChain 表达式语言
  • langchain-community:第三方集成。合作伙伴包(如langchain-openai、langchain-anthropic 等),一些集成已经进一步拆分为自己的轻量级包,只依赖于langchain-core
  • langchain:构成应用程序认知架构的链、代理和检索策略
  • langgraph:通过将步骤建模为图中的边和节点,使用 LLMs构建健壮且有状态的多参与者应用程序
  • langserve:将 LangChain 链部署为 RESTAPI
  • LangSmith:一个开发者平台,可让您调试、测试、评估和监控LLM应用程序,并与LangChain无缝集成

3. LangChain 核心用法

安装指定版本的 LangChain

python 复制代码
pip install langchain==0.3.7  -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install langchain-openai==0.2.3  -i https://pypi.tuna.tsinghua.edu.cn/simple

通过LangChain的接口来调用OpenAI对话

python 复制代码
# 从dotenv模块导入load_dotenv函数,用于加载.env文件中的环境变量
from dotenv import load_dotenv

# 加载.env文件中的环境变量到当前环境中
load_dotenv()

# 导入Python标准库的os模块,用于读取系统环境变量
import os

# 从langchain_openai包导入ChatOpenAI类,这是LangChain封装的OpenAI兼容聊天模型接口
from langchain_openai import ChatOpenAI

# ==============================================
# 模型初始化配置部分
# ==============================================

# 注释掉的代码:默认初始化(会使用OPENAI_API_KEY环境变量和官方OpenAI端点)
# llm = ChatOpenAI()

# 初始化通义千问(Qwen)模型客户端
# 参数说明:
#   api_key: 从环境变量DASHSCOPE_API_KEY获取API密钥(阿里云DashScope平台)
#   base_url: 指定API端点地址(DashScope的兼容模式接口)
#   model: 指定使用的模型为"qwen-plus"
qwllm = ChatOpenAI(api_key=os.getenv("DASHSCOPE_API_KEY"),
                 base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
                 model="qwen-plus")
                 
# 初始化DeepSeek模型客户端
# 参数说明:
#   api_key: 从环境变量DEEPSEEK_API_KEY获取API密钥
#   base_url: DeepSeek官方API端点
#   model: 指定使用的模型为"deepseek-chat"
dpllm = ChatOpenAI(api_key=os.getenv("DEEPSEEK_API_KEY"),
                 base_url="https://api.deepseek.com",
                 model="deepseek-chat")

# ==============================================
# 模型调用示例
# ==============================================

# 使用通义千问模型进行对话调用
# invoke()方法:LangChain统一的方法调用接口
response = qwllm.invoke("什么是大模型?")  # 传入用户问题

# 打印完整的响应对象(包含元数据、content等)
print(response)
print("=" * 50)  # 分隔线

# 打印响应中的具体内容(AI的实际回复)
print(response.content)

多轮对话的封装

python 复制代码
from langchain_openai import ChatOpenAI

# 默认是gpt-3.5-turbo
# llm = ChatOpenAI() 
llm = ChatOpenAI(api_key=os.getenv("DASHSCOPE_API_KEY"),
                 base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
                 model="qwen-plus")


from langchain.schema import (
    AIMessage, #等价于OpenAI接口中的assistant role
    HumanMessage, #等价于OpenAI接口中的user role
    SystemMessage #等价于OpenAI接口中的system role
)

messages = [
    SystemMessage(content="你是于老师的个人助理。你叫小沐"), 
    HumanMessage(content="我叫同学小张"), 
    HumanMessage(content="你是谁?") 
]
response = llm.invoke(messages)
print(response.content)

使用提示模板

python 复制代码
# 我们也可以创建prompt template, 并引入一些变量到prompt template中,这样在应用的时候更加灵活
# 导入ChatPromptTemplate类,用于创建聊天格式的提示词模板
from langchain_core.prompts import ChatPromptTemplate

# ==============================================
# 创建提示词模板
# ==============================================

# ChatPromptTemplate.from_messages()方法:通过消息列表创建模板
# 参数说明:
#   - 列表中的每个元组代表一条消息:(角色, 内容)
#   - 角色:通常是"system"、"user"、"assistant"
#   - 内容:可以是固定文本,也可以包含变量占位符 {variable_name}

prompt = ChatPromptTemplate.from_messages([
    # system角色:设置AI的"人设"或任务背景
    # 这条消息会告诉AI:"你是一个世界级的技术文档编写者"
    ("system", "您是世界级的技术文档编写者"),
    
    # user角色:用户输入,使用变量占位符 {input}
    # {input} 是一个变量,在实际调用时会被具体的用户问题替换
    ("user", "{input}")
])

# 打印模板对象,查看其结构和配置
print(prompt)

# ==============================================
# 使用模板(传统方式)
# ==============================================

# 方式1:手动格式化模板
# prompt.format(input="具体问题") 将 {input} 替换为实际值
formatted_prompt = prompt.format(input="大模型中的LangChain是什么")

# 调用语言模型,传入格式化后的提示词
result = llm.invoke(formatted_prompt)

# 打印结果
print(result)

# ==============================================
# 使用链式调用(LangChain推荐方式)
# ==============================================

# 注释掉的代码展示了更优雅的链式调用方式
# chain = prompt | llm  # 创建处理链:prompt模板 -> 语言模型
# 
# 说明:
#   "|" 运算符:类似于Linux管道,将前一个组件的输出作为后一个组件的输入
#   相当于:input → prompt模板格式化 → LLM处理 → 输出
# 
# 调用链:
# result = chain.invoke({"input": "大模型中的LangChain是什么?"})
# 
# 优势:
#   1. 代码更简洁
#   2. 支持异步、流式处理
#   3. 易于扩展和调试

输出解析器的应用

python 复制代码
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser, JsonOutputParser

# 初始化模型
llm = ChatOpenAI()

# 创建提示模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "您是世界级的技术文档编写者。"),
    ("user", "{input}")
])

# 使用输出解析器
output_parser = StrOutputParser()
# output_parser = JsonOutputParser()

# 将其添加到上一个链中
chain =  prompt | llm | output_parser 
# chain = prompt | llm 

# 调用它并提出同样的问题。答案是一个字符串,而不是ChatMessage
chain.invoke({"input": "LangChain是什么?"})
# chain.invoke({"input": "LangChain是什么? 问题用question 回答用answer 用JSON格式回复"})

向量存储

python 复制代码
# 使用一个简单的本地向量存储 FAISS
pip install faiss-cpu
pip install langchain_community==0.3.7
python 复制代码
# 导入WebBaseLoader类,用于从网页加载文档内容
from langchain_community.document_loaders import WebBaseLoader

# 加载环境变量(用于后续的API密钥管理)
from dotenv import load_dotenv
load_dotenv()

# 导入所需库
import bs4  # BeautifulSoup4,用于HTML解析
import os   # 操作系统接口,用于环境变量和文件操作

# ==============================================
# 设置网络代理(针对国内网络环境)
# ==============================================

# 设置HTTP代理,解决网络访问问题
os.environ["http_proxy"] = "http://127.0.0.1:7897"
os.environ["https_proxy"] = "http://127.0.0.1:7897"

# ==============================================
# 加载网页文档
# ==============================================

# 创建WebBaseLoader实例,指定要加载的网页
loader = WebBaseLoader(
    # web_path: 要抓取的网页URL
    web_path="https://www.gov.cn/yaowen/liebiao/202512/content_7050601.htm",
    
    # bs_kwargs: 传递给BeautifulSoup的解析参数
    # parse_only: 只解析特定的HTML元素,提高效率
    # bs4.SoupStrainer(id="UCAP-CONTENT"): 只提取id为"UCAP-CONTENT"的div元素
    # (这是中国政府网文章内容的特定容器)
    bs_kwargs=dict(parse_only=bs4.SoupStrainer(id="UCAP-CONTENT"))
)

# 执行加载操作,将网页内容转换为Document对象
docs = loader.load()
# print(docs)  # 可以打印查看加载的文档结构

# ==============================================
# 初始化嵌入模型(文本向量化)
# ==============================================

# 注释掉的部分:使用OpenAI的嵌入模型
# from langchain_openai import OpenAIEmbeddings
# embeddings = OpenAIEmbeddings()  # 需要OPENAI_API_KEY环境变量

# 使用阿里云DashScope(通义千问)的嵌入模型
from langchain_community.embeddings.dashscope import DashScopeEmbeddings

# 创建DashScope嵌入模型实例
embeddings = DashScopeEmbeddings(
    model="text-embedding-v3",  # 指定嵌入模型版本
    dashscope_api_key=os.getenv("DASHSCOPE_API_KEY")  # 从环境变量获取API密钥
)

# ==============================================
# 文本分割与向量存储
# ==============================================

# 导入向量存储和文本分割器
from langchain_community.vectorstores import FAISS  # Facebook AI Similarity Search
from langchain_text_splitters import RecursiveCharacterTextSplitter  # 递归文本分割器

# 创建文本分割器实例
# chunk_size=500: 每个文本块的最大字符数
# chunk_overlap=50: 相邻文本块之间的重叠字符数(保持上下文连贯性)
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500, 
    chunk_overlap=50
)

# 对加载的文档进行分割
# 将长文档分割成适合模型处理的小块
documents = text_splitter.split_documents(docs)

# 打印分割后的文档块数量
print(len(documents))

# ==============================================
# 创建向量数据库
# ==============================================

# 使用FAISS创建向量存储
# FAISS.from_documents()方法:
#   1. 使用嵌入模型将每个文档块转换为向量
#   2. 将所有向量存储在FAISS索引中
#   3. 建立快速相似度搜索的能力
vector = FAISS.from_documents(
    documents=documents,      # 分割后的文档列表
    embedding=embeddings      # 使用的嵌入模型
)

RAG+Langchain,基于外部知识,增强大模型回复

python 复制代码
# 导入文档组合链创建函数,用于将检索到的文档与用户问题组合
from langchain.chains.combine_documents import create_stuff_documents_chain

# 导入聊天提示词模板类
from langchain_core.prompts import ChatPromptTemplate

# ==============================================
# 创建提示词模板(RAG专用)
# ==============================================

# 创建一个专门用于检索增强生成(RAG)的提示词模板
prompt = ChatPromptTemplate.from_template("""仅根据提供的上下文回答以下问题:

<context>
{context}
</context>

问题: {input}""")

# 模板解析:
# 1. {context}: 占位符,将被替换为检索到的相关文档内容
# 2. {input}: 占位符,将被替换为用户的实际问题
# 3. "仅根据提供的上下文": 重要指令,强制模型只基于提供的文档回答,避免幻觉

# ==============================================
# 初始化语言模型
# ==============================================

from langchain_openai import ChatOpenAI

# 创建语言模型实例(默认使用gpt-3.5-turbo)
llm = ChatOpenAI()

# ==============================================
# 创建文档组合链
# ==============================================

# 创建文档组合链:将文档内容和用户问题组合成完整提示
# 工作流程:接收文档列表 + 用户问题 → 格式化提示词 → 传递给LLM
document_chain = create_stuff_documents_chain(llm, prompt)

# ==============================================
# 创建检索增强生成(RAG)链
# ==============================================

from langchain.chains import create_retrieval_chain

# 从向量数据库中创建检索器(假设vector是已存在的FAISS向量库)
retriever = vector.as_retriever()

# 配置检索参数:限制最多返回3个最相关的文档
retriever.search_kwargs = {"k": 3}

# 创建检索链:结合检索器和文档组合链
# 工作流程:用户问题 → 检索器查找相关文档 → 文档组合链生成答案
retrieval_chain = create_retrieval_chain(retriever, document_chain)

# ==============================================
# 调用RAG链并获取回答
# ==============================================

# 调用检索增强生成链
response = retrieval_chain.invoke({"input": "建设用地使用权是什么?"})

# 打印生成的答案
# response是一个字典,包含:
#   - "answer": AI生成的答案
#   - "context": 使用的参考文档
#   - "question": 原始问题等
print(response["answer"])

代理的使用

LangChain 框架中,Agents是一种利用大型语言模型(Large Language Models,简称LLMs)来执行任务和做出决策的系统。

LangChain 的世界里,Agent 是一个智能代理,它的任务是听取你的需求(用户输入)和分析当前的情境(应用场景),然后从它的工具箱(一系列可用工具)中选择最合适的工具来执行操作

  • 使用工具(Tool):LangChain中的Agents可以使用一系列的工具(Tools)实现,这些工具可以是API调用、数据库查询、文件处理等,Agents通过这些工具来执行特定的功能。
  • 推理引擎(Reasoning Engine):Agents使用语言模型作为推理引擎,以确定在给定情境下应该采取哪些行动,以及这些行动的执行顺序。
  • 可追溯性(Traceability):LangChainAgents操作是可追溯的,这意味着可以记录和审查Agents执行的所有步骤,这对于调试和理解代理的行为非常有用。
  • 自定义(Customizability):开发者可以根据需要自定义Agents的行为,包括创建新的工具、定义新的Agents类型或修改现有的Agents
  • 交互式(Interactivity):Agents可以与用户进行交互,响应用户的查询,并根据用户的输入采取行动。
  • 记忆能力(Memory):LangChainAgents可以被赋予记忆能力,这意味着它们可以记住先前的交互和状态,从而在后续的决策中使用这些信息。
  • 执行器(Agent Executor):LangChain提供了Agent Executor,这是一个用来运行代理并执行其决策的工具,负责协调代理的决策和实际的工具执行。
python 复制代码
# 导入检索器工具创建函数,将检索器包装成Agent可调用的工具
from langchain.tools.retriever import create_retriever_tool

# ==============================================
# 创建检索器工具
# ==============================================

# 将之前的retriever(向量检索器)包装成工具
retriever_tool = create_retriever_tool(
    retriever,  # 之前创建的向量检索器实例
    "CivilCodeRetriever",  # 工具名称(Agent内部识别用)
    "搜索有关中华人民共和国民法典的信息。关于中华人民共和国民法典的任何问题,您必须使用此工具!",  # 工具描述(Agent决策用)
)

# 工具列表(可以包含多个工具)
tools = [retriever_tool]

# ==============================================
# 初始化智能代理(Agent)
# ==============================================

# 导入相关模块
from langchain_openai import ChatOpenAI
from langchain import hub  # LangChain的提示词模板库
from langchain.agents import create_openai_functions_agent  # 创建基于OpenAI函数调用的Agent
from langchain.agents import AgentExecutor  # Agent执行器

# ==============================================
# 获取预定义的Agent提示词模板
# ==============================================

# 从LangChain Hub拉取预定义的Agent提示词模板
# hwchase17/openai-functions-agent 是一个标准的OpenAI函数调用Agent模板
# 访问 https://smith.langchain.com/hub 查看所有可用模板
prompt = hub.pull("hwchase17/openai-functions-agent")

# ==============================================
# 创建Agent
# ==============================================

# 初始化语言模型(使用GPT-4,temperature=0确保确定性回答)
llm = ChatOpenAI(model="gpt-4", temperature=0)

# 创建OpenAI函数调用Agent
# 参数:语言模型、可用工具列表、提示词模板
agent = create_openai_functions_agent(llm, tools, prompt)

# 创建Agent执行器(实际执行Agent决策的组件)
# verbose=True 会打印详细的执行过程
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# ==============================================
# 运行Agent
# ==============================================

# 调用Agent执行器处理用户输入
response = agent_executor.invoke({"input": "建设用地使用权是什么"})

# response包含Agent的完整响应

4. 结语

在本文中,我们系统梳理了 LangChain 框架的核心架构、关键组件与实践应用。作为大语言模型应用开发的重要工具,LangChain通过模块化设计、标准化接口与链式编排,显著降低了构建复杂 AI 应用的门槛。无论是实现检索增强生成(RAG)、构建智能代理系统,还是整合多源模型与外部工具,LangChain 都为开发者提供了一条清晰、可扩展的技术路径。随着大模型技术的持续演进,掌握 LangChain 这样的框架工具,将助力我们在 AI时代更高效地将技术潜力转化为实际价值,推动智能化应用在各行各业的落地与创新。

相关推荐
只与明月听2 小时前
一个有趣的面试题
前端·后端·python
Mintopia2 小时前
🤖 大模型AI对话系统:消息结构展示设计猜想
人工智能·llm·全栈
陌上倾城落蝶雨2 小时前
django基础命令
后端·python·django
虎头金猫2 小时前
openEuler 22.03 LTS 时序数据库实战:InfluxDB 深度性能评测与优化指南
网络·数据库·python·网络协议·tcp/ip·负载均衡·时序数据库
Jay20021112 小时前
【机器学习】28-29 推荐系统 & 推荐系统实现
人工智能·python·机器学习
闲人编程2 小时前
FastAPI框架架构与设计哲学
python·架构·api·fastapi·异步·codecapsule
小兔崽子去哪了2 小时前
Matplotlib 可视化 / pandas 绘图 / Seaborn 绘图
python·pandas
AI大模型产品经理2 小时前
混合专家模型MoE的全面指南(二)路由机制、负载均衡
人工智能·ai·语言模型·大模型·llm·ai大模型
shenzhenNBA2 小时前
如何在python项目中使用日志功能?通用版本
java·开发语言·python·日志·log