惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V2EX - 技术
V2EX - 技术
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
S
Schneier on Security
S
Securelist
P
Privacy & Cybersecurity Law Blog
Scott Helme
Scott Helme
T
Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
L
LINUX DO - 热门话题
Cyberwarzone
Cyberwarzone
Cisco Talos Blog
Cisco Talos Blog
量子位
博客园 - Franky
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Latest news
Latest news
T
Troy Hunt's Blog
N
News | PayPal Newsroom
Google Online Security Blog
Google Online Security Blog
Apple Machine Learning Research
Apple Machine Learning Research
N
Netflix TechBlog - Medium
小众软件
小众软件
P
Palo Alto Networks Blog
Spread Privacy
Spread Privacy
C
Cyber Attacks, Cyber Crime and Cyber Security
C
Check Point Blog
aimingoo的专栏
aimingoo的专栏
WordPress大学
WordPress大学
L
Lohrmann on Cybersecurity
L
LINUX DO - 最新话题
D
Darknet – Hacking Tools, Hacker News & Cyber Security
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The Last Watchdog
The Last Watchdog
S
Security @ Cisco Blogs
P
Privacy International News Feed
Last Week in AI
Last Week in AI
Microsoft Security Blog
Microsoft Security Blog
T
Tailwind CSS Blog
博客园_首页
云风的 BLOG
云风的 BLOG
V
Vulnerabilities – Threatpost
D
DataBreaches.Net
Recent Announcements
Recent Announcements
酷 壳 – CoolShell
酷 壳 – CoolShell
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
罗磊的独立博客
Engineering at Meta
Engineering at Meta
Forbes - Security
Forbes - Security
T
Tenable Blog

博客园 - Yaopengfei

第五节:Claude Code的用法实操汇总 第十五节:LlamaIndex框架使用2() 第十四节:LlamaIndex框架介绍和入门1(基本用法、提示词、节点等) 第三节:Trae的基本使用 和 Skill的详细用法 第二节:Python基础2 第十三节:FastApi入门以及AI智能体案例落地实操 第二节:GitHub Copilot 用法(基于VSCode/VS、添加DeepSeek/千问等任意模型) 第一节:AI工具总览(Copilot、Cursor、Claude Code、OpenCode、Codex、Trae等) 第一节:Python基础1(数据类型、命名规范、输入输出、运算符、类型转换等) 第十节:预检索-索引优化(摘要、父子、假设问题、元数据、混合索引) 第十二节:MinerU处理复制PDF 和 综合性金融案例实战 第十一节:多检索查询、混合检索(多检索+RRF重排)、检索后优化(文档压缩) 第九节:RAG进阶和Advanced RAG简介 博文阅读密码验证 - 博客园 第七节:LangChain框架Chain链和Agent代理详解 第六节:LangChain框架Model和数据检索详解 第四节:补充pip相关指令大全 第三节:RAG基础(概念、工作流程、文档分块、向量和Embedding、RAG案例等等) 博文阅读密码验证 - 博客园 第一节:Python相关环境安装和配置(Python、PyCharm、Anaconda) 第三十六节:EFCore10.0新增功能和中断性变更 第七节:框架版本大升级(CoreMvc10.x + EFCore10.x) 第五十二节:Core10.0中OpenApi自定义文档(Swagger) 博文阅读密码验证 - 博客园 第三节:C#13、C#14新语法(数字字符串比较、Null分配、扩展成员新写法等等) 第二节:如何理解Embedding以及基于内存库简单实操
第五节:LangChain框架简介和快速入门(模型、模板、解释器、向量、RAG、代理)
Yaopengfei · 2026-04-07 · via 博客园 - Yaopengfei

一.  简介

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版本的架构图:

image

3. LangChain的核心组件

 模型(Models):包含各大语言模型的LangChain接口和调用细节,以及输出解析机制。

 嵌入 (Embeddings):为检索增强生成(RAG)提供基础支持

 代理(Agents):另一个LangChain中的核心机制,通过“代理”让大模型自主调用外部工具和内部工具,使智能Agent成为可能。

 工具 (Tools) : 赋予大模型与外部世界交互的能力。工具可以是搜索引擎、计算器、数据库连接,或者是自定义的 API 接口。

 中间件 (Middleware) : 在 LangChain 的 Agent 体系中,Middleware 是一种拦截器机制,允许开发者在 Agent 执行循环的各个关键节点插入自定义逻辑。

 消息(Messages): 标准化对话数据结构,确保不同模型间的兼容性

image

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的核心功能

image

二.  实操1

1. 版本说明

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

image

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)

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。