ai网站大全建站工具word
2026/3/28 11:23:20 网站建设 项目流程
ai网站大全,建站工具word,郑州的团购网站建设,大连网站建设选网龙1. 项目简介 ChatPDF-Faiss 是一个基于 FAISS 向量数据库的 PDF 文档智能问答系统#xff0c;能够从 PDF 文档中提取信息并回答用户的问题。该系统利用了阿里云 DashScope API 提供的文本嵌入和大语言模型能力#xff0c;实现了对 PDF 文档的高效检索和智能问答。 1.1 核心功…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 工作流程使用 PyPDF2 从 PDF 文件中提取文本和页码信息使用 RecursiveCharacterTextSplitter 将文本分割成小块使用 DashScopeEmbeddings 生成文本嵌入使用 FAISS 创建向量数据库并保存到磁盘用户输入查询问题系统在向量数据库中进行相似度搜索找到相关文本块将相关文本块作为上下文使用 Tongyi LLM 生成回答显示回答和来源页码3. 安装与配置步骤 1克隆项目将项目克隆到本地目录git clone 项目地址步骤 2安装依赖进入项目目录并安装所需依赖cd ChatPDF-Faiss pip install -r requirements.txt步骤 3配置 API 密钥本项目需要使用阿里云 DashScope API因此需要设置环境变量DASHSCOPE_API_KEYWindows 系统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( modeltext-embedding-v1, dashscope_api_keyDASHSCOPE_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, start1): extracted_text page.extract_text() if extracted_text: text extracted_text # 为当前页面的每个字符记录页码 char_page_mapping.extend([page_number] * len(extracted_text)) else: print(fNo text found on page {page_number}.) ​ return text, char_page_mapping5.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_size1000, chunk_overlap200, length_functionlen, ) ​ # 分割文本 chunks text_splitter.split_text(text) print(f文本被分割成 {len(chunks)} 个块。) # 创建嵌入模型 embeddings DashScopeEmbeddings( modeltext-embedding-v1, dashscope_api_keyDASHSCOPE_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, keypage_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_okTrue) # 保存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 knowledgeBase5.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( modeltext-embedding-v1, dashscope_api_keyDASHSCOPE_API_KEY, ) # 加载FAISS向量数据库添加allow_dangerous_deserializationTrue参数以允许反序列化 knowledgeBase FAISS.load_local(load_path, embeddings, allow_dangerous_deserializationTrue) 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 knowledgeBase6. 示例与应用6.1 示例查询以下是一些示例查询及其可能的应用场景示例 1政策查询查询“客户经理每年评聘申报时间是怎样的”应用场景人力资源部门了解员工评聘流程示例 2处罚规定查询查询“客户经理被投诉了投诉一次扣多少分”应用场景员工了解违规处罚规定示例 3考核标准查询查询“客户经理的考核标准有哪些”应用场景新员工了解工作要求6.2 实际应用场景企业文档管理快速检索和问答企业政策、规章制度等文档学术研究从大量学术论文中提取信息并回答问题法律文件分析快速了解法律条文和案例医疗资料查询从医疗文档中提取关键信息教育辅助帮助学生从教材中获取知识7. 常见问题与解决方案7.1 常见问题问题 1运行脚本时提示缺少 DASHSCOPE_API_KEY 环境变量解决方案请按照第 3.3 节的说明设置 DASHSCOPE_API_KEY 环境变量。问题 2PDF 文件提取文本失败解决方案确保 PDF 文件不是扫描件或图片格式这些文件需要 OCR 处理才能提取文本。问题 3向量数据库加载失败解决方案确保./vector_db目录存在且包含正确的索引文件同时确保嵌入模型配置正确。问题 4回答质量不佳解决方案尝试调整文本分割参数增加搜索的相关文档数量或使用更高级的 LLM 模型。7.2 性能优化建议对于大型 PDF 文件可以调整chunk_size和chunk_overlap参数以平衡检索精度和速度考虑使用更高级的文本分割策略如基于段落或章节的分割对于频繁查询的场景可以考虑将向量数据库加载到内存中以提高响应速度如果 API 调用受限可以考虑使用本地嵌入模型8. 总结与展望8.1 项目总结ChatPDF-Faiss 项目成功实现了一个基于向量数据库的 PDF 文档智能问答系统具有以下特点高效的文本提取和处理能力准确的向量相似度搜索智能的问答生成可追溯的来源页码易于使用和扩展8.2 未来展望未来可以考虑以下功能扩展支持多语言 PDF 文档集成 OCR 功能支持扫描件 PDF添加用户界面提高用户体验支持批量处理多个 PDF 文件实现文档自动更新和增量索引添加对话历史功能支持多轮对话集成更多 LLM 模型提供模型选择功能

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询