首页 > AI教程 >Langchain入门到精通0x07:基于Web网页RAG实战

Langchain入门到精通0x07:基于Web网页RAG实战

来源:互联网 2026-07-29 20:24:22

基于Langchain-RAG实现网页摘要检索工具,通过WebBaseLoader加载网页并分割文档,构建向量存储和检索器。采用两种摘要方法:检索链结合文档链生成问答式摘要,或使用内置摘要链直接总结。需注意通过提示词模板显式控制输出语言,避免默认英文输出。

引言:基于Langchain-RAG的网页摘要工具实践

在之前Langchain-RAG的实战中,我们已梳理完整的RAG流程。今天的目标明确:动手实现一个基于Langchain-RAG的网页摘要检索工具。简单来说,就是让机器帮助“阅读”网页,并提炼核心信息。

需求背景:快速获取网页核心内容

日常工作中,我们常需快速获取某个网页的核心信息。但许多网页内容冗长,逐字阅读并不现实。若有一个工具能自动将网页正文的核心内容总结成摘要,效率提升将十分显著。今天就用Langchain将这个功能落地。

长期稳定更新的攒劲资源: >>>点此立即查看<<<

项目代码详解

WebBaseLoader:网页文档加载器

WebBaseLoader是LangChain社区提供的文档加载器,职责是从指定网页URL抓取内容,并解析、清洗、封装为标准Document对象。具体流程分三步:

  1. 发起请求:内部使用requests库向目标URL发送HTTP GET请求,获取原始HTML源码。
  2. 解析与清洗:借助BeautifulSoup4解析HTML,智能剥离脚本、样式表、导航栏、页脚等无关标签,仅提取核心正文文本。
  3. 标准化输出:将提取的文本和元数据(如来源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)# 实例化向量空间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)# 执行摘要summary = summarize_chain.invoke(docs)

注意事项
  1. 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 Template要求输入英文。
    • 经验启示:“隐式”不如“显式”。在AI工程实践中,所有关键要求(如输出格式、语言、风格、长度)必须通过提示词显式、无歧义地传递。依赖模型“隐式推断”是系统不稳定和结果不可控的主要根源。

方案对比

两种方式总结的摘要质量相差不大。方式1较为谨慎,会在摘要末尾声明“仅基于给定上下文得出”。

扩展思考:从单个网页到批量处理

至此,一个网页内容摘要提取工具已实现。如需提取大量网页内容,可基于此核心功能拓展。当数量级上升后,可限定摘要字数,将网页分类,同类信息汇总至表格,进而进行更深入的数据分析和处理。

源代码

github

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。