LLM火了这么长时间,RAG、mcp、embedding等技术名词也出现在了日常的公众号文章中,你有了解过这些技术吗?
大模型出现幻觉啦
你可以把大模型想象成:一个知识渊博、口才极佳的"大忽悠"。
这个"大忽悠"脑子里装了海量的知识,所以跟你聊天时总是侃侃而谈,听起来非常有道理。但问题是,他有一种"无法忍受沉默和不知道"的强迫症 。当你问到一个他不知道或者他记忆模糊的事情时,他不会说"我不知道",而是会基于他已有的知识"脑补"出一段听起来极其合理、但完全是编造的内容,并且用非常自信、肯定的语气告诉你。
这就是大模型的"幻觉",学术上常称为"胡言乱语"或"虚构"。它指大模型生成的内容在事实层面是错误的、不存在的,但形式上却非常连贯、可信。
比如~我的代码里有一个名为@CustomFilter注解,这个注解大模型肯定不知道吧....下面是大模型的回答,我搜了下 Mybatis-Plus 并没有这个注解。

让大模型别"胡说八道"
如何不让大模型胡说八道呢?看一下下面这些方式吧,其中 RAG 将会是我们这篇文章讲述的重点。
Prompt - 在提问时给它立规矩
通过精心设计你的提问方式,来约束模型的行为。
-
是什么:在提问的指令中,明确告诉模型"必须基于已知事实"、"如果不知道就明确说不知道"、"禁止虚构信息"。
-
举例:提示词如下,大模型也给出了"不知道"的回答
1.不确定、不清楚、无法确认的内容,一律回答:不知道。 2.不能根据猜测、可能性、假设来回答。 3.所有回答必须基于确定、准确、可靠的知识。 4.不允许编造事实或补充未经确认的信息。
-
优点:零成本,简单易用,对所有模型都有效。
-
缺点 :约束力有限,对于复杂或模型知识盲区的问题,它可能还是会"忍不住"编造,并且我们是想要它回答的...😭
Fine-Tuning - 从根本上改变它的知识
- 是什么:用大量"高质量、高事实性、相关内容的"的数据对基础模型进行额外的训练,微调其参数。
- 优点:能从模型内部提升其事实性和可靠性,效果比较根本。
- 缺点:成本高昂(需要大量算力和高质量数据),过程复杂,而且无法教给模型它从未学过的知识(比如最新新闻)。
比曾经的AI六小虎,搜狗创始人王小川创立的百川智能已经不再推出通用大模型,转向医疗大模型,背后就是给大模型不断的 Fine-Tuning 医疗相关的数据。

RAG - 给它一本"参考答案",让它照本宣科
这是目前最流行、最有效且成本最低的方法。
-
是什么 :检索增强生成。在让模型回答之前,先从一个你准备好的、可信的知识库(比如公司文档、产品手册、权威论文)里,搜索出与问题最相关的片段,然后把"问题+相关片段"一起交给模型,让它基于这些片段来组织答案。
-
生活比喻:就像考试时,不允许学生自由发挥,而是发给他一本《标准答案汇编》,要求他所有的回答都必须引用这本汇编里的原话。
-
如何工作:
- 准备知识库:把你的所有可靠资料(PDF、Word、网页等)处理成可搜索的格式。
- 用户提问:用户问:"我们产品的旗舰型号支持哪些AI功能?"
- 实时检索:系统立刻在你的产品手册知识库里搜索"旗舰型号"、"AI功能"等关键词,找到最相关的几段描述。
- 组合并回答:模型收到的指令实际上是:"请根据以下资料,回答用户的问题。资料:[检索到的产品手册原文]。 问题:我们产品的旗舰型号支持哪些AI功能?"
- 模型生成:模型会乖乖地基于你提供的资料,总结、复述生成答案,几乎不会编造。
检索增强生成
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系统中的索引流程

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

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

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