给rwkv_pytorch增加rag

news2025/1/13 13:18:47

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.coloradmin.cn/o/1635394.html

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

相关文章

开源博客项目Blog .NET Core源码学习(18:App.Hosting项目结构分析-6)

本文学习并分析App.Hosting项目中后台管理页面的_AminLayout.cshtml模版页面和登录页面。 _AminLayout.cshtml模版页面 后台管理页面中的大部分页面都使用_AminLayout.cshtml作为模板页面,如下图所示,后台页面的视图内容放置在表单中,使用la…

再回顾const int* p, int const* p,int* const p 的区别

目录 一、const int* p 和 int const* p (常量指针) 1.1 p 指向的内存不能通过指针p 修改1.2 其他指针可以修改p 指向的内存1.3 指针p 可以重新指向其他地址 二、int* const p (指针常量) 2.1 p 定义的时候初始化2.2 p 定义的时候…

Adobe推出AI视频超分辨率工具VideoGigaGAN

🦉 AI新闻 🚀 Adobe推出AI视频超分辨率工具VideoGigaGAN 摘要:Adobe公司最新推出的AI工具VideoGigaGAN,利用上采样技术将视频分辨率从128128提升至10241024。这一工具基于GigaGAN模型开发,专注于生成视频超分辨率&am…

利用大型语言模型提升个性化推荐的异构知识融合方法

在推荐系统中,分析和挖掘用户行为是至关重要的,尤其是在美团外卖这样的平台上,用户行为表现出多样性,包括不同的行为主体(如商家和产品)、内容(如曝光、点击和订单)和场景&#xff0…

前端性能优化知识梳理

1.重要性 当我们面试的时候,前端性能优化方面算是必考的知识点,但是工作中我们又很少会重点的对项目进行前端优化,它真的不重要吗? 如果我们可以将后端响应时间缩短一半,整体响应时间只能减少5%~10%。而如果关注前端…

自动化神器,获客秘籍揭秘!

在如今这个信息爆炸的时代,企业如何高效精准地获客成为了一个重要课题。传统的营销方式不仅成本高昂,且效果往往难以衡量。然而,随着自动化工具的兴起,这一切都在悄无声息中发生着翻天覆地的变化。 我们得了解一下什么是自动化工具…

【ZYNQ】Zynq 开发流程

Zynq 芯片架构由嵌入式处理器(Processing System, PS)与可编程逻辑(Programmable Logic, PL),以及 PS 与 PL 之间的互联总线组成。本文主要介绍 Xilinx Zynq 芯片开发所使用的软件,包括 Vivado IDE 与 Xili…

2024最新的,免费的 ChatGPT 网站AI(八个)

ChatGPT是美国人工智能研究实验室OpenAI在2022年11月推出的一款人工智能技术驱动的语言模型应用。它基于GPT-3.5架构(后续还有GPT-4架构的升级版)构建,拥有强大的自然语言处理能力和上下文理解能力,能够参与多轮对话,为…

C语言中的趣味代码(五)

我想以此篇结束关于C语言的博客,因为在C语言拖得越久越不能给大家带来新的创作,在此我也相信大家对C语言已经有了一个新的认知。进入正题,在这一篇中我主要编一个“英语单词练习小程序”来给大家展开介绍,从测试版逐步改良&#x…

C语言入门课程学习笔记-7

C语言入门课程学习笔记-7 第31课 - 初探程序中的函数实验-函数调用实验-函数求前n个正整数和 第32课 - 深入浅出函数调用第33课 - 函数定义细节剖析实验-返回int实验-返回void 第34课 - 函数参数深度剖析实验-形参实参实验-数组元素作为函数形参小结 第35课 - 编写函数对数组排…

前端: 浏览器调试小技巧

1. 如何禁止某个网站跳转: 用于拦截网站地址 2. 如何在线上环境调试源代码, 给源代码打断点 3. 如何在线编写代码 线上调试代码: network -> 找到加载的html文件 -> 右击 -> 选择override content (浏览器的代理调试程序) -> 可以在线写代码啦 4. 如何通过浏览器…

电脑提示msvcr110.dll文件丢失的常见问题以及解决方案

在使用电脑时突然提示msvcr110.dll文件丢失的问题,这是一个的常见问题接下俩这篇文章将教大家几种以及msvcr110.dll丢失的解决方案,用户可能会遇到一些常见问题,这些问题可能会影响他们的软件运行或系统稳定性。以下是一些常见问题及其解决方…

R语言的学习——day1

将数据框中某一列数据改成行名 代码 结果

可平滑替代FTP的FTP替代解决方案,具有哪些强大功能?

FTP是一种广泛使用的文件传输协议,主要用于在网络上的计算机之间传输文件。具有以下特点: 1.简单易用:FTP协议相对简单,易于设置和使用,许多操作系统和应用程序都内置了对FTP的支持。 2.广泛的客户端支持&#xff1a…

C++三大特性及应用

C三大特性 面向对象程序设计(OOP)是一种编程范式,它使用“对象”来设计软件。在OOP中,对象是类的实例,类包含数据(属性)和可以对数据执行操作的方法(行为)。 面向对象的…

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

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

请求路径引发的http308错误

记录一个请求路径输错引发的问题。 正确路径: /user/bind-email 请求路径我们如果输错故意多打一个s /user/bind-emails 正常预检请求会报错404未找到,我们下意识的就去排查路径是不是写错了 但是如果多打一个/ /user//bind-email 此时预检请求会报308永…

【iOS】消息流程分析

文章目录 前言动态类型动态绑定动态语言消息发送objc_msgSendSEL(selector)IMP(implementation)IMP高级用法 MethodSEL、IMP、Method总结流程概述 快速查找消息发送快速查找的总结buckets 慢速查找动态方法解析resolveInstanceMet…

做国外数据采集,更改ip后还被封是ip质量的原因吗?

IP质量低确实会出现封锁情况,但不是唯一的因素。 高质量的IP地址通常不容易被锁定,因为他们往往是由正规的ISP(互联网服务商)。但是,即使是高质量的IP地址,也有可能受其他因素影响导致封锁,如滥…

详解封装,继承,多态

java是一种面向对象的编程语言。 面向对象:是把构成问题的事务分解成各个对象,而建立对象的目的也不是为了完成一个个步骤,而是为了描述某个事物在解决整个问题的过程中所发生的行为。面向对象有封装、继承、多态的特性,所以易维…