Tiny-universe手戳大模型TinyRAG--task4

news2024/11/15 5:40:13

TinyRAG

这个模型是基于RAG的一个简化版本,我们称之为Tiny-RAG。Tiny-RAG是一个基于RAG的简化版本,它只包含了RAG的核心功能,即Retrieval和Generation。Tiny-RAG的目的是为了帮助大家更好的理解RAG模型的原理和实现。

1. RAG 介绍

LLM会产生误导性的 “幻觉”,依赖的信息可能过时,处理特定知识时效率不高,缺乏专业领域的深度洞察,同时在推理能力上也有所欠缺。

正是在这样的背景下,检索增强生成技术(Retrieval-Augmented Generation,RAG)应时而生,成为 AI 时代的一大趋势。

RAG 通过在语言模型生成答案之前,先从广泛的文档数据库中检索相关信息,然后利用这些信息来引导生成过程,极大地提升了内容的准确性和相关性。RAG 有效地缓解了幻觉问题,提高了知识更新的速度,并增强了内容生成的可追溯性,使得大型语言模型在实际应用中变得更加实用和可信。

RAG的基本结构有哪些呢?

  • 要有一个向量化模块,用来将文档片段向量化。
  • 要有一个文档加载和切分的模块,用来加载文档并切分成文档片段。
  • 要有一个数据库来存放文档片段和对应的向量表示。
  • 要有一个检索模块,用来根据 Query (问题)检索相关的文档片段。
  • 要有一个大模型模块,用来根据检索出来的文档回答用户的问题。

在这里插入图片描述

RAG 的流程是什么样的呢?

  • 索引:将文档库分割成较短的 Chunk,并通过编码器构建向量索引。
  • 检索:根据问题和 chunks 的相似度检索相关文档片段。
  • 生成:以检索到的上下文为条件,生成问题的回答。

在这里插入图片描述

2. 向量化

首先让我们来动手实现一个向量化的类,这是RAG架构的基础。向量化的类主要是用来将文档片段向量化,将一段文本映射为一个向量。
那首先我们要设置一个 Embedding 基类,这样我们再用其他的模型的时候,只需要继承这个基类,然后在此基础上进行修改即可,方便代码扩展。

class BaseEmbeddings:
    """
    Base class for embeddings
    """
    def __init__(self, path: str, is_api: bool) -> None:
        self.path = path
        self.is_api = is_api
    
    def get_embedding(self, text: str, model: str) -> List[float]:
        raise NotImplementedError
    
    @classmethod
    def cosine_similarity(cls, vector1: List[float], vector2: List[float]) -> float:
        """
        calculate cosine similarity between two vectors
        """
        dot_product = np.dot(vector1, vector2)
        magnitude = np.linalg.norm(vector1) * np.linalg.norm(vector2)
        if not magnitude:
            return 0
        return dot_product / magnitude

3. 文档加载和切分

接下来我们来实现一个文档加载和切分的类,这个类主要是用来加载文档并切分成文档片段。按 Token 的长度来切分文档。我们可以设置一个最大的 Token 长度,然后根据这个最大的 Token 长度来切分文档。这样切分出来的文档片段就是一个一个的差不多相同长度的文档片段了。在切分的时候要注意,片段与片段之间最好要有一些重叠的内容,这样才能保证检索的时候能够检索到相关的文档片段。还有就是切分文档的时候最好以句子为单位,也就是按 \n 进行粗切分,这样可以基本保证句子内容是完整的。

def get_chunk(cls, text: str, max_token_len: int = 600, cover_content: int = 150):
    chunk_text = []

    curr_len = 0
    curr_chunk = ''

    lines = text.split('\n')  # 假设以换行符分割文本为行

    for line in lines:
        line = line.replace(' ', '')
        line_len = len(enc.encode(line))
        if line_len > max_token_len:
            print('warning line_len = ', line_len)
        if curr_len + line_len <= max_token_len:
            curr_chunk += line
            curr_chunk += '\n'
            curr_len += line_len
            curr_len += 1
        else:
            chunk_text.append(curr_chunk)
            curr_chunk = curr_chunk[-cover_content:]+line
            curr_len = line_len + cover_content

    if curr_chunk:
        chunk_text.append(curr_chunk)

    return chunk_text

4. 数据库 && 向量检索

一个数据库对于最小RAG架构来说,需要实现几个功能呢?

  • persist:数据库持久化,本地保存
  • load_vector:从本地加载数据库
  • get_vector:获得文档的向量表示
  • query:根据问题检索相关的文档片段

嗯嗯,以上四个模块就是一个最小的RAG结构数据库需要实现的功能

class VectorStore:
    def __init__(self, document: List[str] = ['']) -> None:
        self.document = document

    def get_vector(self, EmbeddingModel: BaseEmbeddings) -> List[List[float]]:
        # 获得文档的向量表示
        pass

    def persist(self, path: str = 'storage'):
        # 数据库持久化,本地保存
        pass

    def load_vector(self, path: str = 'storage'):
        # 从本地加载数据库
        pass

    def query(self, query: str, EmbeddingModel: BaseEmbeddings, k: int = 1) -> List[str]:
        # 根据问题检索相关的文档片段
        pass

那让我们来看一下, query 方法具体是怎么实现的呢?

首先先把用户提出的问题向量化,然后去数据库中检索相关的文档片段,最后返回检索到的文档片段。可以看到咱们在向量检索的时候仅使用 Numpy 进行加速,代码非常容易理解和修改。

def query(self, query: str, EmbeddingModel: BaseEmbeddings, k: int = 1) -> List[str]:
    query_vector = EmbeddingModel.get_embedding(query)
    result = np.array([self.get_similarity(query_vector, vector)
                        for vector in self.vectors])
    return np.array(self.document)[result.argsort()[-k:][::-1]].tolist()

5. 大模型模块

那就来到了最后一个模块了,大模型模块。这个模块主要是用来根据检索出来的文档回答用户的问题。

一样的,我们还是先实现一个基类,这样我们在遇到其他的自己感兴趣的模型就可以快速的扩展了。

class BaseModel:
    def __init__(self, path: str = '') -> None:
        self.path = path

    def chat(self, prompt: str, history: List[dict], content: str) -> str:
        pass

    def load_model(self):
        pass

BaseModel 包含了两个方法,chatload_model,如果使用API模型,比如OpenAI的话,那就不需要load_model方法,如果你要本地化运行的话,那还是会选择使用开源模型,那就需要load_model方法发啦。

6. 训练结果

在这里插入图片描述调包在这里插入图片描述加载模型在这里插入图片描述
最后结果

7. 总结

检索增强生成技术(RAG)旨在解决大型语言模型(LLM)存在的误导性、信息过时、知识处理效率低和推理能力不足等问题。该技术通过引入一个额外的检索步骤,在生成答案之前先从文档数据库中检索相关信息,以此提高内容的准确性和相关性。RAG的基本结构包含向量化模块、文档加载与切分模块、数据库存储、检索模块以及大模型生成模块。其核心流程分为索引构建、相关文档检索和基于检索内容的答案生成三个阶段。
为了实现RAG,需要开发能够加载并合理切分文档的类,以及将文本片段转换为向量的向量化类。同时,还需要构建一个数据库,用于存储文档片段及其向量表示,并支持向量的持久化存储、加载、检索等功能。在检索过程中,query方法负责将用户问题向量化,并在数据库中查找最相关的文档片段,为后续的答案生成提供有力支持。通过这些模块和流程的协同工作,RAG能够显著提升语言模型在实际应用中的实用性和可信度。

8. 参考文献

  • When Large Language Models Meet Vector Databases: A Survey
  • Retrieval-Augmented Generation for Large Language Models: A Survey
  • Learning to Filter Context for Retrieval-Augmented Generation
  • In-Context Retrieval-Augmented Language Models
  • https://github.com/datawhalechina/tiny-universe/tree/main/content/TinyRAG

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2185435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux中的进程间通信之共享内存

共享内存 共享内存示意图 共享内存数据结构 struct shmid_ds {struct ipc_perm shm_perm; /* operation perms */int shm_segsz; /* size of segment (bytes) */__kernel_time_t shm_atime; /* last attach time */__kernel_time_t shm_dtime; /* last detach time */__kerne…

OpenGL笔记之事件驱动设计将相机控制类和应用程序类分离

OpenGL笔记之事件驱动设计将相机控制类和应用程序类分离 —— 2024-10-02 下午 code review! 文章目录 OpenGL笔记之事件驱动设计将相机控制类和应用程序类分离1.代码图片2.分析3.UML4.代码 1.代码图片 运行 Mouse button 1 pressed at (100, 200) Mouse dragged by (50, 50)…

老年人最真实的养老需求

子孝父心宽。&#xff08;陈元靓&#xff09; 向往的养老胜地 下文节选(有删改&#xff09;&#xff1a; 中消协发布报告 揭示老年人最真实的养老服务需求 主页&#xff1a; 博客 文章目录 前言1. 需求端1.1 居家养老更关注家政餐饮等“日常所需”1.2 机构养老的需求重在“医…

猫咪尿闭的症状有哪些?适合尿闭猫咪的猫罐头盘点

刚开始养猫的时候只喂猫粮&#xff0c;也没督促孩子喝水&#xff0c;也没喂猫罐头&#xff0c;结果猫咪尿闭了&#xff0c;每次上厕所都在惨叫&#xff0c;完全无法排尿。带去医院治疗&#xff0c;前前后后总共花了8000&#xff0c;真实花钱买教训。我总结了一下猫咪尿闭时会出…

kettle从入门到精通 第八十九课 ETL之kettle kettle jms activemq使用教程

场景&#xff1a;群里有小伙伴求助jms activemq如何使用kettle 进行消费数据&#xff0c;之前连接过kafka&#xff0c;rabbtimq&#xff0c;想着activemq应该也没啥难度&#xff0c;结果低估了activemq。盘他&#xff01;&#xff01;&#xff01; 插曲&#xff1a;ActiveMq 有…

SQL连接Python

对于运营部门的Yoyo来说&#xff0c;她想要知道夜曲优选的订单都来自哪些省份&#xff0c;每个省份的总订单数以及总订单金额分别是多少。 这时小鹿就会通过SQL对连接的数据库进行查询&#xff0c;再将结果传递给Python处理&#xff0c;并帮助Yoyo生成可视化图表。 我们先来快…

工程师 - Github文件访问加速

如果是下载单独的又比较大的Github上的文件&#xff0c;网速较差时&#xff0c;可以使用镜像网站&#xff0c;比如下面这个工具。 GitHub 文件加速 - Sonder (akams.cn) GitHub 文件加速 - Sonder 另外&#xff0c;也可以在搜索引擎里直接搜索“Github 文件加速”&#xff0c;…

MySQL高阶2041-面试中被录取的候选人

目录 题目 准备数据 分析数据 总结 题目 编写解决方案&#xff0c;找出 至少有两年 工作经验、且面试分数之和 严格大于 15 的候选人的 ID 。 可以以 任何顺序 返回结果表。 准备数据 Create table If Not Exists Candidates (candidate_id int, name varchar(30), yea…

检索增强生成(RAG)有什么好的优化方案?

RAG&#xff08;检索增强生成&#xff09;是一种结合了信息检索和内容生成的技术&#xff0c;常用于提升人工智能回答问题的准确性和相关性。本文将RAG的优化分为两个主要方向进行介绍&#xff1a;基础功能优化和架构优化。 一、RAG基础功能优化 基础功能优化主要是对RAG的每个…

以太网交换安全:端口安全

一、端口安全介绍 端口安全是一种网络设备防护措施&#xff0c;通过将接口学习到的动态MAC地址转换为安全MAC地址&#xff08;包括安全动态MAC和Sticky MAC&#xff09;&#xff0c;阻止除安全MAC和静态MAC之外的主机通过本接口和设备通信&#xff0c;从而增强设备的安全性。以…

计组复习笔记

计组笔记 汇编部分 通用寄存器&#xff08;General Registers&#xff09;: AX (Accumulator): 用于累加运算&#xff0c;也是乘法和除法的默认寄存器。BX (Base Register): 可以用作一个基址寄存器&#xff0c;通常用于存放数据的基地址。CX (Counter Register): 通常用于循环…

Lab3 【哈工大_操作系统】系统调用

本节将更新哈工大《操作系统》课程第三个 Lab 实验 系统调用。按照实验书要求&#xff0c;介绍了非常详细的实验操作流程&#xff0c;并提供了超级无敌详细的代码注释。文末附完整标准答案代码&#xff0c;包括系统调用实现 who.c 和测试函数 iam.c、whoami.c 以及超详细注释。…

mac M2安装单机版 MongoDB 7.x

1. 通过tgz包安装MongoDB 1.1 下载并解压缩安装包 官网下载 mac OS 的 MongoDB 安装包&#xff0c;这里选择7.x版本进行安装&#xff08;下载链接&#xff09; 下载好的tgz包&#xff0c;双击解压缩&#xff0c;并重命名为mongdb 将安装包拷贝到安装目录&#xff0c;笔者的…

深入解析开源大模型的GPU资源需求与优化策略

随着大模型的火热很多项目中都使用到了开源大模型&#xff0c;这时候准确评估大模型的GPU资源非常重要&#xff0c;主要有下面几个方面 成本效率&#xff1a;GPU是昂贵的资源。高估内存需求可能导致在硬件上的不必要支出&#xff0c;而低估则可能导致系统故障或性能下降。 性…

【数据结构】什么是红黑树(Red Black Tree)?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;红黑树的概念 &#x1f4cc;红黑树的操作 &#x1f38f;红黑树的插入操作 &#x1f38f;红黑树的删除操作 结语 &#x1f4cc;红黑树的概念 我们之前学过了…

资源《Arduino 扩展板3-WS2812》说明。

资源链接&#xff1a; Arduino 扩展板3-WS2812 1.文件明细&#xff1a; 2.文件内容说明 包含&#xff1a;AD工程、原理图、PCB。 3.内容展示 4.简述 该文件为PCB工程&#xff0c;采用AD做的。 该文件打板后配合Arduino使用&#xff0c;属于Arduino的扩展板。 该文件主要…

通义千问“百宝箱”:效率神器,解放你的双手!

你在为播客转文字、音视频转写和长文本阅读而烦恼吗&#xff1f;今天&#xff0c;就让通义千问的“百宝箱”来帮你解决这些难题&#xff01; 最近&#xff0c;我发现通义千问首页隐藏着一个效率神器——“百宝箱”&#xff08;现在更名为工具箱&#xff09;&#xff0c;简直是…

batch和momentum

&#x1f680; 机器学习系列前期回顾 1、初识机器学习 2、线性模型到神经网络 3、local minima的问题如何解决 &#x1f680;在初识机器学习中&#xff0c;了解了机器学习是如何工作的并引入了线性模型&#xff0c;在线性模型到神经网络这节&#xff0c;将线性模型进一步改进为…

FireRedTTS - 小红书最新开源AI语音克隆合成系统 免训练一键音频克隆 本地一键整合包下载

小红书技术团队FireRed最近推出了一款名为FireRedTTS的先进语音合成系统&#xff0c;该系统能够基于少量参考音频快速模仿任意音色和说话风格&#xff0c;实现独特的音频内容创造。 FireRedTTS 只需要给定文本和几秒钟参考音频&#xff0c;无需训练&#xff0c;就可模仿任意音色…

【Golang】关于Go语言字符串转换strconv

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…