这几天我一直在用我在《AI基于Spec开发是巨坑?》 所说的方法来继续MindX2的开发。虽然,在用前文中所提到的方法尽量去抑制AI胡说八道,但感觉还是治标不治本。AI总是时不时就开始任性独断,顺口胡诌。
最要命的是在MindX2中尽管有记忆系统,AI仍然是会犯这种疯病。所以我决心一定要解决这个问题,先得找到根因。而搞笑的是就在同一天,我一个电商公司的销售主管给我抱怨了这么一个情况,由于我没有拿到手机聊天的截图,只能将他和我说的情况用文字来复述了(以下的Alex就是我朋友的代称):
客户(咆哮): "你们客服说买一送一,现在下单又不算了!欺诈消费者!"
Alex(查看记录): "先生,我们从来没做过这个活动啊..."
客户(甩出截图): "自己看!客服亲口说的!'购买 iPhone 17 即送 AirPods Pro' 我现在就要!"
Alex(崩溃):"我们这是AI客服输啊,这很明显是 AI 编造的啊!我们根本没这个政策..."
后面的内容不关我们事了,主动脑补吧,反正也不会是什么好结局,否则也听不到这样的抱怨,我只是庆幸我最多是骂一下AI,我这朋友估计得被扣钱了,AI惹的祸主管来背呗,实在是有点背。
从技术的角度来看我与我朋友所经历的这两件事就暴露一个AI的本质,这根用哪个模型是没有关系的就是:"幻觉"。其实一查网上也是一大堆说这个的,辛亏也是这么一看才发现这东东的根因真的不在大模型,而是在大模型的应用上。之所以我们感觉它在胡说,然而大模型只是在信息匮乏的情况下给出了一个看似【合乎逻辑】的答案而已。
原来治愈这个种AI幻觉的良药是RAG!
RAG(Retrieval-Augmented Generation,检索增强生成)是一种将外部知识检索与大语言模型生成能力相结合的技术框架。它的核心思想是让大模型在生成回答前,先从外部知识库中检索相关信息,然后将这些信息作为上下文提供给模型,从而生成更准确、更可信、更具时效性的答案
说人话:RAG 就是一种建立语义化搜索的知识库。 不查也不知道原来这还是当下AI中最热门的研究主题之一呢。
我查了一下当下最流行的RAG框架,主要有以下这些:
| 框架类别 | 框架名称 | 主要开发语言 | 备注 |
|---|---|---|---|
| 通用开发框架 | LangChain | Python (主)、JavaScript/TypeScript | 提供 Python 和 LangChain.js (JS/TS) 两个官方版本。Python 版功能最全、生态最成熟。 |
| LlamaIndex | Python、TypeScript | 核心框架提供 Python 和 TypeScript 两种版本。 | |
| Haystack | Python | 由 deepset.ai 开发,是一个基于 Python 的端到端 NLP 框架。 | |
| 企业级/可视化平台 | Dify | Python (后端)、TypeScript (前端) | 后端基于 Python (Flask) ,前端基于 React + TypeScript。 |
| RAGFlow | Python | 官方文档及安装指南均标明主要使用 Python。 | |
| MaxKB | 未明确(推断为 Python/Java) | 作为知识库系统,常见技术栈为 Python 或 Java,具体需查阅其源码仓库确认。 | |
| FastGPT | 未明确(推断为 TypeScript) | 作为零代码平台,其技术栈可能以现代 Web 技术(如 TypeScript)为主。 | |
| 前沿/多模态与专项框架 | UltraRAG 2.1 | 未明确(推断为 Python) | 由清华大学团队开发的研究型框架,通常基于 Python 生态。 |
| Morphik | 未明确(推断为 Python) | 知识图谱驱动的多模态RAG数据库,核心逻辑层常用 Python。 | |
| Milvus | Go 、C++ | 核心数据库引擎由 Go 和 C++ 编写,提供 Python、Java、Go 等多语言 SDK。 | |
| mem0 | 未明确(推断为 Python) | AI 记忆层库,通常与 Python AI 栈深度集成。 | |
| RAGAS | 未明确(推断为 Python) | RAG 评估框架,极大概率基于 Python 实现。 | |
| FlashRAG | 未明确(推断为 Python) | 研究导向的模块化工具包,常见于 Python 研究社区。 |
从上述列表清一色是 Python 的天下。本来是想找到一个用纯GO版本的 RAG,看完这表就将我劝退了。不是我不喜欢Python,相反的我用Python的时间比Go还长,只是Python从来不是我用来做产品的首选语言,主要我比较看重速度与无依赖部署两点,这是我个人认为做一个产品必须追求做到的原则。python我用得最多也就是内部项目,研究性项目,毕竟它的性能是硬伤与Go, Rust, Java 是无法比的,甚至是达到可感知的状态的,不服可以去装个 Hugo 和 Pelican 运行对比一下就很明显,绝对的10秒以上的速度碾压。
找RAG当然是为了升级MindX了,既然找不到那也只能自己手搓了呗,反正ReAct也搓出来了也不差这么一个RAG了。
过程省去,24小时之后 ... 我写了一个叫 GoRAG 的项目,这次索性一开始就直接开源,有兴趣的朋友可以看我的GitHub或者CSDN的源码库。
因为有意识地控制住编程模型的"幻觉"问题这次是省下不少时间写测试了,这个项目的测试覆盖率可是达到了85%+
性能优势:Go 语言带来的本质提升
先来看看用GO实现RAG带来本质提升,我用Go写了基准测试(Bachmark test),以下是与其它两个知名pyhton库的速度对比:
| 测试维度(10,100 文档/160 万字符) | GoRAG | LangChain | LlamaIndex |
|---|---|---|---|
| 索引耗时 | 206 秒(≈20.4ms/文档) | 600-1000 秒 | 400-600 秒 |
| 查询耗时 | 20.5 秒 | 40-80 秒 | 30-40 秒 |
| 内存占用 | 50-100MB | 200-500MB | 150-300MB |
核心关键需求:难点与热点
如果只是仿写重复造轮子,那一点意思都没有还不如直接用,所以我给这个框架加了一些不同的东东,其它该有的功能全部都有,然后还有些高阶能力,可以看下表:
| 功能特性 | GoRAG | 传统 Python 框架 | 解决的核心问题 |
|---|---|---|---|
| 并发目录索引 | ✅ 内置 | ❌ 需手动实现 | 批量文档索引效率低、易卡顿 |
| 智能体 RAG(Agentic RAG) | ✅ 完整支持 | ❌ 无/有限支持 | AI 自主决定检索策略,适配复杂查询(如生成行业报告) |
| RAG-Fusion 多视角检索 | ✅ 独有 | ❌ 不支持 | 单一查询视角检索结果不全的问题 |
| 多跳检索 | ✅ 独有 | ❌ 无/有限支持 | 处理需要从多个文档获取信息的复杂问题 |
| 多格式文档自动解析 | ✅ 9 种(PDF/Excel/PPT 等) | ❌ 需手动装解析库 | 不同格式文档解析兼容性差、配置复杂 |
架构与原理
其实这个项目结构很简单,主要就是由4大部分部分组成:文件解释器,RAG引擎,Embedding提供器,向量储存(已经支持时下最流行的4大向量数据库),每个部分都可以独立扩展,可以支持插件机制进行扩展。
graph TB subgraph "命令行与示例" CLI["cmd/gorag/main.go<br/>CLI 工具入口"] EXB["examples/basic/main.go<br/>基础示例"] EXA["examples/advanced/main.go<br/>高级示例"] end subgraph "RAG 引擎" ENG["rag/engine.go<br/>RAG 引擎"] CACHE["rag/cache.go<br/>查询缓存"] ROUTER["rag/routing.go<br/>查询路由"] HYBRID["rag/retrieval/hybrid.go<br/>混合检索"] RERANK["rag/retrieval/reranker.go<br/>重排序"] end subgraph "能力接口" PARSER["parser/parser.go<br/>文档解析接口"] EMB["embedding/embedding.go<br/>嵌入接口"] VSTORE["vectorstore/vectorstore.go<br/>向量存储接口"] LLM["llm/llm.go<br/>LLM 客户端接口"] end CLI --> ENG EXB --> ENG EXA --> ENG ENG --> PARSER ENG --> EMB ENG --> VSTORE ENG --> LLM ENG --> ROUTER ENG --> HYBRID ENG --> RERANK ENG --> CACHE
开发体验:降低上手门槛
传统 Python RAG 框架需理解 Chain、Agent、Retriever 等复杂概念,代码量高且易出错;GoRAG 设计极简 API,核心功能 5 行代码即可实现:
go
// GoRAG 快速实现 RAG 系统
package main
import (
"context"
"log"
"fmt"
embedder "github.com/DotNetAge/gorag/embedding/openai"
llm "github.com/DotNetAge/gorag/llm/openai"
"github.com/DotNetAge/gorag/rag"
"github.com/DotNetAge/gorag/vectorstore/memory"
)
func main() {
ctx := context.Background()
// 1. 初始化嵌入模型和大模型
embed, _ := embedder.New(embedder.Config{APIKey: "你的API密钥"})
llmClient, _ := llm.New(llm.Config{APIKey: "你的API密钥"})
// 2. 创建 RAG 引擎
engine, _ := rag.New(
rag.WithEmbedder(embed),
rag.WithLLM(llmClient),
rag.WithVectorStore(memory.NewStore()),
)
// 3. 一键索引整个目录(自动并发处理)
if err := engine.IndexDirectory(ctx, "./company_docs"); err != nil {
log.Fatal(err)
}
// 4. 检索增强查询
resp, _ := engine.Query(ctx, "2024 新品 XPhone 16 Pro 的核心功能?", rag.QueryOptions{
TopK: 5, // 返回Top5相关文档
})
// 5. 输出结果(含来源追溯)
fmt.Println("回答:", resp.Answer)
fmt.Println("引用来源:")
for _, src := range resp.Sources {
fmt.Printf("- %s(第 %d 页)\n", src.FilePath, src.PageNumber)
}
}
其它的特性我写在GitHub上了。
GoRAG 并非单纯的"技术升级",而是通过 Go 语言的性能优势和工程化设计,解决了传统 RAG 框架在企业落地中的性能、部署、安全痛点,让 RAG 技术真正能低成本、高可靠地服务于实际业务。
应用
那这东西有什么用?RAG 的应用其实是很广泛的,总结起来主要有以下的几种:
- GoRAG将会是MindX2的核心记忆体的一部分;
- 可以用GoRAG接入你的Agent优化提示词,有效抑制"幻觉"与"失忆";
- 垂直领域智能助手(医疗 / 法律 / 金融)这类领域对专业知识精准度、合规性要求极高,RAG 是解决通用大模型 "外行化" 的核心方案。
- 即使不用于AI项目也可以广泛地应用于客服与智能客服系统,问答系统的语义化索引与搜索;
- 企业内部知识库与协同办公,解决企业内部 "知识沉淀难、检索效率低" 的问题,是企业数字化转型的核心场景;
- 工业与制造业,面向工业场景的 "知识复用、故障排查、运维支持",解决工业数据分散、专家经验难以传承的问题;
- 教育与培训,解决教育场景中 "个性化答疑、知识更新、题库管理" 的问题;
- 政务与公共服务,解决政务场景中 "政策解读、办事指南、公众咨询" 的效率问题。
说白了就是凡需要大型知识库支撑的业务都能用上RAG。这个应用面可是很广的。
当然,如果这GoRAG能有那么一点点入你的法眼,我也希望你能关注或者加入到这个项目中来,在社区中共同发展它。