RAG(一)简单例子-使用WebBaseLoader基于 LangChain + 阿里百炼 + FAISS 构建网页内容智能问答系统

检索增强生成(Retrieval-augmented Generation,RAG),是当下最热门的大模型前沿技术之一。如果将 "微调(finetune)" 理解成大模型内化吸收知识的过程,那么 RAG 就相当于给大模型装上了 "知识外挂",基础大模型不用再训练即可随时调用特定领域知识。

一、场景背景与技术选型

在政务信息、行业资讯等场景中,我们常常需要从网页文本中快速提取关键信息并回答用户问题。传统的 "复制粘贴 + 人工总结" 效率极低,而基于大模型的 RAG(检索增强生成)技术,能实现「网页内容爬取→文本向量化→智能检索→精准回答」的全流程自动化。

本文将实战搭建一个针对政府网页的智能问答系统,核心技术栈如下:

  • WebBaseLoader:LangChain 内置的网页加载器,爬取指定网页内容并提取核心文本;
  • 阿里百炼嵌入模型:替代本地嵌入模型,通过 API 调用实现高效文本向量化;
  • FAISS:轻量级本地向量库,存储网页文本向量并实现快速检索;
  • 通义千问(qwen-plus):阿里云大模型,基于检索到的网页内容生成精准回答;
  • LangChain:串联 "爬取 - 分割 - 向量化 - 检索 - 生成" 全流程的核心框架。

二、核心流程设计

本次实战的核心逻辑可概括为 5 步:

  1. 网页内容爬取:用 WebBaseLoader 爬取指定政府网页,提取核心正文内容;
  2. 文本分割:将长文本切分为固定长度的片段(Chunk),适配嵌入模型和检索效率;
  3. 文本向量化:调用阿里百炼嵌入 API,将文本片段转为向量;
  4. 向量存储与检索:用 FAISS 构建向量库,根据用户问题检索最相关的文本片段;
  5. 智能回答生成:将检索结果作为上下文,调用通义千问生成精准回答。

三、完整实战步骤与代码解析

3.1 环境准备

首先安装所有依赖包,执行以下命令:

复制代码
# LangChain核心依赖(含社区组件、经典链)
pip install langchain langchain-community langchain-core langchain-classic
# 网页解析依赖
pip install beautifulsoup4 requests
# 向量库依赖
pip install faiss-cpu
# 环境变量管理
pip install python-dotenv
# OpenAI兼容接口(调用通义千问)
pip install openai
# 阿里百炼SDK(可选,LangChain已封装)
pip install dashscope

同时准备关键资源:

  • 阿里云 DashScope API Key:前往「阿里云百炼控制台」申请(免费额度足够测试);
  • 创建.env文件,写入:DASHSCOPE_API_KEY=你的API密钥
复制代码
#导入和使用 WebBaseLoader
from langchain_community.document_loaders import WebBaseLoader
from dotenv import load_dotenv
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS

load_dotenv()
import bs4
import os

loader = WebBaseLoader(
    web_path="https://www.gov.cn/zhengce/202512/content_7052399.htm",
    bs_kwargs=dict(parse_only=bs4.SoupStrainer(id="UCAP-CONTENT"))
)
docs = loader.load()
from pydantic import SecretStr
# 分割文档(chunk_size=500,重叠50个字符)
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
documents = text_splitter.split_documents(docs)
print(f"文档分割后片段数量:{len(documents)}")

# 3. 初始化阿里百炼嵌入模型(核心替换)
# 方式1:从环境变量读取API_KEY(推荐,需在.env中配置 DASHSCOPE_API_KEY=你的密钥)
embeddings = DashScopeEmbeddings(
    model="text-embedding-v1",  # 阿里百炼嵌入模型默认值,也可使用其他嵌入模型
    dashscope_api_key=os.getenv("DASHSCOPE_API_KEY")
)

# 4. 将文档片段转换为向量并存储到FAISS
vector = FAISS.from_documents(documents, embeddings)
print("阿里百炼嵌入 + FAISS向量存储构建完成!")

from langchain_core.prompts import ChatPromptTemplate
from langchain_classic.chains.combine_documents import create_stuff_documents_chain
prompt = ChatPromptTemplate.from_template("""仅根据提供的上下文回答以下问题:

<context>
{context}
</context>

问题: {input}""")

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    model="qwen-plus",
    api_key=SecretStr(os.environ["DASHSCOPE_API_KEY"]),
)


# 创建文档组合链  将文档内容和用户问题组合成一个完整的提示,然后传递给语言模型生成回答
document_chain = create_stuff_documents_chain(llm, prompt)

from langchain_classic.chains import create_retrieval_chain

retriever = vector.as_retriever()
retriever.search_kwargs = {"k": 3}  # 限制为最多检索3个文档
# 创建检索链    该链结合了检索器和文档组合链,实现了从向量数据库中检索相关文档,并将这些文档与用户问题组合成提示
retrieval_chain = create_retrieval_chain(retriever, document_chain)
response = retrieval_chain.invoke({"input": "如何丰富群众精神文化生活?"})
print(response["answer"])

3.3 核心代码解析

1. 网页内容精准爬取
复制代码
loader = WebBaseLoader(
    web_path="目标网页地址",
    bs_kwargs=dict(parse_only=bs4.SoupStrainer(id="UCAP-CONTENT"))
)
  • WebBaseLoader:自动爬取网页 HTML 并解析文本,无需手动写爬虫;
  • bs_kwargs:通过bs4.SoupStrainer指定仅解析id="UCAP-CONTENT"的标签,过滤网页导航栏、广告等无关内容,精准提取政府网页正文。
2. 文本分割关键参数
复制代码
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
  • chunk_size=500:将长文本切分为 500 字符的片段(适配嵌入模型的长度限制);
  • chunk_overlap=50:相邻片段重叠 50 字符,避免语义断裂(比如一句话被切分成两个片段)。
3. 阿里百炼嵌入模型优势
复制代码
embeddings = DashScopeEmbeddings(
    model="text-embedding-v1",
    dashscope_api_key=os.getenv("DASHSCOPE_API_KEY")
)
  • 无需下载本地模型,直接通过 API 调用,降低硬件要求;
  • text-embedding-v1是阿里专为中文优化的嵌入模型,检索准确率高于通用模型;
  • 支持批量向量化,处理长文本效率更高。
4. RAG 链核心组合
复制代码
# 文档组合链:拼接上下文和问题
document_chain = create_stuff_documents_chain(llm, prompt)
# 检索链:串联检索器和文档组合链
retrieval_chain = create_retrieval_chain(retriever, document_chain)
  • create_stuff_documents_chain:将检索到的所有文档片段直接拼接进 Prompt(适合短文本场景);
  • create_retrieval_chain:LangChain 封装的通用 RAG 链,自动完成 "检索→拼接 Prompt→调用大模型" 全流程,无需手动编排。

四、运行结果与常见问题解决

4.1 预期运行结果

复制代码
爬取到的原始文档数量:1
文档分割后片段数量:28
阿里百炼嵌入 + FAISS向量库构建完成!
=== 智能回答 ===
丰富群众精神文化生活可从以下方面着手:
1. 推进公共文化服务体系建设,完善基层文化设施,实现城乡文化资源均衡配置;
2. 开展多样化的群众文化活动,如文艺汇演、非遗展示、全民阅读等;
3. 支持地方特色文化发展,挖掘乡土文化资源,打造群众喜闻乐见的文化产品;
4. 利用数字技术赋能文化服务,推广线上文化场馆、云端文艺演出等新业态。

4.2 常见问题解决

  1. 网页爬取失败

    • 原因:网页有反爬机制、网络超时、标签 id 错误;
    • 解决:添加请求头(headers={"User-Agent": "Mozilla/5.0"})、更换parse_only的解析规则(比如按 class 解析)、增加超时重试。
  2. 嵌入模型调用失败

    • 原因:API Key 无效、网络不通、额度不足;
    • 解决:检查.env文件中 API Key 是否正确,确认阿里云账号已开通百炼服务,测试网络能否访问dashscope.aliyuncs.com
  3. 回答不精准

    • 原因:检索片段数量过少、文本分割粒度不合理;
    • 解决:调整retriever.search_kwargs={"k": 5}增加检索数量,或调整chunk_size为 300/800 优化分割粒度。

五、扩展方向

  1. 多网页批量爬取 :将web_path改为列表(["url1", "url2"]),爬取多个相关网页,构建更全面的知识库;
  2. 文档格式扩展 :替换WebBaseLoaderPyPDFLoader/DocxLoader,支持 PDF、Word 等本地文档的智能问答;
  3. 高级检索优化 :使用create_map_reduce_documents_chain替代create_stuff_documents_chain,处理长文档时先总结每个片段再生成回答;
  4. 本地大模型替换:将通义千问替换为本地部署的 Qwen-7B,摆脱 API 调用限制,实现离线运行;
  5. 可视化界面:结合 Gradio/Streamlit 搭建网页问答界面,支持用户输入网址和问题,一键获取回答。

六、核心总结

  1. 本次实战基于 LangChain 的模块化设计,仅需几十行代码就完成了 "网页爬取→向量化→智能问答" 的全流程,体现了 RAG 技术的轻量化和易用性;
  2. 阿里百炼嵌入模型 + 通义千问的组合,无需本地部署大模型,新手也能快速搭建可用的 RAG 系统;
  3. create_retrieval_chain是 LangChain 封装的通用 RAG 链,大幅降低了流程编排的复杂度,适合快速验证业务场景。

该系统可直接适配政务、金融、教育等领域的网页 / 文档问答场景,只需替换爬取地址和问题,即可快速实现专属的智能问答工具。

相关推荐
JaydenAI4 小时前
[拆解LangChain执行引擎] ManagedValue——一种特殊的只读虚拟通道
python·langchain
OPEN-Source5 小时前
大模型实战:搭建一张“看得懂”的大模型应用可观测看板
人工智能·python·langchain·rag·deepseek
一切尽在,你来6 小时前
1.4 LangChain 1.2.7 核心架构概览
人工智能·langchain·ai编程
一切尽在,你来7 小时前
1.3 环境搭建
人工智能·ai·langchain·ai编程
蛇皮划水怪13 小时前
深入浅出LangChain4J
java·langchain·llm
、BeYourself15 小时前
LangChain4j 流式响应
langchain
、BeYourself15 小时前
LangChain4j之Chat and Language
langchain
qfljg17 小时前
langchain usage
langchain
kjkdd21 小时前
6.1 核心组件(Agent)
python·ai·语言模型·langchain·ai编程
渣渣苏1 天前
Langchain实战快速入门
人工智能·python·langchain