内容参考于图灵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)