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

一、场景背景与技术选型
在政务信息、行业资讯等场景中,我们常常需要从网页文本中快速提取关键信息并回答用户问题。传统的 "复制粘贴 + 人工总结" 效率极低,而基于大模型的 RAG(检索增强生成)技术,能实现「网页内容爬取→文本向量化→智能检索→精准回答」的全流程自动化。
本文将实战搭建一个针对政府网页的智能问答系统,核心技术栈如下:
- WebBaseLoader:LangChain 内置的网页加载器,爬取指定网页内容并提取核心文本;
- 阿里百炼嵌入模型:替代本地嵌入模型,通过 API 调用实现高效文本向量化;
- FAISS:轻量级本地向量库,存储网页文本向量并实现快速检索;
- 通义千问(qwen-plus):阿里云大模型,基于检索到的网页内容生成精准回答;
- LangChain:串联 "爬取 - 分割 - 向量化 - 检索 - 生成" 全流程的核心框架。
二、核心流程设计
本次实战的核心逻辑可概括为 5 步:
- 网页内容爬取:用 WebBaseLoader 爬取指定政府网页,提取核心正文内容;
- 文本分割:将长文本切分为固定长度的片段(Chunk),适配嵌入模型和检索效率;
- 文本向量化:调用阿里百炼嵌入 API,将文本片段转为向量;
- 向量存储与检索:用 FAISS 构建向量库,根据用户问题检索最相关的文本片段;
- 智能回答生成:将检索结果作为上下文,调用通义千问生成精准回答。
三、完整实战步骤与代码解析
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 常见问题解决
-
网页爬取失败:
- 原因:网页有反爬机制、网络超时、标签 id 错误;
- 解决:添加请求头(
headers={"User-Agent": "Mozilla/5.0"})、更换parse_only的解析规则(比如按 class 解析)、增加超时重试。
-
嵌入模型调用失败:
- 原因:API Key 无效、网络不通、额度不足;
- 解决:检查
.env文件中 API Key 是否正确,确认阿里云账号已开通百炼服务,测试网络能否访问dashscope.aliyuncs.com。
-
回答不精准:
- 原因:检索片段数量过少、文本分割粒度不合理;
- 解决:调整
retriever.search_kwargs={"k": 5}增加检索数量,或调整chunk_size为 300/800 优化分割粒度。
五、扩展方向
- 多网页批量爬取 :将
web_path改为列表(["url1", "url2"]),爬取多个相关网页,构建更全面的知识库; - 文档格式扩展 :替换
WebBaseLoader为PyPDFLoader/DocxLoader,支持 PDF、Word 等本地文档的智能问答; - 高级检索优化 :使用
create_map_reduce_documents_chain替代create_stuff_documents_chain,处理长文档时先总结每个片段再生成回答; - 本地大模型替换:将通义千问替换为本地部署的 Qwen-7B,摆脱 API 调用限制,实现离线运行;
- 可视化界面:结合 Gradio/Streamlit 搭建网页问答界面,支持用户输入网址和问题,一键获取回答。
六、核心总结
- 本次实战基于 LangChain 的模块化设计,仅需几十行代码就完成了 "网页爬取→向量化→智能问答" 的全流程,体现了 RAG 技术的轻量化和易用性;
- 阿里百炼嵌入模型 + 通义千问的组合,无需本地部署大模型,新手也能快速搭建可用的 RAG 系统;
create_retrieval_chain是 LangChain 封装的通用 RAG 链,大幅降低了流程编排的复杂度,适合快速验证业务场景。
该系统可直接适配政务、金融、教育等领域的网页 / 文档问答场景,只需替换爬取地址和问题,即可快速实现专属的智能问答工具。