大模型学习笔记五:RAG

文章目录

    • 一、RAG介绍
      • 1)局限性
      • 2)通过检索增强生成
    • 二、RAG系统的基本搭建流程
      • 1)搭建流程简介
      • 2)文档的加载和切割
      • 3)检索引擎
      • 4)LLM接口封装
      • 5)prompt模板
      • 6)RAG Pipeline初探
      • 7)关键字检索局限性
    • 三、向量检索
      • 1)文本向量
      • 2)向量相似度计算
      • 3)向量数据库
      • 4)基于向量检索的RAG
      • 5)若想换个国产模型
      • 6)OpenAI新发布的两个Embedding模型
    • 四、实战RAG进阶
      • 1)文本分割的粒度
      • 2)检索后排序
      • 3)混合检索
      • 4)RAG-Fusion
    • 五、向量模型的本地部署
    • 六、总结
      • 1)离线步骤
      • 2)在线步骤

一、RAG介绍

1)局限性

1、LLM 的知识不是实时的
2、LLM 可能不知道你私有的领域/业务知识
在这里插入图片描述

2)通过检索增强生成

  • RAG定义:
    RAG(Retrieval Augmented Generation)顾名思义,通过检索的方法来增强生成模型的能力。
  • 示例
    上传了对应PDF去解析
    在这里插入图片描述
  • 大概流程
    在这里插入图片描述

二、RAG系统的基本搭建流程

1)搭建流程简介

搭建过程:

1、文档加载,并按一定条件切割成片段
2、将切割的文本片段灌入检索引擎
3、封装检索接口
4、构建调用流程:Query -> 检索 -> Prompt -> LLM -> 回复

2)文档的加载和切割

  • 安装
pip install --upgrade openai
-------------------
# 安装 pdf 解析库
!pip install pdfminer.six
  • 解析代码
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextContainerdef extract_text_from_pdf(filename, page_numbers=None, min_line_length=1):'''从 PDF 文件中(按指定页码)提取文字'''paragraphs = []buffer = ''full_text = ''# 提取全部文本for i, page_layout in enumerate(extract_pages(filename)):# 如果指定了页码范围,跳过范围外的页if page_numbers is not None and i not in page_numbers:continuefor element in page_layout:if isinstance(element, LTTextContainer):full_text += element.get_text() + '\n'# 按空行分隔,将文本重新组织成段落lines = full_text.split('\n')for text in lines:if len(text) >= min_line_length:buffer += (' '+text) if not text.endswith('-') else text.strip('-')elif buffer:paragraphs.append(buffer)buffer = ''if buffer:paragraphs.append(buffer)return paragraphs#提取片段并打印
paragraphs = extract_text_from_pdf("llama2.pdf", min_line_length=10)
for para in paragraphs[:3]:print(para+"\n")
  • 回复
 Llama 2: Open Foundation and Fine-Tuned Chat ModelsHugo Touvron∗ Louis Martin† Kevin Stone† Peter Albert Amjad Almahairi Yasmine Babaei Nikolay Bashlykov Soumya Batra Prajjwal Bhargava Shruti Bhosale Dan Bikel Lukas Blecher Cristian Canton Ferrer Moya Chen Guillem Cucurull David Esiobu Jude Fernandes Jeremy Fu Wenyin Fu Brian Fuller Cynthia Gao Vedanuj Goswami Naman Goyal Anthony Hartshorn Saghar Hosseini Rui Hou Hakan Inan Marcin Kardas Viktor Kerkez Madian Khabsa Isabel Kloumann Artem Korenev Punit Singh Koura Marie-Anne Lachaux Thibaut Lavril Jenya Lee Diana Liskovich Yinghai Lu Yuning Mao Xavier Martinet Todor Mihaylov Pushkar Mishra Igor Molybog Yixin Nie Andrew Poulton Jeremy Reizenstein Rashi Rungta Kalyan Saladi Alan Schelten Ruan Silva Eric Michael Smith Ranjan Subramanian Xiaoqing Ellen Tan Binh Tang Ross Taylor Adina Williams Jian Xiang Kuan Puxin Xu Zheng Yan Iliyan Zarov Yuchen Zhang Angela Fan Melanie Kambadur Sharan Narang Aurelien Rodriguez Robert Stojnic Sergey Edunov Thomas Scialom∗GenAI, Meta

3)检索引擎

  • 安装库
# 安装 ES 客户端
!pip install elasticsearch7
# 安装NLTK(文本处理方法库)
!pip install nltk
  • 预先准备(安装停词方法和屏蔽警告)
from elasticsearch7 import Elasticsearch, helpers
from nltk.stem import PorterStemmer
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
import nltk
import reimport warnings
warnings.simplefilter("ignore")  # 屏蔽 ES 的一些Warningsnltk.download('punkt')  # 英文切词、词根、切句等方法
nltk.download('stopwords')  # 英文停用词库
  • 去停用词,取词根方法
def to_keywords(input_string):'''(英文)文本只保留关键字'''# 使用正则表达式替换所有非字母数字的字符为空格no_symbols = re.sub(r'[^a-zA-Z0-9\s]', ' ', input_string)word_tokens = word_tokenize(no_symbols)# 加载停用词表stop_words = set(stopwords.words('english'))ps = PorterStemmer()# 去停用词,取词根filtered_sentence = [ps.stem(w)for w in word_tokens if not w.lower() in stop_words]return ' '.join(filtered_sentence)
  • ES处理
1)将本文灌入检索引擎
# 1. 创建Elasticsearch连接
es = Elasticsearch(hosts=['http://117.50.198.53:9200'],  # 服务地址与端口http_auth=("elastic", "FKaB1Jpz0Rlw0l6G"),  # 用户名,密码
)# 2. 定义索引名称
index_name = "teacher_demo_index_tmp"# 3. 如果索引已存在,删除它(仅供演示,实际应用时不需要这步)
if es.indices.exists(index=index_name):es.indices.delete(index=index_name)# 4. 创建索引
es.indices.create(index=index_name)# 5. 灌库指令
actions = [{"_index": index_name,"_source": {"keywords": to_keywords(para),"text": para}}for para in paragraphs
]# 6. 文本灌库
helpers.bulk(es, actions)
2)实现关键字检索
def search(query_string, top_n=3):# ES 的查询语言search_query = {"match": {"keywords": to_keywords(query_string)}}res = es.search(index=index_name, query=search_query, size=top_n)return [hit["_source"]["text"] for hit in res["hits"]["hits"]]results = search("how many parameters does llama 2 have?", 2)
for r in results:print(r+"\n")
  • ES回复
 Llama 2 comes in a range of parameter sizes—7B, 13B, and 70B—as well as pretrained and fine-tuned variations.1. Llama 2, an updated version of Llama 1, trained on a new mix of publicly available data. We also increased the size of the pretraining corpus by 40%, doubled the context length of the model, and adopted grouped-query attention (A

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

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

相关文章

基于springboot+vue的医院药品管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

【GIS技术】GIS在地质灾害易损性评价、危险性评估与灾后重建中的实践技术应用

地质灾害是指全球地壳自然地质演化过程中,由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下,地质灾害在世界范围内频繁发生。我国除滑坡灾害外,还包括崩塌、泥石流、地面沉…

分享一次性能测试过程

在企业中完成性能测试项目是一个挑战性强、技术含量高的任务。本文将分享一个公司完成高性能游戏系统的性能测试过程,展示如何完成一次成功的性能测试项目。 项目背景:这是一家游戏公司,推出了一款新的游戏软件,系统要求高性能、…

JMeter压测【简单使用】

目录 🧂1.性能指标 🍿2.下载安装 🥞3.压测 1.创建线程组 2.设置要模拟的数据 3.设置压测http 4.设置要压测的具体路径 5.查看 1.性能指标 响应时间(Response Time: RT)响应时间指用户从客户端发起一个请求开始,到客…

SPI总线知识总结

1 SPI的时钟极性CPOL和时钟相位CPHA的设置 1.1 SPI数据传输位数 SPI传输数据过程中总是先发送或接收高字节数据,每个时钟周期接收器或发送器左移一位数据。对于小于16位的数据,在发送前必须左对齐,如果接收的数据小于16位,则采用软…

HI3516DV500 HI3516DRFCV500 HI3516DRBCV500 海思安防监控芯片 提供原厂开发包

总体介绍 Hi3516DV500是一颗面向视觉行业推出的高 清智能SoC。该芯片最高支持2路sensor输入,支持最高5M30fps的ISP图像处理能力,支持2F WDR、多级降噪、六轴防抖、多光谱融合等多种 传统图像增强和处理算法,支持通过AI算法对输 入图像进行实…

【Java EE 】认识文件与Java文件操作

目录 🍀认识文件🌸树型结构组织 和 目录🌸文件路径(Path)🌸其他知识 🌳Java 中操作文件🌸File 概述🌻属性🌻构造方法🌻方法 🌸代码示例…

代码随想录算法训练营第22天|235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

目录 一、力扣235.二叉搜索树的最近公共祖先1.1 题目1.2 思路1.3 代码 二、力扣701.二叉搜索树中的插入操作2.1 题目2.2 思路2.3 代码 三、力扣450.删除二叉搜索树中的节点3.1 题目3.2 思路3.3 代码3.4 总结 一、力扣235.二叉搜索树的最近公共祖先 1.1 题目 1.2 思路 利用二叉…

(二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布

前言 本节内容会介绍如何使用Docker Pipeline插件实现docker项目的pipeline流水线项目的可持续化集成发布,在开始本节内容之前,我们要先搭建好docker环境,以及镜像本地存储仓库docker harbor,关于docker和docker harbor的安装,可查看作者往期博客内容。 正文 ①安装Doc…

maven打包失败 Cannot create resource output directory[已解决]

文章目录 前言1.打开资源管理器(ctrlAltdelete打开任务管理器)2. 选择性能,再选择打开资源监视器3. 搜索“target”4. 我这里示范操作输入的perfmon,显示perfmon.exe占用的,右键结束这个进程 。5.然后重新用package打包…

C++之queue和deque

1、queue queue(队列),一种数据结构,可以让某些数据结构的操作变得简单。队列(queue)最大的特点就是先进先出。就是说先放入queue容器的元素一定是要先出队列之后,比它后进入队列的元素才能够出…

MySQL 多表查询 连接查询 自连接

介绍 自连接查询,可以是内连接查询,也可以是外连接查询,一句话自己连接自己,一个表当作两个表进行连接。 语法 SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件两个表A说明是同一张表,但是别名不同 案例…