52.llama_index-文档存储 📅 发布时间:2026/7/12 6:59:38 👁️ 浏览次数: 内容参考于图灵AI大模型全栈LLamaIndex中使用StorageContext来管理存储LLamaIndex会存储原始数据Docstore、索引元数据IndexStore、向量数据VectorStore、知识图谱GraphStore原始数据存储的是分割完的原始文档索引元数据存储的是相当于一个目录通过目录去找文档和向量的映射关系上方的原始数据Docstore、索引元数据IndexStore、向量数据VectorStore是可以插拔的可以更换存储方式StorageContext是用来管理上方4个的存储首先查看官网说明下图是文档的存储方式地址https://developers.llamaindex.ai/python/framework-api-reference/storage/docstore/如下图红框可以看到它可以存到Simple会本地存储、Readis内存数据库、Mongodb数据库中这里使用SimpleDocumentStore也就是下图红框来管理存储它会创建下图的5个文件default__vector_store文件存放向量数据docstore文件存放文档内容里面存的就是之前的节点格式的jsongraph_store文件存放图数据image__vector_store文件存放图片信息index_store文件存放索引如下图1和31是源文档3是下一个文本节点代码# 导入目录文件加载器用于读取本地文件并封装为 Document 对象 from llama_index.core import SimpleDirectoryReader # 导入句子分割器用于按语义边界将长文档切分为文本节点TextNode from llama_index.core.node_parser import SentenceSplitter # 导入简单文档存储类内存型文档存储实现支持节点的增删查改与本地持久化 # 作用统一管理文本节点/文档的内容与元数据是索引体系中文本数据的持久化载体 from llama_index.core.storage.docstore import SimpleDocumentStore # 导入存储上下文容器是 LlamaIndex 存储体系的统一调度入口 # 作用聚合管理 docstore文档存储、vector_store向量存储、index_store索引存储等所有存储组件 # 提供统一的持久化、加载、初始化能力避免单独管理各类存储 from llama_index.core import StorageContext # 第一步加载本地文档 # 通过 SimpleDirectoryReader 加载指定的单个文本文件返回 Document 对象列表 # input_files直接指定目标文件路径列表无需扫描整个目录适合精准加载少量文件 documents SimpleDirectoryReader(input_files[./data_file/小说.txt]).load_data() # 第二步文档切分为文本节点 # 实例化默认配置的句子分割器默认 chunk_size1024、chunk_overlap200 # 调用 get_nodes_from_documents 将完整文档按语义边界切分为多个 TextNode 节点 nodes SentenceSplitter().get_nodes_from_documents(documents) # 打印切分后的节点列表可查看节点数量与概览信息 print(nodes) # 第三步创建文档存储并写入节点 # 实例化简单文档存储默认是内存级存储数据仅保存在运行内存中 # SimpleDocumentStore 特点轻量、无外部依赖基于字典存储节点支持序列化到本地 JSON 文件 doc_store SimpleDocumentStore() # 向文档存储中批量添加节点 # 方法名 add_documents 兼容 Document 和 BaseNode 两类对象节点会以 node_id 为键存入内部字典 doc_store.add_documents(nodes) # 第四步构建存储上下文容器 # 通过 from_defaults 工厂方法创建存储上下文 # 作用将我们自定义的 doc_store 注册到存储上下文中统一管理 # 未显式指定的存储组件如 vector_store、index_store会自动使用默认的内存实现 storage_context StorageContext.from_defaults(docstoredoc_store) # 第五步持久化存储到本地磁盘 # 调用 persist 方法将存储上下文中的所有存储组件序列化到本地目录 # 入参目标目录路径若目录不存在会自动创建 # 本示例会在 ./documents 目录下生成 docstore.json 文件保存所有节点的完整数据 storage_context.persist(./documents) # 第六步从本地磁盘加载已持久化的存储 # 通过 from_defaults 指定 persist_dir读取本地持久化文件重建存储上下文 # 底层会自动解析目录下的各类存储文件还原 docstore、vector_store 等所有存储组件 new_storage_context StorageContext.from_defaults(persist_dir./documents) # 打印文档存储中的所有文档字典 # docstore.docs 是存储的核心数据结构类型为 Dict[str, BaseNode] # 键为节点 IDnode_id值为对应的节点完整对象可直接读取节点文本、元数据等信息 print(new_storage_context.docstore.docs)使用Mongodb存储注意要连接外网Mongodb官网下载地址https://www.mongodb.com/try/download/community首先下载Mongodb数据库官网下载地址是一个msi的安装包下载完双击运行即可这里使用Docker下载如下图配置然后点击Run就可以了如果想设置账户密码去问ai把下图给ai到这就安装好了Mongodb数据库了接下来开始使用首先安装下方的两个库pip install llama-index-storage-docstore-mongodb pip install pymongo代码运行完就会有数据了如下图llama_index代码会自己创建如下图读取的效果图如下图红框它会有三个集合前面的novel是代码中设置的命名空间点击下图红框点击后会出现下图红框的内容可以看到有embedding向量、metadata元数据、text原始文档数据如下图data存放的是元数据、原始文档数据metadata专门用来存储元数据LlamaIndex自身用的ref_doc_info就是之前说的目录它对应一个原始文件就是说通过SimpleDirectoryReader读取到原始文档后未分块之前它会有一个文档的唯一ID这个ref_doc_info就把这个唯一ID保存了下来然后分块后的文档每一个分块都会带着这个文档的唯一ID点击下图红框可以看到这些id然后复制下图红框的内容然后来到data里按CTRLF搜索是可以找到的如下图红框的黄色高亮代码# 导入 LlamaIndex 核心组件目录文件加载器、存储上下文 # SimpleDirectoryReader批量/单个加载本地文件封装为 Document 对象 # StorageContext存储体系统一入口聚合管理文档存储、向量存储等各类存储组件 from llama_index.core import ( SimpleDirectoryReader, StorageContext ) # 导入句子分割器用于按语义边界将长文档切分为指定大小的文本节点 from llama_index.core.node_parser import SentenceSplitter # 导入 MongoDB 版本文档存储实现 # 类全称MongoDocumentStore # 定位生产级持久化文档存储基于 MongoDB 数据库存储节点数据替代内存/本地文件级的 SimpleDocumentStore # 核心优势支持海量节点持久化、多进程/多服务共享数据、支持查询与索引、适合线上生产环境 # 所属扩展包llama-index-storage-docstore-mongodb需单独安装 from llama_index.storage.docstore.mongodb import MongoDocumentStore # 1. 加载本地文档 # 使用 SimpleDirectoryReader 加载指定的单个文本文件返回 Document 对象列表 # input_files直接指定目标文件路径列表无需扫描目录适合精准加载少量文件 documents SimpleDirectoryReader( input_files[./data_file/小说.txt] ).load_data() # 2. 文档切分为文本节点 # 实例化句子分割器自定义切分粒度 # chunk_size512单个文本节点最大字符数为 512 # chunk_overlap50相邻节点首尾重叠 50 个字符避免跨节点语义断裂 # 调用 get_nodes_from_documents 执行切分返回 TextNode 列表 nodes SentenceSplitter( chunk_size512, chunk_overlap50 ).get_nodes_from_documents(documents) # 打印切分后的节点总数校验切分结果 print(f切分后的 Node 数量{len(nodes)}) # 3. 初始化 MongoDB 文档存储 # 使用 from_uri 工厂方法创建 MongoDocumentStore 实例通过连接 URI 对接 MongoDB # 入参说明 # uriMongoDB 标准连接字符串格式为 mongodb://账号:密码地址:端口本地无认证可简写为 mongodb://localhost:27017 # db_name目标数据库名称所有存储数据会存入该数据库下 # namespace命名空间用于同一数据库内的业务数据隔离 # 本质是集合名前缀不同 namespace 对应不同的 MongoDB 集合数据完全独立 # 适合多项目、多业务共用同一个 MongoDB 实例的场景避免数据混淆 docstore MongoDocumentStore.from_uri( urimongodb://localhost:27017, db_namellama_index, # 命名空间文档多了之后方便做隔离 namespacenovel ) # 4. 构建存储上下文 # 将自定义的 MongoDB 文档存储注册到存储上下文中统一管理 # 未显式指定的向量存储、索引存储等组件会自动使用默认的内存实现 # 如果后续想换数据库执行修改下方docstore的值就可以了 storage_context StorageContext.from_defaults( docstoredocstore ) # 5. 批量写入节点到 MongoDB # 调用 add_documents 方法将所有切分后的节点存入 MongoDB 文档存储 # 注意 # 1. 首次运行需打开该行注释执行写入后续重复运行建议注释避免重复写入数据 # 2. 节点以 node_id 为主键重复写入的行为以官方实现为准建议做好去重处理 # storage_context.docstore.add_documents(nodes) # print(Node 已成功存入 MongoDB) # 6. 读取并预览 MongoDB 中的节点数据 print(\n DocStore 数据 \n) # storage_context.docstore.docs 返回所有节点的字典键为 node_id值为节点完整对象 # 此处截取前 3 个节点做预览避免输出过多内容 for node_id, node in list(storage_context.docstore.docs.items())[:3]: # 打印节点唯一 ID print(fNode ID: {node_id}) # 打印节点文本的前 100 个字符做内容预览 print(node.text[:100]) # 打印分隔线区分不同节点 print(- * 50)
DeepSeek幻觉调试不靠猜:用TensorBoard+HalluProbe双轨可视化,5分钟定位幻觉发生层(Transformer Block级精准打击) 更多请点击: https://intelliparadigm.com 第一章:DeepSeek 遇到幻觉怎么办 当 DeepSeek 系列大模型(如 DeepSeek-V2、DeepSeek-Coder)在生成文本时输出与事实不符、自相矛盾或无依据的“看似合理实则错误”的内容,即… 2026/7/12 6:59:38
Obsidian + Markdown 实战:构建个人知识库的5个高级工作流与插件配置 Obsidian Markdown 实战:构建个人知识库的5个高级工作流与插件配置在信息爆炸的时代,如何高效地组织和管理个人知识成为每个终身学习者必须面对的挑战。Obsidian 作为一款基于 Markdown 的双链笔记工具,凭借其本地优先、高度可定制和强大的链… 2026/7/12 6:57:37
华为/思科 ACL 实战:3种高级ACL配置对比,精准控制TCP/UDP/ICMP流量 华为/思科 ACL 实战:3种高级ACL配置对比,精准控制TCP/UDP/ICMP流量在网络设备管理中,高级访问控制列表(ACL)是实现精细化流量控制的核心工具。本文将深入探讨华为和思科设备上编号3000-3999的高级ACL配置,通… 2026/7/12 6:55:36
Unity游戏开发:有限状态机(FSM)原理与实战框架搭建指南 1. 项目概述:为什么Unity开发者绕不开状态机?如果你在Unity里做过稍微复杂一点的游戏逻辑,比如一个角色的移动(待机、行走、奔跑、跳跃、攻击),或者一个UI界面的切换(主菜单、设置、背包、战斗&… 2026/7/12 8:20:15
Bevy虚拟几何与meshlet技术路线解析 1. 为什么“Virtual Geometry in Bevy(一)”不是一篇教程,而是一份技术路线图的开篇宣言“Virtual Geometry in Bevy(一)”这个标题,乍看像是一篇入门指南的序章,但结合当前Bevy引擎在虚拟几何领… 2026/7/12 8:20:15
STM32H743ZI与ADP5350电源管理方案详解 1. 为什么需要ADP5350STM32H743ZI电源方案?在嵌入式系统设计中,电源管理往往是最容易被忽视却至关重要的环节。我曾参与过一个工业物联网网关项目,最初采用分立式电源方案,结果在高温环境下出现LDO过热宕机,导致整个系… 2026/7/12 8:18:14
URP管线中Kajiya-Kay与Marschner融合的头发渲染实战指南 1. 项目概述:从“发丝”到“灵魂”的渲染挑战在实时渲染领域,头发渲染一直是个“老大难”问题。它不像一个光滑的球体或者一个坚硬的金属表面,可以用简单的光照模型轻松搞定。一根头发,细如发丝,却包含了复杂的光学现象… 2026/7/12 8:18:14
高精度数据采集系统设计:ADS127L11与PIC32MZ应用指南 1. 项目背景与核心器件选型 在工业测量、医疗设备和精密仪器等领域,将模拟信号转换为高精度数字信号是核心需求。ADS127L11作为德州仪器(TI)推出的24位Δ-Σ ADC,配合PIC32MZ2048EFM064这款高性能MCU,能够构建出采样率高达1.067MSPS的精密数据… 2026/7/12 8:16:14
多维聚合不是GROUP BY:数据立方体构建与动态指标计算 1. 这不是简单的“加总求平均”——多维聚合中的数据变形术到底在解决什么问题?如果你正在处理销售报表、用户行为宽表、IoT设备时序快照,或者哪怕只是Excel里一张带地区、月份、产品线、渠道四个维度的汇总表,那你大概率已经踩进过这个坑&am… 2026/7/12 8:14:13
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14