【AI大模型开发】-创建RAG问答实战(LangChain+DeepSeek+Faiss)

1. 项目简介

ChatPDF-Faiss 是一个基于 FAISS 向量数据库的 PDF 文档智能问答系统,能够从 PDF 文档中提取信息并回答用户的问题。该系统利用了阿里云 DashScope API 提供的文本嵌入和大语言模型能力,实现了对 PDF 文档的高效检索和智能问答。

1.1 核心功能

  • 从 PDF 文件中提取文本内容和页码信息
  • 使用递归字符分割器将文本分割成小块
  • 使用 DashScope Embeddings 生成文本嵌入
  • 使用 FAISS 创建和管理向量数据库
  • 支持将向量数据库保存到磁盘并重新加载
  • 使用 Tongyi LLM 生成智能回答
  • 显示回答的来源页码,提高可追溯性

2. 技术架构

本项目采用了以下技术栈:

2.1 主要依赖

  • PyPDF2:用于从 PDF 文件中提取文本
  • langchain_community:提供向量存储和 LLM 接口
  • langchain_text_splitters:用于文本分割
  • FAISS:高效的向量相似度搜索库
  • 阿里云 DashScope API:提供文本嵌入和大语言模型服务

2.2 工作流程

  1. 使用 PyPDF2 从 PDF 文件中提取文本和页码信息
  2. 使用 RecursiveCharacterTextSplitter 将文本分割成小块
  3. 使用 DashScopeEmbeddings 生成文本嵌入
  4. 使用 FAISS 创建向量数据库并保存到磁盘
  5. 用户输入查询问题
  6. 系统在向量数据库中进行相似度搜索,找到相关文本块
  7. 将相关文本块作为上下文,使用 Tongyi LLM 生成回答
  8. 显示回答和来源页码

3. 安装与配置

步骤 1:克隆项目

将项目克隆到本地目录:

git clone <项目地址>

步骤 2:安装依赖

进入项目目录并安装所需依赖:

cd ChatPDF-Faiss pip install -r requirements.txt

步骤 3:配置 API 密钥

本项目需要使用阿里云 DashScope API,因此需要设置环境变量DASHSCOPE_API_KEY

Windows 系统:
setx DASHSCOPE_API_KEY "你的API密钥"
Linux/Mac 系统:
export DASHSCOPE_API_KEY="你的API密钥"

**注意:**设置环境变量后,需要重启终端或 IDE 才能生效。

4. 使用方法

4.1 基本使用

步骤 1:准备 PDF 文件

将需要处理的 PDF 文件放入项目目录,例如浦发上海浦东发展银行西安分行个金客户经理考核办法.pdf

步骤 2:运行脚本

执行chatpdf-faiss.py脚本:

python chatpdf-faiss.py

脚本会自动执行以下操作:

  • 从 PDF 文件中提取文本和页码信息
  • 将文本分割成小块并生成嵌入
  • 创建 FAISS 向量数据库并保存到./vector_db目录
  • 使用示例查询测试系统功能

4.2 自定义查询

要使用自定义查询,您可以修改chatpdf-faiss.py文件中的query变量:

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

4.3 加载已保存的向量数据库

如果您已经创建了向量数据库,可以使用load_knowledge_base函数加载它,而不需要重新处理 PDF 文件:

# 创建嵌入模型 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("你的问题")

5. 代码解析

5.1 核心函数

5.1.1 extract_text_with_page_numbers

从 PDF 文件中提取文本并记录每个字符对应的页码:

def extract_text_with_page_numbers(pdf) -> Tuple[str, List[Tuple[str, int]]]: """ 从PDF中提取文本并记录每个字符对应的页码 参数: pdf: PDF文件对象 返回: text: 提取的文本内容 char_page_mapping: 每个字符对应的页码列表 """ text = "" char_page_mapping = [] ​ for page_number, page in enumerate(pdf.pages, start=1): extracted_text = page.extract_text() if extracted_text: text += extracted_text # 为当前页面的每个字符记录页码 char_page_mapping.extend([page_number] * len(extracted_text)) else: print(f"No text found on page {page_number}.") ​ return text, char_page_mapping
5.1.2 process_text_with_splitter

处理文本并创建向量存储:

def process_text_with_splitter(text: str, char_page_mapping: List[int], save_path: str = None) -> FAISS: """ 处理文本并创建向量存储 参数: text: 提取的文本内容 char_page_mapping: 每个字符对应的页码列表 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) print(f"文本被分割成 {len(chunks)} 个块。") # 创建嵌入模型 embeddings = DashScopeEmbeddings( model="text-embedding-v1", dashscope_api_key=DASHSCOPE_API_KEY, ) # 从文本块创建知识库 knowledgeBase = FAISS.from_texts(chunks, embeddings) print("已从文本块创建知识库。") # 为每个文本块找到对应的页码信息 page_info = {} current_pos = 0 for chunk in chunks: chunk_start = current_pos chunk_end = current_pos + len(chunk) # 找到这个文本块中字符对应的页码 chunk_pages = char_page_mapping[chunk_start:chunk_end] # 取页码的众数(出现最多的页码)作为该块的页码 if chunk_pages: # 统计每个页码出现的次数 page_counts = {} for page in chunk_pages: page_counts[page] = page_counts.get(page, 0) + 1 # 找到出现次数最多的页码 most_common_page = max(page_counts, key=page_counts.get) page_info[chunk] = most_common_page else: page_info[chunk] = 1 # 默认页码 current_pos = chunk_end knowledgeBase.page_info = page_info print(f'页码映射完成,共 {len(page_info)} 个文本块') # 如果提供了保存路径,则保存向量数据库和页码信息 if save_path: # 确保目录存在 os.makedirs(save_path, exist_ok=True) # 保存FAISS向量数据库 knowledgeBase.save_local(save_path) print(f"向量数据库已保存到: {save_path}") # 保存页码信息到同一目录 with open(os.path.join(save_path, "page_info.pkl"), "wb") as f: pickle.dump(page_info, f) print(f"页码信息已保存到: {os.path.join(save_path, 'page_info.pkl')}") return knowledgeBase
5.1.3 load_knowledge_base

从磁盘加载向量数据库和页码信息:

def load_knowledge_base(load_path: str, embeddings = None) -> FAISS: """ 从磁盘加载向量数据库和页码信息 参数: load_path: 向量数据库的保存路径 embeddings: 可选,嵌入模型。如果为None,将创建一个新的DashScopeEmbeddings实例 返回: knowledgeBase: 加载的FAISS向量数据库对象 """ # 如果没有提供嵌入模型,则创建一个新的 if embeddings is None: embeddings = DashScopeEmbeddings( model="text-embedding-v1", dashscope_api_key=DASHSCOPE_API_KEY, ) # 加载FAISS向量数据库,添加allow_dangerous_deserialization=True参数以允许反序列化 knowledgeBase = FAISS.load_local(load_path, embeddings, allow_dangerous_deserialization=True) print(f"向量数据库已从 {load_path} 加载。") # 加载页码信息 page_info_path = os.path.join(load_path, "page_info.pkl") if os.path.exists(page_info_path): with open(page_info_path, "rb") as f: page_info = pickle.load(f) knowledgeBase.page_info = page_info print("页码信息已加载。") else: print("警告: 未找到页码信息文件。") return knowledgeBase

6. 示例与应用

6.1 示例查询

以下是一些示例查询及其可能的应用场景:

示例 1:政策查询

查询:“客户经理每年评聘申报时间是怎样的?”

应用场景:人力资源部门了解员工评聘流程

示例 2:处罚规定查询

查询:“客户经理被投诉了,投诉一次扣多少分”

应用场景:员工了解违规处罚规定

示例 3:考核标准查询

查询:“客户经理的考核标准有哪些?”

应用场景:新员工了解工作要求

6.2 实际应用场景

  • 企业文档管理:快速检索和问答企业政策、规章制度等文档
  • 学术研究:从大量学术论文中提取信息并回答问题
  • 法律文件分析:快速了解法律条文和案例
  • 医疗资料查询:从医疗文档中提取关键信息
  • 教育辅助:帮助学生从教材中获取知识

7. 常见问题与解决方案

7.1 常见问题

问题 1:运行脚本时提示缺少 DASHSCOPE_API_KEY 环境变量

解决方案:请按照第 3.3 节的说明设置 DASHSCOPE_API_KEY 环境变量。

问题 2:PDF 文件提取文本失败

解决方案:确保 PDF 文件不是扫描件或图片格式,这些文件需要 OCR 处理才能提取文本。

问题 3:向量数据库加载失败

解决方案:确保./vector_db目录存在且包含正确的索引文件,同时确保嵌入模型配置正确。

问题 4:回答质量不佳

解决方案:尝试调整文本分割参数,增加搜索的相关文档数量,或使用更高级的 LLM 模型。

7.2 性能优化建议

  • 对于大型 PDF 文件,可以调整chunk_sizechunk_overlap参数以平衡检索精度和速度
  • 考虑使用更高级的文本分割策略,如基于段落或章节的分割
  • 对于频繁查询的场景,可以考虑将向量数据库加载到内存中以提高响应速度
  • 如果 API 调用受限,可以考虑使用本地嵌入模型

8. 总结与展望

8.1 项目总结

ChatPDF-Faiss 项目成功实现了一个基于向量数据库的 PDF 文档智能问答系统,具有以下特点:

  • 高效的文本提取和处理能力
  • 准确的向量相似度搜索
  • 智能的问答生成
  • 可追溯的来源页码
  • 易于使用和扩展

8.2 未来展望

未来可以考虑以下功能扩展:

  • 支持多语言 PDF 文档
  • 集成 OCR 功能,支持扫描件 PDF
  • 添加用户界面,提高用户体验
  • 支持批量处理多个 PDF 文件
  • 实现文档自动更新和增量索引
  • 添加对话历史功能,支持多轮对话
  • 集成更多 LLM 模型,提供模型选择功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1201221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Adobe推出AI生成播客功能,Acrobat迎来更多智能化特性

在过去几周内&#xff0c;Adobe持续推出多项AI相关更新&#xff0c;包括Photoshop、Acrobat和Express与ChatGPT的集成&#xff0c;以及Firefly对GPT-Image 1.5的支持。今天&#xff0c;该公司宣布了几项即将登陆Acrobat和Express的新AI功能&#xff1a;生成演示文稿功能上线通过…

hal!HalGetBusDataByOffset函数分析得到Device (PE40)PCI设备空间前4个字节不是0xFFFF说明PCI设备存在--非常重要

hal!HalGetBusDataByOffset函数分析得到Device (PE40)PCI设备空间前4个字节不是0xFFFF说明PCI设备存在--非常重要第一部分&#xff1a;参考&#xff1a;PCI0设备扩展下的实际建立的子设备扩展共94*841个--重要中间结果--说明这41个设备存在dsdt.dsl:1767: Device (A…

CF650G国宾车车架设计

第2章 总体方案确定 2.1 国内外车架概况 摇篮式车架:其特点是摩托车发动机的安装状态犹如婴儿被放在框架的摇篮中一样,所以称为摇篮式车架.这些空间结构的车架在强度和刚性方面都要好的多,所以大功率摩托车.高速竞赛车广泛地采用这种车架. 摇篮式车架又可细分为 ⑴双排管摇篮式…

2001-2023年全国各省制造业细分行业产值数据

2001-2023年全国各省制造业细分行业产值数据 1、时间&#xff1a;2001-2023年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;农副食品加工业、食品制造业、酒、饮料和精制茶制造业、烟草制造业、纺织业、纺织服装、鞋帽制造业、皮革、毛皮、羽毛&#xff08…

兰亭妙微:以交互设计界面设计VUE开发,重塑智慧商保理赔新体验

兰亭妙微:以交互设计界面设计VUE开发,重塑智慧商保理赔新体验在数字化浪潮席卷医疗与保险行业的今天,“高效、安全、暖心”成为智慧商保产品的核心竞争力。保信健康宝——这款联合保险公司、医院打造的统一线上理赔…

德勤报告:AI并未兑现盈利承诺

赚钱并不是一切...至少在AI领域如此。专业服务公司德勤的研究显示&#xff0c;对大多数企业而言&#xff0c;采用AI工具对盈利并没有任何帮助。但研究人员仍对这项技术给予赞誉。根据德勤发布的"企业AI现状"报告&#xff0c;74%的组织希望其AI项目能够增加收入&#…

【更新至2024年】2008-2024年各省规模以上工业企业RD经费数据

【更新至2024年】2008-2024年各省规模以上工业企业R&D经费数据 1、时间&#xff1a;2008-2024年 2、指标&#xff1a;规模以上工业企业R&D经费(万元) 3、来源&#xff1a;国家统计局、统计年鉴 4、范围&#xff1a;31省 5、缺失情况&#xff1a;2010年缺失&#x…

粉料自动包装机

第2章 设计任务简介 2.1 设计题目 粉料立式包装机整体及传动系统设计 粉料包装机是针对粉状物料而实现自动包装而设计的单辊筒多配置的包装机械。可实现三边封口的包装。 要设计完成的包装膜供给装置采用倾斜方式。被包装的物料通过计量装置的精密计量后落入下料嘴&#xff0c;…

方程式赛车发动机进气系统设计与分析

2 进气系统方案设计 2.1 进气系统设计流程 进气系统设计首先是要了解发动机自身特性。此次使用的Aprilia SXV 550【13】发动机是来自高性能公路摩托车阿普利亚Aprilia SXV 550的一款摩托车发动机。发动机&#xff0c;离合器&#xff0c;变速器为一体式结构&#xff0c;变速器末…

在吴忠,遇见羽毛球:专业教练与智能系统伴你成长

羽毛球场地上&#xff0c;击球声与脚步声交织成独特的韵律。在这里&#xff0c;每位学员的成长轨迹都被细心记录&#xff0c;每一次挥拍的进步都被看见。吴忠码上羽毛球俱乐部正在重新定义羽毛球培训——当专业教练的经验遇见智能系统的精准&#xff0c;学习羽毛球变得前所未有…

钢管旋切机设计—控制部分设计

5 钢管旋切机改进方案 根据现在旋切机加工精度不高&#xff0c;对环境污染严重&#xff0c;生产效率低&#xff0c;浪费资源&#xff0c;不宜与实现自动化&#xff0c;劳动强度大的缺点&#xff0c;做如下改进&#xff1a;采用无屑轧切工艺&#xff0c;生产效率高管材利用好&am…

自动化FortiGate攻击利用FortiCloud单点登录篡改防火墙配置

网络安全公司Arctic Wolf警告称&#xff0c;出现了一个"新的自动化恶意活动集群"&#xff0c;涉及对Fortinet FortiGate设备进行未经授权的防火墙配置更改。该公司表示&#xff0c;这项活动始于2026年1月15日&#xff0c;与2025年12月的一次攻击活动具有相似性。在那…

详细介绍:【Qt】Qt 批量修改同类对象

详细介绍:【Qt】Qt 批量修改同类对象2026-01-22 17:39 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !i…

2026年杭州休博康复护理院标杆推荐:休博康复护理院、休博养老医院、休博重症医院、休博重症护理医院(★★★★★)

在人口老龄化进程加速、康养服务需求持续升级的2025年,优质医养护理机构成为民众健康保障的重要依托。其中,杭州休博护理院凭借在康复、重症、养老、血透四大核心领域的深耕细作,以及标准化的服务体系与差异化的服务…

MiroThinker:开源搜索代理模型助力高效研究

MiroThinker 是一个开源的搜索代理模型&#xff0c;旨在通过工具增强推理和现实世界信息搜索的能力&#xff0c;实现与 OpenAI Deep Research 和 Gemini Deep Research 之间的深度研究体验相匹配。 &#x1f680; MiroThinker 概述 MiroThinker 是 MiroMind 的旗舰研究代理模…

在吴忠,一位国家二级运动员的教练如何用科技与专业重塑羽毛球学习

清晨的阳光透过吴忠码上羽毛球俱乐部的玻璃窗&#xff0c;洒在整洁的球场上。国家二级运动员韩宁波教练正与一位学员进行多球训练&#xff0c;他每一次喂球都精准地落在学员最舒适的回击位置。01 专业教练团队&#xff0c;国家二级运动员领衔教学韩宁波教练作为国家二级运动员&…

MongoDB开源mongot引擎源码,助力RAG和AI工作负载

MongoDB已在服务端公共许可证&#xff08;SSPL&#xff09;下发布了mongot引擎的源码。mongot是驱动MongoDB搜索和向量搜索功能的核心引擎。分析师表示&#xff0c;此举将帮助自管理版本数据库的开发者更好地规划AI用例的RAG系统&#xff0c;因为源码将提供更多的透明度、可调试…

宏智树 AI 双降攻略:破解查重与 AIGC 检测的双重学术关卡

“查重率 8% 却被 AIGC 检测标红 90%”“越改越生硬&#xff0c;反而暴露 AI 痕迹”…… 随着高校查重系统与 AIGC 识别技术同步升级&#xff0c;论文安全早已不是 “重复率低” 就能通关。作为深耕论文写作科普的教育博主&#xff0c;我实测发现宏智树 AI&#xff08;官网&…

2026年市场靠谱的重型货架批发厂家推荐排行榜,自动化立体库货架/穿梭式货架/层板货架,重型货架供应商推荐排行榜

行业背景:重型货架市场迎来技术驱动与场景深化新阶段 随着制造业智能化升级与物流效率需求提升,重型货架行业正从单一存储功能向“空间优化+流程自动化”方向转型。据第三方机构统计,2025年国内重型货架市场规模突破…

复合运动绕线机设计

第2章 复合运动绕线机基本设计方案 2.1 传统绕线机设备的局限性 原有机械式绕线机的绕线过程&#xff1a;电机转动通过齿轮降速将转动传递到绕线轴 &#xff0c;在由绕线轴带著绕线模低速匀速转动&#xff0c;最终完成线圈的绕制。图1.1为机械式绕线机的机械结构示意图。随着线…