news 2026/4/16 14:31:13

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 链,大幅降低了流程编排的复杂度,适合快速验证业务场景。

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/9 23:33:01

用TESTIM快速验证产品原型可用性

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个原型测试框架&#xff0c;能够快速对产品原型进行以下验证&#xff1a;1) 核心流程完整性 2) 关键交互响应 3) 基本功能正确性。使用TESTIM实现快速测试脚本录制&#xff…

作者头像 李华
网站建设 2026/4/16 12:22:51

对比评测:GHELPER如何让GitHub效率提升3倍

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个效率对比工具&#xff1a;1. 记录传统GitHub操作(创建Issue、PR等)的平均耗时&#xff1b;2. 实现GHELPER自动化处理的相同任务&#xff1b;3. 生成可视化对比报表&#x…

作者头像 李华
网站建设 2026/4/15 22:49:46

快速验证:用LSTM构建情感分析原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 快速开发一个基于LSTM的文本情感分析原型系统。输入为电影评论文本&#xff0c;输出为正面/负面情感分类。要求包括文本预处理、词嵌入、LSTM分类模型构建和评估。使用IMDB影评数据…

作者头像 李华
网站建设 2026/4/15 8:35:44

C++ 文件和流

C++ 文件和流 在C++编程中,文件和流是处理数据输入输出(I/O)的重要机制。文件是数据持久化的存储媒介,而流则是一种抽象的概念,它将输入输出设备(如文件、键盘、显示器等)与程序连接起来,使得数据可以在它们之间传输。以下是关于C++文件和流的一个全面指南。 文件概述…

作者头像 李华
网站建设 2026/4/15 19:18:08

【毕业设计】深度学习基于CNN卷积网络的动物是否疲劳识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/16 14:26:55

ALIBABAPROTECT入门指南:从零开始学习数据防护

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 编写一个简单的ALIBABAPROTECT模拟程序&#xff0c;帮助初学者理解其工作原理。程序需包含&#xff1a;1. 基本防护机制&#xff1b;2. 模拟攻击检测&#xff1b;3. 简单用户界面。…

作者头像 李华