RAG(检索增强生成 )

📑前言

本文主要是【RAG】——RAG(检索增强生成 )的文章,如果有什么需要改进的地方还请大佬指出⛺️

🎬作者简介:大家好,我是听风与他🥇
☁️博客首页:CSDN主页听风与他
🌄每日一句:狠狠沉淀,顶峰相见

目录

  • 📑前言
  • RAG
    • 1.RAG定义
    • 2.RAG技术演化
    • 3.RAG优势
  • LangChain实现RAG
    • 1.基础环境准备
    • 2.在项目根目录创建.env文件,用来存放相关配置(configuration.env)
    • 3.准备一个矢量数据库来保存所有附加信息的外部知识源。
      • 3.1 加载数据
      • 3.2数据分块
      • 3.3数据块存储
  • RAG实现
    • 1.数据检索
    • 2.提示增强
    • 3.答案生成
  • 📑文章末尾

RAG

1.RAG定义

  • llm是一个预训练的模型,这就决定了llm自身无法实时更新模型中的知识,由此,业界已经形成了通过RAG(Retrieval Augmented Generation)等外接知识库等方式快速扩展llm知识。
  • RAG的增强阶段可以在pre-training预训练,Fine-tuning微调,Inference推理三个阶段;从增强的数据源,包括非结构化数据,结构化数据和llm生成的内容三个途径。

2.RAG技术演化

  • RAG通过优化检索器、生成器等关键部分,为大模型中的复杂知识密集型任务提供了更高效的解决任务。
  • 检索阶段:利用编码模型根据问题检索相关文档。
  • 生成阶段:将检索到的上下文作为条件,系统生成文本。

3.RAG优势

结合检索系统和生成模型。能利用最新信息,提高答案质量,具有更好的可解释性和适应性。简单来说,就是实时更新检索库。

LangChain实现RAG

1.基础环境准备

pip install langchain openai weaviate-client

2.在项目根目录创建.env文件,用来存放相关配置(configuration.env)

OPENAI_API_KEY="此处添openai的api_key"

3.准备一个矢量数据库来保存所有附加信息的外部知识源。

3.1 加载数据

  • 这里选择斗破苍穹.txt作为文档输出,要加载到langchain中的TextLoader中
from langchain.document_loaders import TextLoader
loader = TextLoader('./a.txt')
documents = loader.load()

3.2数据分块

  • 因为文档在其原始状态下太长,无法放入大模型的上下文窗口,所以需要将其分成更小的部分。LangChain 内置了许多用于文本的分割器。这里使用 chunk_size 约为 1024 且 chunk_overlap 为128 的 CharacterTextSplitter 来保持块之间的文本连续性。
from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(chunk_size=1024, chunk_overlap=128)
chunks = text_splitter.split_documents(documents)

3.3数据块存储

  • 要启用跨文本块的语义搜索,需要为每个块生成向量嵌入,然后将它们与其嵌入存储在一起。要生成向量嵌入,可以使用 OpenAI 嵌入模型,并使用 Weaviate 向量数据库来进行存储。通过调用 .from_documents(),矢量数据库会自动填充块。
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Weaviate
import weaviate
from weaviate.embedded import EmbeddedOptionsclient = weaviate.Client(embedded_options = EmbeddedOptions()
)vectorstore = Weaviate.from_documents(client = client,    documents = chunks,embedding = OpenAIEmbeddings(),by_text = False
)

RAG实现

1.数据检索

  • 将数据存入矢量数据库后,就可以将其定义为检索器组件,该组件根据用户查询和嵌入块之间的语义相似性获取相关上下文。
retriever = vectorstore.as_retriever()

2.提示增强

  • 完成数据检索之后,就可以使用相关上下文来增强提示。在这个过程中需要准备一个提示模板。可以通过提示模板轻松自定义提示,如下所示。
from langchain.prompts import ChatPromptTemplate
template = """你是一个问答机器人助手,请使用以下检索到的上下文来回答问题,如果你不知道答案,就说你不知道。问题是:{question},上下文: {context},答案是:
"""
prompt = ChatPromptTemplate.from_template(template)

3.答案生成

  • 利用 RAG 管道构建一条链,将检索器、提示模板和 LLM 链接在一起。定义了 RAG 链,就可以调用它了。
from langchain.chat_models import ChatOpenAI
from langchain.schema.runnable import RunnablePassthrough
from langchain.schema.output_parser import StrOutputParser
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)rag_chain = ({"context": retriever,  "question": RunnablePassthrough()} | prompt | llm| StrOutputParser() 
)query = "萧炎的表妹是谁?"
res=rag_chain.invoke(query)
print(f'答案:{res}')

📑文章末尾

在这里插入图片描述

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

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

相关文章

springcloud sleuth分布式请求链路跟踪

简介 在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后的请求结果,每一个前段请求都会形成一条复杂的分布式服务调用链路,链路中的任何一环出现高延时或错误都会引起整个请求最后的失败. S…

抖店只做商品卡流量能行吗?为什么我的店铺没流量?出单玩法解析

我是王路飞。 抖店开通后,如果只做商品卡流量,可行吗? 有的新手商家就是不想给达人分佣金,就一直坚持做商品卡流量,但店铺却一直没什么流量,自然也就没出单了。 自然流量也是可以出单的,只能…

【MySQL】本地创建MySQL数据库详解

文章目录 下载MySQL安装重置密码本地连接 下载MySQL 下载网址:https://dev.mysql.com/downloads/mysql/ 安装 将下载好的压缩包解压到D盘。 在解压好的文件夹中创建my.ini文件。 将以下代码复制粘贴到创建好的my.ini文件中。注意修改文件路径。 [mysqld] #设置…

【SQL注入】SQLMAP v1.7.11.1 汉化版

下载链接 【SQL注入】SQLMAP v1.7.11.1 汉化版 简介 SQLMAP是一款开源的自动化SQL注入工具,用于扫描和利用Web应用程序中的SQL注入漏洞。它在安全测试领域被广泛应用,可用于检测和利用SQL注入漏洞,以验证应用程序的安全性。 SQL注入是一种…

Docker 安装:在linux系统CentOS7 版本 安装Docker

目录 一,Docker介绍: 1.1Docker是什么? 1.2Docker组成 二,Docker安装: 三,Docker基本使用 3.1服务 3.2镜像 3.3容器 🎉🎉欢迎来到我的CSDN主页!🎉&am…

让网页自动化测试更简便,流程图设计工具为您解决痛点

在数字化时代,网页自动化测试已经成为提高工作效率、保证项目质量的重要手段。然而,传统的自动化测试往往需要复杂的编程技能,对非专业人员来说门槛较高。为了解决这个问题,我们向您推荐一款创新的设计工具,它可以通过…

jenkins环境搭建

jenkins环境搭建 1.环境说明2.环境准备1.jdk安装2.安装Git3.安装sshpass4.安装Maven 3.安装Jenkins(war包方式安装)1.安装2.镜像加速 4.官网提供的yum方式安装5.访问 1.环境说明 keyvalue环境centos7jdk版本11git2.43.0maven3.9.6jenkins最新版本http://mirrors.jenkins-ci.or…

nginx(1.13.7)首次安装出现:【make: *** 没有规则可以创建“default”需要的目标“build” 问题】解决措施

目录 前言: 一.龙蜥(Anolis)操作系统上安装GCC 1.安装gcc 2.检验安装 二.安装出现 make: *** 没有规则可以创建“default”需要的目标“build” 问题 1.解压安装nginx 2.安装出现问题展示 3.解决措施 4.重新编译进行安装 5…

算法第十七天-构造有效字符串的最少插入数

构造有效字符串的最少插入数 题目要求 解题思路 考虑abc的个数 假设答案有n个"abc"组成,那么需要插入的字符个数为 3 ∗ n − l e n ( s ) 3*n - len(s) 3∗n−len(s)。 对于相邻的两个字符x和y(x在y左侧): 如果 x…

ubuntu安装node

1 下载 node 官网下载 如果需要其他版本,点击上图的Other Downloads 这里下载的版本是20.11.0 Linux Binaries (x64),下载下来后是node-v20.11.0-linux-x64.tar.xz这样的格式,直接右键解压得到如下目录: 直接拷贝该文件夹到指定目…

通过IP地址识别风险用户

随着互联网的迅猛发展,网络安全成为企业和个人关注的焦点之一。识别和防范潜在的风险用户是维护网络安全的关键环节之一。IP数据云将探讨通过IP地址识别风险用户的方法和意义。 IP地址的基本概念:IP地址是互联网上设备的独特标识符,它分为IP…

redis学习

redis的五个基本数据类型。 redis字符串(String) string是redis最基本的类型,一个key对应一个Tvalue。 string类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。 string类型是…

vue项目之.env文件.env.dev、test、pro

.env文件是vue运行项目时的环境配置文件。 .env: 全局默认配置文件,所有环境(开发、测试、生产等)均会加载并合并该文件 .env.development(开发环境默认命名) 开发环境的配置,文件名默认为.env.development,如果需要改名也是可以的&#xf…

微创新与稳定性的权衡

之前做过一个项目,业务最高峰CPU使用率也才50%,是一个IO密集型的应用。里面涉及一些业务编排,所以为了提高CPU使用率,我有两个方案:一个是简单的梳理将任务可并行的采用并行流、额外线程池等方式做并行;另外…

Rust-模式解构

match 首先,我们看看使用match的最简单的示例: exhaustive 有些时候我们不想把每种情况一一列出,可以用一个下划线来表达“除了列出来的那些之外的其他情况”: 下划线 下划线还能用在模式匹配的各种地方,用来表示…

大话 JavaScript(Speaking JavaScript):第二十一章到第二十五章

第二十一章:数学 原文:21. Math 译者:飞龙 协议:CC BY-NC-SA 4.0 Math对象用作多个数学函数的命名空间。本章提供了一个概述。 数学属性 Math的属性如下: Math.E 欧拉常数(e) Math.LN2 2 …

抓交通肇事犯(python)

问题描述: 一辆卡车违反交通规则,撞人后逃跑。现场有三人目击该事件,但都没有记住车号,只记下了车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但…

MATLAB 2023a软件下载安装教程

编程如画,我是panda! 这次给大家带来的是MATLAB 2023a的下载安装教程 前言 MATLAB,即Matrix Laboratory的缩写,是一款强大的科学计算软件,以其独特的矩阵计算基础、丰富的数学函数库和直观的数据可视化工具而闻名。作…

服务端性能测试——性能测试工具JMeter-L1

第一遍没学懂,后续文章会更新~ 目录: 1.JMeter介绍与安装Meter简介JMeter安装2.JMeter的运行JMeter运行、界面功能简介3.使用代理服务器录制请求录制压测脚本(一)Web端脚本录制方法4.测试计划5.线程组6.控制器7.JMeter采样器/取…

C++ Builder XE关于TDateTime批量加减时间TTimerPiker的设置

void __fastcall TForm3::Button3Click(TObject *Sender) { TDateTime *DT new TDateTime(); //new TDateTime类型变量 *DTTPicker1->Time; //加 1 小时: DT (double)DT 1/24; //加 1 分钟: DT (double)DT 1/(24*60); //加 1 秒钟: DT (double)DT 1/(24*60*60); …