RAG 管道 (Retrieval-Augmented Generation)

检索增强生成 (RAG) 是目前构建知识密集型 AI 应用的主流范式。通过将检索系统与生成模型结合,RAG 解决了 LLM 知识过时和幻觉的问题。LangGraphGo 提供了构建复杂、自适应 RAG 管道的理想框架。

1. 基础 RAG 流程

背景与功能

最简单的 RAG 流程是线性的:用户提问 -> 检索文档 -> 构建 Prompt -> LLM 生成回答。使用 LangGraphGo,我们可以将每一步封装为一个节点,清晰地表达这个流程。

实现原理

我们通常定义一个包含 `Question`, `Documents`, `Answer` 的状态 Schema。检索节点填充 `Documents`,生成节点读取 `Documents` 并填充 `Answer`。

代码展示

// 1. 定义状态
type RAGState struct {
    Question  string
    Documents []string
    Answer    string
}

// 2. 定义检索节点
func retrieve(ctx context.Context, state interface{}) (interface{}, error) {
    s := state.(RAGState)
    // 调用向量数据库或搜索引擎
    docs := vectorStore.Search(s.Question)
    s.Documents = docs
    return s, nil
}

// 3. 定义生成节点
func generate(ctx context.Context, state interface{}) (interface{}, error) {
    s := state.(RAGState)
    // 构建包含上下文的 Prompt
    prompt := fmt.Sprintf("Context: %v\nQuestion: %s", s.Documents, s.Question)
    // 调用 LLM
    ans := llm.Generate(prompt)
    s.Answer = ans
    return s, nil
}

// 4. 构建图
g.AddNode("retrieve", retrieve)
g.AddNode("generate", generate)
g.AddEdge("retrieve", "generate")

2. 自适应 RAG (Adaptive RAG)

背景与功能

基础 RAG 假设每次检索都是完美的,但这往往不成立。自适应 RAG 引入了反馈循环:如果检索到的文档不相关,或者生成的答案无法回答问题,Agent 可以选择重写查询、重新检索或拒绝回答。

LangGraphGo 的循环图结构非常适合实现这种自我修正的逻辑。

实现原理

我们引入一个"评分"节点(可以是 LLM 本身),对检索结果或最终答案进行评分。根据评分结果,使用条件边路由回之前的步骤。

代码展示:评分与重试

// 评分节点:评估文档相关性
func gradeDocuments(ctx context.Context, state interface{}) (interface{}, error) {
    // ... 让 LLM 判断文档是否与问题相关 ...
    // 返回包含评分结果的状态
}

// 路由函数
func checkRelevance(ctx context.Context, state interface{}) string {
    s := state.(RAGState)
    if s.RelevanceScore < 0.7 {
        return "rewrite_query" // 相关性低,去重写查询
    }
    return "generate" // 相关性高,去生成答案
}

// 构建自适应流程
g.AddNode("retrieve", retrieve)
g.AddNode("grade", gradeDocuments)
g.AddNode("rewrite", rewriteQuery)
g.AddNode("generate", generate)

g.AddEdge("retrieve", "grade")
g.AddConditionalEdge("grade", checkRelevance)
g.AddEdge("rewrite", "retrieve") // 循环:重写后再次检索

3. Corrective RAG (CRAG)

CRAG 是一种高级模式,当检索到的知识不可靠时,它会回退到网络搜索(Web Search)来获取最新信息。这可以通过在图中添加一个 Web Search 节点和相应的条件路由轻松实现。