什么是RAG?啥又是向量?带你从周杰伦的角度读懂.....

LLM火了这么长时间,RAG、mcp、embedding等技术名词也出现在了日常的公众号文章中,你有了解过这些技术吗?

大模型出现幻觉啦

你可以把大模型想象成:一个知识渊博、口才极佳的"大忽悠"。

这个"大忽悠"脑子里装了海量的知识,所以跟你聊天时总是侃侃而谈,听起来非常有道理。但问题是,他有一种"无法忍受沉默和不知道"的强迫症 。当你问到一个他不知道或者他记忆模糊的事情时,他不会说"我不知道",而是会基于他已有的知识"脑补"出一段听起来极其合理、但完全是编造的内容,并且用非常自信、肯定的语气告诉你。

这就是大模型的"幻觉",学术上常称为"胡言乱语"或"虚构"。它指大模型生成的内容在事实层面是错误的、不存在的,但形式上却非常连贯、可信。

比如~我的代码里有一个名为@CustomFilter注解,这个注解大模型肯定不知道吧....下面是大模型的回答,我搜了下 Mybatis-Plus 并没有这个注解。

让大模型别"胡说八道"

如何不让大模型胡说八道呢?看一下下面这些方式吧,其中 RAG 将会是我们这篇文章讲述的重点。

Prompt - 在提问时给它立规矩

通过精心设计你的提问方式,来约束模型的行为。

  • 是什么:在提问的指令中,明确告诉模型"必须基于已知事实"、"如果不知道就明确说不知道"、"禁止虚构信息"。

  • 举例:提示词如下,大模型也给出了"不知道"的回答

    复制代码
    1.不确定、不清楚、无法确认的内容,一律回答:不知道。
    2.不能根据猜测、可能性、假设来回答。
    3.所有回答必须基于确定、准确、可靠的知识。
    4.不允许编造事实或补充未经确认的信息。
  • 优点:零成本,简单易用,对所有模型都有效。

  • 缺点 :约束力有限,对于复杂或模型知识盲区的问题,它可能还是会"忍不住"编造,并且我们是想要它回答的...😭


Fine-Tuning - 从根本上改变它的知识

  • 是什么:用大量"高质量、高事实性、相关内容的"的数据对基础模型进行额外的训练,微调其参数。
  • 优点:能从模型内部提升其事实性和可靠性,效果比较根本。
  • 缺点:成本高昂(需要大量算力和高质量数据),过程复杂,而且无法教给模型它从未学过的知识(比如最新新闻)。

比曾经的AI六小虎,搜狗创始人王小川创立的百川智能已经不再推出通用大模型,转向医疗大模型,背后就是给大模型不断的 Fine-Tuning 医疗相关的数据。


RAG - 给它一本"参考答案",让它照本宣科

这是目前最流行、最有效且成本最低的方法。

  • 是什么检索增强生成。在让模型回答之前,先从一个你准备好的、可信的知识库(比如公司文档、产品手册、权威论文)里,搜索出与问题最相关的片段,然后把"问题+相关片段"一起交给模型,让它基于这些片段来组织答案。

  • 生活比喻:就像考试时,不允许学生自由发挥,而是发给他一本《标准答案汇编》,要求他所有的回答都必须引用这本汇编里的原话。

  • 如何工作:

    1. 准备知识库:把你的所有可靠资料(PDF、Word、网页等)处理成可搜索的格式。
    2. 用户提问:用户问:"我们产品的旗舰型号支持哪些AI功能?"
    3. 实时检索:系统立刻在你的产品手册知识库里搜索"旗舰型号"、"AI功能"等关键词,找到最相关的几段描述。
    4. 组合并回答:模型收到的指令实际上是:"请根据以下资料,回答用户的问题。资料:[检索到的产品手册原文]。 问题:我们产品的旗舰型号支持哪些AI功能?"
    5. 模型生成:模型会乖乖地基于你提供的资料,总结、复述生成答案,几乎不会编造。

检索增强生成

Retrieval-Augmented Generation

  • 解决思路:将外部知识库与LLM结合,通过检索获取相关信息,增强生成质量
  • 核心价值:降低幻觉、提供实时信息、支持私域知识

一个RAG系统的基本架构就是如下图所示,分为索引、检索、生成三个步骤,接下来我们娓娓道来

什么是向量?

想象一下,你正在教一个外星人理解地球语言。这个外星人不懂中文、英文,但它精通数学。你怎么向它解释"苹果"这个词的含义呢?

向量的神奇之处就在于:它把人类语言中模糊的、主观的语义概念,转换成了精确的、可计算的数学表示(最终形态是 一个固定长度的浮点数数组)。

把你的资料向量化

在RAG中便是将你所要构建的"知识"文本先切分成很多端的小块,然后将这些小块使用向量模型进行向量化,最后将文本块的向量和文本块同时存到向量数据库当中。

文本块向量和文本块是一种 key-value结构,所以后面我们找到了文本块向量也就找到了文本块。

1. 文本分块处理

  • 固定长度分块:按预设字符数均匀切分,适合格式规整的文档
  • 语义分块:基于句子边界和语义完整性进行智能分割
  • 重叠分块:在相邻分块间设置重叠区域,避免关键信息被割裂
  • 自定义分块:可根据段落、章节等文档结构进行灵活划分

2. 向量化编码

  • OpenAI的text-embedding-ada-002等系列

  • Google的BERT及其变体模型

  • Sentence-BERT等专用语义编码模型

  • 阿里云的text-embedding系列

  • 轻量级本地部署:

    • all-MiniLM-L6-v2等小型模型 (试过了,不好用别用,中小型公司乖乖用厂商的👀)
    • 针对中文优化的m3e等开源模型

3. 向量存储方案

  • Milvus(开源首选,强推,国产之光💪)

  • Pinecone(全托管服务)

  • Chroma(轻量易用)

  • 传统数据库扩展

    • ElasticSearch with 向量插件
    • PostgreSQL + pgvector扩展
    • Redis 向量搜索模块

检索向量化后的内容

那么将原始的文档转换为向量存储后,我们要怎么用呢?其实一个向量可以在一堆向量之间找出他的"哥们"。

举个🌰:假如全世界的人都面部信息是一个向量数据库,我们把周杰伦的脸看作一个向量,那么向量数据库就会很快给我们匹配出"周饼伦"。

那么我们想要从向量数据库里匹配出相似的内容,需要以下步骤

  • 将查询的内容也转换为向量
  • 计算查询向量与所有文档向量的相似度
  • 返回相似度最高的K个文本块(前面我们讲了向量和文本块是一种key-value结构,我们搜索到了向量,就找到文本块,这里向量起到的是一个索引的作用)

怎么计算相似度呢

计算向量相似度常用的算法有三种:分别是点积相似、余弦相似、欧氏距离

点积相似度

点积相似的计算方式很简单,就是两个向量对应位置的数值相乘,值越大就是越相似

css 复制代码
点积 = (A₁ × B₁) + (A₂ × B₂) + (A₃ × B₃) + ... + (Aₙ × Bₙ)  = Σ(Aᵢ × Bᵢ)  对于 i 从 1 到 n

余弦相似度

其实就是高中学的计算两个点与原点形成的夹角的余弦值 ,比如说已知平面内两个点 X (x 1,y 1) 和 Y (x 2,y2),我们就是要计算,这两个点与原点的连接线的夹角的余弦值,最终也是值越大的越相似。

公式如下:

css 复制代码
            A·B
cos(θ) = ---------------------------------------------
          |A| × |B|
​
其中:
A·B = 向量A和B的点积
|A| = 向量A的长度 = √(A₁² + A₂² + ... + Aₙ²)
|B| = 向量B的长度 = √(B₁² + B₂² + ... + Bₙ²)
​
举个🌰吧
​
假设:
向量A = (1, 2, 3)
向量B = (4, 5, 6)
​
计算步骤:
1. 点积 A·B = (1×4) + (2×5) + (3×6) = 4 + 10 + 18 = 32
2. 向量A长度 |A| = √(1² + 2² + 3²) = √(1 + 4 + 9) = √14 ≈ 3.74
3. 向量B长度 |B| = √(4² + 5² + 6²) = √(16 + 25 + 36) = √77 ≈ 8.77
4. 余弦相似度 = 32 / (3.74 × 8.77) ≈ 32 / 32.8 ≈ 0.975
​

欧氏距离

在语义空间中测量"直线距离",公式为:距离 = √[(A₁-B₁)² + (A₂-B₂)² + ... + (Aₙ-Bₙ)²]

三种方式的适用场景

余弦相似度:文本语义比较、文档检索排序、内容推荐系统(多数场景用的都是这个)

欧氏距离:空间位置测量、聚类分析、异常检测

点积相似度:快速初步筛选、计算资源有限场景(说白了,就是比较拉)

LLM 生成

好了,经历了上面流程我们基本知道了索引和检索的过程,那么经过检索匹配后的文档就会作为我们跟大模型交互的一部分,这样大模型就会根据我们推荐给它的文档进行思考回复,就避免"胡说八道"。

下面有一个完整的流程图,可以回顾一下~

RAG 实战案例

为了更深入的了解 RAG 我们就利用 Cherry Studio 这个工具搭建一个最简单的 RAG

第一步-注册一个阿里百炼的账号

为什么选择阿里百炼?其实现在的 LLM 差距并不大,我们选择哪家都可以,最主要的百炼平台上有向量模型,我们从上面取一份密钥就可以直接用 LLM 和向量模型啦,比较方便一点(也许腾讯云、百度飞桨、字节火山也会有,但是我并不知道......这个随意)

我们就直接创建一个API 复制就行了

第二步-打开Cherry Studio进行相关配置

首先,在模型服务中搜索到"阿里云百炼",然后填充好刚刚复制好的密钥,检测成功即可

然后点击最下方的添加按钮,添加向量模型:text-embedding-v4

第三步-添加知识库

创建知识库,配置向量模型

添加要向量化的文件或者目录的位置(我要演示的是 @CustomFilter 这个注解,所以就把有这个注解的MilvusPlus的源码添加进来了),

这整个过程对应的就是,之前讲的RAG系统中的索引流程

第四步-配置助手,体验知识库

首先我们先不给他配置知识库,体验一下他是否会"胡说八道"

确实在胡说八道了。。。。

现在编辑助手,给他安排上知识库看一下,完美撒花🎉

相关推荐
放羊郎2 小时前
一款基于鲁班猫和STM32的自主导航实践
人工智能·数码相机·slam·视觉slam·建图·激光slam
GoldenSpider.AI2 小时前
Muon 优化器:通过正交化动量矩阵革命性地加速 AI 大模型训练
人工智能·svd·muon·adamw
三条猫2 小时前
AI 大模型如何给 CAD 3D 模型“建立语义”?
人工智能·机器学习·3d·ai·大模型·cad
bst@微胖子2 小时前
ModelScope微调模型
人工智能·深度学习·bert
再__努力1点2 小时前
【11】特征检测与匹配:AKAZE特征算法详解与实现
人工智能·python·opencv·算法·计算机视觉·特征提取
逸风尊者3 小时前
开发需掌握的知识:高精地图
人工智能·后端·算法
alwaysuzybaiyy3 小时前
物联网定位技术实验报告|实验一 Wi-Fi指纹定位
网络·人工智能·物联网
taxunjishu3 小时前
Modbus RTU 转 Modbus TCP:物联网网关实现中药产线巴赫曼与三菱PLC互联
人工智能·物联网·tcp/ip·区块链·工业自动化
xier_ran3 小时前
深度学习:动量梯度下降实战(Momentum Gradient Descent)
人工智能·深度学习