场景背景与技术选型
在政务信息、行业资讯等场景中,我们常常需要从网页文本中快速提取关键信息并回答用户问题。传统的'复制粘贴 + 人工总结'效率极低,而基于大模型的 RAG(检索增强生成)技术,能实现「网页内容爬取→文本向量化→智能检索→精准回答」的全流程自动化。
本文将实战搭建一个针对政府网页的智能问答系统,核心技术栈如下:
- WebBaseLoader:LangChain 内置的网页加载器,爬取指定网页内容并提取核心文本;
- 阿里百炼嵌入模型:替代本地嵌入模型,通过 API 调用实现高效文本向量化;
- FAISS:轻量级本地向量库,存储网页文本向量并实现快速检索;
- 通义千问(qwen-plus):阿里云大模型,基于检索到的网页内容生成精准回答;
- LangChain:串联'爬取 - 分割 - 向量化 - 检索 - 生成'全流程的核心框架。

核心流程设计
本次实战的核心逻辑可概括为 5 步:
- 网页内容爬取:用 WebBaseLoader 爬取指定政府网页,提取核心正文内容;
- 文本分割:将长文本切分为固定长度的片段(Chunk),适配嵌入模型和检索效率;
- 文本向量化:调用阿里百炼嵌入 API,将文本片段转为向量;
- 向量存储与检索:用 FAISS 构建向量库,根据用户问题检索最相关的文本片段;
- 智能回答生成:将检索结果作为上下文,调用通义千问生成精准回答。
完整实战步骤与代码解析
环境准备
首先安装所有依赖包,执行以下命令:
# 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
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 DashScopeEmbeddings
langchain_text_splitters RecursiveCharacterTextSplitter
langchain_community.vectorstores FAISS
pydantic SecretStr
bs4
os
load_dotenv()
loader = WebBaseLoader(
web_path=,
bs_kwargs=(parse_only=bs4.SoupStrainer(=))
)
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=, chunk_overlap=)
documents = text_splitter.split_documents(docs)
()
embeddings = DashScopeEmbeddings(
model=,
dashscope_api_key=os.getenv()
)
vector = FAISS.from_documents(documents, embeddings)
()
langchain_core.prompts ChatPromptTemplate
langchain_classic.chains.combine_documents create_stuff_documents_chain
langchain_openai ChatOpenAI
langchain_classic.chains create_retrieval_chain
prompt = ChatPromptTemplate.from_template()
llm = ChatOpenAI(
base_url=,
model=,
api_key=SecretStr(os.environ[]),
)
document_chain = create_stuff_documents_chain(llm, prompt)
retriever = vector.as_retriever()
retriever.search_kwargs = {: }
retrieval_chain = create_retrieval_chain(retriever, document_chain)
response = retrieval_chain.invoke({: })
(response[])


