给rwkv_pytorch增加rag

RAG

  • 参考地址
  • 语义模型地址
  • 选择该模型
  • 使用方法
  • 方法二
  • 安装方法
  • 下载模型到本地
  • 材料
  • 材料处理
  • 语义分割
    • 计算得分
    • 根据得分 分割文本
  • 构建向量数据库
  • 问答匹配
  • 问答整合

参考地址

RAG简单教程
分割策略

语义模型地址

hf
在这里插入图片描述

选择该模型

gte

使用方法

import torch.nn.functional as F
from torch import Tensor
from transformers import AutoTokenizer, AutoModel

input_texts = [
    "中国的首都是哪里",
    "你喜欢去哪里旅游",
    "北京",
    "今天中午吃什么"
]

tokenizer = AutoTokenizer.from_pretrained("thenlper/gte-large-zh")
model = AutoModel.from_pretrained("thenlper/gte-large-zh")

# Tokenize the input texts
batch_dict = tokenizer(input_texts, max_length=512, padding=True, truncation=True, return_tensors='pt')

outputs = model(**batch_dict)
embeddings = outputs.last_hidden_state[:, 0]
 
# (Optionally) normalize embeddings
embeddings = F.normalize(embeddings, p=2, dim=1)
scores = (embeddings[:1] @ embeddings[1:].T) * 100
print(scores.tolist())

方法二

from sentence_transformers import SentenceTransformer
from sentence_transformers.util import cos_sim

sentences = ['That is a happy person', 'That is a very happy person']

model = SentenceTransformer('thenlper/gte-large-zh')
embeddings = model.encode(sentences)
print(cos_sim(embeddings[0], embeddings[1]))

安装方法

Sentence Transformers 是一个基于 PyTorch 的开源库,用于计算句子、段落或文档之间的语义相似度。它提供了多种预训练模型,可以用于各种自然语言处理任务,如文本分类、信息检索、文本聚类等。
以下是安装 Sentence Transformers 的基本步骤:

  1. 安装Python环境:首先确保你的系统中安装了Python。Sentence Transformers 要求Python 3.6或更高版本。
  2. 安装PyTorch:Sentence Transformers 依赖于PyTorch。你可以通过访问PyTorch的官方网站获取适合你系统的安装命令。PyTorch官网会根据你的系统和CUDA版本(如果你使用GPU)提供相应的安装指令。
  3. 使用pip安装Sentence Transformers:在安装了PyTorch之后,你可以使用pip来安装Sentence Transformers。打开命令行(终端)并输入以下命令:
   pip install -U sentence-transformers

-U参数确保pip更新到最新版本。
4. 验证安装:安装完成后,你可以通过运行一个简单的示例脚本来验证安装是否成功。例如,使用预训练的模型来计算两个句子之间的相似度:

   from sentence_transformers import SentenceTransformer
   model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
   sentence1 = 'The cat sits on the mat'
   sentence2 = 'The cat is sitting on the carpet'
   embedding1 = model.encode(sentence1)
   embedding2 = model.encode(sentence2)
   cos_sim = util.pytorch_cos_sim(embedding1, embedding2)
   print("Cosine-Similarity:", cos_sim)

这段代码会下载预训练的模型并计算两个句子之间的余弦相似度。
6. 额外的依赖:Sentence Transformers 库可能还需要其他依赖,如scikit-learnnumpy等。如果运行示例代码时出现错误,提示缺少某个库,可以使用pip来安装它们。
7. 更新pip、setuptools和wheel:在安装新的Python包之前,最好更新pip、setuptools和wheel,以确保你安装的是最新版本的库。

   pip install --upgrade pip setuptools wheel

请根据你的操作系统和Python环境调整上述步骤。如果在安装过程中遇到任何问题,可以查看Sentence Transformers的官方文档或GitHub页面以获取帮助。

下载模型到本地

下载方法参考
当然可以直接点击多次下载
在这里插入图片描述
可以从这里下载模型文件

材料

随便下一个压缩包例子

材料处理

from glob import glob

import pandas as pd
from  tqdm import tqdm
texts_path=glob("F:/rag/novel5/*.txt")

total_dict=[]
for one in tqdm(texts_path[:10]):
    with open(one,'r',encoding='utf-8') as f:
        one_data=f.read()
    new_data=[]
    for i in one_data.split():
        if i.count("。")>1:
            new_data+=i.split("。")
        else:
            new_data.append(i)
    total_dict.append({one:new_data})
 
pd.to_pickle(total_dict,"total_data.pkl")

语义分割

计算得分

import pandas as pd
from sentence_transformers import SentenceTransformer
from sentence_transformers.util import cos_sim
from tqdm import tqdm
import torch
# sentences = ['That is a happy person', 'That is a very happy person']

model = SentenceTransformer('F:/rag/gte_large_zh')
model.to("cuda")


data = pd.read_pickle("total_data.pkl")

batch_size = 3
total_list= []
for one in tqdm(data):
    for name, texts in one.items():
        texts=[i for i in texts if len(i)>1]
        one_dict = {name: {"data": [], "score": []}}
        score_list=[]
        for i in tqdm(range(0, len(texts) - 1, batch_size)):
            j = i + batch_size
            sentences = texts[i:j +1]
            embeddings0 = model.encode(["。".join(sentences[:-1])])
            embeddings1 = model.encode(["。".join(sentences[1:])])
            out=cos_sim(embeddings0,embeddings1)
            score=out.tolist()[0]
            del out
            del embeddings0
            del embeddings1
            del sentences
            torch.cuda.empty_cache()
            score_list+=score
        one_dict[name]["score"]=score_list
        one_dict[name]["data"]=texts
        total_list.append(one_dict)
pd.to_pickle( total_list,"total_score_one_data.pkl")

根据得分 分割文本

import pandas as pd
import numpy as np
from tqdm import tqdm

batch_size = 3
data = pd.read_pickle("total_score_one_data.pkl")
total_list=[]
for one in data:
    data_list = []
    for name, two in one.items():
        score = two["score"]
        text = two["data"]

        for ii,i in tqdm(enumerate(range(0, len(text) - 1, batch_size))):
            j = i + batch_size
            if ii==0:

                sentences = text[i:j+1 ]
            else:
                sentences = text[i+1:j + 1]


            data_list+=sentences
            if score[ii] > 0.9:
                data_list += ["#chunk#"]

        total_list.append(data_list)
pd.to_pickle(total_list,"total_list.pkl")


构建向量数据库

import pandas as pd
from sentence_transformers import SentenceTransformer
from sentence_transformers.util import cos_sim
from tqdm import tqdm



model = SentenceTransformer('F:/rag/gte_large_zh')
model.to("cuda")
batch_size=1000
data=pd.read_pickle("total_list.pkl")
total_list=[]
for one in tqdm(data):
    for name,two in one.items():
        data_list=[]
        total="。".join(two).split("#chunk#")
        for t in tqdm(range(0,len(total),batch_size)):
            batch=total[t:t+batch_size]
            embeddings = model.encode(batch)
            data_list+=embeddings.tolist()
        total_list.append({name:{"em":data_list,"data":total}})
pd.to_pickle(total_list,"embedding.pkl")

问答匹配

import pandas as pd
from sentence_transformers import SentenceTransformer
from sentence_transformers.util import cos_sim
import numpy as np
# from tqdm import tqdm



model = SentenceTransformer('F:/rag/gte_large_zh')
model.to("cuda")
batch_size=1000
data=pd.read_pickle("embedding.pkl")
text="修仙小说"
text_em=model.encode(text)
total_list=[]
for one in data:
    for name,data_em in one.items():
        sim=cos_sim(text_em,data_em["em"])
        score,ids=sim[0].topk(5)
        top_text=np.array(data_em["data"])[ids.numpy()]
        res=pd.DataFrame({"name":[name]*top_text.size,"score":score.numpy().tolist(),"text":top_text.tolist(),"ids":ids.numpy().tolist()})
        total_list.append(res)
result=pd.concat(total_list)
result=result.sort_values("score",ascending=False)
result=str(result[["name","score","text"]].values[:3])
prompt="问题:{},参考:{} 答案:".format(text,result)

问答整合

rwkv 使用参考

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AQS共享模式之CyclicBarrier

概念:CyclicBarrier翻译为循环(屏障/栅栏),当一组线程到达一个屏障(同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会打开,所有被屏障拦截的线程才会继续工作。 设计目的:和Co…

当你老了:献给40岁以上还在求职的朋友

怪盗团团长按:本文作者是我的一位老朋友,他已经年过四十,在国内职场,算是不折不扣的中老年人了。难能可贵的是,最近他还换了工作,去了一个自己不熟悉的新行业奋斗。 我一直很纳闷,为何在中国&am…

该安装包不适配当前高性能处理器 请使用 64 位安装包

今天一台用户的一台手机报错,如下: 该安装包不适配当前高性能处理器 请使用 64 位安装包 查了下,网上也有人反馈该问题 https://ask.dcloud.net.cn/question/186865 最后在贴吧上发现答案:https://tieba.baidu.com/p/8773132859 …

Bluetooth Profile 蓝牙协议栈总结

GAP-Generic Access Profile 控制设备广播和连接 GAP profile 的目的是描述: Profile rolesDiscoverability modes and proceduresConnection modes and proceduresSecurity modes and procedures 设备连接过程 LE中GAP有4种角色:BroadcasterObserv…

使用groovy+spock优雅的进行单测

使用groovyspock优雅的进行单测 1. groovyspock示例1.1 简单示例1.2 增加where块的示例1.3 实际应用的示例 2. 单测相关问题2.1 与SpringBoot融合2.2 单测数据与测试数据隔离2.3 SQL自动转换(MySQL -> H2) 参考 Groovy是一种基于JVM的动态语言&#x…

LVGL自定义滑动

触摸和编码器都可以操作 typedef struct {lv_obj_t* obj;int16_t x;int16_t y;int16_t width;int16_t height; }pos_and_size_t;typedef struct {lv_obj_t* obj;lv_coord_t height;lv_coord_t width;lv_coord_t width_pad;lv_coord_t height_pad;lv_coord_t child_widget;lv_co…

2024王炸组合!基于Mamba的遥感图像处理引爆顶会!

对比传统方法,基于Mamba的遥感图像处理在计算效率和分析精度方面遥遥领先,Mamba遥感也成为了论文研究的新方向。 具体来说,在融合高分辨率的空间图像和低分辨率的光谱图像获取综合信息方面,Mamba可以提升性能,同时保持…

【Harmony3.1/4.0】笔记七-选项卡布局

概念 当页面信息较多时,为了让用户能够聚焦于当前显示的内容,需要对页面内容进行分类,提高页面空间利用率。Tabs组件可以在一个页面内快速实现视图内容的切换,一方面提升查找信息的效率,另一方面精简用户单次获取到的…

MySQL CRUD操作

前言👀~ 上一章我们介绍了数据库的一些基础操作,关于如何去创建一个数据库,还有使用数据库,删 除数据库以及对表进行的一些基础操作,今天我们学习CRUD操作 俗称(增删改查) 如果各位对文章的内…

Objenesis 底层

Objenesis 简介 Objenesis 是一个 Java 库,用于在不调用构造方法的情况下创建对象。由于绕过了构造方法,所以无法调用构造方法中的初始化逻辑。相应的,Objenesis 无法创建抽象类、枚举、接口的实例对象。 起源 与其称之为起源,…

基于ST的STM32F407ZGT6嵌入式uCOS-III V3.08 操作系统工程实验

1.基于的开发板 2.原理图截图: 3.主控芯片框图与性能特点: High-performance foundation line, Arm Cortex-M4 core with DSP and FPU, 1 Mbyte of Flash memory, 168 MHz CPU, ART Accelerator, Ethernet, FSMC The STM32F405xx and STM32F407xx family is based on the high…

多家企业机密数据遭Lockbit3.0窃取,亚信安全发布《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件87起,与上周相比勒索事件大幅下降。美国依旧为受勒索攻击最严重的国家,占比45%。 本周Cactus是影响最严重的勒索家族,Lockbit3.0和Bianlian恶意家族紧随其后,从整体上看Lockbit3.0依旧…

Meltdown 以及Linux KPTI技术简介

文章目录 前言一、Introduction二、 Background2.1 Out-of-order execution2.2 Address Spaces2.3 Cache Attacks 三、A Toy Example四、Building Blocks of the Attack4.1 Executing Transient Instructions4.2 Building a Covert Channel 五、Meltdown5.1 Attack Description…

深度学习之视觉特征提取器——LeNet

LeNet 引入 LeNet是是由深度学习巨头Yann LeCun在1998年提出,可以算作多层卷积网络在图像识别领域的首次成功应用。我们现在通常说的LeNet是指LeNet-5,最早的LeNet-1在1988年即开始研究,前后持续十年之久。但是,受限于当时计算机…

c++初阶——类和对象(下)

大家好,我是小锋,今天我们来学习我们类和对象的最后一个章节,我们本期的内容主要是类和对象的一些细节进行讲解 再谈构造函数 我们在初始化时有两种方式一种是函数体内初始化,一种是初始化列表 我们先来看看日期类的初始化 构造…

[机缘参悟-166] :周期论:万物的周期现象是这个世界有序性和稳定性保障;超越周期:在轮回中,把握周期节奏。

目录 前言:超越周期 一、周期是大自然和宇宙的规律,是天道 1.1 概述 1.2 万物的周期规律的现象 1.3 电磁波的周期 二、计算机世界中的周期性 三、佛家的生命轮回规律 四、人类社会发展的周期规律 五、经济活动的周期规律 5.1 概述 5.2 股市的…

Ieetcode——21.合并两个有序链表

21. 合并两个有序链表 - 力扣(LeetCode) 合并两个有序链表我们的思路是创建一个新链表,然后遍历已知的两个有序链表,并比较其节点的val值,将小的尾插到新链表中,然后继续遍历,直到将该两个链表…

C语言实验-函数与模块化程序设计

一: 编写函数fun,其功能是:输入一个正整数,将其每一位上为偶数的数取出重新构成一个新数并输出。主函数负责输入输出,如输入87653142,则输出8642。(main函数->fun函数) #define _…

【代码问题】【Pytorch】训练模型时Loss为NaN或INF

解决方法或者问题排查: 加归一化层: 我的问题是我新增的一个模块与原来的模块得到的张量相加,原张量是归一化后的,我的没有: class Module(nn.Module):def __init__(self,dim,):super().__init__()# 新增一个LayerNo…

节假日如何快速回应客户消息?

在宝贵的休闲时光或者特殊的节日期间,有时候由于工作、家庭等原因,我们很难及时回应客户的消息。那么如何在忙碌之时,如何确保与他人的交流畅通无阻呢?答案就是使用微信私域流量管理系统。 01 机器人自动回复设置 机器人自动回…