尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

GraphRAG 如何通过自定义 InputReader 扩展新的输入文件格式?

GraphRAG 如何通过自定义 InputReader 扩展新的输入文件格式? GraphRAG 如何通过自定义 InputReader 扩展新的输入文件格式【免费下载链接】graphragA modular graph-based Retrieval-Augmented Generation (RAG) system项目地址: https://gitcode.com/GitHub_Trending/gr/graphragGraphRAG 的索引管道内置了text、csv、json、jsonl、parquet和markitdown六种输入类型见 docs/config/yaml.md。如果你的数据以其他格式存放且不想先写脚本转换成已有格式官方给出的扩展方式就是实现一个继承InputReader的类再把它注册到InputReaderFactory见 docs/index/inputs.md 的 “Custom File Handling” 一节。这篇文章就是这条路径从读懂内置 Reader 的接口约定到写出自定义 Reader、注册、配置settings.yaml并验证结果。先理解两个约定documents 表和 TextDocument所有输入格式读入后都会变成同一个documentsDataFrame每行一个文档列结构是固定的见 docs/index/inputs.mdnametype说明idstr文档 ID用文本内容哈希生成保证多次运行稳定textstr文档全文titlestr文档名部分格式可配置creation_datestrISO8601 字符串从源文件系统获取raw_datadict可选结构化输入的源行/源对象可用于 chunking 时的元数据前缀对应的 Python 数据类是 TextDocument字段为id、text、title、creation_date、raw_data可选。你的自定义 Reader 最终产出的就是这种对象列表后续的 chunking 行为与内置格式完全一致。阅读内置 Reader接口长什么样InputReader 是一个抽象基类你的实现只需要关心其中一部分构造函数接收storage、file_pattern、encoding默认utf-8以及任意额外关键字参数。file_pattern是一个正则基类用它调用self._storage.find(re.compile(self._file_pattern))在存储里找文件抽象方法read_file(self, path: str) - list[TextDocument]必须实现把单个文件读成一个或多个TextDocument基类已经实现了read_files()收集所有文件和_iterate_files()逐文件迭代。注意两点内置行为一个文件读取抛异常时只打 warningWarning! Error loading file %s. Skipping...并跳过不会中断整个管道找不到匹配文件时会打 warningNo {file_pattern} matches found in storage并返回空。TextFileReader 是最简单的参考实现从self._storage.get(path, encoding...)读文本用gen_sha512_hash({text: text}, [text])生成 idtitle 取文件名creation_date 通过self._storage.get_creation_date(path)获取raw_data传None。第一步实现你的 Reader 并注册下面以一个假设的.mynotes纯文本格式为例。如果read_file里的解析逻辑要换成你自己的格式解析二进制、结构化等替换这一处即可其余骨架保持不变。注册函数register_input_reader定义在 input_reader_factory.py签名是register_input_reader(input_reader_type, input_reader_initializer, scopetransient)其中scope取transient或singleton见 Factory.registersingleton 表示相同初始化参数复用同一实例。from pathlib import Path from graphrag_input.hashing import gen_sha512_hash from graphrag_input.input_reader import InputReader from graphrag_input.input_reader_factory import register_input_reader from graphrag_input.text_document import TextDocument class MyNotesReader(InputReader): Reader implementation for .mynotes files. def __init__(self, file_pattern: str | None None, **kwargs): super().__init__( file_patternfile_pattern if file_pattern is not None else .*\\.mynotes$, **kwargs, ) async def read_file(self, path: str) - list[TextDocument]: Read a .mynotes file into a list of documents. text await self._storage.get(path, encodingself._encoding) document TextDocument( idgen_sha512_hash({text: text}, [text]), titlestr(Path(path).name), texttext, creation_dateawait self._storage.get_creation_date(path), raw_dataNone, ) return [document] # 第一个参数是 settings.yaml 里 input.type 会使用的名字可以是任意字符串 register_input_reader(mynotes, MyNotesReader)注册代码必须在create_input_reader被调用之前执行。create_input_reader 的逻辑是先看config.type是否已在工厂里注册没有就尝试注册六个内置类型csv/text/json/jsonl/markitdown/parquet仍找不到则抛出ValueError错误信息会列出当前已注册的类型InputConfig.type mynotes is not registered in the InputReaderFactory. Registered types: ...这条报错本身就是第一条验证手段如果忘了注册或名字写错管道启动时就会在这里失败而不是静默读不到文件。另外InputConfig 显式开启了extraallow用途注释写明是 “Allow extra fields to support custom reader implementations”——也就是说input配置块里的额外字段会连同storage、file_pattern、encoding等一起作为关键字参数传给你的 Reader 构造函数需要额外配置的 Reader 可以靠这个机制接收。第二步配置 settings.yaml在数据项目根目录的settings.yaml中把input.type设成你注册的名字。graphrag-input 包 README 中 markitdown 的配置示例展示了 input 与输入存储的写法可以照此组织input: type: mynotes file_pattern: .*\\.mynotes$ encoding: utf-8 input_storage: type: file base_dir: input各字段的说明依据 docs/config/yaml.md 的input一节file_pattern是匹配输入文件的正则内置类型有由type推导出的默认值如.*\.csv$自定义类型没有内置默认实际生效的会是你 Reader 构造函数里的回退默认值示例中为.*\.mynotes$配置里显式写出可以覆盖它input块还支持storagetype为file|memory|blob|cosmosdb、base_dir等来指定输入文件存放位置。id_column、title_column、text_column属于结构化格式的字段映射配置纯文本类 Reader 用不到。第三步运行索引有两种入口APIbuild_index 接收GraphRagConfig内部通过PipelineFactory创建管道并执行。你的注册代码放在同一脚本里、build_index调用之前执行即可。CLIgraphrag index具体参数见 docs/cli.md 与 docs/get_started.md。可选替代路径如果你的数据最终在 DataFrame 里build_index还支持input_documents参数直接传入 pandas DataFrame完全绕开文件读取见 docs/index/inputs.md 的 “Bring-your-own DataFrame”。这条路径要求你自行保证 DataFrame 符合上文 documents 表的结构。它适合内容在自定义存储里的场景与本文的文件 Reader 扩展是两条并列路线二选一即可。验证文件被找到了、文档进管道了文档给出的可核对信号有这三处全部来自实际代码行为启动即验证注册input.type未注册时create_input_reader抛出上文那个带已注册类型列表的ValueError。读取阶段日志基类_iterate_files在读取完成后会输出Found %d %s files, loading %d匹配到的文件数、文件模式、加载的文档数。若某个文件解析失败日志里会有Warning! Error loading file ...且该文件被跳过——出现这类 warning 说明个别文件解析有问题需要单独排查。管道产物索引完成后会落documents表parquet结构即上文五列 schema其最终 schema 细节见 docs/index/outputs.md。核对id、text、title、creation_date是否符合预期即可确认自定义 Reader 的输出正确接入了后续 chunking。边界与限制Reader 里读取的文件内容如何变成TextDocument完全由你决定raw_data填了内容就可以配合chunking.prepend_metadata把源文件字段前缀到每个 chunk见 docs/index/inputs.md 的 “Field Prepending”。单个文件读取异常只告警并跳过不会让整次索引失败“零文件匹配”同样只是 warning。这两点意味着输入目录放错时管道仍会跑完要特别留意日志里的 warning。工厂允许用任意字符串名字注册实现也可以直接覆盖内置类型名text、csv等。覆盖内置行为前建议先理解对应内置 Reader 的实现。build_index 所在的 API 模块 标注了 “under development”不保证向后兼容依赖它做二次开发时留意这一点。【免费下载链接】graphragA modular graph-based Retrieval-Augmented Generation (RAG) system项目地址: https://gitcode.com/GitHub_Trending/gr/graphrag创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表