当前位置: 首页 > news >正文

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}')

📑文章末尾

在这里插入图片描述

相关文章:

  • vercel部署twikoo后评论收不到通知邮件问题解决方法
  • 飞桨分子动力学模拟-论文复现第六期:复现TorchMD
  • 奇怪的事情记录:外置网卡和外置显示器不兼容
  • Ceph入门到精通-通过 CloudBerry Explorer 管理对象bucket
  • ssh远程登陆
  • Kubernetes 集群管理—日志架构
  • iOS14 Widget 小组件调研
  • UniRepLKNet实战:使用 UniRepLKNet实现图像分类任务(二)
  • 7个Linux搜索和过滤命令
  • Jmeter 性能-监控服务器
  • 多种采购方式下,数智化招标采购系统建设解决方案
  • kube-apiserver参数详解
  • WPF真入门教程26--项目案例--欧姆龙PLC通讯工具
  • 飞天使-k8s知识点10-kubernetes资源对象3-controller
  • ftp安装与配置 云服务器 CentOS7
  • 【Leetcode】101. 对称二叉树
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • Android组件 - 收藏集 - 掘金
  • javascript从右向左截取指定位数字符的3种方法
  • JavaScript异步流程控制的前世今生
  • js中forEach回调同异步问题
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • spring-boot List转Page
  • unity如何实现一个固定宽度的orthagraphic相机
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 微信公众号开发小记——5.python微信红包
  • MPAndroidChart 教程:Y轴 YAxis
  • postgresql行列转换函数
  • 进程与线程(三)——进程/线程间通信
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (+4)2.2UML建模图
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (6)添加vue-cookie
  • (9)STL算法之逆转旋转
  • (pojstep1.1.2)2654(直叙式模拟)
  • (Python第六天)文件处理
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (四)Controller接口控制器详解(三)
  • (一)appium-desktop定位元素原理
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)ObjectiveC 深浅拷贝学习
  • (转)视频码率,帧率和分辨率的联系与区别
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .Net IOC框架入门之一 Unity
  • .net 托管代码与非托管代码
  • .Net转前端开发-启航篇,如何定制博客园主题
  • @ModelAttribute注解使用
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现