自己手写了一个大模型RAG项目-06.使用自己的embedding模型

news2025/4/8 10:12:38

大家好,我是程序锅。

github上的代码封装程度高,不利于小白学习入门。

常规的大模型RAG框架有langchain等,但是langchain等框架源码理解困难,debug源码上手难度大。

因此,我写了一个人人都能看懂、人人都能修改的大模型RAG框架代码。

整体项目结构如下图所示:手把手教你大模型RAG框架架构

手把手教你大模型RAG框架架构

整个小项目分为10个章节,和github高度封装的RAG代码不同,我们将从0到1搭建大模型RAG问答系统,所有代码均整理放置在Github:ai-app,有需要的朋友自取。

图1.RAG技术路线

上一篇文章,我介绍了通过一个小项目实现了大模型RAG。

本篇文章将介绍6.更换embedding模型.

带大家修改里面的Embedding部分,替换成自己本地部署的Embedding模型,并且尝试多模态和单模态两种方式。

一、Embedding原理介绍

一句话说明白Embedding的原理:用向量来表示对象,并衡量对象之间相关性

1.什么叫做表示对象呢?

我们知道,计算机在处理任何形式的数据时,处理的都是数字,更极端点处理的都是二进制数字。不论是显示图片、文本,还是播放语音、视频,在计算机看来都是数据流。

因此,计算机在处理文本时,只有将文本转换成数字形式才能进行计算,而词嵌入表示就是为了解决这个问题。

这里举一个最简单的例子one-hot编码的概念。

比如,“程序锅讲大模型”这七个字,分别对应“0-6”。由于计算机只能识别"0"和"1",可将每个字表示为"0"和"1"组成的向量,如下图所示。

image

对象表示是没问题了,但是发现一个问题:用one-hot编码向量之间是没关系的。

是否能够很好衡量向量之间的关系,这是衡量一个Embedding模型好坏的关键。

所以,下面我将介绍如何衡量向量之间的关系。

2.衡量向量之间的关系

embedding模型的性质是能使距离相近的向量对应的物体有相近的含义,比如 Embedding(七龙珠)和Embedding(魔人布欧)之间的距离就会很接近,但 Embedding(七龙珠)和Embedding(乱世佳人)的距离就会远一些。

网上常用的向量模型有:word2vec、Bert等。大模型厂商也会用API提供embedding模型,比如ChatGPT、智谱等等。

通过前面的小项目调用智谱GLM4的接口,我们初步了解大模型embedding能干啥。

下面我们将采用paddleNLp的embedding模型,亲自本地化部署并集成到项目中,涉及多模态和单模态两个版本。

paddleNlp Embedding介绍

飞桨(PaddlePaddle)是集深度学习核心框架、工具组件和服务平台为一体的技术先进、功能完备的开源深度学习平台;使用这个平台,你可以轻松构建模型,清洗数据等。

PaddleNLP依赖于PaddlePaddle,它是百度提供的开源工具,提供开箱即用的产业级NLP预置任务能力,无需训练,一键预测。

PaddleNLP Embedding是PaddleNLP中的一个模块。

PaddleNLP Embedding分为多模态和单模态两个版本,其中多模态适用于图片和文本作为输入,而单模态只适用于文本作为输入。

整体逻辑关系如下所示:

  • 多模态Embedding

多模态学习可以聚合多源数据的信息,使得模型学习到的表示更加完备。以视频分类为例,同时使用字幕标题等文本信息、音频信息和视觉信息的多模态模型要显著好于只使用任意一种信息的单模态模型,这已经被多篇文章实验验证过。

PaddleNLP Embedding中可以使用的多模态模型如下表所示。

模型视觉文本语言
PaddlePaddle/ernie_vil-2.0-base-zh (默认)ViTERNIE中文
OFA-Sys/chinese-clip-vit-base-patch16ViT-B/16RoBERTa-wwm-Base中文
OFA-Sys/chinese-clip-vit-large-patch14ViT-L/14RoBERTa-wwm-Base中文
OFA-Sys/chinese-clip-vit-large-patch14-336pxViT-L/14RoBERTa-wwm-Base中文
  • 单模态Embedding

PaddleNLP Embedding可以使用的单模态模型如下表所示:

模型层数维度语言
rocketqa-zh-dureader-query-encoder12768中文
rocketqa-zh-dureader-para-encoder12768中文
rocketqa-zh-base-query-encoder12768中文
rocketqa-zh-base-para-encoder12768中文
moka-ai/m3e-base12768中文
rocketqa-zh-medium-query-encoder6768中文
rocketqa-zh-medium-para-encoder6768中文
rocketqa-zh-mini-query-encoder6384中文
rocketqa-zh-mini-para-encoder6384中文
rocketqa-zh-micro-query-encoder4384中文
rocketqa-zh-micro-para-encoder4384中文
rocketqa-zh-nano-query-encoder4312中文
rocketqa-zh-nano-para-encoder4312中文
rocketqav2-en-marco-query-encoder12768英文
rocketqav2-en-marco-para-encoder12768英文
ernie-search-base-dual-encoder-marco-en"12768英文

二、Embedding依赖环境安装

首先添加pip源

由于网络环境,建议添加清华的pip源。步骤如下:

1.在C:\User(或者用户)\电脑的用户名\,目录下创建一个命名为pip的文件夹(如:C:\Users\Administrator\pip),在该文件夹下创建一个命名为pip.ini的文件,在该文件中写入以下内容:

[global]
index-url=https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=pypi.tsinghua.edu.cn

图1

2.Win+R打开命令行输入cmd,执行以下代码(用于获取镜像源的地址)。

pip config get global.index-url 

image

看到如上截图说明镜像源地址切换完毕。

方式一:安装paddlepaddle CPU相关环境

0.激活conda环境

conda activate RAG

1.这里安装paddlepaddle CPU版本,没GPU也可以在笔记本上本地部署。

python -m pip install paddlepaddle==2.6.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

2.安装paddlenlp

#安装paddlenlp
pip install --upgrade paddlenlp -i https://pypi.tuna.tsinghua.edu.cn/simple

方式二:安装paddlepaddle GPU相关环境

如果有GPU服务器,可以在服务器上部署,建议通过docker部署的方式。

1.拉取预安装 PaddlePaddle 的镜像:

docker pull registry.baidubce.com/paddlepaddle/paddle:2.6.0-gpu-cuda12.0-cudnn8.9-trt8.6

2.用镜像构建并进入Docker容器:

nvidia-docker run --name paddle -it -v $PWD:/paddle registry.baidubce.com/paddlepaddle/paddle:2.6.0-gpu-cuda12.0-cudnn8.9-trt8.6 /bin/bash

3.进入镜像后,安装paddlenlp

#安装paddlenlp
pip install --upgrade paddlenlp -i https://pypi.tuna.tsinghua.edu.cn/simple

4.安装截图
image

三、Embedding测试

文档地址:

https://github.com/PaddlePaddle/PaddleNLP/blob/develop/docs/model_zoo/taskflow.md

多模态Embedding测试

1.新建paddleEmbedding.py,执行如下代码

>>> from paddlenlp import Taskflow
>>> import paddle.nn.functional as F
>>> text_encoder = Taskflow("feature_extraction", model='rocketqa-zh-base-query-encoder')
>>> text_embeds = text_encoder(['春天适合种什么花?','谁有狂三这张高清的?'])
>>> text_features1 = text_embeds["features"]
>>> text_features1
Tensor(shape=[2, 768], dtype=float32, place=Place(gpu:0), stop_gradient=True,
       [[ 0.27640465, -0.13405125,  0.00612330, ..., -0.15600294,
         -0.18932408, -0.03029604],
        [-0.12041329, -0.07424965,  0.07895312, ..., -0.17068857,
          0.04485796, -0.18887770]])
>>> text_embeds = text_encoder('春天适合种什么菜?')
>>> text_features2 = text_embeds["features"]
>>> text_features2
Tensor(shape=[1, 768], dtype=float32, place=Place(gpu:0), stop_gradient=True,
       [[ 0.32578075, -0.02398480, -0.18929179, -0.18639392, -0.04062131,
       ......
>>> probs = F.cosine_similarity(text_features1, text_features2)
>>> probs
Tensor(shape=[2], dtype=float32, place=Place(gpu:0), stop_gradient=True,
       [0.86455142, 0.41222256])

单模态Embedding测试

1.新建paddleEmbedding.py,填入如下代码,执行CUDA_VISIBLE_DEVICES=1 python paddleEmbedding.py

>>> from paddlenlp import Taskflow
>>> import paddle.nn.functional as F
>>> text_encoder = Taskflow("feature_extraction", model='rocketqa-zh-base-query-encoder')
>>> text_embeds = text_encoder(['春天适合种什么花?','谁有狂三这张高清的?'])
>>> text_features1 = text_embeds["features"]
>>> text_features1
Tensor(shape=[2, 768], dtype=float32, place=Place(gpu:0), stop_gradient=True,
       [[ 0.27640465, -0.13405125,  0.00612330, ..., -0.15600294,
         -0.18932408, -0.03029604],
        [-0.12041329, -0.07424965,  0.07895312, ..., -0.17068857,
          0.04485796, -0.18887770]])
>>> text_embeds = text_encoder('春天适合种什么菜?')
>>> text_features2 = text_embeds["features"]
>>> text_features2
Tensor(shape=[1, 768], dtype=float32, place=Place(gpu:0), stop_gradient=True,
       [[ 0.32578075, -0.02398480, -0.18929179, -0.18639392, -0.04062131,
       ......
>>> probs = F.cosine_similarity(text_features1, text_features2)
>>> probs
Tensor(shape=[2], dtype=float32, place=Place(gpu:0), stop_gradient=True,
       [0.86455142, 0.41222256])

Embedding模型集成到现有项目

#embedding = ZhipuEmbedding() # 只需注释原有ZhipuEmbedding类
embedding = PaddleEmbedding(model=embedding_model) # 引用PaddleEmbedding类

四、运行

代码目录结构:

├─images
├─RAG #存放RAG核心代码
└─tutorial
    ├─01.如何调用大模型API
    ├─02.RAG介绍
    ├─03.部署环境准备
    ├─04.知识库构建
    ├─05.基于知识库的大模型问答
    ├─06.改进-用自己的embedding模型
    ├─07.封装镜像对外提供服务
    ├─08.改进-基于Faiss的大模型知识索引构建
    ├─09.改进-使用向量数据库
    └─10.前端构建

打开tutorial文件夹,进入06.改进-用自己的embedding模型

本教程默认采用PaddleNLP中的rocketqa-zh-base-query-encoder单模态embedding方法。

step1:执行python prepare.py,使用rocketqa-zh-base-query-encoder模型完成知识库构建

step2:执行python test.py,基于构建的知识库,开展大模型问答。

最后,我撰写的人工智能应用相关的博客及配套代码均整理放置在Github:ai-app,有需要的朋友自取。

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

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

相关文章

Unity入门理论+实践篇之Luna

创建世界的主角 父子物体 首先创建一个cube物体 可以观察到其在2D视角下的坐标为(0,0) 此时将cube物体拖拽到ldle_0下,如图所示,并将其坐标值改为(2,2) 此时再将ldle_0物体的坐标…

拓数派入选中电联大数据与统计分会两大重点专项工作组

自中国电力企业联合会大数据与统计分会成立以来,深入贯彻党中央、国务院关于不断做强做优做大我国数字经济有关要求,充分发挥数据要素乘数效应,凝聚行业专家及能源电力产业链各主体力量,持续推进能源电力数据资源交易共享&#xf…

Unity环绕物体的摄像机,添加了遮挡的适应

第三人人称摄像机 支持的功能 设定目标后使用鼠标可以环绕目标点旋转,且会进行遮挡的适配,当有遮挡的时候会移动差值移动到没有遮挡的位置。 使用方式 将vThirdPersonCamera 挂在与摄像机上然后为target赋值。 如果有需要检测遮挡的层级可以修改&…

数据仓库与数据挖掘实验练习6-7(实验四2024.5.22)

tips: 列出虚拟环境:conda env list 激活虚拟环境:activate hi 进入jupyter-lab:jupyter lab 练习6 1. 处理字符串空格 发现问题: 使用 values 属性查看数据时,如果发现 Name 列没有对齐,很可能是 Name 左…

2024年软考总结 信息系统管理师

选择题 英文题,我是一题也没把握,虽然我理解意思。 千万不要认为考死记硬背不对。目的不在于这。工程项目中有很多重要的数字,能记住说明你合格。 案例 几乎把答案全写在案例中了。 计算题 今年最简单。没有考成本。 只考了关键路径&a…

sheng的学习笔记-AI-EM算法

AI学习笔记目录:sheng的学习笔记-AI目录-CSDN博客 目录 基础知识 什么是EM算法 EM算法简介 数学知识 极大似然估计 问题描述 用数学知识解决现实问题 最大似然函数估计值的求解步骤 Jensen不等式 定义 EM算法详解 问题描述 EM算法推导流程 EM算法流程…

绘制t-SNE图

什么是t-SNE图? 如下图,下图来源于论文Contrastive Clustering 一般用于分类问题/对比学习。 作用? 体现出经过层层训练,类内越来越紧密,类间差异越来越大;或者也可以做消融可视化。 怎么画&#xff1f…

如何安装虚拟机Wmware,并且在虚拟机中使用centos系统

1. 前言 大家好,我是jiaoxingk 本篇文章主要讲解如何安装虚拟机,并且在虚拟机中安装centos系统,让windows电脑也能够使用Linux系统 2. 虚拟机的介绍 在安装Vmware之前,我们先做虚拟机的介绍 虚拟机:通过软件虚拟出来的…

【吊打面试官系列】Java高并发篇 - 什么是乐观锁和悲观锁?

大家好,我是锋哥。今天分享关于 【什么是乐观锁和悲观锁?】面试题,希望对大家有帮助; 什么是乐观锁和悲观锁? 1、乐观锁: 就像它的名字一样,对于并发间操作产生的线程安全问题持乐观状态, 乐观锁认为竞争…

JAVAEE初阶多线程(4)

在前面的文章中简单的概述了线程的基本定义接下来就是线程的最后完结了。 1.工厂模式 1.1工厂模式的简单定义 (1)在java jar包中有一个工厂模式这是一种设计模式 (2)这个设计模式是为了更好的解决构造方法创建对象太坑了的问题…

安卓开发:相机水印设置

1.更新水印 DecimalFormat DF new DecimalFormat("#"); DecimalFormat DF1 new DecimalFormat("#.#");LocationManager LM (LocationManager)getSystemService(Context.LOCATION_SERVICE); LM.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2…

urllib_post请求_百度翻译之详细翻译

百度翻译有一个详细翻译的接口: post请求: 请求参数(较多): 打印之后,发现有问题: 改一下请求头: 将Accept-Encoding注释掉,因为我们使用的是utf-8编码: 加上…

解决:LVGL+GUI Guider 1.7.2运行一段时间就会卡死死机,内存泄露溢出的问题

概括: 我在使用NXP官方GUI Guider生成的代码出现了内存泄漏的问题。但我遇到的并不是像其他人所说的style的问题,如下链接。而是因为在页面渲染之前就使用了该页面内的组件,内存就会不断增加。 LVGL 死机 内存泄漏_lvgl 内存溢出-CSDN博客 运…

..堆..

堆 堆是完全二叉树,即除了最后一列之外,上面的每一层都是满的(左右严格对称且每个节点都满子节点) 最后一列从左向右排序。 默认大根堆:每一个节点都大于其左右儿子,根节点就是整个数据结构的最大值 pr…

【Telemac】Telemac相关报错记录

文章目录 1.下载BlueKenue后缀为man解决办法2.运行Telemac项目提示Fortran报错解决办法1.下载BlueKenue后缀为man BlueKenue官方下载链接: 可以看到下载器请求时出现了问题,下载BlueKenue后缀为man. 解决办法 修改下载后的文件后缀为msi即可 2.运行Telemac项目提示Fortr…

视频号小店怎么进入优选联盟?入驻优选联盟都有什么条件?

大家好,我是电商花花。 视频号小店想要出单、爆单,不管在流量上还是销量都离不开达人带货,因为目前视频号小店上基本上就没有自然流量,想出单只能做达人带货。 而视频号小店想要找达人带货,必须是企业店铺&#xff0…

C++基础与深度解析 | 泛型算法 | bind | Lambda表达式

文章目录 一、泛型算法1.泛型算法的分类2.迭代器分类 二、bind与lambda表达式1.bind2.lambda表达式 三、泛型算法的改进--ranges(c20) 一、泛型算法 C中的泛型算法是标准模板库(STL)的一部分(这里重点讨论 C 标准库中定义的算法,而…

转置卷积简明教程

转置卷积层也被(错误地)称为反卷积层。反卷积层反转了标准卷积层的操作,即如果对通过标准卷积层生成的输出进行反卷积,则会返回原始输入。转置卷积层与反卷积层相似,因为两者生成的空间维度相同。转置卷积不是通过值反…

【闲聊】-Chrome DevTools简介与启动方法

Chrome DevTools简介与启动方法 Chrome DevTools是Chrome浏览器内置的一套网页开发调试工具,适用于前端开发人员。以下是如何启动DevTools以及各个面板的功能列表。 如何启动Chrome DevTools 快捷键启动: 在Windows/Linux上,按 F12 或 Ctrl…

1.手动LogisticRegression模型的训练和预测

通过这个示例,可以了解逻辑回归模型的基本原理和训练过程,同时可以通过修改和优化代码来进一步探索机器学习模型的训练和调优方法。 过程: 生成了一个模拟的二分类数据集:通过随机生成包含两个特征的数据data_x,并基于一定规则生…