RAG概念

RAG 是 Retrieval-Augmented Generation 的缩写,中文意为检索增强生成。它是一种结合了信息检索和大语言模型生成能力的人工智能技术框架。

简单理解:让大模型在回答问题前,先“查资料”,再根据查到的资料来回答。

RAG解决的痛点

  • 第一是知识时效性,LLM 训练完知识就固定了,训练截止日期之后发生的事它一无所知;
  • 第二是私有知识覆盖,公司内部文档、行业专有数据根本没有机会进训练集,LLM 对这些内容是空白的;
  • 第三是幻觉问题,没有知识依据时 LLM 容易「自己发挥」编出一个听起来合理但实际错误的答案,给了它参考资料之后幻觉就少很多。

详细流程

┌─────────────────────────────────────────────────────────────────────────┐
│                        ChatAgent 处理流程                                │
└─────────────────────────────────────────────────────────────────────────┘

用户消息
    │
    ▼
┌─────────────────┐
│ 1. 加载上下文    │ ← Redis 读取最近 10 轮 + 摘要
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│ 2. Query 改写    │ ← LLM 根据历史改写用户问题
└────────┬────────┘
         │
         ▼
┌─────────────────────────────────────────┐
│ 3. 混合检索(并行)                       │
│    ├── 语义检索:向量相似度搜索 Milvus    │
│    └── 关键词检索:MySQL 全文搜索         │
└────────┬────────────────────────────────┘
         │
         ▼
┌─────────────────┐
│ 4. 动态权重融合  │ ← 根据查询类型调整权重
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│ 5. Rerank 重排序 │ ← 按相关性重排序,取 Top 5
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│ 6. 构建 Prompt   │ ← 系统提示 + 上下文 + 检索结果
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│ 7. LLM 生成回答  │ ← SSE 流式输出
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│ 8. 保存消息      │ ← MySQL + 更新 Redis
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│ 9. 检查轮数      │ ← 超过 10 轮则生成摘要
└─────────────────┘

各步骤详细说明

1. 加载上下文

  • 从 Redis 读取最近 10 轮对话历史
  • 从 Redis 或 MySQL 读取结构化摘要(如果有)
  • 组装成完整的上下文

这一步是为了让大模型有记忆,不然大模型将不知道你之前问过什么。

2. Query 改写

  • 使用 LLM 根据对话历史改写用户问题
  • 目的:解决指代消解(“它”、“这个”)和省略问题
  • 示例:
    • 用户问:“它的优点是什么?”
    • 改写后:“Transformer 架构的优点是什么?”

3. 混合检索(Milvus 混合检索)

  • 语义检索:将改写后的 query 向量化,在 Milvus 中搜索相似片段
  • 关键词检索:使用 Milvus 全文检索功能搜索关键词
  • 两种检索并行执行,统一在 Milvus 中完成

4. 动态权重融合

  • 根据查询类型动态调整权重:
    • 技术/精确查询 → 关键词权重高(0.6)
    • 开放/语义查询 → 语义权重高(0.7)
  • 使用 RRF (Reciprocal Rank Fusion) 算法融合结果

5. Rerank 重排序

  • 使用交叉编码器对融合后的结果重新排序
  • 取 Top 5 最相关片段

6. 构建 Prompt

  • 系统提示:角色定义 + 回答规范 + 引用要求
  • 上下文:摘要 + 最近对话历史
  • 检索结果:Top 5 片段 + 来源信息

7. LLM 生成回答

  • 根据 Prompt 生成回答,SSE 流式输出

8. 保存消息

  • 将用户消息和 AI 回答保存到 MySQL
  • AI 回答的 Metadata 中存储引用来源
  • 更新 Redis 缓存

9. 检查轮数

  • 如果对话超过 10 轮,调用 LLM 生成结构化摘要
  • 摘要保存到 MySQL 和 Redis
  • 从 Redis 中移除超过 10 轮的旧消息

总结

这套流程能够提高大模型回答的可信度,原因有下:

  • 在对话能力层面,依托Redis缓存实现多轮对话记忆与超长对话摘要压缩,解决了传统大模型无上下文记忆、对话轮次受限的痛点,保障人机交互的连贯性与自然度。
  • 在检索能力层面,采用Milvus向量语义检索+关键词全文检索的混合模式,搭配RRF动态权重融合与Rerank重排序机制,适配技术精准查询、语义模糊查询等不同用户场景。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐