概述
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 欢迎各种贡献,贡献前请阅读相关说明。