什么是RAG? LangChain的RAG实践!

1. 什么是RAG

RAG的概念最先在2020年由Facebook的研究人员在论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》中提出来。在这篇论文中他们提出了两种记忆类型:

  • 基于预训练模型(当时LLM的概念不像现在这么如日中天,但LLM也可以被归类为预训练模型)的参数型记忆;
  • 基于向量的非参数型记忆。

RAG技术将这两种记忆类型进行了整合,最终,在知识密集型的NLP任务上,比如QA,比单独使用上述两种类型的记忆获得了更好的效果。接下来将具体介绍RAG如何来补充LLM的一些短板,以及在两种记忆的具体体现,并使用LangChain来实现基本RAG流程。

2. LLM面临的挑战和RAG带来的好处

目前来看,LLM是几乎是解决各个任务的最佳解决方案。在通用聊天这一领域,很多大模型都能够实现接近人类的水平表现。但它的表现也不是完美,也存在着诸多不足:

  • 在没有答案的情况下提供虚假的信息(幻觉);
  • 在专业领域表现不足,无法给出回答,这和大模型使用的训练数据息息相关,很多领域的数据是相对粉封闭的;
  • 对于同样的问题可能会产生不同的回答,这在对问题答案稳定性要求高的领域是不能接受的;
  • 无法感知不断变化的知识。

可以把大模型比做一个刚毕业找到工作的大学生,他具备了很多通识性的知识,但对组织内部的专业知识知之甚少,因此需要尽快掌握组织内部的领域知识,可以让资深员工手把手的传输知识,也可以通过阅读组织内的文档吸收知识。与此类似,RAG通过问题匹配知识,并将知识带给大模型,再利用大模型出色的生成能力来回答问题,这样大模型这个“新人”就能变得专业,也能感知到不断变化的外部信息。

3. LangChain的RAG实践

在本节,我们将重点利用LangChain框架来进行RAG实践

3.1 RAG架构

典型的RAG架构与搜索引擎的架构类型,分为离线和在线部分,其中离线部分是对数据进行索引,这里的索引和传统的搜索引擎的倒排索引不同,这里的索引是对数据的向量化,如图(来自LangChain官网)

image.png

从图中我们可以清晰的看到,在离线索引阶段,总共有4个主要的步骤:

  1. 加载内容,非结构化数据通常需要提取内容,比如从word文档、pdf文档中提取文本内容;
  2. 内容分块,将提取的内容进一步切分为小块(chunk),这样在匹配问题时可以将上下文缩减到很小;
  3. 对于每个分块的内容获取其向量(embedding),这个获取向量的过程可以借助大模型本身的能力来实现,例如,gpt就提供了embedding的接口;
  4. 存储向量,将获取的向量通过向量数据库存储起来,方便查询。

这里最终存储的结果就是论文中提出的基于向量的非参数化的记忆。 接下来我们再来看在线(检索和生成)的部分,如图(来自LangChain官网)

image.png

在Question到大模型这条链路中,增加了Retrieve这个步骤。用户的问题被embedding后,会在向量库中匹配出最佳的内容,并和用户的问题一起,构成Prompt交给大模型,大模型根据这个Prompt再生成对应的答案返回给用户。除了第二节中提到的RAG带来的好处,这里还有一个工程层面的优势,通过Retrieve找到与问题最相关的知识,从而减少了上下文,压缩了Prompt的token数量。

上面两部分构成了RAG的基本架构,下面我们将使用LangChain来完整的实现一个RAG原型。

3.2 基于LangChain的RAG实现

为了方便我们对比效果,我们首先先实现一个直接将问题抛给大模型的流程,代码如下:

ini
复制代码
from langchain_community.llms import LlamaCpp
# 加载本地模型文件地址,使用mixtral-8*7B的大模型
model_home = "~/models/mixtral-8x7b-instruct-v0.1.Q8_0.gguf"
# 使用llm_model作为加载框架
llm_model = LlamaCpp(model_path=model_home)
prompt = "孙悟空几打白骨精?"
print(llm_model.invoke(prompt))

这里,我使用的是本地的大模型mixtral-8X7B-instruct 8位量化的版本,通过LlamaCpp框架进行加载。模型输出的答案为

erlang
复制代码
孙悟空与白骨精的第一次较量是在《西游记》第六回中发生的,这是在孙悟空带着猪八戒、沙和尚前来拜访时,白骨精就偷偷地上前来欺诈孙悟空和他的同伴们。当时,白骨精就利用孙悟空和他的同伴们对于自己还不知道的身份感到的好奇心进行了诱饵计 stratagem.当时,孙悟空和他的同伴们都没有想到白骨精会是一个女妖的存在,所以他们都被白骨精诱饵计 seduction stratagem给骗了过来,而在此期间,孙悟空和他的同伴们都没有意识到到底是谁在利用他们的

可以看到,模型给出的答案,并不尽如人意。首先,“三打白骨精”这个故事并不是在原文第六回发生的,其次,给的答案并没有准确的回复“几打”这个问题。 即便是ChatGPT 3.5 也无法回答这样的问题。

image.png

我们尝试用RAG来解决这个问题。基于RAG的流程和架构,我们除了依赖大模型,还需要依赖一个用于向量存储和查询的引擎,为了方便,直接follow官方的样例,使用Chroma。

对于非参数化记忆,我先后选择了目录、《三打白骨精》这章内容和《三打白骨精》概要。

下面的代码实现了RAG的离线过程:

ini
复制代码
from langchain_community.document_loaders import DirectoryLoader
from langchain_community.embeddings import LlamaCppEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma# 使用DirectoryLoader 加载文件,作为外部知识
loader = DirectoryLoader('/Users/trent/dev/data/rag', glob="**/*.txt")
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=256, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
embeddings = LlamaCppEmbeddings(model_path=model_home)
vectorstore = Chroma.from_documents(documents=splits, embedding=embeddings)

下面的代码实现了RAG的在线过程:

python
复制代码
import os
from langchain import hub
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough# 可以在LangSimth生成一个API key用于整个RAG链路的追踪
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "langSimth_api_key"# 将向量存储作为retriever
retriever = vectorstore.as_retriever()
# 从[LangSmith Hub](https://smith.langchain.com/hub)拉取promt的模版
prompt = hub.pull("rlm/rag-prompt")def format_docs(docs):return "\n\n".join(doc.page_content for doc in docs)rag_chain = ({"context": retriever | format_docs, "question": RunnablePassthrough()}| prompt| llm_model| StrOutputParser()
)

我们以RAG的形式再次进行提问:

arduino
复制代码
rag_chain.invoke("孙悟空几打白骨精?")

非参数化记忆的不同,得到的答案也不尽相同,对于这个问题,概要作为非参数化记忆,得到的答案最为准确。 下面是LangSmith中对利用三个外部文件进行试验的结果。

截屏2024-04-05 22.37.54.png

这里要推荐一下LangSmith这个可观测性组件,可以清晰的追踪到RAG的流程,以下图为例,既可以看到一次Q&A的全过程,又可以观测到Retriever的输入输出。

截屏2024-04-05 22.42.14.png

以上就是用LangChain实现的一个简单RAG流程。

Retriever这个组件的引入可以有效的增强LLM的能力,但也会带来新的挑战:

  1. 外部的知识如何选择,不同的外部知识会带来不一样的效果表现,这就要具体问题具体分析了;
  2. 外部的知识如何进行处理,chunk如何切分,chunk size如何设置等等;
  3. 提问的模板如何设置,好的提问模板可以充分利用LLM的能力,从工程上来讲,Context的长度也需要尽可能的精简。

这些问题,需要在具体的场景中进行具体的分析,同时也需要有合适的机制通过不断的反馈来积累最佳实践。

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

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

事实上,抢你饭碗的不是AI,而是会利用AI的人。

科大讯飞、阿里、华为等巨头公司发布AI产品后,很多中小企业也陆续进场!超高年薪,挖掘AI大模型人才! 如今大厂老板们,也更倾向于会AI的人,普通程序员,还有应对的机会吗?

与其焦虑……

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高。

针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)👈

一、LLM大模型经典书籍

AI大模型已经成为了当今科技领域的一大热点,那以下这些大模型书籍就是非常不错的学习资源。

在这里插入图片描述

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

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

在这里插入图片描述

三、LLM大模型系列视频教程

在这里插入图片描述

四、LLM大模型开源教程(LLaLA/Meta/chatglm/chatgpt)

在这里插入图片描述

LLM大模型学习路线

阶段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.3 流水线工程
    • L2.4 总结与展望

阶段3:AI大模型应用架构实践

  • 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。

  • 内容

    • L3.1 Agent模型框架
    • L3.2 MetaGPT
    • L3.3 ChatGLM
    • L3.4 LLAMA
    • L3.5 其他大模型介绍

阶段4:AI大模型私有化部署

  • 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。

  • 内容

    • L4.1 模型私有化部署概述
    • L4.2 模型私有化部署的关键技术
    • L4.3 模型私有化部署的实施步骤
    • L4.4 模型私有化部署的应用场景

这份 LLM大模型资料 包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)👈

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

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

相关文章

A027-基于Spring Boot的农事管理系统

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…

13. 基于yolov8苹果叶片病害识别系统(含UI界、Python代码、训练好的模型、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下: 算法模型:     yolov8、yolov8 SE注意力机制 或 yolov5、yolov5 SE注意力机制 , 直接提供最少两个训练好的模型。模型十分重要,因为有些同学的电脑没有 GPU&#xff0…

新的服务器Centos7.6 安装基础的环境配置(新服务器可直接粘贴使用配置)

常见的基础服务器配置之Centos命令 正常来说都是安装一个docker基本上很多问题都可以解决了,我基本上都是通过docker去管理一些容器如:mysql、redis、mongoDB等之类的镜像,还有一些中间件如kafka。下面就安装一个 docker 和 nginx 的相关配置…

Three.js性能优化和实践建议

Three.js 是一个功能强大的 3D 引擎,当场景足够大的时候,就会出现卡顿的现象,首先要保证电脑的性能够用,然后看看下面方法,帮助你提高应用的运行效率。 1. 使用 stats.js 监视性能 在进行任何优化之前,首…

ima.copilot-腾讯智能工作台

一、产品描述 ima.copilot是腾讯推出的基于腾讯混元大模型技术的智能工作台,通过先进的人工智能技术,为用户提供了一个全新的搜读写体验,让知识管理变得更加智能和高效。它不仅是一个工具,更是一个智能的伙伴,能够帮助…

Jdbc学习笔记(二)核心API--ResultSet

ResultSet之滚动结果集 ResultSet默认只能往下移 ResultSet表示结果集,它是一个二维的表格!ResultSet内部维护一个行光标(游标),ResultSet提供了一系列的方法来移动游标: void beforeFirst():…

【服务器】本地安装X11 服务器-Windows

【服务器】本地安装X11 服务器-Windows X11 服务器概述X Window System 简介 本地安装X11 服务器另:采用 MobaXterm (自带 X server) 连接远程服务器简单说明流程: 参考 X11 服务器概述 X11 服务器 是 X Window System(简称 X11 或 X&#x…

【机器学习】机器学习中用到的高等数学知识-3.微积分 (Calculus)

3. 微积分 (Calculus) 导数和梯度:用于优化算法(如梯度下降)中计算损失函数的最小值。偏导数:在多变量函数中优化目标函数。链式法则:在反向传播算法中用于计算神经网络的梯度。 导数和梯度:用于优化算法…

[Import REC] Import REC下载及使用Import REC重建引入表Import table详细过程(附有下载文件)

前言 下载 使用夸克网盘打开链接,给出的是绿化版免安装 Import REC 链接:https://pan.quark.cn/s/552e4c1ea7d6 提取码:qEMM 下载之后解压得到 里面有使用更新说明 使用修复import table 演示 现在有一个程序,放入PEiD进行查壳…

MySQL技巧之跨服务器数据查询:高级篇-先调用A数据库的MySql存储过程再复制到B数据库的表中

MySQL技巧之跨服务器数据查询:高级篇-先调用A数据库的MySql存储过程再复制到B数据库的表中 基础篇已经描述:借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MySQL数据库的…

AI制作表情包,每月躺赚1W+,完整流程制作多重变现教学

项目介绍 AI制作表情包项目是一个利用ai,快速生成表情包的副业项目。 在社交平台如微信、QQ等,表情包已成为日常沟通不可或缺的一部分。通过AI技术,我们可以轻松制作出大量表情包,并通过多种渠道实现变现,非常适合追…

excel使用

上中下旬的逾期金额 步骤: 1、先判断上中下旬的时间范围 2、根据城市和时间求和,算出对应的逾期金额 问题:当从左插入列时,列的格式与原本一致,当我们想看数值时,发现为日期 解决:在开始-数据格…

MySQL算数运算符基础:详解与入门

目录 背景: 过程: 1.加法与减法运算符 1.2扩展: 1.3运算结果得出结论 : 2.乘法和除法运算 ​2.1练习: 2.2运算结果得出结论 : 3.求模取余运算符 3.1练习: 总结: 背景&a…

2024年AI办公工具API:高效办公的智能选择

在2024年,AI技术已经深入到我们工作生活的方方面面,极大地提高了办公效率和质量。这些工具通过集成先进的算法和模型,使得日常任务自动化、数据分析智能化、内容创作高效化。以下是2024年最受欢迎的AI办公工具API,它们正在重新定义…

力扣 LeetCode 142. 环形链表II(Day2:链表)

解题思路&#xff1a; 使用set判断是否重复添加&#xff0c;如果set加入不进去证明之前到达过该节点&#xff0c;有环 public class Solution {public ListNode detectCycle(ListNode head) {Set<ListNode> set new HashSet<>();ListNode cur head;while (cur …

基于Spring Boot的电子商务系统设计

5 系统实现 系统实现部分就是将系统分析&#xff0c;系统设计部分的内容通过编码进行功能实现&#xff0c;以一个实际应用系统的形式展示系统分析与系统设计的结果。前面提到的系统分析&#xff0c;系统设计最主要还是进行功能&#xff0c;系统操作逻辑的设计&#xff0c;也包括…

使用 Vue 配合豆包MarsCode 实现“小恐龙酷跑“小游戏

作者&#xff1a;BLACK595 “小恐龙酷跑”&#xff0c;它是一款有趣的离线游戏&#xff0c;是Google给Chrome浏览器加的一个有趣的彩蛋。当我们浏览器断网时一只像素小恐龙便会出来提示断网。许多人认为这只是一个可爱的小图标&#xff0c; 但当我们按下空格后&#xff0c;小恐…

Attention is all you need详细解读

transformer目的是解决NLP中使用RNN不能并行计算问题。 Encoder-Decoder, Attention, Transformer 三者关系 1.基础储备 &#xff08;1&#xff09;CV基础知识 1.首先拿CV中的分类任务来说&#xff0c;训练前我们会有以下几个常见步骤&#xff1a; 2.获取图片 3.定义待分类的类…

面向对象的需求分析和设计(一)

[toc] 1. 引言 前一篇文章《我对需求分析的理解》提到了面向对象分析和设计&#xff0c;正好最近又重新有重点的读了谭云杰著的《Think in UML》&#xff0c;感觉有必要写把书中一些核心内容观点以及自己的想法整理出来&#xff0c;一是方便自己日后的复习&#xff0c;另外也…

Window下PHP安装最新sg11(php5.3-php8.3)

链接: https://pan.baidu.com/s/10yyqTJdwH_oQJnQtWcwIeA 提取码: qz8y 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 (链接失效联系L88467872) 1.下载后解压文件&#xff0c;将对应版本的ixed.xx.win文件放进php对应的ext目录下&#xff0c;如图所示 2.修改ph…