LangChain 网页 RAG 实战 入门到精通 第7篇
前言
在此前的Langchain-RAG实战中,我们已经系统梳理了RAG的完整技术流程。今天的目标十分明确:动手构建一个基于Langchain-RAG的网页摘要检索工具。简而言之,就是让机器自动“阅读”网页,并从中精准提取核心信息,帮助用户快速掌握关键内容。
需求背景
在日常工作中,我们常常需要快速获取某个网页的核心要点。然而,许多网页内容冗长繁杂,逐页通读并不现实。若能拥有一款自动将网页正文提炼为简洁摘要的工具,工作效率的提升将不言而喻。今天,我们将借助Langchain把这个功能真正落地实现。
项目代码
WebBaseLoader
WebBaseLoader是LangChain社区提供的一款文档加载器,其职责明确:从指定的网页URL抓取内容,再经解析、清洗、封装为标准化的Document对象。
具体流程分为三步:
- 发起请求:内部调用requests库向目标URL发送HTTP GET请求,获取原始HTML源码。
- 解析与清洗:借助BeautifulSoup4解析HTML,智能剔除脚本、样式表、导航栏、页脚等无关标签,仅保留核心正文文本。
- 标准化输出:将提取的文本及元数据(如来源URL、标题)打包成Document对象。每个Document包含
page_content(文本内容)与metadata(元数据)。
网页→文档
web_path:网页地址
bs_kwargs:解析配置
- bs4.SoupStrainer(id="UCAP-CONTENT") 表示仅解析id为“UCAP-CONTENT”的区域
打开目标网页,我们需要提取正文部分,页面头部与底部均不需要。查看网页源码可以发现,detailContent段正是我们所需的内容。
loader = WebBaseLoader(web_path="https://www.gov.cn/yaowen/liebiao/202603/content_7061810.htm",# bs_kwargs=dict(parse_only=bs4.SoupStrainer(id="UCAP-CONTENT"))# 分块:将网页中目标内容进行分割bs_kwargs={"parse_only":bs4.SoupStrainer(id="UCAP-CONTENT")})docs = loader.load()
准备工作
# 文本分块切割splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=100)documents = splitter.split_documents(docs)# 实例化向量存储(Chroma)vector_store = Chroma.from_documents(documents=documents,embedding=llm_embeddings)# 创建检索器retriever = vector_store.as_retriever()# 注意:以下Prompt模板中包含 {context} 和 {input} 两个变量# 需使用{context}表示上下文,该变量会自动从retriever中获取# human中限定了变量{input},链中必须使用该变量system_prompt = """你是问答任务的助理。请根据以下上下文回答问题:上下文:<{context}>如果你不知道答案,不要通过其他渠道获取,直接回答你不知道。"""prompt_template = ChatPromptTemplate.from_messages([("system", system_prompt),("human", "{input}")])
摘要
方法一:内置检索链
- retrieval_chain 与 documents_chain 组合
# ====================== 方式1:retrieval_chain + documents_chain ======================# 创建链:预定义链 create_stuff_documents_chain(文档链)documents_chain = create_stuff_documents_chain(client,prompt_template)# 参数1:检索器;参数2:文档链retrieval_chain = create_retrieval_chain(retriever, documents_chain)# 使用大模型生成答案resp = retrieval_chain.invoke({"input":"会议提到了什么?"})print("=========方式1:retrieval_chain + documents_chain==========")print(resp["answer"])
方法二:内置摘要链
- load_summarize_chain
代码
# 定义明确要求生成中文摘要的提示词模板# 注意:{text} 是占位符,链会自动将文档内容填充至此prompt_template = """请用中文简洁地总结以下文本的主要内容:{text}请确保摘要完全使用中文,并涵盖核心要点。中文摘要:"""prompt = PromptTemplate(template=prompt_template, input_variables=["text"])summarize_chain = load_summarize_chain(llm=client,chain_type="stuff", # 采用stuff策略prompt=prompt)# 4. 执行摘要summary = summarize_chain.invoke(docs)
注意事项
- invoke的入参是loader.load()加载好的Document对象,而非方法一中经过分块处理的Document。这是两种方法之间显著的差异,务必留意。
summary = summarize_chain.invoke(docs)
2. 当直接调用而不指定任何约束时,会发现输出的摘要竟然是英文。
summarize_chain = load_summarize_chain(llm=client,chain_type="stuff" # 采用stuff策略)# 执行摘要summary = summarize_chain.invoke(docs)
那么问题来了:输入的是纯中文文档,但经过LangChain的
load_summarize_chain函数处理后,摘要输出却变成了英文。原因是什么?- 这本质上不是代码或框架的Bug,而是对大模型工作模式以及LangChain默认配置的理解偏差。它触及了当前AI应用开发中一个非常典型且关键的“黑箱”问题:我们究竟该如何精确控制大模型的输出行为?说到底是提示词工程的范畴。
- 原因其实很简单:
load_summarize_chain内部默认实现了一个Prompt模板,该模板默认要求模型输出英文。 - 经验总结:“隐式”不如“显式”。在AI工程实践中,所有关键要求(如输出格式、语言、风格、长度)都必须通过提示词显式、无歧义地传递。依赖模型的“隐式推断”是系统不稳定、结果不可控的主要根源。
方案对比
两种方式生成的摘要质量相差不大。不过方式1较为谨慎,在摘要末尾会附加一句“仅基于给定上下文得出”的声明。
扩展思考
至此,一款网页内容摘要提取工具已成功实现。若需提取大量网页内容,只需基于此核心功能做进一步扩展。例如,当数据量上升后,可以限定摘要字数,对网页进行分类,并将同类信息汇总至一张表格。后续便可基于这些信息展开更深入的数据分析与处理工作。
源代码
github
相关攻略
这款硬朗像素风无衬线字体,带你体验未来感设计与9档字重自由 一、全文速览图 二、字体简介 本期免费商用字体:Sinkin Sans,由英国专业字体工作室K-Type出品。这是一款融合了inktrap凹槽工艺的现代无衬线体,兼具优雅气质与实用性能,视觉上现代而不失温度,清晰易读,辨识度极佳。全家族共提
基于Langchain-RAG实现网页摘要检索工具,通过WebBaseLoader加载网页并分割文档,构建向量存储和检索器。采用两种摘要方法:检索链结合文档链生成问答式摘要,或使用内置摘要链直接总结。需注意通过提示词模板显式控制输出语言,避免默认英文输出。
Roland是一款免费可商用的复古装饰字体,灵感源自中世纪哥特书写传统,融合历史厚重感与现代视觉张力。提供Regular、Contour、Shadow三种字重,适用于复古海报、文创包装、品牌标识等场景,无需署名,无隐藏条款。
QoderWake作为数字程序员需绑定身份与权限,通过监听仓库事件自动生成代码变更并创建PullRequest,随后在沙箱环境执行单元测试与集成验证,测试失败时输出分层诊断。最终生成交付包,经指定角色审批后方可合并部署,确保全流程可控可追溯。
QoderWake脚本执行错误可通过日志定位。调试核心五步:启用详细日志模式并重定向输出;按时间戳与进程ID筛选关键日志段;检查脚本内嵌变量与路径解析结果;复现失败步骤并注入临时调试语句;验证Python解释器与依赖模块兼容性。
热门专题
热门推荐
《Paralives》开发商承诺所有后续更新永久免费,拒绝付费DLC模式。15人小团队依靠首发销售额即可支撑多年运营,无需依赖额外内容包维持开发,展现了与《模拟人生》系列不同的差异化竞争思路。
2025年5月28日,比亚迪王朝网全新力作——宋Ultra DM-i正式推向市场,共推出5款配置车型,官方售价区间为12 99万至15 99万元。此次定价策略极具突破性:一款拥有310公里纯电续航能力的中型插电混动SUV,直接下探至13万元级别市场。作为王朝网络的新旗舰,该车明确瞄准高频出行需求场景
先来关注一个有趣的细节:苹果首款折叠屏手机,传闻将于今年秋季正式亮相。产品命名可能为iPhone Ultra,也有媒体称之为iPhone Fold——无论最终叫什么,这都将标志着苹果在折叠形态领域首次“出手”。 近日,配件厂商iFunSmart已率先上架iPhone Ultra的首批保护壳——这绝非
山寨币ETF迎来批量上市潮,首批项目市场表现如何?一文分析 Binance币安 欧易OKX ️ Huobi火币️ 最近,市场出现了一个不容忽视的新动向:XRP、DOGE、LTC、HBAR等现货ETF已经悄然登陆美国市场。与此同时,A VAX、LINK等资产的同类产品也正在审批流程中。进入11月以来,
近日,公司对SteamDeck1TBOLED版涨价300美元至949美元,上架短短不到24小时便再度售罄。据外界分析,该公司从中国大量补货并分批投放库存,高溢价未影响众多玩家的抢购热情与速度,其人气极其旺盛无比足以支撑快速清空。





