游乐游手机版
首页/AI教程/文章详情

天学会AI应用开发第十二课:从PDF、Word和网页构建RAG

时间:2026-07-11 16:50
上一篇文章介绍了如何从TXT文件中读取文本内容,但在日常办公场景中,纯文本文件的使用频率并不高。更常见的需求是处理PDF、Word等文档格式,同时还需要从网页中提取知识信息。 因此,本篇文章将重点讲解如何从PDF、Word以及网页中提取内容,并将其应用于RAG(检索增强生成)系统。 一、从PDF文件

上一篇文章介绍了如何从TXT文件中读取文本内容,但在日常办公场景中,纯文本文件的使用频率并不高。更常见的需求是处理PDF、Word等文档格式,同时还需要从网页中提取知识信息。

15天学会AI应用开发(十二)从PDF、WORD、网页构建RAG

因此,本篇文章将重点讲解如何从PDF、Word以及网页中提取内容,并将其应用于RAG(检索增强生成)系统。

一、从PDF文件中高效提取文本内容

PDF格式在日常工作中非常普遍,无论是通知文件还是电子书,大多采用这种格式。Python生态中提供了多种处理PDF的库,其中pdfplumber是最常用的之一。在使用前需要先安装:

pip install pdfplumber

安装完成后,调用pdfplumber的open方法打开文件,逐页提取文本并拼接即可。示例代码如下:

import pdfplumber

def read_from_pdf(file_path):
    full_text = ""
    with pdfplumber.open(file_path) as pdf:
        for page in pdf.pages:
            page_text = page.extract_text()
            if page_text:
                full_text += page_text + "n"
    return full_text

逻辑非常简单:打开PDF文件,逐页读取文本,最后将所有内容拼接成一个字符串。

二、从Word文档中读取文本内容

DOCX格式就是常见的Word文档,处理这种文件推荐使用python-docx库。同样,先安装:

pip install python-docx

使用Document打开文件后,不仅可以读取段落文本,还能提取表格中的内容。来看代码示例:

from docx import Document

def read_from_word(file_path):
    doc = Document(file_path)
    content = []
    # 读取段落
    for para in doc.paragraphs:
        t = para.text.strip()
        if t:
            content.append(t)
    # 读取表格内容
    for table in doc.tables:
        for row in table.rows:
            for cell in row.cells:
                t = cell.text.strip()
                if t:
                    content.append(t)
    return "n".join(content)

表格内容的读取常被新手忽略,但在实际项目中表格数据往往非常关键,务必不要遗漏。

三、从网页中爬取并读取文本内容

除了本地文件,互联网上的资料也是一个庞大的知识库。如何高效提取网页内容?推荐使用trafilatura库,它能自动过滤广告、导航栏等干扰元素,只保留核心正文。安装命令:

pip install trafilatura

配合requests库请求网页,再通过trafilatura提取纯净文本。代码如下:

import requests
import trafilatura

def get_webpage_text(url):
    # 请求网页
    headers = {"User-Agent":"Mozilla/5.0"}
    resp = requests.get(url, headers=headers, timeout=10)
    resp.encoding = "utf-8"
    # 自动提取纯净正文(剔除广告导航)
    raw = trafilatura.extract(resp.text)
    return raw if raw else "提取失败"

User-Agent设置非常重要,如果不配置,请求可能会被服务器拦截。同时,建议设置timeout参数,避免请求长时间等待。

四、构建基于网页的在线知识库RAG系统

仅仅学会读取还不够,我们需要将获取的内容实际应用起来。结合之前介绍的BGE-small模型和FAISS向量库,可以构建一个基于网页的在线RAG系统。

在编写代码之前,先安装所需的依赖库:

pip install faiss-cpu sentence

接下来编写完整的检索测试代码。与之前教程相比,最大的变化是将knowledge数组从手动输入改为从网页自动拉取并分块处理:

from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
import requests
import trafilatura

# 加载一整段文本
def get_webpage_text(url):
    headers = {"User-Agent":"Mozilla/5.0"}
    resp = requests.get(url, headers=headers, timeout=10)
    resp.encoding = "utf-8"
    raw = trafilatura.extract(resp.text)
    return raw if raw else "提取失败"

# 读取一整段文本,并把换行符换成句号
url = "https://www.nhsa.gov.cn/art/2025/12/25/art_14_19130.html"
raw_text = get_webpage_text(url)

# 自动把一段文字切成多段
def split_text(text, max_len=50):
    sentences = text.split("。")  # 按句号分割
    chunks = []
    current = ""
    for sen in sentences:
        sen = sen.strip()
        if not sen:
            continue
        sen += "。"  # 加回去句号,让语义完整
        if len(current) <= max_len:
            current += sen
        else:
            if current:
                chunks.append(current.strip())
            current = sen
    if current:
        chunks.append(current.strip())
    return chunks

# 自动分块
knowledge = split_text(raw_text)

# 加载本地已有的模型
embed_model = SentenceTransformer("./bge-small-zh-v1.5", device="cpu")

# 生成向量(把知识库向量化)
vectors = embed_model.encode(knowledge)

# 构建 FAISS 索引
index = faiss.IndexFlatL2(vectors.shape[1])
index.add(np.array(vectors).astype("float32"))

# RAG 检索
def rag(question):
    print("n 问题:" + question)
    q_vec = embed_model.encode([question])
    D, I = index.search(np.array(q_vec).astype("float32"), 1)
    best = knowledge[I[0][0]]
    answer = best.split(":")[-1]
    print(" 答案:" + answer)
    print("-" * 50)

# 运行
if __name__ == "__main__":
    print("=== 本地智能 RAG 系统:问什么答什么 ===")
    while True:
        q = input("n请输入问题(q退出):")
        if q.lower() == "q":
            break
        rag(q)

运行程序后,依次输入“GS1码是什么?”“GS1编码是什么?”“GS1码有什么作用?”,输出结果如下:

=== 本地智能 RAG 系统:问什么答什么 ===

请输入问题(q退出):GS1码是什么?
 问题:GS1码是什么?
 答案:国际 GS1 编码体系。GS1码在药品追溯体系中的应用。在药品追溯中,GS1码通常由数字、字母和符号组成,常见载体为二维码格式。
--------------------------------------------------

请输入问题(q退出):GS1编码是什么?
 问题:GS1编码是什么?
 答案:最后一种就是国际 GS1 编码(Global Standard 1,即全球统一编码标识系统)GS1编码载体为二维码,多见于进口药品。
--------------------------------------------------

请输入问题(q退出):GS1码有什么作用?
 问题:GS1码有什么作用?
 答案:采集GS1码的准备工作。在我国医药市场上,吉利德、安进、辉瑞、渤健、强生等公司的部分或全部药品采用了GS1码作为药品追溯码,大部分医疗器械也都使用GS1码制进行追溯。
--------------------------------------------------

从输出日志来看,回答基本准确。这表明通过BGE-small和FAISS的组合,成功实现了对网页内容的在线检索。整个流程其实并不复杂,核心就是利用trafilatura提取正文、BGE-small进行向量化、FAISS构建索引并检索,三步即可完成。

来源:https://bbs.huaweicloud.com/blogs/481732
上一篇Hy3+WorkBuddy组合国产顶级Agent附完整提示词 下一篇跨境物流AI Agent感知决策全链路自动化技术拆解
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
CAD零基础入门教程:坐标输入、图层管理与基础绘图命令
AI教程 · 2026-09-01

CAD零基础入门教程:坐标输入、图层管理与基础绘图命令

本文面向CAD零基础学习者,系统讲解坐标输入、图层管理与基础绘图命令的核心用法。通过分步实操与常见问题排查,帮助新手建立精确绘图习惯,掌握规范出图的基础能力。

CAD从入门到项目交付:绘图、标注、图块与实战工作流
AI教程 · 2026-09-01

CAD从入门到项目交付:绘图、标注、图块与实战工作流

掌握CAD的核心在于建立“画得准、标得清、复用快、交付稳”的工作流。本文提供从环境设置、高频命令组合、标注规范、图块标准化到项目分阶段交付的完整路径,帮助初学者避免常见返工陷阱,独立完成可检查、可复用、可打印的工程图纸。

Claude Code 登录指南:个人、Teams 与企业账号区分与授权步骤
AI教程 · 2026-09-01

Claude Code 登录指南:个人、Teams 与企业账号区分与授权步骤

本文详细解析 Claude Code 登录前的账号类型区分方法,涵盖个人订阅、Teams 席位与企业 Enterprise 席位的授权路径差异。提供终端登录命令、环境变量排查及常见异常处理步骤,帮助用户快速完成正确授权并避免登录路径混淆。

Claude Code 文件修改前的权限模式配置与命令审批指南
AI教程 · 2026-09-01

Claude Code 文件修改前的权限模式配置与命令审批指南

本文详细介绍Claude Code在修改文件前的权限模式配置方法,包括defaultMode可选值、permissions allow与deny规则设置、多层级配置文件管理以及 status验证技巧,帮助开发者安全高效地使用AI编程助手。

Claude Code接入VS Code后先测扩展和终端命令
AI教程 · 2026-09-01

Claude Code接入VS Code后先测扩展和终端命令

在VS Code中接入Claude Code后,建议优先验证扩展面板与集成终端两条入口。本文提供标准检查顺序、关键命令与常见故障排查路径,帮助你快速确认环境就绪,避免后续开发受阻。