5min了解RAG,真的非常非常简单

引言

你有没有遇到过大模型胡言乱语?
你有没有遇到过大模型知识过时?
你有没有遇到过大模型缺乏专业领域数据?

相信答案是肯定的,今天我们要聊的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

5min了解RAG,真的非常非常简单
因为知识库中完全没有silence,所以大模型很懵的一通思考给出了让人匪夷所思的答案,其实这里有问题,因为知识库搜索不到silence,这时候大模型就不应该在使用知识库了,不过因为只是简单的demo,这里并没有做这些处理,大家注意。

第二次:有RAG

5min了解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/

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年4月21日 下午1:00
下一篇 2025年5月27日 上午11:05

相关推荐

发表回复

登录后才能评论
微信公众号
微信公众号
edgesensor_high 小程序
小程序
分享本页
返回顶部