






















一. 简介
1. 介绍
官⽅⽂档:https://reference.langchain.com/python/langchain/ 中文文档: https://langchain.ichuangpai.com/
Langchain是一个用于开发大语言模型的框架,简化了LLM应用程序生命周期的各个阶段:
(1) 开发阶段: 使用LangChain的组件快速构建应用程序。
(2) 生产阶段: 使用LangSmith检查、监控、评估你的链。
(3) 部署阶段: 使用LangServer将任何链转换成API。
2. 发展历史
当前为第四阶段
阶段四:企业级稳定版 (v1.0.0)
发布时间:2025.10
核心变化:首个主要版本 (Major Release),标志着框架进入成熟期。
技术细节:
长期稳定 (LTS):核心 API 锁定,不再进行破坏性更新,满足企业级生产环境的稳定性要求。
LangGraph 1.0:同步发布 LangGraph 1.0 正式版。这确立了“图 (Graph)”结构作为复杂智能体(Agent)编排的标准架构,取代了早期的线性链式架构。
文档体系重构:提供了结构更清晰、以用例为导向的官方文档。
当前1.x版本的架构图:

3. LangChain的核心组件
模型(Models):包含各大语言模型的LangChain接口和调用细节,以及输出解析机制。
嵌入 (Embeddings):为检索增强生成(RAG)提供基础支持
代理(Agents):另一个LangChain中的核心机制,通过“代理”让大模型自主调用外部工具和内部工具,使智能Agent成为可能。
工具 (Tools) : 赋予大模型与外部世界交互的能力。工具可以是搜索引擎、计算器、数据库连接,或者是自定义的 API 接口。
中间件 (Middleware) : 在 LangChain 的 Agent 体系中,Middleware 是一种拦截器机制,允许开发者在 Agent 执行循环的各个关键节点插入自定义逻辑。
消息(Messages): 标准化对话数据结构,确保不同模型间的兼容性

PS:补充一些功能封装术语
LLMs:大语言模型
ChatModels:一般基于 LLMs,但按对话结构重新封装
Prompt:提示词模板
OutputParser:解析输出
Retriever: 向量的检索
Document Loader:各种格式文件的加载器
Embedding Model:文本向量化表示,用于检索等操作
Verctor Store: 向量的存储
Text Splitting:对文档的常用操作
Tools:调用外部功能的函数,例如:调 google 搜索、文件 I/O、Linux Shell 等等
Toolkits:操作某软件的一组工具集,例如:操作 DB、操作 Gmail 等等
4. 开源第三方库
模型(Models):包含各大语言模型的LangChain接口和调用细节,以及输出解析机制。
langchain-core : 是 LangChain 框架的基石,它包含了最基础、最稳定且与具体模型供应商无关的核心抽象与接口
langchain-community :第三方集成。合作伙伴包(如langchain-openai、langchain-anthropic等),一些集成已经进一步拆分为自己的轻量级包,只依赖于langchain-core
langchain :构成应用程序认知架构的链、代理和检索策略
langgraph:通过将步骤建模为图中的边和节点,使用 LLMs 构建健壮且有状态的多参与者应用程序
langserve:将 LangChain 链部署为 REST API
LangSmith:一个开发者平台,可让您调试、测试、评估和监控LLM应用程序,并与LangChain无缝集成
注意: Langchain开发我们一般说的是他的整个生态
5. langchain-core的核心功能

二. 实操1
1. 版本说明
此处均使用当前最新版本 langchain 1.x 版本,很多都是相互依赖的,必备的安装指令如下:

pip install langchain==1.2.15 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install langchain-openai==1.1.14 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install langchain_community==0.4.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install langchain_tavily==0.2.18 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install langchain_huggingface==1.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install langchain_chroma==1.1.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
2. 模型调用
代码分享
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
load_dotenv()
llm = ChatOpenAI(api_key=os.getenv("api_key"), base_url=os.getenv("base_url"), model_name="qwen-turbo")
# 一次性输出
# response = llm.invoke("什么是大模型?")
# print(response.content)
# 流式输出(逐字打印)
end = "" # 表示不换行
stream_iterator = llm.stream("什么是大模型?")
for chunk in stream_iterator:
print(chunk.content, end="", flush=True)
多轮对话
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
# LangChain 1.x 新版消息导入
from langchain_core.messages import AIMessage, HumanMessage, SystemMessage
"""
AIMessage 等价于OpenAI接口中的assistant role AI 模型的回复消息
HumanMessage 等价于OpenAI接口中的user role 表示用户输入的消息
SystemMessage 等价于OpenAI接口中的system role 系统级指令或背景设定
"""
load_dotenv()
llm = ChatOpenAI(api_key=os.getenv("api_key"), base_url=os.getenv("base_url"), model_name=os.getenv("model1"))
messages = [
SystemMessage(content="你是各位老师的个人助理。你叫小戈"),
HumanMessage(content="我的名字叫小张"),
AIMessage(content="不好意思,暂时无法获取天气情况"),
HumanMessage(content="我是谁?"),
# HumanMessage(content="今天天气怎么样"),
]
# response = llm.invoke(messages)
# print(response.content)
# 流式输出
stream = llm.stream(messages)
for chunk in stream:
print(chunk.content, end="", flush=True)
3. 提示模板
代码分享
import os
from dotenv import load_dotenv
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
load_dotenv()
llm = ChatOpenAI(api_key=os.getenv("api_key"), base_url=os.getenv("base_url"), model_name="qwen-plus")
# 需要注意的一点是,这里需要指明具体的role,在这里是system和用户
# {input}为变量
prompt = ChatPromptTemplate.from_messages([("system", "您是世界级的技术文档编写者"), ("user", "{input1}")])
# 我们可以把prompt和具体llm的调用和在一起(通过chain,chain可以理解为sequence of calls to take) Linux ps aux | grep redis
chain = prompt | llm
# 一次性输出
# response = chain.invoke({"input1": "大模型中的LangChain是什么?简单总结,不要超过200字"})
# print(response.content)
# 流式
stream = chain.stream({"input1": "大模型中的LangChain是什么?简单总结,不要超过200字"})
for chunk in stream:
print(chunk.content, end="", flush=True)
4. 输出解释器
代码分享
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser, JsonOutputParser
from dotenv import load_dotenv
import os
load_dotenv()
# 初始化模型
llm = ChatOpenAI(api_key=os.getenv("api_key"), base_url=os.getenv("base_url"), model_name="qwen-plus")
# 创建提示模板
prompt = ChatPromptTemplate.from_messages([("system", "您是世界级的技术文档编写者。"), ("user", "{input}")])
# 使用输出解析器
# output_parser = StrOutputParser()
output_parser = JsonOutputParser()
# 将其添加到上一个链中
chain = prompt | llm | output_parser
# 调用它并提出同样的问题。答案是一个字符串,而不是ChatMessage
# 如果你没有让大模型使用json格式输出,会报错
# res = chain.invoke({"input": "LangChain是什么?不要超过300个字符"})
res = chain.invoke({"input": "LangChain是什么? 问题用question 回答用answer 用JSON格式回复,不要超过300个字符"})
print(res)
5. 前置-向量库FAISS的用法
faiss读法:法伊斯
(1) 构建索引
"""
faiss-cpu = 真正的向量数据库引擎(Facebook 开源)
langchain_community = 只是 FAISS 的包装壳,让你能在 LangChain 里调用 FAISS
必须安装:
pip install faiss-cpu -i https://pypi.tuna.tsinghua.edu.cn/simple
"""
import os
import bs4
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import WebBaseLoader # 加载网页资源
from langchain_community.embeddings import DashScopeEmbeddings # 千问的向量模型加载库
from langchain_community.vectorstores import FAISS
from dotenv import load_dotenv
load_dotenv()
# FAISS:读法:法伊斯
# 1. 获取文档 (先确认该网址是否能打开)
webLoader = WebBaseLoader(
'https://www.gov.cn/zhengce/content/202510/content_7043916.htm',
bs_kwargs=dict(parse_only=bs4.SoupStrainer(id='UCAP-CONTENT')),
)
# 数据格式:返回格式Document对象, metadata 源数据 page_content源文件内容
# print(webLoader.load())
# 2.文档切片
text_spl = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=50)
docs = text_spl.split_documents(webLoader.load())
# print(docs)
# print(len(docs))
# 3. 初始化向量模型
vect = None
batch_size = 10 # 每批处理10条文档
embs = DashScopeEmbeddings(dashscope_api_key=os.getenv("api_key"), model=os.getenv("model2"))
# 4. 分批向量化 + 合并向量库
for i in range(0, len(docs), batch_size):
batch_docs = docs[i : i + batch_size]
print(f'第{i // batch_size + 1}批次 文档数量: {len(batch_docs)}')
if i == 0:
vect = FAISS.from_documents(batch_docs, embs) # 首次创建
else:
new_vect = FAISS.from_documents(batch_docs, embs) # 后续批次合并添加
vect.merge_from(new_vect)
# 5. 保存到本地
vect.save_local('faiss_store')
(2) 进行搜索
import os
from langchain_classic.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_classic.chains import create_retrieval_chain
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import DashScopeEmbeddings
from dotenv import load_dotenv
load_dotenv()
# 1.初始化向量模型
embeddings = DashScopeEmbeddings(dashscope_api_key=os.getenv("api_key"), model=os.getenv("model2"))
# 2.加载本地FAISS向量库(私有知识库)
save_path = "faiss_store"
vector_store = FAISS.load_local(folder_path=save_path, embeddings=embeddings, allow_dangerous_deserialization=True) # 允许加载 pickle 文件(仅限可信文件)
# 3.创建提示模板
prompt = ChatPromptTemplate.from_template(
"""仅根据提供的上下文回答以下问题:
<context>
{context}
</context>
问题: {input}"""
)
# 4. 初始化大模型(通义千问)
llm = ChatOpenAI(api_key=os.getenv("api_key"), base_url=os.getenv("base_url"), model=os.getenv("model1"))
# 5. 文档拼接链:把检索到的文档塞进提示,给LLM生成答案
doc_chain = create_stuff_documents_chain(llm, prompt)
# 6. 向量库 → 检索器(根据问题找相关文档)
retriever = vector_store.as_retriever()
# 7. 完整RAG链:检索 + 生成
rag_chain = create_retrieval_chain(retriever, doc_chain)
# 8. 提问并打印结果
response = rag_chain.invoke({"input": "密云水库水源保护条例什么时候执行"})
# print("检索到的文档:", response["context"]) # 想看检索到的文档,打开这行
print("模型回答:", response["answer"])
6. RAG案例
获取数据的工具类my_utils封装
"""
faiss-cpu = 真正的向量数据库引擎(Facebook 开源)
langchain_community = 只是 FAISS 的包装壳,让你能在 LangChain 里调用 FAISS
必须安装:
pip install faiss-cpu -i https://pypi.tuna.tsinghua.edu.cn/simple
"""
# 导入和使用 WebBaseLoader
import os
# 消除警告,告诉服务器你是谁
os.environ["USER_AGENT"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
import bs4
from dotenv import load_dotenv
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.embeddings import DashScopeEmbeddings # 阿里社区提供的向量模型库
from langchain_community.vectorstores import FAISS # 使用FAISS数据库
load_dotenv()
def faiss_conn():
# 1. 爬取指定网页内容
loader = WebBaseLoader(
web_path="https://www.gov.cn/zhengce/content/202604/content_7064504.htm",
bs_kwargs=dict(parse_only=bs4.SoupStrainer(id="UCAP-CONTENT")), # 过滤这个id下的内容
)
docs = loader.load()
# 2. 切分文档
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
documents = text_splitter.split_documents(docs)[:10] # 取前十条
# 3. 初始化向量模型
embeddings = DashScopeEmbeddings(dashscope_api_key=os.getenv("api_key"), model=os.getenv("model2"))
# 4. 构建并返回FAISS向量库
# 向量存储 embeddings 会将 documents 中的每个文本片段转换为向量,并将这些向量存储在 FAISS 向量数据库中
vector = FAISS.from_documents(documents, embeddings)
return vector
主代码分享
import os
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from my_utils import faiss_conn
from dotenv import load_dotenv
from langchain_classic.chains import create_retrieval_chain
from langchain_classic.chains.combine_documents import create_stuff_documents_chain
load_dotenv()
# {context}变量必须包含
prompt = ChatPromptTemplate.from_template(
"""
仅根据提供的上下文回答以下问题:
<context>
{context}
</context>
问题: {input}
"""
)
# 创建llm连接
llm = ChatOpenAI(api_key=os.getenv("api_key"), base_url=os.getenv("base_url"), model_name=os.getenv("model1"))
# 创建文档组合链 将文档内容和用户问题组合成一个完整的提示,然后传递给语言模型生成回答
document_chain = create_stuff_documents_chain(llm, prompt)
# 生成检索器示例 创建检索器
retriever = faiss_conn().as_retriever()
retriever.search_kwargs = {"k": 3} # 限制为最多检索3个文档
# 创建检索链 该链结合了检索器和文档组合链,实现了从向量数据库中检索相关文档,并将这些文档与用户问题组合成提示
retrieval_chain = create_retrieval_chain(retriever, document_chain)
# 调用检索链并获取回答
response = retrieval_chain.invoke({"input": "信用与企业的关系?"})
print(response["answer"])
7. 代理
在 LangChain 的世界里,Agent 是一个智能代理,它的任务是听取你的需求(用户输入)和分析当前的情境(应用场景),然后从它的工具箱(一系列可用工具)中选择最合适的工具来执行操作。
代码分享
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.tools.retriever import create_retriever_tool
from langchain.agents import create_agent
from my_utils import faiss_conn
load_dotenv()
# 1. 读取并存储数据,然后创建检索器
retriever = faiss_conn().as_retriever()
# 2. 创建检索工具
retriever_tool = create_retriever_tool(
retriever,
name="关于建立企业信用状况综合评价体系的实施方案的一个检索器工具",
description="搜索有关信用的任何问题,您必须使用此工具!",
)
tools = [retriever_tool]
# 3.初始化LLM
llm = ChatOpenAI(api_key=os.getenv("api_key"), base_url=os.getenv("base_url"), model=os.getenv("model1"))
# 4.初始化agent(新版不需要AgentExecutor)
agent = create_agent(model=llm, tools=tools, system_prompt="你是一个客服助手,使用工具回答问题。")
# 5. agent调用
inputs = {"messages": [{"role": "user", "content": "请用中文回答,信用和企业的关系是什么?"}]}
result = agent.invoke(inputs)
print(result['messages'][-1].content)
# print(result)
!
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。