AI编程-搭建本地知识库检索(RAG)
本文介绍了三种实现基于PDF文件的知识问答程序的方法。首先采用Coze平台进行低代码开发,实现PDF知识库的创建和问答功能;其次通过wucai工具进行高代码开发,编写Python脚本完成PDF读取、文本切片、向量化存储和问答功能;最后使用cursor工具由AI自主规划实现方案。三种方法各具特点:Coze开发速度快但功能受限,wucai可控性高但需技术基础,cursor智能化程度高但需要更多验证。文
目标:利用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。
过程中也遇到一些问题,通过多轮对话,最终还是解决了。
四、源码
五、总结
1、技术栈总结
| 功能 | 使用的技术 | 其他技术栈(待完善) |
|---|---|---|
| pdf读取 | PyPDF2 | MinerU |
| 切片 | LangChain的RecursiveTextSpliter | |
| 向量化 | 大模型text-embedding-v1 | |
| 相似度检索 | Faiss | ES |
| 答案生成 | 大模型qwen-turbo、deepseek |
2、三种实现方式总结
| 实现方式 | 优点 | 缺点 |
|---|---|---|
| Coze | 快、工具集成度高、可在豆包发布应用 | 无法打印:检索内容所在的文档名称和页码 |
| wucai+具体步骤 | 可控度较高 | 需熟悉实现流程和相关技术栈 |
| cursor+AI自主规划 | 几乎AI自主规划,人可以在技术上有所欠缺。 | 人需要熟悉业务目标。不可控成分较多,需要花更多的时间检验成果及代码质量。 |
六、待完成
以下为我自己记录的待完成事项,如果大家有啥建议,也欢迎留言指导。
- 调用云端大模型的方式的总结?
- 常见的切片方法有哪些,他们有哪些优缺点?
- 还有什么方法可以增强RAG?
- 如何在微信上做个robot(或者说Agent),放在微信群里,完成以上工作?
更多推荐

所有评论(0)