从RAG出发

news/2025/9/21 15:49:20/文章来源:https://www.cnblogs.com/yezigege/p/19103747

从RAG出发

1. RAG的概念和背景

1.1 什么是RAG

RAG(Retrieval-Augmented Generation,检索增强生成)是一种将 信息检索大语言模型生成 融合的技术架构。

其核心思想是:在模型生成前,通过检索外部知识库获取相关信息,再将这些信息与用户问题一同输入生成模型,从而生成更加准确、可解释的回答。

相较于传统大语言模型(LLM):

  • 知识截止:模型训练数据有时间限制,无法覆盖最新信息;
  • 幻觉问题:模型可能生成表面合理但错误的信息;
  • 领域知识不足:对特定业务或企业内部信息掌握有限;
  • 个性化缺失:无法基于用户特定知识库生成回答。

RAG 通过引入外部知识库和检索机制,有效缓解以上问题,使生成内容可追溯、可验证,同时支持企业定制化知识。

1.2 为什么 AI 平台需要 RAG

在企业级 AI 平台中,RAG 的价值主要体现在以下几方面:

  1. 知识实时性
    • 企业内部知识、政策、市场信息不断更新。
    • 仅依赖 LLM 的静态训练语料无法满足实时信息需求,RAG 可以动态接入知识库。
  2. 私有化知识管理
    • 企业数据通常是私有的,不在公开语料中。
    • RAG 能直接使用企业文档、报表、数据库,满足内部业务场景。
  3. 可解释性与可信度
    • RAG 能提供答案来源(Reference),用户可验证。
    • 增强业务场景中的可靠性,降低风险。
  4. 可控性与个性化
    • 可以通过设计知识库结构、检索策略和提示词模板来控制输出风格和内容。
    • 支持多行业、多场景、多用户的定制化应用。
  5. 平台化扩展性
    • 支持多模态文件解析(PDF、Excel、图片、Markdown)。
    • 支持多存储后端(向量库、ES、关系型数据库、图数据库)。
    • 支持统一服务能力(embedding、reranker、query 改写),模块化可复用。

2. RAG 解决的问题

2.1 大模型的知识局限

  • 静态语料:训练完成后无法获取最新知识。
  • 领域适配不足:无法针对企业内部知识或专业领域进行有效回答。

2.2 幻觉与不可靠输出

  • LLM 生成看似合理但错误的回答,无法提供文档来源。
  • 在金融、医疗、法律等高要求场景不可接受。

2.3 可溯源与可解释性

  • 通过 RAG,生成回答时可插入文档引用。
  • 支撑企业对知识源管理、内容验证和合规性需求。

2.4 平台化的扩展性需求

企业级 AI 平台对 RAG 的需求不仅是“答案更准”,还涉及:

  • 多模态支持:文本、表格、图片等。
  • 大规模检索与计算:需要高并发、高吞吐的向量检索和模型推理。
  • 模块化能力:embedding、reranker、query 改写可复用、可扩展。
  • 可维护性:模型升级、知识库更新、算力扩展要低风险。

3. RAG 的通用流程

RAG 的执行流程可分为 离线知识库构建阶段在线查询生成阶段。在企业 AI 平台中,每个阶段不仅关注功能正确,还涉及 性能优化、模块复用、可扩展性和可维护性


3.1 知识库构建阶段(离线处理)

3.1.1 文档收集与预处理

  • 目标:将原始企业文档标准化为可处理格式。
  • 处理策略
    1. 文件类型识别:文本、PDF、Markdown、Excel、图片等。
    2. 格式标准化
      • PDF → minerU JSON → Block 级结构化信息
      • Excel → HTML 或 Key-Value 对象
      • 图片 → OCR 或多模态模型解析文字/图表
    3. 噪声过滤:去除无实际意义的图标、二维码等内容。
  • 设计 rationale:不同文件类型采用策略模式(BlockProcessorStrategy),保证 易扩展低耦合

3.1.2 文本切分与元数据标注

  • 目标:生成语义完整的 chunk,以适应模型上下文窗口。
  • 处理策略
    • 长文档按段落/标题切分,保证上下文完整性。
    • 对每个 chunk 添加元数据:标题、来源、时间、文件 ID 等。
  • 设计 rationale:确保后续向量化检索的精度,同时支持溯源和引用标注。

3.1.3 向量化 Embedding

  • 目标:将每个 chunk 转换为高维向量,捕捉语义信息。
  • 处理策略
    • 使用专用 embedding 模型(如 bge-large-zh)。
    • 批量处理,支持 GPU 并行,提高计算效率。
    • 向量归一化,便于后续余弦相似度计算。
  • 设计 rationale:通过向量化,支持 快速语义检索,避免仅依赖关键词匹配的局限。

3.1.4 向量存储与索引

  • 目标:将向量及元数据存储到数据库,支持高效检索。
  • 处理策略
    • 向量库(Milvus / VectorDB):存储 embedding,支持高并发检索。
    • ES / MySQL:存储原始文本、元数据和关键词索引。
    • 异步任务队列(Kafka):解耦文档解析、向量生成、存储任务。
  • 设计 rationale:混合存储兼顾性能和灵活性;异步队列提高吞吐量并保证任务可靠性。

3.2 查询生成阶段(在线处理)

3.2.1 Query 改写与优化

  • 目标:增强用户查询与知识库匹配度,提高检索精度。
  • 处理策略
    • 问题扩展:添加同义词、上下文提示。
    • 语义增强:使用小型 LLM 或规则模型进行 query rewrite。
  • 设计 rationale:减少检索噪声,提高 top-k 候选片段的相关性。

3.2.2 候选召回(Recall)

  • 目标:从向量库和关键词索引中获取相关 chunk。
  • 处理策略
    • 向量召回:使用余弦相似度或欧氏距离,返回 top-k 向量片段。
    • 关键词检索:利用 BM25 或 ES 查询,补充精确匹配片段。
    • 混合召回:结合向量和关键词得分,加权生成候选列表。
  • 设计 rationale:向量检索捕捉语义,关键词保证精确性,二者互补。

3.2.3 重排序(Reranker)

  • 目标:提高召回片段与用户问题的相关性,剔除噪声。
  • 处理策略
    • 输入 query 与候选片段,使用 reranker 模型计算匹配分数。
    • 按得分排序,保留 top-n 用于生成。
  • 设计 rationale:向量检索存在噪声,reranker 提升召回质量,尤其对长尾问题效果明显。

3.2.4 内容生成(LLM)

  • 目标:基于候选片段生成最终回答。
  • 处理策略
    • 将 top-n chunk 与用户问题拼接,构造 LLM 输入。
    • 使用大模型(如 Qwen2.5-VL)生成回答。
  • 设计 rationale:通过拼接上下文,增强回答事实性,减少 hallucination。

3.2.5 溯源与引用标注

  • 目标:在回答中插入来源,保证可溯源性。
  • 处理策略
    • 计算答案片段与参考块的 关键词相似度 + 向量相似度,加权计算综合得分。
    • 综合得分超过阈值则插入引用。
  • 设计 rationale:提供答案来源,增强可信度,同时支持审计和业务合规。

3.3 流程图示意

用户问题│▼
Query 改写 ──► 候选召回 ──► 重排序 ──► LLM 生成回答 ──► 溯源标注 ──► 返回用户▲│向量库 + ES + MySQL▲│文档解析切分 & Embedding

3.4 工程要点总结

  1. 模块化设计:每一步都是独立服务或函数模块,方便扩展与替换。
  2. 异步与批量处理:文档解析、向量化使用队列和批量操作,支持高吞吐。
  3. 多存储策略:向量库 + ES + SQL 混合存储,兼顾速度与灵活性。
  4. 资源分配优化:不同任务类型分配 GPU / CPU,提升性能并节约算力成本。
  5. 可观测性:各阶段可统计吞吐量、响应时间、召回准确率、LLM 生成质量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/908858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件工程第二次作业——第一次个人编程作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience/homework/13468这个作业的目标 实…

【树状数组】codeforce 1288 E. Messenger Simulator

View Post【树状数组】codeforce 1288 E. Messenger Simulator题目 https://codeforces.com/problemset/problem/1288/E 题解 用以下测试用例进行讲解: 4 2 3 2上述测试用例的执行过程如图所示:初始状态下,第 \(i\)…

exsi 6.7 打补丁

exsi 6.7 打补丁exsi 6.7 打补丁esxi 6.7 打补丁WARNING:All commands run on the ESXi shell are logged and may be included insupport bundles. Do not provide passwords directly on the command line.Most tool…

Ubuntu 24.04 安装 DaVinci Resolve

Ubuntu 24.04 安装 DaVinci Resolve Step1: 下载并安装 chmod +x DaVinci_Resolve_Studio_19.0_Linux.run sudo ./DaVinci_Resolve_Studio_19.0_Linux.run -i可能会遇到依赖的问题, 需要先安装以下的几个库, 再以跳过检…

Promise中处理请求超时问题

1. 使用 Promise.race() 处理超时Promise<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script src="https://code.jquery.com/jquery-3.6.0.min.js">&l…

图解26:老生常谈的OSI网络模型

哈哈,之前画的不能在老的图了,重新拿出来让AI加个码看看效果,没有一点失真还不错,

【C++】指针

内存 程序中最重要的一件事,就是内存。当启动一个程序的时候,所有的代码都被载入到内存当中,内存中的所有的二进制指令都在告诉计算机你的代码需要做什么。 没有内存,计算机什么都做不了,而指针对于管理和操纵内存…

Quart

Quart📌 在软件/编程里 Quart 是一个 Python 异步 Web 框架,API 和 Flask 几乎完全兼容,但基于 asyncio,所以可以用 async/await 写异步代码。你可以把它理解为 “异步版 Flask”。典型用途:写高并发 Web 服务、…

AI驱动建筑行业数字化转型

AI驱动建筑行业数字化转型精细化管理为目标的数字化转型是建筑产业发展的必然趋势 建筑业当前面临着行业增速下降、劳动力成本上升、单个项目投标家数增加、资源环境约束加剧等挑战,且随着时代发展,建筑项目的规…

详细介绍:前端学习——CSS

详细介绍:前端学习——CSSpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", …

VSCode 把代码发送到激活状态下的终端

VSCode 把代码发送到激活状态下的终端 你有没有遇到过这样的情况:在VSCode里写Python代码时,经常需要打开好几个终端。但问题是,Shift+Enter快捷键只能把选中的代码发送到第一个终端。有时候,如果VSCode意外重启,…

java设计模式-工厂模式(文件上传) - 实践

java设计模式-工厂模式(文件上传) - 实践2025-09-21 15:33 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block…

线性结构之数组[基于郝斌课程]

线性结构:把所有的结点用一根线穿起来 连续存储[数组]什么叫做数组:元素类型相同,大小相等/* @file main.c @brief 线性结构之数组 @author EricsT (EricsT@163.com) @version v1.0.0 @date 202…

完整教程:Vue中的props方式

完整教程:Vue中的props方式pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

深度剖析 B 站关键词排名:策略与技巧全解析 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

图解25:MySQL主从复制原理

使用AI图生图,有些修饰的还不错,有些差强人意,特别是文字内容混在一起的AI明显是比较难处理

用 Go 编写验证码识别脚本(基于 Tesseract)

一、概述 识别验证码通常用于登录自动化、表单填写等自动化流程中。对于字符清晰、干扰较少的验证码,OCR 是一种轻便高效的识别方式。本文介绍如何使用 Go 调用 Tesseract OCR 实现验证码图片的识别。 二、前提条件安…

第03周 预习、实验与作业:面向对象入门2与类的识别

一、什么样的方法应该用static修饰?不用static修饰的方法往往具有什么特性?Student的getName应该用static修饰吗? (1)什么样的方法应该用static修饰? 1.工具类或者辅助方法 例如:Math.sqrt()、Arrays.sort()等,…

完整教程:MySQL 存储过程完整实战手册---一篇吃透 Stored Procedure

完整教程:MySQL 存储过程完整实战手册---一篇吃透 Stored Procedure2025-09-21 15:15 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto …

数据结构 静态链表的实现(算法篇) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …