SuperAPI AI 工具集

nano-graphrag

nano-graphrag 是一个简单、易于修改的 GraphRAG 实现。它针对官方 GraphRAG 代码难以阅读和修改的问题,提供了一个更小、更快、更清晰但保留核心功能的版本。排除测试和提示词后,nano-graphrag 约 1100 行代码,具备轻量可移植(支持 faiss、neo4j、ollama 等)、异步和完整类型标注等特性。它支持增量插入、朴素 RAG 插入与查询、可替换的 LLM/嵌入/存储组件,以及自定义提示词和分块方法。项目还提供了英文和中文基准测试、多跳 RAG 评估笔记本,以及相关的使用示例。

访问官网

工具介绍

概述

nano-graphrag 是一个简单、易于修改的 GraphRAG 实现。项目作者指出,GraphRAG 虽然强大,但官方实现难以阅读和修改,因此该项目提供了一个更小、更快、更清晰的版本,同时保留核心功能。排除测试和提示词后,nano-graphrag 约 1100 行代码。

主要特性

  • 轻量可移植:支持 faiss、neo4j、ollama 等
  • 异步且完整类型标注
  • 支持增量插入,避免重复计算和数据添加
  • 同时支持朴素 RAG 的插入和查询
  • 可替换 LLM、嵌入模型、存储组件
  • 可自定义提示词与分块方法
  • 使用内容 MD5 哈希作为键,避免重复分块

安装与配置

推荐从源码安装,也可从 PyPi 安装。需设置 OpenAI API key:export OPENAI_API_KEY="sk-..."。

若使用 Azure OpenAI API,可参考 .env.example 设置,并通过 GraphRAG(...,using_azure_openai=True,...) 启用。若使用 Amazon Bedrock API,需先通过 aws configure 等方式配置凭证,再按示例启用。

如无 key,可参考使用 transformers 和 ollama 的示例。如需使用其他 LLM 或嵌入模型,可参考 Advances 部分。

使用方式

下载 Charles Dickens 的《A Christmas Carol》副本,使用示例 Python 片段进行初始化。下次从同一 working_dir 初始化 GraphRAG 时,会自动重新加载所有上下文。

nano-graphrag 支持增量插入,不会重复计算或添加数据。每次插入时,图的社区会被重新计算,社区报告也会重新生成。

对于每个方法 NAME(...),都有对应的异步方法 aNAME(...)。

GraphRAG 和 QueryParam 是 Python 中的 dataclass,可使用 help(GraphRAG) 和 help(QueryParam) 查看所有可用参数。

组件与集成

内置组件表示 nano-graphrag 内部已有实现,examples 表示在 examples 文件夹的教程中有实现。可查看 examples/benchmarks 了解组件之间的比较。

使用 GraphRAG(...,always_create_working_dir=False,...) 可跳过目录创建步骤,适用于所有组件都切换到非文件存储时。

graph_func.query 返回最终答案,不进行流式输出。如需将 nano-graphrag 集成到项目中,可使用 param=QueryParam(..., only_need_context=True,...),仅返回从图中检索到的上下文,以便集成到自定义提示词中。

提示词定制

nano-graphrag 使用 nano_graphrag.prompt.PROMPTS 字典中的提示词,可以替换其中任意提示词。重要提示词包括:entity_extraction(从文本块中提取实体和关系)、community_report(组织和总结图集群描述)、local_rag_response(本地搜索生成的系统提示词模板)、global_reduce_rag_response(全局搜索生成的系统提示词模板)、fail_response(当用户查询无相关内容时的回退响应)。

LLM 与嵌入

nano-graphrag 需要两种 LLM:一个强大的和一个廉价的。前者用于规划和响应,后者用于总结。默认强大的为 gpt-4o,廉价的为 gpt-4o-mini。可实现自己的 LLM 函数进行替换。可参考使用 deepseek-chat 或 ollama 作为 LLM 模型的示例。

nano-graphrag 会使用 best_model_func 输出 JSON,参数为 "response_format": {"type": "json_object"}。部分开源模型可能产生不稳定的 JSON,因此引入了后处理接口,可将响应转换为 JSON,通过 GraphRAG(...convert_response_to_json_func=YOUR_STRING_TO_JSON_FUNC,...) 传入自定义函数。例如可参考 json_repair 修复 LLM 返回的 JSON 字符串。

可用任意 _utils.EmbedddingFunc 实例替换默认嵌入函数。默认使用 OpenAI embedding API。可参考使用 sentence-transformer 本地计算嵌入的示例。

存储后端

nano-graphrag 主要使用三类存储:base.BaseKVStorage 用于存储键值 JSON 数据,默认使用磁盘文件存储;base.BaseVectorStorage 用于索引嵌入,默认使用 nano-vectordb,也有内置 hnswlib 存储,还可参考实现 milvus-lite 的示例(Windows 不可用);base.BaseGraphStorage 用于存储知识图谱,默认使用 networkx,也有内置 Neo4jStorage。可通过 GraphRAG(.., key_string_value_json_storage_cls=YOURS,...)、GraphRAG(.., vector_db_storage_cls=YOURS,...)、GraphRAG(.., graph_storage_cls=YOURS,...) 替换。

基准与相关项目

项目提供英文基准、中文基准,以及一个多跳 RAG 任务的评估笔记本。使用 nano-graphrag 的项目包括:Medical Graph RAG、LightRAG、fast-graphrag、HiRAG。

限制

nano-graphrag 未实现 GraphRAG 的 covariates 功能。其全局搜索实现与原始版本不同:原始版本使用类似 map-reduce 的方式将所有社区填入上下文,而 nano-graphrag 只使用 top-K 重要且中心的社区(可通过 QueryParam.global_max_consider_community 控制,默认为 512 个社区)。

贡献

nano-graphrag 欢迎各种贡献,贡献前请阅读相关说明。