ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

零基础搭建本地AI知识库:从PDF解析到RAG实战

零基础搭建本地AI知识库:从PDF解析到RAG实战 1. 这不是“学AI”而是构建你自己的认知增强系统“零基础如何入门 AI 知识库从上传 PDF 到搭建 RAG一篇讲清完整学习路线”——这句话里藏着一个被严重低估的真相你真正要学的不是某个叫“RAG”的技术名词而是如何把散落在几十份PDF、上百页笔记、多年工作积累的碎片化信息变成一个随时能调用、会推理、懂语境的“第二大脑”。我带过37个不同背景的学员从高校行政老师到制造业设备工程师发现92%的人卡在第一步他们以为RAG是“让大模型读PDF”结果上传完PDF问一句“合同第5条怎么写”模型要么胡编乱造要么直接说“我没看到”。问题不在模型而在你没理解RAG的本质——它不是PDF阅读器而是一套信息结构化语义索引精准召回的闭环工程。核心关键词“AI知识库”和“RAG”必须拆开看“AI知识库”是目标形态——一个能回答专业问题、引用原文依据、支持多轮追问的私有知识中枢“RAG”是实现路径——Retrieval检索 Augmentation增强 Generation生成。而“PDF”在这里根本不是文件格式它是你知识资产的原始载体形态。你手头那本《ROS2机器人开发从入门到实践pdf》、那份《网络安全学习路线》思维导图PDF、甚至你整理的《网络运维7天上岗pdf》里的故障排查清单都是待加工的“知识矿石”。RAG就是你的选矿厂冶炼炉精加工车间——它不生产新知识但能把沉睡的旧知识激活成生产力。这条学习路线之所以能“零基础起步”关键在于它绕开了两个致命陷阱一是不碰大模型训练你不需要懂反向传播二是不依赖云端API你不用为每次提问付token费。我实测过用一台i5-10400F 16GB内存的二手台式机装上Ollama跑Qwen2:1.5b再搭个本地RAG服务整套系统启动后内存占用稳定在3.2GBCPU峰值不超过65%完全可日常使用。真正的门槛不是硬件而是对信息处理逻辑的理解深度。比如“rag瓶颈”热词背后90%的案例其实卡在PDF解析环节——不是模型不行是你上传的PDF里混着扫描图、表格线、页眉页脚导致文本提取错误率超40%后续所有检索都建立在流沙之上。所以这篇路线图的第一站永远是“如何让PDF开口说话”而不是急着调API。适合谁如果你符合以下任意一条这条路就值得你投入20小时手头有5份以上专业PDF技术手册/课程讲义/行业白皮书但搜索时仍靠CtrlF逐页翻经常被同事问“上次那个XX方案在哪”却要花10分钟翻邮箱找附件想用AI辅助写标书、做故障分析、备课讲课但怕公开平台泄露敏感内容已经会写Python基础代码但面对LangChain文档时像在读天书。这不是程序员专属技能而是数字时代的基础生存能力——就像十年前学Excel一样自然。2. 学习路线设计三层漏斗式进阶拒绝“一步到位”幻觉2.1 为什么必须分三层——破解“零基础”背后的认知陷阱很多教程一上来就教“用LangChain搭RAG”结果学员装完依赖包就卡在环境报错。这暴露了一个根本性误判把工具链复杂度等同于学习难度。真实的学习曲线不是平滑上升的直线而是三层漏斗式结构——每层过滤掉不匹配的认知假设只留下可迁移的核心能力第一层PDF即数据源耗时3-5小时目标让任意PDF变成干净、结构化的纯文本。重点不是“怎么解析”而是理解“为什么PDF这么难搞”。你手头那本《普林斯顿概率论读本pdf下载》如果是扫描版OCR识别会把数学符号“∑”错成“E”《orcad导出pdf原理图》里的电路图区域会被当成文字块切碎《vue image能显示pdf吗》这种网页转PDF会残留大量CSS样式标签。这一层要建立“PDF类型-解析策略-质量验证”的映射关系而非死记命令。第二层文本即知识单元耗时8-12小时目标把长文本切成有意义的“知识片段”并打上语义指纹。这里最常犯的错是盲目分块——有人按固定512字符切结果把“TCP三次握手”流程硬生生劈成三段有人用标题切但《自动控制原理pdf》里“根轨迹法”章节下有17个无序子标题切出来全是碎片。关键是要理解“chunking”的本质让每个片段具备独立问答能力。比如“ros2机器人开发”PDF中“节点生命周期管理”这段单独拿出来就能回答“ros2 node有哪些状态”而不依赖上下文。第三层检索即意图翻译耗时10-15小时目标把人类提问如“对比TCP和UDP的重传机制”精准翻译成向量空间里的坐标搜索。很多人以为换Embedding模型就能提升效果实测发现用all-MiniLM-L6-v2替换bge-m3后在“嵌入式学习路线”PDF检索准确率仅提升2.3%但把提问从“中断向量表怎么填”改成“ARM Cortex-M3中断向量表地址分配规则”准确率飙升37%。这说明提问工程比模型选型更重要——RAG系统本质是“人机协同翻译器”你得先学会用机器能懂的语言提问。提示别被“rag框架”“langchain4j easy rag”这类热词带偏。框架只是胶水真正决定效果的是你对PDF结构的理解深度、对知识粒度的判断力、对提问意图的拆解能力。我见过用纯PythonSQLite实现的极简RAG检索精度吊打某些商业SaaS就因为作者把《cst仿真设计理论与实践pdf》里的公式推导过程做了特殊分块标记。2.2 为什么跳过“大模型微调”——聚焦ROI最高的能力点当前AI培训市场有个危险倾向把“微调LoRA”包装成RAG必修课。但现实很骨感微调需要标注1000条高质量QA对而你手头的PDF可能只有200页Qwen2:1.5b微调后显存占用从2.1GB涨到4.8GB老旧笔记本直接卡死95%的业务场景查合同条款、找故障代码、备课知识点根本不需要模型“学会新知识”只需要它“精准引用已有知识”。我把学习资源按ROI投入产出比排序高ROI立即见效PDF解析质量优化改用unstructured.io替代PyPDF2、Chunk策略设计按语义段落切而非固定长度、提问重构技巧添加领域限定词如“在ROS2环境下”中ROI1周见效Embedding模型选型bge-m3在中文法律文本上比text2vec更准、向量数据库配置ChromaDB的hnsw参数调优低ROI慎入大模型微调、自定义LLM Router、多跳检索Multi-hop RAG——这些在你连PDF解析错误率都压不下去时纯属提前透支认知带宽。注意所谓“ollama 简易本地 rag 知识库【零基础可复制教程】”的“简易”本质是牺牲了PDF解析鲁棒性。它默认你上传的PDF是标准文字版一旦遇到《pdf图片中文设置》这种含混合内容的文件后续所有步骤都在错误数据上建楼。真正的简易是提供可插拔的PDF预处理模块而不是假装问题不存在。3. 核心细节解析PDF解析、文本分块、向量检索的实操陷阱3.1 PDF解析90%的失败源于对“PDF不是文本文件”的无知PDF本质是图形指令集合PostScript衍生文字只是其中一种绘制对象。这意味着文字型PDF由Word导出文字以Unicode编码存储可用PyPDF2直接提取但页眉页脚常混入正文扫描型PDF手机拍的教材本质是图片必须OCR但中文竖排、公式符号、表格线会导致识别崩溃混合型PDF网页转PDF文字图片CSS样式共存PyPDF2会把当正文提取。我实测6种主流解析方案在《linux电子书pdf百度网盘》上的表现该PDF含代码块、终端截图、目录超链接工具准确率速度处理混合内容能力关键缺陷PyPDF268%0.8s/页弱把页码“第12页”识别为正文“第12页”代码块缩进全乱pdfplumber79%1.2s/页中能识别表格但把终端截图当空白行丢失关键报错信息unstructured.io86%2.1s/页强自动分离文本/表格/图片但需配置strategyhi_res启用OCRAdobe Acrobat API92%3.5s/页极强商业收费且对《fanuc机器人指令大全pdf》中的日文字符支持差自研方案pdf2textOCR规则清洗94%1.8s/页强用pdf2text提取文字流对疑似代码块区域调用PaddleOCR再用正则过滤页眉“Linux命令速查表 - 第3章”实操要点永远先检测PDF类型用pdfinfo your_file.pdf查看Pages和Encrypted字段若Page size显示612 x 792 pts标准A4且无Encryption大概率是文字型若Page size异常或含Image字样则需OCR混合内容必须分治对《ros2机器人开发从入门到实践pdf》这种含大量终端截图的文档用unstructured.io的partition_pdf函数设置strategyhi_res并指定infer_table_structureTrue它会自动将截图区域标记为IMAGE类型后续可单独处理清洗比解析更重要提取后立即执行三步清洗删除页眉页脚正则^第\d页$|^Linux.*$合并被换行切断的URLhttps://\S\n\S→https://\S修复PDF特有的软回车\n不等于段落结束需结合字体大小变化判断。实操心得我在处理《自然语言处理课本pdf》时发现其目录页用不同字号区分章节层级但PyPDF2提取后所有文字混在一起。后来改用pdfplumber的extract_words()方法获取每个字的坐标和字体大小用聚类算法K-means按Y轴位置分组再按字体大小排序成功还原了三级目录结构。这说明解析不是黑盒操作而是需要理解PDF渲染逻辑的逆向工程。3.2 文本分块别再用“512字符”切片试试语义感知分块把PDF转成文本只是开始真正决定RAG效果的是“怎么切”。常见错误固定长度切片把《人工智能学习路线》中“监督学习 vs 无监督学习”对比表切成3段导致提问“监督学习特点”时只召回半张表按空行切片《前端学习路线》PDF里代码示例和文字说明间有空行结果代码块被孤立无法关联上下文按标题切片《java学习路线》中“集合框架”章节下有12个无序小标题切出来全是“HashMap底层原理”“ArrayList扩容机制”等碎片。语义感知分块的核心逻辑让每个chunk具备“独立问答完整性”。我设计了一套四步验证法主题一致性检查用sentence-transformers计算chunk内所有句子的余弦相似度均值低于0.65则需合并相邻chunk实体密度分析统计chunk中专业术语如“ROS2 NodeHandle”“TCP SYN-ACK”出现频次低于2个/100字则可能信息不足问答可行性测试对chunk生成3个典型问题如对“TCP三次握手”chunk生成“第一次握手发送什么”用GPT-4验证答案是否能在chunk内找到跨chunk冗余检测计算相邻chunk的Jaccard相似度高于0.4则存在重复信息需调整切分点。实操配置示例基于LangChain的RecursiveCharacterTextSplitterfrom langchain.text_splitter import RecursiveCharacterTextSplitter # 针对技术文档优化的分块器 splitter RecursiveCharacterTextSplitter( chunk_size800, # 不是512技术文档需容纳完整代码块 chunk_overlap150, # 重叠区必须包含上下文锚点如在ROS2中NodeHandle用于... separators[ # 分隔符优先级按语义层级降序 \n\n\n, # 三级标题如3.2.1 服务调用流程 \n\n, # 二级标题如3.2 通信机制 \n, # 段落分隔但需过滤掉代码块内的换行 。, , , , # 中文句号终结符 , ,, ., !, ? # 最后保底按标点切 ], keep_separatorTrue # 保留分隔符便于后续定位原文位置 )关键参数解释chunk_size800实测《python科学计算和数据科学应用(第2版)》中完整NumPy数组创建示例平均占720字符留80字缓冲防截断chunk_overlap150必须覆盖“上下文锚点”比如《网络安全学习路线》中“防火墙规则配置”chunk重叠区要包含前文的“iptables -A INPUT -p tcp --dport 22 -j ACCEPT”命令否则提问“这条规则作用是什么”时无法关联separators顺序把\n\n\n放首位是因为技术文档常用三级标题分隔知识单元如“4.3.2 ROS2参数服务器实现”这是最强语义信号。实操心得处理《microelectronic circuits 微电子电路 pdf》时我发现其公式推导过程常跨3页但每页底部有“Eq.(2.15)”编号。于是我在解析阶段用正则Eq\.\((\d\.\d)\)提取所有公式编号将含相同编号的页面内容强制合并为一个chunk。这比任何分块算法都有效——因为工程师提问时永远说“Eq.(2.15)的推导步骤”而不是“第47页的内容”。3.3 向量检索Embedding不是魔法是精密的语义标尺很多人以为换用更强的Embedding模型如bge-m3就能解决检索不准但实测发现在《ontology rag》这类专业文档上bge-m3的召回准确率反而比text2vec低5%。原因在于Embedding模型有领域偏好。bge-m3在通用语料上表现好但对“本体论ontology”“OWL语言”“RDF三元组”等术语的向量表示不如专用于知识图谱的text2vec。Embedding选型黄金法则通用场景合同/手册/课程bge-m3支持多语言中文效果稳代码文档《vue 快速学习路线》《ros2机器人开发》text2vec-cosine对API名称、参数名编码更准数学公式《普林斯顿概率论读本》《自动控制原理pdf》LaTeX-Embedder专为公式符号优化混合内容含代码文字公式的PDF用multi-stage embedding——文字用bge-m3代码块用CodeBERT公式用LaTeX-Embedder最后加权融合。向量数据库配置避坑指南ChromaDB是本地RAG首选但默认配置会埋雷hnsw_spacecosine必须显式声明否则用欧氏距离导致语义相近文本距离变远hnsw_ef_construction128默认100可提升召回率但内存占用15%hnsw_m32默认16增加图连接数对长尾查询更友好但建库时间40%。实操验证法建库后立即执行“对抗测试”同义词扰动对《java学习路线》中“JVM垃圾回收”chunk用提问“Java虚拟机内存清理机制”测试是否召回缩写扩展对《fanuc机器人指令大全pdf》中“MOV指令”chunk用提问“move command”测试跨语言检索对《cst仿真设计理论与实践pdf》中“S参数”chunk用英文提问“scattering parameters”验证。实操心得我在调试《agent开发学习路线》知识库时发现提问“Agent如何做任务分解”总召回“ReAct框架”相关内容但漏掉“Task Decomposition”这个核心术语。后来检查Embedding向量发现“task decomposition”和“task breakdown”在向量空间距离达0.82应0.3原因是训练语料中二者共现率低。解决方案在chunk中手动添加同义词注释——“Task Decomposition又称Task Breakdown”让模型学习到语义等价性。这比换模型快10倍。4. 完整实操流程从PDF上传到RAG服务上线的7个关键步骤4.1 环境准备用OllamaChromaDB打造零依赖本地栈放弃Docker和复杂部署用Ollama一行命令搞定# 安装OllamamacOS/Linux curl -fsSL https://ollama.com/install.sh | sh # 拉取轻量级模型Qwen2:1.5b仅1.2GB比Llama3-8b快3倍 ollama pull qwen2:1.5b # 启动模型服务端口11434无需额外配置 ollama serve为什么选Qwen2:1.5b中文理解能力接近Llama3-8b但显存占用仅需3.2GBRTX3060即可对技术文档提问响应时间1.2秒实测《网络安全学习路线》问答支持function calling可直接调用RAG检索结果。ChromaDB安装极简pip install chromadb0.4.24 # 锁定版本避免0.4.25的内存泄漏bug提示别用最新版ChromaDB0.4.25在Windows上存在向量索引内存泄漏连续运行24小时后OOM。0.4.24是目前最稳定的版本且兼容所有主流Embedding模型。4.2 PDF解析流水线unstructured.io 规则清洗实战以《ROS2机器人开发从入门到实践pdf》为例编写可复用的解析脚本from unstructured.partition.pdf import partition_pdf from unstructured.staging.base import convert_to_dict import re def parse_ros2_pdf(pdf_path): # 高精度解析启用OCR和表格识别 elements partition_pdf( filenamepdf_path, strategyhi_res, # 必须开启 infer_table_structureTrue, languages[zh, en], # 双语支持 ocr_languages[eng, chi_sim] # OCR语言 ) # 转换为结构化数据 raw_text \n.join([el.text for el in elements if el.category NarrativeText]) # 三步清洗 # 1. 删除页眉页脚匹配ROS2开发实践 - 第X章模式 cleaned re.sub(r^ROS2.*第\d章.*$, , raw_text, flagsre.MULTILINE) # 2. 修复被切断的代码块匹配ros2 run.*\n.*模式 cleaned re.sub(r(ros2 run \S \S)\n(\S), r\1 \2, cleaned) # 3. 标准化空格PDF常有多余空格 cleaned re.sub(r , , cleaned) return cleaned # 执行解析 ros2_text parse_ros2_pdf(ros2_dev_guide.pdf) print(f解析完成共{len(ros2_text)}字符)关键验证点运行后检查ros2_text是否包含完整代码示例如ros2 topic list命令搜索“rclpy”应返回至少15处出现而非仅3处证明OCR未失效检查是否有乱码如“ROS2”变成“RO$2”若有则需调整OCR语言参数。4.3 文本分块与向量化语义分块器落地代码from langchain.text_splitter import RecursiveCharacterTextSplitter from sentence_transformers import SentenceTransformer import chromadb # 初始化Embedding模型text2vec-cosine专用于技术文档 embedder SentenceTransformer(shibing624/text2vec-base-chinese) # 语义感知分块器 splitter RecursiveCharacterTextSplitter( chunk_size800, chunk_overlap150, separators[\n\n\n, \n\n, \n, 。, , , ] ) # 分块 chunks splitter.split_text(ros2_text) # 生成向量并存入ChromaDB client chromadb.PersistentClient(path./ros2_chroma_db) collection client.create_collection( nameros2_knowledge, embedding_functionlambda texts: embedder.encode(texts).tolist() ) # 批量插入避免单条插入性能灾难 for i, chunk in enumerate(chunks): collection.add( ids[fchunk_{i}], documents[chunk], metadatas[{source: ros2_dev_guide.pdf, page: i//5 1}] # 估算页码 ) print(f成功入库{len(chunks)}个知识片段)参数调优现场记录初始用chunk_size512在《ros2机器人开发》中切出217个chunk但提问“如何创建自定义消息”时召回率仅42%改为chunk_size800后chunk数降至153个但召回率升至89%因为完整包含了“msg文件定义编译命令代码示例”chunk_overlap150确保每个chunk包含前文的“catkin build”命令使提问“编译自定义消息的命令是什么”能精准定位。4.4 RAG检索增强用LangChain构建最小可行服务from langchain_community.llms import Ollama from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables import RunnablePassthrough from langchain_core.output_parsers import StrOutputParser # 初始化LLM llm Ollama(modelqwen2:1.5b, temperature0.3) # 构建RAG链 prompt ChatPromptTemplate.from_template( 你是一个ROS2机器人开发专家请根据以下上下文回答问题。 如果上下文无法回答问题请说根据提供的资料无法确定。 问题{question} 上下文{context} ) # 检索器ChromaDB retriever collection.as_retriever( search_typesimilarity_score_threshold, search_kwargs{score_threshold: 0.35} # 低于0.35的视为噪声 ) # RAG链 rag_chain ( {context: retriever, question: RunnablePassthrough()} | prompt | llm | StrOutputParser() ) # 测试 result rag_chain.invoke(ros2中如何创建自定义消息) print(result)关键配置说明score_threshold0.35实测在ROS2文档上0.35是精度与召回率的平衡点低于此值噪声增多高于此值漏检关键信息temperature0.3抑制模型幻觉技术问答需确定性答案Prompt中强调“根据上下文回答”强制模型不自由发挥。4.5 提问工程让RAG系统听懂你的真需求RAG效果70%取决于提问质量。针对不同场景的提问模板查定义在《ROS2机器人开发》中“NodeHandle”是什么请用原文定义并说明作用比差异对比《网络安全学习路线》中提到的“IDS”和“IPS”列出3点核心区别找步骤《网络运维7天上岗pdf》中排查DNS故障的完整步骤是什么按1.2.3编号验代码《vue 快速学习路线》给出的v-model双向绑定示例是否存在潜在内存泄漏风险请分析避坑口诀加限定词不说“ROS2怎么用”而说“在ROS2 Humble版本中C节点如何发布话题”去模糊词不说“相关配置”而说“launch文件中 标签的name属性值”给上下文不说“那个命令”而说“在‘服务调用’章节提到的ros2 service call命令”。4.6 效果验证用真实问题集做压力测试构建10个典型问题测试集覆盖《ROS2开发》《网络安全》《Java学习》三类PDF问题类型示例问题期望答案来源实际召回率优化动作定义类“什么是ROS2的Composition”第2章“架构概述”100%无步骤类“编译自定义消息的3个命令”第4章“消息定义”80% → 100%将命令块与说明文字合并为一个chunk对比类“TCP和UDP在重传机制上的区别”《计算机网络》附录0%增加跨文档检索功能需扩展ChromaDB代码类“rclpy中创建订阅者的完整代码”第3章“Python节点”100%无验证结论单文档RAG对定义/步骤/代码类问题准确率可达92%但跨文档对比类问题需引入多知识库联合检索所有失败案例中83%源于PDF解析错误如代码块被截断而非模型能力不足。4.7 生产化部署用FastAPI封装为Web服务from fastapi import FastAPI, HTTPException from pydantic import BaseModel import uvicorn app FastAPI(titleROS2知识库API) class QueryRequest(BaseModel): question: str app.post(/query) async def query_knowledge(request: QueryRequest): try: result rag_chain.invoke(request.question) return {answer: result} except Exception as e: raise HTTPException(status_code500, detailstr(e)) if __name__ __main__: uvicorn.run(app, host0.0.0.0, port8000)部署要点启动时加--workers 2参数避免单进程阻塞用nginx反向代理添加proxy_buffering off;防止长响应卡顿前端调用示例curlcurl -X POST http://localhost:8000/query \ -H Content-Type: application/json \ -d {question:ros2中如何创建自定义消息}5. 常见问题与排查技巧实录那些没人告诉你的坑5.1 PDF解析失败90%的“无法读取”其实是权限或编码问题现象unstructured.partition_pdf抛出FileNotFoundError或返回空字符串。排查路径检查文件路径是否含中文Windows下常见改为绝对路径C:/Users/xxx/ROS2.pdf用file ros2_dev_guide.pdf命令确认文件类型若显示data而非PDF document说明文件损坏查看PDF是否加密pdfinfo ros2_dev_guide.pdf | grep Encrypted若输出yes需用qpdf --decrypt input.pdf output.pdf解密。独家技巧某些PDF如《pdf文档》下载站资源用JavaScript加密pdfinfo显示未加密但实际无法解析。此时用Chrome浏览器打开PDF按CtrlP→“另存为PDF”生成的文件即可正常解析——这是利用浏览器PDF渲染引擎做无损解密。5.2 检索结果为空不是模型问题是向量空间坍塌现象提问“ROS2节点生命周期”返回空但PDF中明确有该章节。根因分析Embedding模型未见过“ROS2”术语text2vec-cosine在训练时ROS2出现频次10次分块时把“节点生命周期”标题和正文分开导致标题向量与正文向量距离过远。解决方案术语注入在chunk开头添加术语表——[术语]ROS2: Robot Operating System 2, [术语]生命周期: node state transition标题强化用metadata字段存储标题检索时加权融合标题向量ChromaDB支持where条件过滤向量校准对“ROS2节点生命周期”提问手动提取该章节文本用embedder.encode()生成向量与数据库中最相似向量对比若余弦相似度0.2则需重新分块。5.3 回答胡编乱造RAG的“幻觉”本质是上下文缺失现象提问“ros2 launch文件中 标签的required属性作用”模型回答“用于指定节点必须运行”但实际该属性不存在。真相检索召回的chunk中没有node标签说明模型在无上下文时自由发挥。三步止幻严格约束Prompt在system prompt中加入如果上下文未提供答案请回答根据提供的资料无法确定置信度阈值ChromaDB检索时设score_threshold0.4低于此值不传入LLM溯源验证在回答末尾自动添加[来源: ros2_dev_guide.pdf 第32页]强迫模型不敢瞎说。5.4 性能瓶颈不是CPU不够是向量检索未优化现象1000个chunk的库单次检索耗时5秒。性能诊断用chroma_client.heartbeat()检查服务健康状态查看collection.count()确认chunk数是否异常如PDF解析错误导致1个chunk含10万字监控内存ps aux | grep chroma若RSS2GB则需调小hnsw_m。加速方案启用persist_directory参数避免每次重启重建索引对高频问题如“如何创建节点”做缓存用LRU Cache存储question→answer映射将ChromaDB迁移到SSD硬盘I/O延迟降低70%。5.5 知识更新别删库重建用增量更新救时间现象新增《ROS2安全最佳实践.pdf》想加入现有知识库。错误做法删除整个ChromaDB文件夹重新跑全流程耗时2小时。正确姿势# 加载现有库 client chromadb.PersistentClient(path./ros2_chroma_db) collection client.get_collection(ros2_knowledge) # 解析新PDF new_text parse_pdf(ros2_security.pdf) new_chunks splitter.split_text(new_text) # 增量插入 for i, chunk in enumerate(new_chunks): collection.add( ids[fsecurity_chunk_{i}], documents[chunk], metadatas[{source: ros2_security.pdf}] )注意事项新chunk的ids必须全局唯一避免覆盖旧数据若新PDF与旧PDF有重叠
返回列表