【AI大模型开发】-基于向量数据库的PDF智能问答系统(实战)

ChatPDF-Faiss:基于向量数据库的PDF智能问答系统

一、项目概述

ChatPDF-Faiss是一个基于向量数据库技术的PDF智能问答系统,它能够将PDF文档内容转换为向量表示并存储在FAISS向量数据库中,用户可以通过自然语言提问获取文档中相关信息的精确回答。

功能特点

  • 📄 PDF文本提取:支持从PDF文档中提取文本内容并记录页码信息
  • 向量数据库:使用FAISS实现高效的向量存储和相似度搜索
  • 🤖 智能问答:结合大语言模型实现基于文档内容的智能回答
  • 📊 来源追溯:提供答案对应的原始文档页码,增强可信度
  • 💾 持久化存储:支持向量数据库的保存和加载,提高复用性

二、技术栈与依赖

核心技术栈

  • Python:主要开发语言
  • PyPDF2:PDF文本提取
  • LangChain:大语言模型应用框架
  • FAISS:高效向量检索库
  • DashScope Embeddings:文本嵌入模型(阿里巴巴通义千问)
  • Tongyi LLM:通义大语言模型

项目依赖

项目所需依赖已在requirements.txt文件中列出:

langchain1.2.0
langchain_community0.4.1

PyPDF2==3.0.1

复制代码
## 三、项目结构

Case-ChatPDF-Faiss/

├── chatpdf-faiss.ipynb # Jupyter Notebook交互式版本

├── chatpdf-faiss.py # Python脚本版本

├── requirements.txt # 项目依赖

├── 浦发上海浦东发展银行西安分行个金客户经理考核办法.pdf # 示例PDF文档

└── vector_db/ # 生成的向量数据库目录(运行后创建)

├── index.faiss # FAISS向量索引文件

├── index.pkl # 向量元数据

└── page_info.pkl # 页码信息映射

复制代码
## 四、环境搭建与配置

### 1. 安装Python环境
确保已安装Python 3.8+版本。

### 2. 安装依赖
```bash
pip install -r requirements.txt

3. 配置API密钥

本项目使用阿里巴巴通义千问的API,需要配置DASHSCOPE_API_KEY环境变量:

Windows系统
cmd 复制代码
setx DASHSCOPE_API_KEY "your_api_key_here"
Linux/Mac系统
bash 复制代码
export DASHSCOPE_API_KEY="your_api_key_here"

4. 注册API密钥

如需使用阿里巴巴通义千问的API,需要在阿里云官网注册并获取API密钥。

五、使用教程

1. 准备PDF文档

将需要处理的PDF文档放入项目目录中,示例使用的是"浦发上海浦东发展银行西安分行个金客户经理考核办法.pdf"。

2. 运行程序

方法一:运行Python脚本
bash 复制代码
python chatpdf-faiss.py
方法二:使用Jupyter Notebook
bash 复制代码
jupyter notebook chatpdf-faiss.ipynb

3. 处理流程

程序运行后,会执行以下步骤:

  1. PDF文本提取:从PDF文档中提取所有文本内容并记录每个段落对应的页码
  2. 文本分割:将长文本分割成大小合适的文本块,便于后续处理
  3. 向量生成:使用文本嵌入模型将文本块转换为向量表示
  4. 向量存储:将向量数据存储到FAISS向量数据库中
  5. 持久化保存:将向量数据库和页码信息保存到本地磁盘
  6. 智能问答:针对预设问题进行智能回答并显示来源页码

4. 自定义查询

在代码的最后部分,可以修改查询问题:

python 复制代码
# 设置查询问题
query = "客户经理每年评聘申报时间是怎样的?"
# query = "客户经理被投诉了,投诉一次扣多少分"

5. 加载已保存的向量数据库

如果需要再次使用已处理的文档,可以直接加载保存的向量数据库:

python 复制代码
# 示例:如何加载已保存的向量数据库
# 创建嵌入模型
embeddings = DashScopeEmbeddings(
    model="text-embedding-v1",
    dashscope_api_key=DASHSCOPE_API_KEY,
)
# 从磁盘加载向量数据库
loaded_knowledgeBase = load_knowledge_base("./vector_db", embeddings)
# 使用加载的知识库进行查询
docs = loaded_knowledgeBase.similarity_search("客户经理每年评聘申报时间是怎样的?")

六、核心代码解析

1. PDF文本提取与页码记录

python 复制代码
def extract_text_with_page_numbers(pdf) -> Tuple[str, List[int]]:
    """
    从PDF中提取文本并记录每行文本对应的页码
    
    参数:
        pdf: PDF文件对象
    
    返回:
        text: 提取的文本内容
        page_numbers: 每行文本对应的页码列表
    """
    text = ""
    page_numbers = []

    for page_number, page in enumerate(pdf.pages, start=1):
        extracted_text = page.extract_text()
        if extracted_text:
            text += extracted_text
            page_numbers.extend([page_number] * len(extracted_text.split("\n")))

    return text, page_numbers

该函数负责从PDF文档中提取文本内容,并为每一行文本记录对应的页码,这对于后续的来源追溯非常重要。

2. 文本处理与向量存储创建

python 复制代码
def process_text_with_splitter(text: str, page_numbers: List[int], save_path: str = None) -> FAISS:
    """
    处理文本并创建向量存储
    
    参数:
        text: 提取的文本内容
        page_numbers: 每行文本对应的页码列表
        save_path: 可选,保存向量数据库的路径
    
    返回:
        knowledgeBase: 基于FAISS的向量存储对象
    """
    # 创建文本分割器
    text_splitter = RecursiveCharacterTextSplitter(
        separators=["\n\n", "\n", ".", " ", ""],
        chunk_size=1000,
        chunk_overlap=200,
        length_function=len,
    )

    # 分割文本
    chunks = text_splitter.split_text(text)
    
    # 创建嵌入模型
    embeddings = DashScopeEmbeddings(
        model="text-embedding-v1",
        dashscope_api_key=DASHSCOPE_API_KEY,
    )
    
    # 从文本块创建知识库
    knowledgeBase = FAISS.from_texts(chunks, embeddings)
    
    # 记录每个文本块对应的页码信息
    # ...(页码匹配逻辑)
    knowledgeBase.page_info = page_info
    
    # 保存向量数据库(如果提供了保存路径)
    if save_path:
        # ...(保存逻辑)
    
    return knowledgeBase

该函数是整个系统的核心,负责:

  • 将长文本分割成大小合适的文本块
  • 使用嵌入模型将文本块转换为向量
  • 创建FAISS向量数据库
  • 建立文本块与原始页码的映射关系
  • 保存向量数据库到本地

3. 向量数据库的加载

python 复制代码
def load_knowledge_base(load_path: str, embeddings = None) -> FAISS:
    """
    从磁盘加载向量数据库和页码信息
    
    参数:
        load_path: 向量数据库的保存路径
        embeddings: 可选,嵌入模型
    
    返回:
        knowledgeBase: 加载的FAISS向量数据库对象
    """
    # ...(加载逻辑)
    return knowledgeBase

该函数用于加载已保存的向量数据库,包括FAISS索引文件和页码信息,方便后续的查询操作。

七、功能扩展建议

1. 多文档支持

可以扩展系统以支持同时处理多个PDF文档,实现跨文档的信息检索。

2. Web界面

开发一个Web界面,提供更友好的用户交互体验,包括PDF上传、问题输入和结果展示。

3. 多模型支持

增加对更多语言模型的支持,如OpenAI GPT、Google Gemini等,提高系统的灵活性。

4. 对话历史管理

添加对话历史功能,支持上下文感知的连续问答,提高用户体验。

5. 批量问答

支持批量导入问题并生成回答报告,适用于需要处理大量问题的场景。

八、常见问题与解决方案

1. 问题:PDF文本提取不完整

解决方案 :尝试使用其他PDF提取库,如pdfminerPyMuPDF,它们对某些特殊格式的PDF支持更好。

2. 问题:向量数据库创建失败

解决方案:检查API密钥是否正确配置,网络连接是否正常,以及是否有足够的磁盘空间。

3. 问题:回答不准确或不相关

解决方案 :调整文本分割参数(如chunk_sizechunk_overlap),或增加相似度搜索返回的文档数量(k值)。

4. 问题:程序运行缓慢

解决方案

  • 减少文本分割的chunk_size
  • 使用更轻量级的嵌入模型
  • 考虑使用GPU加速FAISS索引构建

九、总结

ChatPDF-Faiss项目展示了如何利用向量数据库技术实现智能文档问答系统。通过将PDF文档转换为向量表示并结合大语言模型,用户可以轻松获取文档中相关信息的精确回答。该项目具有良好的可扩展性,可以根据实际需求进行功能扩展和优化。

无论是企业内部文档查询、学术文献分析,还是个人知识管理,ChatPDF-Faiss都能提供高效、准确的智能问答服务,为用户节省大量阅读和查找信息的时间。


相关推荐
PeterClerk2 小时前
数据挖掘方向 CCF 期刊推荐(数据库 / 数据挖掘 / 内容检索)
数据库·人工智能·深度学习·数据挖掘·计算机期刊
乾元2 小时前
当奥本海默遇到图灵:AI 开启的网络安全新纪元
服务器·网络·人工智能·网络协议·安全·web安全
向量引擎2 小时前
2026年AI架构实战:彻底解决OpenAI接口超时与封号,Python调用GPT-5.2/Sora2企业级架构详解(附源码+压测报告)
人工智能·python·架构
木头程序员2 小时前
持续学习(Continual/Lifelong Learning)综述
大数据·人工智能·深度学习·机器学习
程途拾光1582 小时前
模型微调 vs 上下文学习的成本效益对比
人工智能·深度学习·机器学习
丝斯20112 小时前
AI学习笔记整理(51)——大模型之RAG优化技术
人工智能·笔记·学习
中國龍在廣州2 小时前
35天,成了AI 模型的斩杀线
大数据·人工智能·深度学习·算法·机器人
Warren2Lynch10 小时前
利用 AI 协作优化软件更新逻辑:构建清晰的 UML 顺序图指南
人工智能·uml
ModelWhale10 小时前
当“AI+制造”遇上商业航天:和鲸助力头部企业,构建火箭研发 AI 中台
人工智能