go-light-rag
MegaGrindStone/go-light-rag加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
传统的 RAG(检索增强生成)系统在处理复杂问题时,常常陷入一个困境:当用户问"某公司创始人的投资偏好是什么"这类跨维度问题时,单纯依靠向量相似度检索往往只能找到语义相近的片段,却无法捕捉实体之间深层的关联关系——比如"创始人"和"投资偏好"之间的因果链条。
2024 年,香港大学发布的 LightRAG 框架率先将图数据库引入 RAG 架构,通过构建知识图谱来表达实体间的关系,显著提升了检索的全局性和关联性推理能力。go-light-rag 则是 LightRAG 的 Go 语言实现,将这套混合检索架构带入了高性能 Go 生态。
go-light-rag 由独立开发者 MegaGrindStone 创建,采用 MIT 许可证,是一个专注于轻量化和模块化的 Go 语言 RAG 库。相比原版 Python 实现,它刻意将文档处理管道与提示词工程解耦,给开发者提供三个核心能力:直接控制文档插入流程、直接访问检索到的上下文数据、完全自由地编写自定义提示词。
该库目前已获得 62 颗 GitHub Stars,话题标签涵盖 ai、go、library、lightrag、llm、rag,主分支为 main,拥有完整的 CI/CD 流水线(GitHub Actions + golangci-lint + codecov)。
go-light-rag 的设计哲学围绕接口抽象展开,定义了四个核心接口:
LLM 接口:统一封装了大语言模型的调用,内置重试机制和 Token 计数管理。目前已实现四个 Provider:OpenAI(含 Azure OpenAI 兼容)、Ollama(本地模型)、Anthropic(Claude 系列)和 OpenRouter(聚合平台)。
GraphStorage 接口:封装图数据库操作,提供实体的增删改查、关系管理、批量查询,以及基于关系计数的实体重要性排序。在 storage/ 目录下实现了 Neo4j(生产级)和 BoltDB(嵌入式)两种图存储后端。
VectorStorage 接口:向量数据库抽象,支持语义相似度检索。提供 Milvus(分布式向量数据库)、ChromaM(嵌入式向量库)和 Redis(通过 RediSearch)三种后端。
DocumentHandler 接口:文档分块策略,目前内置三种实现:Default(基于 token 数量的滑动窗口分块)、Go(针对 Go 源码的 AST 感知分块)和 Semantic(利用 LLM 语义判断分块边界)。
这套架构的优势在于:任意接口都可以替换实现——想换向量数据库?换一个 VectorStorage 实现即可;想用自己的 LLM?实现 LLM 接口即可,无需改动核心逻辑。
Insert 函数是 go-light-rag 的写入入口,其处理流程体现了混合检索的精髓:
文档分块:根据 DocumentHandler 的分块策略,将长文档切分为多个 Source(来源片段),每个 Source 携带分块后的文本内容和分块位置信息。
并发 Embedding:通过 golang.org/x/sync/errgroup 并发调用 EmbeddingFunc,将每个文本块转换为高维向量,并存储到 VectorStorage 中。
实体关系抽取:这是 LightRAG 的核心创新——对每个文本块,Insert 函数会调用 LLM 从中抽取实体(Entity)和关系(Relationship),将抽取结果同时写入 GraphStorage(关系)和 VectorStorage(向量),形成"图谱+向量"的双轨存储。
智能摘要压缩:当实体或关系的描述过长(超过 MaxSummariesTokenLength 配置的阈值)时,系统会自动调用 LLM 进行摘要压缩,避免存储浪费。
多轮 Gleaning:初次抽取可能遗漏实体,系统支持配置 GleanCount(追加提取轮数),在每一轮中利用已抽取的实体作为上下文,辅助 LLM 发现可能被遗漏的实体。
这套流程使得 go-light-rag 在插入阶段就完成了"知识结构化",为后续查询阶段的全局+局部混合检索奠定了基础。
Query 函数支持两种互补的检索模式:
全局搜索(Global):基于关键词在知识图谱中扩展检索范围。首先通过 QueryHandler 从查询语句中提取高/低级关键词,然后在图谱中查询关联实体,再以实体为起点进行广度优先扩展,最后在向量数据库中检索关联段落。适合回答"介绍一下 XX 公司的整体情况"这类宏观问题。
局部搜索(Local):直接在向量数据库中做语义相似度检索,找到与查询最相关的文本片段。适合回答具体事实类问题,如"XX 事件发生在哪一天"。
QueryResult 将两种模式的返回结果统一封装为 GlobalEntities、GlobalRelationships、GlobalSources、LocalEntities、LocalRelationships、LocalSources 六个字段,开发者可以自由组合这些结果来构建提示词,而不是被固定的模板束缚。
go-light-rag 的代码质量在多个维度表现突出:
测试覆盖率:项目使用 Go 官方 testing 包编写了大量测试文件(insert_test.go、query_test.go、handler 各子包的 _test.go),codecov 集成显示覆盖率良好。
代码规范:golangci-lint 配置严格,测试文件中使用 nolint 注解说明为何跳过特定 lint 检查,体现了对规范的尊重而非简单压制。
日志架构:全面采用 log/slog(Go 1.21+ 内置的结构化日志库)替代传统的 log.Printf,slog 支持分级日志、上下文属性,在生产环境中可追踪性更强。
错误处理:定义了大量自定义错误类型(ErrEntityNotFound、ErrRelationshipNotFound 等),便于调用方精准处理不同失败场景,而非用通用 error 泛泛而报。
并发安全:在 insert.go 和 query.go 中使用 errgroup 实现并发控制,既保证效率又统一错误聚合。
适合人群:有 Go 开发经验的工程师,希望在现有 Go 应用中集成 RAG 能力,而无需引入 Python 运行时。
使用门槛:
上手建议路径:阅读 examples/default/ 中的最小可用示例 → 理解 LLM/GraphStorage/VectorStorage 三个接口的组合关系 → 替换为自己的后端配置 → 编写 Insert/Query 调用。
1. 零一键部署:作为纯库,不提供 Docker 镜像或一键启动脚本。用户需要自行编写主程序,配置依赖服务(Neo4j/Milvus/Chroma 等),初次上手有一定配置成本。
2. 多语言 embedding 依赖外部服务:虽然内置 tiktoken-go 做 token 计数,但 Embedding 向量生成依赖外部服务(OpenAI、Ollama Embedding 等),不支持纯本地、纯离线的 embedding 计算。
3. 无 Web UI 或 API 服务:不像 LangChain Python 版那样提供 LangServe 直接暴露 REST API,go-light-rag 的输出是 QueryResult 结构体,需要用户自行封装为 HTTP 服务。
4. 文档相对简洁:README 以功能介绍为主,缺乏架构图、FAQ 或 Troubleshooting 指南,对 RAG 新手不太友好。
go-light-rag 的出现填补了 Go 生态中"生产级 RAG 库"的空白。在高性能网关、微服务或 CLI 工具中集成 AI 能力时,Go 的并发模型和部署便利性(单二进制)是 Python 无法比拟的。随着 Ollama 等本地模型的成熟,越来越多的团队希望构建"完全本地化"的 AI 知识库,go-light-rag 正是这一趋势的有力支撑。
配合 Neo4j(关系图谱)和 ChromaM(嵌入式向量库),可以在不依赖任何外部云服务的情况下,搭建一套完整的数据不上云的私有化 RAG 系统——这对金融、医疗、法律等数据敏感行业具有重要的落地价值。