引言
你有没有遇到过大模型胡言乱语?
你有没有遇到过大模型知识过时?
你有没有遇到过大模型缺乏专业领域数据?
…
相信答案是肯定的,今天我们要聊的RAG技术,就是在解决这些问题。
什么是RAG?
RAG,Retrieval-Augmented Generation,检索增强生成,检索增强生成模型结合了语言模型和信息检索技术。具体来说,当模型需要生成文本或者回答问题时,它会先从一个庞大的文档集合中检索出相关的信息,然后利用这些检索到的信息来指导文本的生成,从而提高预测的质量和准确性。
用最通俗的语言来讲,RAG技术,就是让大模型可以想像人类一样,先去查资料,然后再回答问题。我们举个例子。
我想让大模型介绍一下小编,但是大模型并不认识小编,所以大模型无法回答这个问题。好在小编入职的时候,他的简历是存在公司里的,这时候,将小编的简历输入到知识库,再让大模型介绍小编前,先在知识库(也就是一堆简历中)找到小编的信息,然后汇总整理后,告诉我小编是谁。
简而言之,RAG就是和大模型结合在一起,通过先检索(知识库),再生成(结果)的方式来完成内容生成的。
RAG的工作流程
我们还是从一个具体的例子开始,让大模型介绍小编(Silence)是谁?
基于这个例子,我们从用户角度和开发角度来阐述RAG,用户角度主要描述用户提出问题后,经过了什么,得到了准确答案。开发角度是指如何从0到1搭建一个RAG的demo。不同角度可能受众不同,大家根据自己的需求自行选择。
用户角度来看RAG的工作流程
-
• 用户向大模型提问:请介绍silence是谁? -
• 系统在知识库查找和“Silence“最接近的内容,比如系统查到”Silence很帅“,”Silence今年18岁“,”Silence博学善思“等。 -
• 系统将这些信息统统告诉大模型说,模型哥,silence是XXXX,用户问你”请介绍silence是谁“,你回答他吧。 -
• 大模型说”收到“,然后开始思考,嗯嗯嗯,ok,开始回答:silence怎么怎么滴。
这样,虽然大模型不认识silence,但是通过RAG技术提供的信息,大模型得到了关于silence的可靠信息,再结合大模型本身的能力,就能给用户一个满意的答案了。
接下来我们从开发的角度来看如何搭建一个RAG。
开发角度来看如何搭建RAG
从开发角度来描述,除了使用外,我们还会提到关于知识库简历的部分,最后会附上python代码,有代码经验的小伙伴可以自己搭建demo。
整体来看:创建知识库—>知识向量化—>知识检索—>生成prompt—>大模型生成—>得到结果
-
• 创建知识库:扫描本地的知识,将其处理成合适的数据。 -
• 知识向量化:大模型本质其实就是信息的相似度,但是自然语言是没办法去量化相似度的,因此需要对知识、文字都向量化,将其转换成向量,方便计算相似度。 这里介绍一下向量化,也就是embedding,embedding是NLP中的一个核心概念,他将文字变成数字向量,让机器理解语言之间的相似度,比如“hello”这个词,经过embedding处理后,可以变成一个768维的向量,“world”这个词,经过embedding后,也会变成一个768维的向量,向量里的数字保留了文字的特征,向量之间通过cos函数计算向量的关系,来判断文字之间的关系。
-
• 知识检索:当用户提出一个问题后,系统先将问题向量化,然后和知识库的向量去做比对,找到最相似的相关信息。用户问“请介绍silence”,系统对这句话进行向量化处理,然后与知识库的向量求相似度,例如cos函数求相似度,得到最相似的知识,例如“silence很帅,很有才”等。 -
• 生成prompt:大模型的输出是需要提示词的,也就是prompt,其实知识检索的结果就是生成更多更完善的提示词和背景信息,将其输入给大模型。原本用户提问是“请介绍silence”,经过了一番操作,输入给大模型的问题成了“silence很帅很有才,silenceXXXX”“请介绍silecne”。 -
• 大模型生成:大模型基于用户的问题,和知识检索得到的信息,生成内容。 -
• 得到答案:finish~
附上python的代码(本文demo使用了ollama,大模型和embedding都下载到了本地,大模型使用了deepseek-r1:1.5b):
import numpy as np
from ollama import embeddings, chat, Message
# 1.创建一个知识库
class Kb:
def __init__(self,filepath):
with open(filepath, 'r', encoding='utf-8') as f:
content = f.read()
self.docs = self.split_content(content) # 文本完成切分,并赋值给self.docs
self.embeds = self.encode(self.docs) # 得到了每段文本的向量
@staticmethod
def split_content(content, max_length=80): # 文本切分,分成了50长度的文本
chunks = []
for i in range(0, len(content), max_length):
chunks.append(content[i:i+max_length])
return chunks
@staticmethod
def encode(texts): # 将文本列表转成嵌入向量,并通过numpy返回数组
embeds = []
for text in texts:
response = embeddings(model='mxbai-embed-large', prompt=text)
embeds.append(response['embedding'])
return np.array(embeds)
@staticmethod
def similarity(A, B): # 计算余弦相似度
dot_product = np.dot(A, B)
norm_A = np.linalg.norm(A)
norm_B = np.linalg.norm(B)
cosine_sim = dot_product / (norm_A * norm_B)
return cosine_sim
def search(self, text):
max_similarity = 0
max_similarity_index = 0
e = self.encode([text])[0]
for idx, te in enumerate(self.embeds):
similarity = self.similarity(e, te)
if similarity > max_similarity:
max_similarity = similarity
max_similarity_index = idx
return self.docs[max_similarity_index]
class Rag:
def __init__ (self, model, kb: Kb):
self.model = model
self.kb = kb
self.prompt_template = """
基于:%s
回答:%s
"""
def chat(self, text):
# 1.先在知识库里面寻找相关信息
context = self.kb.search(text)
# 2.将context拼接到prompt里面
prompt = self.prompt_template % (context, text)
response = chat(self.model, [Message(role='system', content=prompt)])
return response['message']
rag = Rag(model='deepseek-r1', kb=Kb('知识库.txt'))
while True:
q = input('Human: ')
r = rag.chat(q)
print('Assistant: ',r['content'])
RAG的效果体验
为了方便大家直观的理解RAG带来的不同,我们以“请介绍silence是谁”为问题让AI回答,第一次,在知识库中没有“silence”相关的信息,第二次,在知识库中保留“silence”的信息:
第一次:没有RAG

第二次:有RAG

RAG的优势
-
• 动态更新知识,打破模型“记忆固化”: -
• 传统模型的困境:GPT等模型的训练数据截止于某个时间点(例如2023年1月),无法自动获取新知识。若想更新知识,必须耗费巨资重新训练模型,成本高达数百万美元。 -
• RAG的突破:通过外接实时更新的知识库(如企业数据库、行业报告、新闻网站),RAG能动态检索最新信息。例如,当用户询问“2024年奥运会奖牌榜”时,RAG会优先从联网数据中提取结果,而非依赖模型过时的记忆。 -
• 案例:彭博社使用RAG搭建金融问答系统,实时整合股票行情、财报数据,回答准确率提升40%。
-
-
• 大幅降低“幻觉”,让AI回答更可信 -
• 传统模型的“脑补”风险:大模型在缺乏相关知识时,倾向于生成看似合理实则错误的答案(如捏造历史事件细节)。 -
• RAG的约束机制:通过强制模型基于检索到的证据生成答案,RAG可将幻觉率降低50%以上(Google DeepMind 2023年实验数据)。例如医疗场景中,RAG会严格引用权威医学指南内容,而非自由发挥。 -
• 行业影响:法律咨询领域,RAG系统需标注答案出处(如某法律条款第几条),显著提升专业可信度。
-
-
• 低成本赋能垂直领域,告别“通用模型不专业”
传统方案的局限性:训练一个专业领域模型(如石油勘探)需要标注海量数据,中小企业难以承担。-
• RAG的轻量化改造:只需为通用大模型(如Llama 2)接入行业知识库(如地质勘探报告、设备手册),即可快速构建专业工具。 -
• 典型案例:制造业:西门子用RAG搭建设备维修助手,5天内对接20万页技术文档,故障诊断响应时间缩短70%。
-
-
• 数据隐私与安全的双重保障 -
• 传统云服务的风险:用户提问若直接输入通用模型,可能泄露敏感信息(如企业内部数据)。 -
• RAG的本地化部署:企业可将知识库存储在私有服务器,确保数据不出内网。例如医院部署的RAG系统,患者病历仅限本地检索,生成答案时自动脱敏。
-
RAG的挑战
尽管RAG展现出巨大潜力,但其技术成熟度仍面临关键挑战,未来突破将集中在以下方向:
-
• “垃圾进,垃圾出”:数据质量决定天花板:若知识库存在错误或冗余信息(如矛盾的市场报告),RAG可能检索到错误证据并生成误导性答案。2023年MIT实验显示,当检索文档包含30%噪声数据时,RAG准确率下降超60%。 -
• 长文本处理的“注意力涣散”问题:当检索到上百页文档时,大模型可能因上下文长度限制,无法有效提取关键信息。例如,对一份50页的合同进行风险点分析,RAG可能遗漏后半部分的关键条款。 -
• 实时检索的效率与成本平衡:毫秒级响应场景(如高频金融交易咨询)中,RAG需在检索速度(调用向量数据库)与计算资源消耗间取得平衡。当前主流方案延迟约200-500ms,难以满足超低延时需求。
原创文章,作者:王得宇AIPM,如若转载,请注明出处:https://www.pmtemple.com/silence/17592/