news 2026/4/18 7:23:20

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【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_community
0.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系统
setx DASHSCOPE_API_KEY "your_api_key_here"
Linux/Mac系统
exportDASHSCOPE_API_KEY="your_api_key_here"

4. 注册API密钥

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

五、使用教程

1. 准备PDF文档

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

2. 运行程序

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

3. 处理流程

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

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

4. 自定义查询

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

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

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

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

# 示例:如何加载已保存的向量数据库# 创建嵌入模型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文本提取与页码记录

defextract_text_with_page_numbers(pdf)->Tuple[str,List[int]]:""" 从PDF中提取文本并记录每行文本对应的页码 参数: pdf: PDF文件对象 返回: text: 提取的文本内容 page_numbers: 每行文本对应的页码列表 """text=""page_numbers=[]forpage_number,pageinenumerate(pdf.pages,start=1):extracted_text=page.extract_text()ifextracted_text:text+=extracted_text page_numbers.extend([page_number]*len(extracted_text.split("\n")))returntext,page_numbers

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

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

defprocess_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# 保存向量数据库(如果提供了保存路径)ifsave_path:# ...(保存逻辑)returnknowledgeBase

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

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

3. 向量数据库的加载

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

该函数用于加载已保存的向量数据库,包括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都能提供高效、准确的智能问答服务,为用户节省大量阅读和查找信息的时间。


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

2026标杆企业游学 | 为什么会选择字节跳动上海总部?

字节跳动上海总部,是其全球化战略的超级引擎,更是Zhong国互联网创新的前沿阵地。这里汇聚抖音、飞书、TikTok等核心产品研发力量,坐拥20万平方米智慧办公空间,日均处理数据量超千万亿级。参访者将直击字节“始终创业”的文化内核&…

作者头像 李华
网站建设 2026/4/8 18:02:10

基于 Flutter × OpenHarmony 构建便签列表视图

文章目录基于 Flutter OpenHarmony 构建便签列表视图前言背景Flutter OpenHarmony 跨端开发介绍开发核心代码代码设计解析1. 空态处理(Empty State)2. 主题适配(ThemeData)3. 网格化列表展示4. 组件拆分心得总结基于 Flutter O…

作者头像 李华
网站建设 2026/4/18 7:03:10

QUdpSocket的readyRead信号触发时机解析

1.QUdpSocket的readyRead信号发送的时机 QUdpSocket 的 readyRead() 信号是在 有新的 UDP 数据报到达套接字的接收缓冲区,并且应用程序 尚未读取这些数据 时发出的。 具体来说,其触发时机如下: ✅ 触发条件 UDP 数据报已到达本地主机 并被…

作者头像 李华
网站建设 2026/4/18 4:44:32

基于STM32单片机智能环境监控温湿度CO2光照PM2.5无线设计26-029

26-029、STM32智能环境监控系统设计-TFT1.44-PM2.5-CO2-BH1750-DHT11-WIFI-风扇本设计由STM32F103C8T6单片机核心板电路TFT1.44寸液晶电路PM2.5传感器电路CO2传感器电路BH1750光照检测电路DHT11温湿度传感器电路2路风扇电路WiFi-ESP8266模块电路电源电路组成。1、TFT1.44寸液晶…

作者头像 李华
网站建设 2026/4/17 18:39:28

达梦数据库部署安装故障一

你执行 disql 登录达梦数据库时出现 [-70028]:创建SOCKET连接失败 报错,核心原因是 达梦数据库实例(dmserver)尚未启动,或实例未正常监听 5236 端口,导致 disql 无法建立 Socket 连接,具体分析和解决方案如…

作者头像 李华