一文弄懂大模型RAG

什么是RAG,

顾名思义,通过检索外部数据,增强大模型生成效果。可以理解为让大模型先翻书,再回答问题,比如将公司内部的工作流程大模型肯定是不知道,但是我先将工作手册先给他看,当我再询问他就知道了

为什么要引入RAG

  1. 首先大模型会面临着幻觉的问题,比如他会将西游记的孙悟空引入到三国演义中的赤壁之战之中。会出现事实不符,逻辑混乱看似合理缺乏真实依据的现象。形成这一现象的原因训练数据有噪声。模型从海量数据中学习数据,然而数据本身有一些问题,比如网络谣言,架空小说等情况,还有个原因是概率优先,大模型本身是概率生成式模型,而非事实真实性。
  2. 大模型知识更新缓慢,比如你问deekseek最新的知识库是什么时候?他会回答是在2024年7月,那么在2024年7月之后的知识他就没法回答
  3. 大模型对领域知识理解有限,因为大模型在训练时候,是广度优先的,训练的数据覆盖全网公开文本。单领域内部的数据可能不会对外公开,而且分布稀疏
    总结: 所以RAG的引入初衷是增强大模型的事实性,时效性,减少幻觉而存在的。

RAG的流程

从上图可以看出RAG主要有三个部分,索引化,检索以及生成。

索引化:将文档切分成片段,再编码为向量,存储在向量数据库里。

检索:将问题向量化,在向量数据库中检索到与问题相似度最高的文本片段

生成:将用户提出的问题与检索出来的文本片段组装成提示词,抛向大模型,作为大模型的输入,让其组织语言生成最终的回答

代码实现(Python实现)

  • 第一步,申请阿里云百炼API KEY
  • 第二步,安装chromadb向量数据库

pip install chromadb

附带chromadb使用教程 zhuanlan.zhihu.com/p/680661442

  • 第三步,准备文档进行分割
python 复制代码
从 PDF 文件中(按指定页码)提取文字
def extract_text_from_pdf(filename, page_numbers=None):
    paragraphs = []
    full_text = ''
    for i, page_layout in enumerate(extract_pages(filename)):
        if page_numbers is not None and i not in page_numbers:
            continue
        for element in page_layout:
            if isinstance(element, LTTextContainer):
                full_text += element.get_text().replace("\n", "").replace(" ", "")
    if full_text:
        text_chunks = sliding_window_chunks(full_text, 250, 100)
        for text in text_chunks:
            paragraphs.append(text)
    return paragraphs

def sliding_window_chunks(text, chunk_size, stride):
    return [text[i:i + chunk_size] for i in range(0, len(text), stride)]
  • 第四步,使用chromadb向量数据库,封装获取向量和添加文档的操作
python 复制代码
class MyVectorDBConnector:
    def __init__(self):
        # 创建数据库的链接
        self.db = chromadb.Client()
        # 创建数据库
        self.collection = self.db.get_or_create_collection(name="demo")

    def get_embeddings(self, texts, model="text-embedding-v2"):
        '''封装 qwen 的 Embedding 模型接口'''
        data = client.embeddings.create(input=texts, model=model).data
        return [x.embedding for x in data]

    def add_documents(self, instructions):
        # 将数据向量化
        embeddings = self.get_embeddings(instructions)

        #把向量化的数据和原文存入向量数据库
        self.collection.add(
            embeddings=embeddings,  
            documents=instructions,  
            ids=[f"id{i}" for i in range(len(instructions))] 
        )

    '''检索向量数据库'''
    def search(self, query, n_results):
        results = self.collection.query(
            query_embeddings=self.get_embeddings([query]),
            n_results=n_results,
        )
        return results
  • 第五步,创建机器人对象,封装与大模型API交互的方法
ini 复制代码
class RAG_ROBOT():
    def __init__(self, vector_db, n_res):
        self.vector_db = vector_db
        self.n_res = n_res
    def get_completion(self, prompt, model="qwen-plus"):
        messages = [{"role": "user", "content": prompt}]
        response = client.chat.completions.create(
            model=model,
            messages=messages,
            temperature=0,
        )
        return response.choices[0].message.content

    def chat(self, queyr):
        # 1.检索
        search_Data = self.vector_db.search(queyr, self.n_res)
        # 2. 构建提示词
        prompt = prompt_template.replace('__INTRO__', '\n'.join(search_Data['documents'][0])).replace('__QUERY__', queyr)
        ret = self.get_completion(prompt)
        print('机器人回答:', ret)
  • 第六步,调用
ini 复制代码
if __name__ == '__main__':
    
    client = OpenAI(api_key="xxxxxx", #阿里云百炼API KEY
                    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1")
    prompt_template = """
            你是一个问答机器人,如果遇到无法回答的问题,请回复"我无法回答"。
            已知信息:
            __INTRO__
            用户问:
            __QUERY__
            请用中文回答用户问题。
            """

    page_data = extract_text_from_pdf('财务管理文档.pdf', page_numbers=[0, 1, 2])
    vector_db = MyVectorDBConnector()
    vector_db.add_documents(page_data)

    # 创建机器人对象
    rag_bot = RAG_ROBOT(vector_db, n_res=2)
    rag_bot.chat('财务管理权限划分')

以上代码仅供学习参考,上述"财务管理文档"没找到上传的地方。

相关推荐
HyperAI超神经1 分钟前
在线教程|DeepSeek-OCR 2公式/表格解析同步改善,以低视觉token成本实现近4%的性能跃迁
开发语言·人工智能·深度学习·神经网络·机器学习·ocr·创业创新
JoySSLLian14 分钟前
手把手教你安装免费SSL证书(附宝塔/Nginx/Apache配置教程)
网络·人工智能·网络协议·tcp/ip·nginx·apache·ssl
BestSongC16 分钟前
行人摔倒检测系统 - 前端文档(1)
前端·人工智能·目标检测
模型时代22 分钟前
Anthropic明确拒绝在Claude中加入广告功能
人工智能·microsoft
夕小瑶25 分钟前
OpenClaw、Moltbook爆火,算力如何48小时内扩到1900张卡
人工智能
一枕眠秋雨>o<28 分钟前
透视算力:cann-tools如何让AI性能调优从玄学走向科学
人工智能
那个村的李富贵41 分钟前
昇腾CANN跨行业实战:五大新领域AI落地案例深度解析
人工智能·aigc·cann
集简云-软件连接神器1 小时前
技术实战:集简云语聚AI实现小红书私信接入AI大模型全流程解析
人工智能·小红书·ai客服
松☆1 小时前
深入理解CANN:面向AI加速的异构计算架构
人工智能·架构
rainbow7242441 小时前
无基础学AI的入门核心,从基础工具和理论开始学
人工智能