RAG 入门指南:从零开始构建一个 RAG 系统

本文正文字数约 3300 字,阅读时间 10 分钟。

从零开始构建一个应用可以让我们快速理解应用的各个部分。

这个方法其实非常适用于 RAG。

我在以前的文章中有介绍过 RAG 的概念、原理以及应用等,但其实,亲自动手来构建一个 RAG 系统或许能够让我们更快速的理解 RAG 到底是什么。

本文将为读者提供一个从零开始搭建一个 RAG 应用的入门教程。

RAG 简介

在开始之前,我还是打算再次简要的介绍一下 RAG。

在 Meta 的官方 Blog 上有这样一段话:

Building a model that researches and contextualizes is more challenging, but it’s essential for future advancements. We recently made substantial progress in this realm with our Retrieval Augmented Generation (RAG) architecture, an end-to-end differentiable model that combines an information retrieval component (Facebook AI’s dense-passage retrieval system) with a seq2seq generator (our Bidirectional and Auto-Regressive Transformers BART model). RAG can be fine-tuned on knowledge-intensive downstream tasks to achieve state-of-the-art results compared with even the largest pretrained seq2seq language models. And unlike these pretrained models, RAG’s internal knowledge can be easily altered or even supplemented on the fly, enabling researchers and engineers to control what RAG knows and doesn’t know without wasting time or compute power retraining the entire model.

这段话主要讲述了一个新的模型架构,也就是 RAG (检索增强生成) 的重要性和优势。可以概括为以下几点:

  1. 1. 构建一个能够进行研究和上下文分析的模型虽然更具挑战性,但对未来的技术进步非常关键;

  2. 2. 通过在知识密集的下游任务上微调,RAG 可以实现最先进的结果,比现有的最大的预训练序列到序列语言模型还要好;

  3. 3. 与传统的预训练模型不同,RAG 的内部知识可以轻松地动态更改或补充。也就是说,研究人员和工程师可以控制 RAG 知道和不知道的内容,而不需要浪费时间或计算资源重新训练整个模型。

这段话信息量很大,但是作为初学者,简而言之:

RAG 的本质是在传递给 LLM 的提示语中,通过一个检索工具来添加自己的数据。

接下来,我们就要开始准备我们的 RAG 应用了。

RAG 系统的高层组件

  • • 一组文档,正式说法为语料库

  • • 用户输入

  • • 语料库和用户输入之间的相似性度量

这是简化版的 RAG 组件系统,我们不需要考虑向量存储,甚至目前还不需要 LLM。

以下是一篇 RAG 论文中的系统概述:

它假设了很多背景信息,比我们预设的简化版要复杂的多。

对于想要深入研究的人来说,这篇论文很有价值,但是对于我们想要入门的人来说,通过一步一步构建自己的 RAG 系统来学习才更适合。

RAG 系统的查询步骤

    1. 查询用户输入
    1. 进行相似性度量
    1. 对用户输入和检索到的文档进行后处理

这里的后处理即将检索到的文档和用户输入发送给 LLM 进行处理,最终生成回答。

相似性度量是指用来评估两个对象之间相似程度的方法。在文本处理和信息检索中,相似性度量可以帮助我们确定两个文本之间的相似度。在 RAG 系统中,我们可以使用这些相似性度量方法之一来比较用户输入和文档集合中的每个文档,从而找到最相关的文档。

从零开始构建 RAG 系统

现在,我们将以一个具体的案例从零开始来构建一个 RAG 系统。

以下是简化版的流程图。

以下是具体步骤。

获取文档集合

我们首先定义一个简单的文档语料库。

corpus_of_documents = [       "Take a leisurely walk in the park and enjoy the fresh air.",       "Visit a local museum and discover something new.",       "Attend a live music concert and feel the rhythm.",       "Go for a hike and admire the natural scenery.",       "Have a picnic with friends and share some laughs.",       "Explore a new cuisine by dining at an ethnic restaurant.",       "Take a yoga class and stretch your body and mind.",       "Join a local sports league and enjoy some friendly competition.",       "Attend a workshop or lecture on a topic you're interested in.",       "Visit an amusement park and ride the roller coasters."   ]

定义和执行相似性度量

现在我们需要一种方法来衡量我们将要接收的用户输入与我们组织的文档集合之间的相似性。

可以说,最简单的相似性度量是杰卡德相似性。

杰卡德相似性(Jaccard Similarity)是一种衡量两个集合相似程度的简单方法。它计算两个集合的交集和并集的比例,用于比较两个文本之间的相似性。简而言之就是,杰卡德相似性看两个集合中共同元素的数量占所有元素的总数量的比例。

对语料库进行预处理

由于我们需要进行相似性度量,所以需要将字符串处理成集合。

我们可以使用最简单的方式来进行预处理,也就是将字符串转换为小写并按照空格分割。

# 将语料库字符串按照空格分割,并返回杰卡德相似性的结果   def jaccard_similarity(query, document):       query = query.lower().split(" ")       document = document.lower().split(" ")       intersection = set(query).intersection(set(document))       union = set(query).union(set(document))       return len(intersection)/len(union)

然后,我们需要定义一个函数,该函数接受用户的精确查询和我们的语料库,并根据相似性的结果将最匹配的文档返回给用户。

def return_response(query, corpus):       similarities = []       for doc in corpus:           similarity = jaccard_similarity(user_input, doc)           similarities.append(similarity)       return corpus_of_documents[similarities.index(max(similarities))]

现在,我们可以试着运行一下。

定义用户查询输入。

user_input = "I like to hike"

将输出的结果打印出来。

print(return_response(user_input, corpus_of_documents))

如果不想在自己电脑上配置 Python 环境,可以直接使用线上的 Python 编辑器,比如:https://www.programiz.com/python-programming/online-compiler/

至此,我们已经构建出了一个最基本的 RAG 系统。

相似性问题

由于我们选择了一个非常简单的相似性度量方法来学习,所以会带来一些问题。

它没有语义概念,只是简单地看两个文档中有哪些词,然后进行对比。

也就是说,只要我们提供的用户输入里包含这些词,那么我们就会得到相同的结果,因为那就是最接近的文档。

比如,我将用户输入换成了 user_input = "I don't like to hike"

输出结果和上文的输出结果一样。

这是一个在 RAG 中会经常遇到的话题,我们会在后面解决这个问题。

目前,我们还没有对我们检索到的文档进行任何后处理。只是实现了 RAG 的「检索」功能。

下一步是通过结合 LLM 来增强生成。

添加 LLM

要方便快捷的添加 LLM,我们可以直接在本地机器上运行一个开源的 LLM。

这里,我将使用 Ollama 的 Llama 3.1 模型。当然,你也可以使用 OpenAI 的 GPT-4 或 Anthropic 的 Claude 或者其他 LLM。

可以到 ollama 官网下载安装自己想要的 LLM:https://ollama.com/

现在,我们需要对代码做些修改了。

如果是在本地运行 LLM,那么,你需要在自己电脑上配置好 Python 相关的环境,这样在后续步骤中,才能将代码运行起来。

现在,需要引入一些库。

import requests   import json

我们的步骤会有所变化:

  1. 1. 获取用户输入;

  2. 2. 获取最相似的文档(通过我们的相似性度量来衡量);

  3. 3. 将这个文档作为提示语传递给 LLM;

  4. 4. 最后将结果返回给用户。

user_input = "I like to hike"   relevant_document = return_response(user_input, corpus_of_documents)   full_response = []      prompt = """   You are a bot that makes recommendations for activities. You answer in very short sentences and do not include extra information.   This is the recommended activity: {relevant_document}   The user input is: {user_input}   Compile a recommendation to the user based on the recommended activity and the user input.   """

定义好以上步骤之后,我们现在来调用 Ollama 的 API。

在编辑此代码之前,你需要先运行 LLM 在后台,直接在命令行里输入 ollama serve 即可。

url = 'http://localhost:11434/api/generate'   data = {       "model": "llama3.1",       "prompt": prompt.format(user_input=user_input, relevant_document=relevant_document)   }   headers = {'Content-Type': 'application/json'}   response = requests.post(url, data=json.dumps(data), headers=headers, stream=True)   try:       count = 0       for line in response.iter_lines():           if line:               decoded_line = json.loads(line.decode('utf-8'))                              full_response.append(decoded_line['response'])   finally:       response.close()      print(''.join(full_response))

运行以上代码,即可看到结果。

现在我们已经从零开始构建了一个完整的 RAG 系统。

现在 LLM 就可以直接帮我们处理上文提到的相似性问题。如果把用户输入改成 I don't like to hike.,那么我们会得到以下这样的回答。

总结以及改进点

尽管我们已经搭建出了一个完整的 RAG 系统,但是,真实场景下的 RAG 系统也许会更加复杂,涉及向量数据库(Vector Database)、嵌入(Embedding)和提示语工程(Prompt Engineering)等。

如果想要更加深入的学习 RAG,你也许需要在此基础之上考虑以下的一些改进点。

    1. 文档数量:更多的文档可能意味着更多的推荐,目前,我们只给 LLM 提供一个文档。我们可以输入多个文档作为“上下文”,让模型根据用户输入提供更个性化的推荐。
    1. 文档的深度/大小:更高质量的内容和包含更多信息的长文档可能更好。
    1. 提供给 LLM 的文档部分:如果我们有更大或更全面的文档,我们可能只想添加这些文档的部分内容,或者多个文档的部分内容,或一些变体。在词汇中,这称为分块(chunking)。
    1. 文档存储工具:我们可能会以不同的方式或不同的数据库存储文档。特别是如果我们有大量文档,可能会考虑将它们存储在向量存储中。
    1. 相似性度量:我们如何衡量相似性是至关重要的,我们可能需要在性能和全面性之间权衡。
    1. 文档和用户输入的预处理:我们可以在将用户输入传递给相似性度量之前进行一些额外的预处理或增强。例如,我们可以使用嵌入将输入转换为向量。
    1. 提示语:我们可以对 LLM/模型使用不同的提示语,并根据我们想要的输出进行调整,以获得我们想要的结果。

你可以在我的 GitHub 上获取到本文所有代码:https://github.com/Erichain/ai-application-demos/blob/main/create-rag-from-scratch.py


如何系统的去学习大模型LLM ?

作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的 AI大模型资料 包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来

所有资料 ⚡️ ,朋友们如果有需要全套 《LLM大模型入门+进阶学习资源包》,扫码获取~

👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享]👈

在这里插入图片描述

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

在这里插入图片描述

四、AI大模型商业化落地方案

img

阶段1:AI大模型时代的基础理解
  • 目标:了解AI大模型的基本概念、发展历程和核心原理。
  • 内容
    • L1.1 人工智能简述与大模型起源
    • L1.2 大模型与通用人工智能
    • L1.3 GPT模型的发展历程
    • L1.4 模型工程
      - L1.4.1 知识大模型
      - L1.4.2 生产大模型
      - L1.4.3 模型工程方法论
      - L1.4.4 模型工程实践
    • L1.5 GPT应用案例
阶段2:AI大模型API应用开发工程
  • 目标:掌握AI大模型API的使用和开发,以及相关的编程技能。
  • 内容
    • L2.1 API接口
      - L2.1.1 OpenAI API接口
      - L2.1.2 Python接口接入
      - L2.1.3 BOT工具类框架
      - L2.1.4 代码示例
    • L2.2 Prompt框架
      - L2.2.1 什么是Prompt
      - L2.2.2 Prompt框架应用现状
      - L2.2.3 基于GPTAS的Prompt框架
      - L2.2.4 Prompt框架与Thought
      - L2.2.5 Prompt框架与提示词
    • L2.3 流水线工程
      - L2.3.1 流水线工程的概念
      - L2.3.2 流水线工程的优点
      - L2.3.3 流水线工程的应用
    • L2.4 总结与展望
阶段3:AI大模型应用架构实践
  • 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。
  • 内容
    • L3.1 Agent模型框架
      - L3.1.1 Agent模型框架的设计理念
      - L3.1.2 Agent模型框架的核心组件
      - L3.1.3 Agent模型框架的实现细节
    • L3.2 MetaGPT
      - L3.2.1 MetaGPT的基本概念
      - L3.2.2 MetaGPT的工作原理
      - L3.2.3 MetaGPT的应用场景
    • L3.3 ChatGLM
      - L3.3.1 ChatGLM的特点
      - L3.3.2 ChatGLM的开发环境
      - L3.3.3 ChatGLM的使用示例
    • L3.4 LLAMA
      - L3.4.1 LLAMA的特点
      - L3.4.2 LLAMA的开发环境
      - L3.4.3 LLAMA的使用示例
    • L3.5 其他大模型介绍
阶段4:AI大模型私有化部署
  • 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。
  • 内容
    • L4.1 模型私有化部署概述
    • L4.2 模型私有化部署的关键技术
    • L4.3 模型私有化部署的实施步骤
    • L4.4 模型私有化部署的应用场景
学习计划:
  • 阶段1:1-2个月,建立AI大模型的基础知识体系。
  • 阶段2:2-3个月,专注于API应用开发能力的提升。
  • 阶段3:3-4个月,深入实践AI大模型的应用架构和私有化部署。
  • 阶段4:4-5个月,专注于高级模型的应用和部署。
这份完整版的所有 ⚡️ 大模型 LLM 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

全套 《LLM大模型入门+进阶学习资源包↓↓↓ 获取~

👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享👈

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言指针详解(三)目录版

C语言指针详解(三)目录版 1、字符指针变量1.1、字符指针变量的一般应用1.2、常量字符串1.3、常量字符串与普通字符串的区别1.3.1 常量字符串的不可修改性1.3.2 常量字符串的存储 2、数组指针变量2.1、数组指针变量定义2.2、数组指针变量的初始化 3、二维…

图的DFS

LeetCode2368 受限条件下可到达节点的数目 class Solution { public:int dfs(vector<vector<int>>& g,int x,int fa){int sum1;for(int y:g[x]){if(y!fa) sumdfs(g,y,x);}return sum;}int reachableNodes(int n, vector<vector<int>>& edges, …

C语言指针(3)

目录 一、字符指针变量 二、数组指针变量 三、⼆维数组传参的本质 四、函数指针变量 五、typedef 关键字 六、函数指针数组 一、字符指针变量 字符指针char* &符号名 符号名&#xff0c;这都是获取的是首元素地址。 int main() {char a[] "abcdef";cha…

另一棵树的子树 - 力扣(LeetCode)C语言

572. 另一棵树的子树 - 力扣&#xff08;LeetCode&#xff09;&#xff08;点击前面链接即可查看题目&#xff09; 一、题目 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在&#xff0c;返回 true &#xff1b;否则&…

机器学习中的关键距离度量及其应用

引言 在当今的数据驱动世界中&#xff0c;机器学习算法扮演着至关重要的角色&#xff0c;它们在图像分类、面部识别、在线内容审核、零售目录优化和推荐系统等多个领域发挥着重要作用。这些算法的核心在于它们能够识别和利用数据之间的相似性。而实现这一点的关键&#xff0c;…

ShardingSphere 内核工作原理

文章目录 内核工作原理配置管控SQL Parser: SQL解析引擎SQL Router- SQL 路由引擎SQL Rewriter : SQL 优化引擎SQL Executor &#xff1a; SQL执行引擎Result Merger&#xff1a; 结果归并 内核工作原理 ShardingSphere的整体架构图是这样的&#xff1a; 配置管控 在进入Shar…

MySQL事务,锁,MVCC总结

mysql中最重要的就是事务&#xff0c;其四大特性让我们维持了数据的平衡&#xff0c;一致。那么事务究竟是什么&#xff0c;与什么相关&#xff0c;他的使用步骤&#xff0c;以及使用过程中我们会遇到什么问题呢&#xff1f;下面我们一起学习交流! 1.MySQL的存储引擎&#xff…

SPIFFS与LittleFS的对gz文件格式的区别

SPIFFS 只能安装在Arduino上。LittleFS支持Arduino IDE和VScode的 PlatformIO。 SPIFFS serveStatic: server.serveStatic("/", SPIFFS, "/") 负责提供 SPIFFS 文件系统中的文件。您可以在 SPIFFS 上放置 .gz 文件&#xff0c;并该方法将自动处理它们。 …

git cz代码提交规范,适用于node14以上

1.效果 3. 在项目中如何添加 3.1 安装(只提供npm安装方式)全局安装 commitizen npm i -D commitlint commitlint/config-conventional commitizen cz-git 3.2 配置模版 在项目的根目录下配置添加文件 commitlint.config.js 并写入如下代码 /** type {import(cz-git).UserCo…

C# 类型转换

隐式&#xff08;implicit&#xff09;类型转换 1.不丢失精度的转换 2.显示&#xff08;explicit&#xff09;类型的转换 有可能丢失精度的转换 使用convert转换 ToString方法&#xff1a;将数值类型转换成字符串型

PDF密码移除技巧: 五大 PDF 密码移除器

如果您想解密或删除 PDF 密码&#xff0c;该怎么办&#xff1f;PDF 是一种经常用于商业的格式&#xff0c;您可以在培训、教育和商业场合使用它。添加这些 PDF 文件的密码可以保护您的安全和隐私。因此&#xff0c;有很多 PDF 都用密码加密&#xff0c;当您想要查看这些 PDF 时…

吃透张宇1000题和660题,能保底100分吗?

暑假已经过一半了&#xff0c;很多人都在埋头做题&#xff0c;如果你选择的是1000题660题 一定要好好看这篇笔记&#xff01; 因为很多人做题做到现在&#xff0c;有点迷茫 主要的迷茫点有三个&#xff1a; 1、为什么1000题和660题也都做不少了&#xff0c;遇到新题&#x…

RS485 芯片SN65HVD72DR导致的死机问题调试

最近再一次栽倒在这颗RS485 芯片上了&#xff0c;硬件说这和芯片功耗有点高&#xff0c;要控下电源, 结果10次有9次程序死机&#xff01; 先上图&#xff0c;请各位高手看看&#xff0c;这电路有问题没有&#xff1f; 为什么我会说是RS485 芯片导致的死机&#xff1f;因为 只要…

ai自动配音工具

AI拟音大师&#xff0c;给你的无声视频添加生动而且同步的音效 &#x1f61d;文件夹是一种基于文本的视频到音频生成框架,可以生成高质量的音频,在语义上相关,并与输入视频时间同步。 下载地址&#xff1a;https://pan.quark.cn/s/5a2be1cc5551

被工信部认可的开源软件治理解决方案

近日&#xff0c;工信部网络安全产业发展中心正式发布了“2023年信息技术应用创新解决方案”&#xff0c;开源网安凭借“基于SCA技术开源软件治理解决方案”顺利入选&#xff0c;成为经工信部认可的优秀解决方案&#xff0c;这是开源网安连续两届荣获此荣誉。 工业和信息化部网…

基于强化学习的Deep-Qlearning网络玩cartpole游戏

1、环境准备&#xff0c;gym的版本为0.26.2 2、编写网络代码 # 导入必要的库 import gym import torch import torch.nn as nn import torch.optim as optim import numpy as np from collections import deque import random# 定义DQN网络 class DQN(nn.Module):def __init__…

基于web的购物网站的设计与实现(系统源码+lw+部署文档+讲解等)

文字目录&#xff1a; 目录 详细视频演示 系统实现界面 1.1系统开发环境以及运行环境 1.1.1系统开发环境 1.1.2系统运行环境 1.2系统功能实现 1.3管理员模块实现 2 技术介绍 2.1 thinkphp5介绍 2.2 MySQL数据库 2.3 B/S结构 4.1系统结构设计 4.2系统功能结构设计…

如何挑选理想的报表工具?从入门到专业,测评十大热门工具的优缺点

报表能够用表格和图表等格式动态显示数据&#xff0c;因此衍生出相应的报表工具&#xff0c;已经有20年以上的发展历史了&#xff0c;期间报表工具不断随着需求的改变而更新迭代&#xff0c;今天博主就来推荐十款实用的报表工具&#xff0c;祝你轻松解决烦人的中国式复杂报表。…

【MySQL进阶】MySQL主从复制

目录 MySQL主从复制 概念 主从形式 一主多从 多主一从 双主复制 主从级联复制 主从复制原理 三个线程 两个日志文件 主从复制的主要工作模式 异步复制 半同步复制 全同步复制 MySQL主从复制 概念 MySQL主从复制是一种数据分布机制&#xff0c;允许从一个数据库服…

32.x86游戏实战-使用物品call

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…