目标:利用AI编程工具,编写一个 基于本地的pdf文件的 知识问答 程序。

步骤:数据读取、切片、向量化 -> 问题向量化 -> 相似度检索 -> 利用大模型结合上下文生成答案。

技术栈

工具:coze、cursor、wucai

思路

 (1)低代码:Coze平台,实现的过程考虑具体的业务处理流程及相关问题;

 (2)高代码:wucai工具,我给出具体的实现步骤和技术选型,纯让AI帮写代码;

 (3)高代码:cursor工具,只说我的目标,让AI帮我规划方法,再逐步实现。

一、低代码实现(Coze)

1、创建知识库,上传pdf文件。

2、配置的workflow如下图所示

结果Generation的大模型提示词如下所示:

## 系统提示词:
将用户的问题和知识库检索的结果结合,生成答案。注意,不要无中生有,如果知识库的检索的结果为空,直接回答,知识库中没有检索到相关的信息。

## 用户提示词:
用户的问题: {{userInput}}
知识库检索结果: {{queryList}}

缺陷:没有找到知识库检索内容的同时,把相关文件名称、页码检索出来的功能。

二、wucai实现(AI编程工具)

        我有具体的思路,总共编写两个python脚本,其作用分别如下:

文件1:读取pdf文件、切片、向量化、生成metadata数据、存储到faiss中,将faiss持久化;

文件2:读取faiss文件,根据用户提问进行相似度搜索,然后结合大模型(DeepSeek)回答问题。

2.1 提示词(文件1)

第一轮提示词:

使用PyPDF2读取文件:  ./resources/浦发上海浦东发展银行西安分行个金客户经理考核办法.pdf  ,
然后,使用LangChain的RecursiveTextSpliter进行切片,需要记录每片内容需要与页码的关系,
然后,使用DashScope调用text-embeddings-v1模型对每片内容进行向量化,
然后,将向量存储到Faiss中,同时也需要保存每片与页码的关系,
最后,将Faiss持久化,在当前目录下生成一个 data.faiss文件。
先给出详细的方案,不要编写代码。

第一轮AI回复:

PDF文档向量检索系统详细方案

  1. 技术栈和依赖
   - PyPDF2: 用于PDF文档的读取和解析
   - LangChain: 提供RecursiveTextSplitter文本分割器
   - DashScope: 提供text-embeddings-v1文本向量化服务
   - FAISS: Facebook开源的相似度检索库,用于向量存储和检索
   - Python 3.x: 基础运行环境

  2. 实现流程

  步骤1: PDF文档读取
   - 使用PyPDF2库读取./resources/浦发上海浦东发展银行西安分行个金客户经理考核办法.pdf
   - 逐页读取文档内容,并记录每页的页码信息
   - 构建文本内容和页码的映射关系

  步骤2: 文本切片处理
   - 使用LangChain的RecursiveCharacterTextSplitter进行文本分割
   - 设置合适的chunk_size和chunk_overlap参数确保语义完整性
   - 为每个文本切片保留原始页码信息
   - 创建切片内容与页码的映射字典

  步骤3: 文本向量化
   - 配置DashScope API密钥和text-embeddings-v1模型
   - 批量对文本切片进行向量化处理
   - 将文本切片和对应的向量进行关联

  步骤4: 向量存储
   - 使用FAISS创建索引结构存储向量
   - 保存文本切片、向量、页码三者之间的映射关系
   - 可考虑使用FAISS中的元数据功能存储页码信息

  步骤5: 持久化存储
   - 将FAISS索引保存为data.faiss文件
   - 同时保存页码映射关系到对应文件(如JSON格式)
   - 确保加载时能够恢复完整的文档结构信息

  3. 关键技术考虑

  文本分割策略
   - 使用RecursiveCharacterTextSplitter按字符递归分割
   - 优先在句子边界分割,其次段落,最后字符
   - 设置合适的chunk_size(建议512-1000字符)和chunk_overlap(建议64字符)

  页码关系维护
   - 为每个文本块创建元数据,包含原始页码信息
   - 可使用Docment对象的metadata字段存储页码
   - 确保检索返回结果时能够关联到原始页码

  性能优化
   - 考虑批量处理文本切片以提高向量化效率
   - 合理设置API调用频率,避免超出服务商限制
   - 可预设重试机制处理API调用失败的情况

  4. 文件结构设计
   - data.faiss: FAISS向量索引文件
   - data.pkl: FAISS索引相关的元数据(如文档内容和页码映射)
   - 配置文件: DashScope API密钥和模型参数

  5. 错误处理
   - PDF读取失败的处理
   - API调用失败的重试机制
   - 向量维度不一致的处理
   - 磁盘空间不足的检测

  这个方案能够完整实现从PDF读取到向量存储的全部功能,并保持切片内容和页码的正确对应关系。

第二轮提问:让AI编写代码,如运行中碰到问题,再解决问题。最终AI编写了:pdf_vector_processor.py

2.2 提示词(文件2)

编写新的python文件,实现基于终端的对话工具,用户通过终端输入用户问题,处理后,再通过终端打印回复结果。
加载data.faiss,使用DashScope调用text-embeddings-v1模型对用户问题向量化,
然后,通过faiss的相似度检索工具,找到匹配度最高的5个答案,将这5个答案打印出来,并打印出关联的页码,
结合检索到的答案和用户的问题,使用DashScope调用DeepSeek-v3模型,生成最终的答案。

最终AI编写了:terminal_chatbot.py

三、cursor实现(AI编程工具)

说出我的目标,让AI自主规划实现方案,然后逐步调整,实现功能。提示词如下:

我想实现基于一个pdf文件的知识问答程序,请你提供具体的实现方案,先不要编写任何代码。
文件路径为: ./resources/浦发上海浦东发展银行西安分行个金客户经理考核办法.pdf。

过程中也遇到一些问题,通过多轮对话,最终还是解决了。

四、源码

https://gitee.com/tjzhuorui312/ai_code_exercise/tree/master/1%E3%80%81%E6%9C%AC%E5%9C%B0%E7%9F%A5%E8%AF%86%E5%BA%93%E6%A3%80%E7%B4%A2

五、总结

1、技术栈总结

功能 使用的技术 其他技术栈(待完善)
pdf读取 PyPDF2 MinerU
切片 LangChain的RecursiveTextSpliter
向量化  大模型text-embedding-v1
相似度检索 Faiss ES
答案生成 大模型qwen-turbo、deepseek

2、三种实现方式总结

实现方式 优点 缺点
Coze 快、工具集成度高、可在豆包发布应用 无法打印:检索内容所在的文档名称和页码
wucai+具体步骤 可控度较高 需熟悉实现流程和相关技术栈
cursor+AI自主规划 几乎AI自主规划,人可以在技术上有所欠缺。 人需要熟悉业务目标。不可控成分较多,需要花更多的时间检验成果及代码质量。

六、待完成

以下为我自己记录的待完成事项,如果大家有啥建议,也欢迎留言指导。

  1. 调用云端大模型的方式的总结?
  2. 常见的切片方法有哪些,他们有哪些优缺点?
  3. 还有什么方法可以增强RAG?
  4. 如何在微信上做个robot(或者说Agent),放在微信群里,完成以上工作?
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐