我的第3个AI项目-Advanced RAG with Gemma, Weaviate, and LlamaIndex

news2024/11/18 3:48:44

目录

  • 一、项目简介
    • 概述
    • 时间
    • kaggle地址(代码和详细注解)
    • 主要工作和收获
    • 技术栈
    • 数据集
    • 结果
  • 二、bug修复
    • 在 Kaggle 使用模型时需要先同意该模型的使用条款
    • 使用 GPU 时显存不足
    • 把 Weaviate 从V3升级到V4
      • 改动一:创建client
      • 改动二:判断某个索引是否存在
      • 改动三:聚合查询
      • 改动四:带过滤条件的普通查询
    • 使用 OpenAI 的 gpt-4 模型时报错
    • OpenAI api调用超出限额
      • 结论
  • 三、kaggle 使用 Tips
    • 查看每个cell的运行时间
    • 将代码或者打印日志折叠和展开
    • 注意 kaggle 免费 GPU 和 TPU 的使用限额
    • Kaggle 上两种免费 GPU 该如何选择?
      • 1. **NVIDIA Tesla P100**
      • 2. **NVIDIA Tesla T4**
      • 选择建议:
      • 总结:

一、项目简介

概述

这是我的第3个AI项目,本项目使用 LlamaIndex 与 Gemma 以及 Weaviate 向量数据库构建高级 RAG 管道

时间

2024.09.08-2024.09.09

kaggle地址(代码和详细注解)

Advanced RAG with Gemma, Weaviate, and LlamaIndex

主要工作和收获

  • 通过自定义类使用 Gemma 模型
  • 在 Weaviate 中创建和使用向量存储(VectorStore),并将其与 llama_index 一起用于管理嵌入和索引。
  • 构建了一个简单的 RAG查询引擎
  • 构建了一个高级的 RAG查询引擎,用到了(自动检索、混合搜索、重新排序、Few-shot 提示)等高级RAG技术
  • 把 Weaviate 从V3升级到V4,修复版本兼容bug
  • 熟悉了 LlamaIndex 和 Weaviate 的使用
  • 了解了openai api 调用可能存在的一些问题

技术栈

  • 高级RAG技术,LlamaIndex,Weaviate,Gemma

数据集

2023-kaggle-ai-report

结果

因为openai 的api 需要付费调用,而我觉得自己现在的需求没有付费的必要,所以高级的 RAG查询引擎的部分功能(自动检索)没有真正跑通,不过原理和代码已经懂了,留着以后条件满足了再尝试,详细解释见我技术博客bug修复部分(OpenAI api调用超出限额)。


二、bug修复

在 Kaggle 使用模型时需要先同意该模型的使用条款

原作者代码运行到这行代码时报错了:

gemma_lm = keras_nlp.models.GemmaCausalLM.from_preset("gemma_instruct_2b_en")

报错信息:

BackendError: POST failed with: {"errors":["You must agree to the license on the model detail page: https://www.kaggle.com/models/keras/gemma"],"error":{"code":9,"details":[]},"wasSuccessful":false}

错误信息的意思是:我需要在使用 Kaggle 上的某个模型(这里是 Keras 模型 “gemma”)之前,同意其许可证。

解决方案:
打开报错中提到的链接:https://www.kaggle.com/models/keras/gemma。
在页面上查找并同意模型的许可证协议。如下图所示:

同意模型的许可证协议

同意许可证后,右下角会跳出这个框,说明现在可以使用Gemma模型了。

可以使用模型了


使用 GPU 时显存不足

运行到这里报错了:

gemma_lm = keras_nlp.models.GemmaCausalLM.from_preset("gemma_instruct_2b_en")

错误信息:

ResourceExhaustedError: {{function_node __wrapped__Mul_device_/job:localhost/replica:0/task:0/device:GPU:0}} failed to allocate memory [Op:Mul] name: 

ResourceExhaustedError: failed to allocate memory 错误通常是因为在使用 GPU 进行计算时,显存(GPU memory)不足,无法分配足够的内存来执行当前的操作。这种情况在处理大型模型或批处理数据时尤其常见。而且 Kaggle 的免费 GPU 有固定的显存限制,所以我可能需要优化代码(比如使用更小的模型)以减少显存占用。

解决方案有很多,不过我不想改动代码,因为我想到原作者代码是能跑的,没有出现这个错误,所以我怀疑不是模型过大导致的,而是自己之前的操作已经占用了大量显存,导致GPU显存不足。

解决方案:尝试重启 Kaggle Notebook 的内核(停止并重启 session),以释放所有 GPU 资源, 再跑一次就没有出现这个bug了。如果还不行,可以尝试切换到 TPU 试试。


把 Weaviate 从V3升级到V4

本来我想按照上一个项目的解决思路,通过指定版本号来安装各个包,且版本号都保持和原作者一样,这样就可以在不改动代码(兼容原作者Weaviate-client 3.x版本代码)的情况下跑起来了。但是我发现原作者下面三个包采用了静默安装(-q),导致这三个包没有安装日志,所以没法从日志里找到对应的版本号。我又尝试了用距离原作者notebook发布日期(2024-01-30)最近的版本号来替代,但是还是出现了各种版本兼容报错。

!pip install -q -U keras-nlp
!pip install -q -U keras>3
!pip install -q -U llama_index

解决方案:所以我决定把作者 weaviate 3.x的代码升级到4.x,这样所有的安装包都可以采用最新版本了,而且kaggle环境也采用最新环境(Always use latest environment)。

参考weaviate官方迁移文档 Migrate from v3 to v4,我做了下面代码的修改:

改动一:创建client

v3代码

import weaviate
from weaviate.embedded import EmbeddedOptions

client = weaviate.Client(embedded_options=EmbeddedOptions())

v4代码

import weaviate
client = weaviate.connect_to_embedded()

改动二:判断某个索引是否存在

v3代码

if client.schema.exists(index_name):
    client.schema.delete_class(index_name)

v4代码

collections = client.collections.list_all()
if index_name in collections:
    client.collections.delete(index_name)

改动三:聚合查询

v3代码

client.query.aggregate(index_name).with_meta_count().do()

v4代码

client.collections.get(index_name).aggregate.over_all(total_count=True)

改动四:带过滤条件的普通查询

v3代码

response = (
    client.query
    .get(index_name, ["text"])
    .with_where({
        "path": ["competition_title"],
        "operator": "Equal",
        "valueText": "Google - Isolated Sign Language Recognition"
    })
    .with_limit(2)
    .do()
)

print(json.dumps(response, indent=4))

v4代码

from weaviate.classes.query import Filter

response = client.collections.get(index_name).query.fetch_objects(
    filters=Filter.by_property("competition_title").equal("Google - Isolated Sign Language Recognition"),
    limit=2
)

for o in response.objects:
    print(o.properties)

升级完后,bug就修复了。


使用 OpenAI 的 gpt-4 模型时报错

报错是自动检索(元数据过滤)的那一块代码的最后一行:

import openai
from llama_index.llms.openai import OpenAI
from kaggle_secrets import UserSecretsClient
user_secrets = UserSecretsClient()
openai.api_key = user_secrets.get_secret("OPENAI_API_KEY")

retriever = VectorIndexAutoRetriever(
    index, 
    llm = OpenAI(model="gpt4"),
    vector_store_info=vector_store_info,
    similarity_top_k = 4, 
    vector_store_query_mode="hybrid", 
    alpha=0.5,
    verbose=True
)

response = retriever.retrieve(sample_query)

错误信息:

NotFoundError: Error code: 404 - {'error': {
'message': 'The model `gpt-4` does not exist or you do not have access to it.', 
'type': 'invalid_request_error', 'param': None, 'code': 'model_not_found'}}

该错误说明我在尝试使用 OpenAI 的 gpt-4 模型时遇到了问题。我想到可能是权限问题,免费用户可能只能用 gpt-3.5-turbo ,所以我改用了 gpt-3.5-turbo ,改动代码如下:

llm = OpenAI(model="gpt-3.5-turbo"),

上面的错误解决了,又报出了下面另一个bug。


OpenAI api调用超出限额

错误信息如下:

RateLimitError: Error code: 429 - {'error': {
'message': 'You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.', 
'type': 'insufficient_quota', 'param': None, 'code': 'insufficient_quota'}}

这个错误说明我的 OpenAI api 调用超出限额,我看了一下错误信息里提到的网址:Error Code 429 - You exceeded your current quota, please check your plan and billing details.

文档里说:此错误消息表示您已达到 API 的最高月度预算。这意味着您已使用分配给您的计划的所有信用或单位,并且已达到结算周期的限制。

于是我查了下各个时间周期的限制到底是多少,见文档:rate-limits
我是免费用户,我看下图限额好像还比较高啊,我感觉自己根本没有调用几次,应该没有达到限额才对。

在这里插入图片描述

然后我看了下自己账户的usage情况:usage。
我发现自己好像有5美金的免费额度,而且一点都没有使用,如下图

你好

不过需要注意左上角,这是 project api 的情况,而不是user api 的 使用
project api 和 user api 的区别见下图

在这里插入图片描述
我很困惑,自己明明调用了api,上图却显示没有任何api调用呢,而且还有5美金额度,于是我上网查了下,找到这个帖子:
openai-api-error-429-you-exceeded-your-current-quota-please-check-your-plan-a

原来我不是付费用户,不应该看usage页面(这是付费用户看的),而应该看billing 页面,我发现自己确实没有免费试用额度了,虽然我根本没有用过,我猜可能根本没有送或者之前送了过期了,见下图:

在这里插入图片描述

解决方案很简单:就是付费。
但是我暂时不打算付费用 openai 的api。因为我认为后面工作的话不太会用到这个,公司里用的肯定是自己微调的免费开源的大模型,一般不会愿意用openai的api,毕竟比较贵。所以我应该把时间和精力花在免费开源大模型上面。

那么能否用其他模型替代gpt4来实现自动检索呢?

我尝试了用gemma模型来替代gpt4模型。

结果在同样的地方又报错了,错误信息不同:

ValidationError: 2 validation errors for VectorStoreQuerySpec
query
  Field required [type=missing, input_value={'$defs': {'FilterOperato...Spec', 'type': 'object'}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.8/v/missing
filters
  Field required [type=missing, input_value={'$defs': {'FilterOperato...Spec', 'type': 'object'}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.8/v/missing

该错误 ValidationError 表示我在使用 VectorStoreQuerySpec 时,必需的 queryfilters 字段未提供。
于是我查了下 VectorStoreQuerySpec 并结合下面文档,找出了报错的真正原因
Auto-Retrieval from a Weaviate Vector Database
这个文档里有句话如下:
We will be using GPT-4 for its reasoning capabilities to infer the metadata filters. Depending on your use case, “gpt-3.5-turbo” can work as well.

意思是:LlamaIndex在自动检索技术的示例中,之所以选择GPT-4(gpt-3.5-turbo也行)模型,是因为GPT-4才有能力根据用户提问自动推断出metadata filters(元数据过滤条件),而我尝试用来替换GPT-4的 gemma 模型还不具备这个能力,所以才导致在调用VectorStoreQuerySpec 时,必需的 queryfilters 字段未提供。

gpt-4自动推断出的 queryfilters 是这样的:

Using query str: good backbone for the Kaggle competition
Using filters: [('competition_title', '==', 'Feedback Prize - English Language Learning')]

除了gemma 模型,我猜其他开源免费的大模型应该也不具备自动检索的能力,所以LlamaIndex官网才会在自动检索技术的示例中使用需要付费的GPT-4 api来实现而不是其他免费的模型。我查了下LLaMA 2也是需要微调和提示工程(prompt engineering)才具备这个功能。

当然,我可以尝试通过适当的微调和提示工程(prompt engineering)来让gemma 或者LLaMA 2模型具备这个能力,但是实现起来会比较复杂的也比较耗时,而且微调和提示工程(prompt engineering)是我后面项目要学的,现在超出了我的能力范围,而且也不是我这个项目的目标。

结论

这个项目到底为止,自动检索功能就先不测试跑通了,毕竟自己已经知道了原理、思路和实现代码。
1.等后面更需要用到 openai api 的时候,我再付费测试一下就好了。
2.或者等我后面学会大模型微调,而且后面项目也确实有必要实现这个功能的时候,我再来尝试用其他开源大模型来实现这个功能。


三、kaggle 使用 Tips

查看每个cell的运行时间

在cell开始时加上这行代码就可以了,wall time 就是cell的运行时间

%%time

将代码或者打印日志折叠和展开

将代码或者打印日志折叠和展开


注意 kaggle 免费 GPU 和 TPU 的使用限额

有两种GPU可以选,共用免费限额时间,一周免费时间是30小时,TPU只有一种,是20小时,我一周才过了两天,就使用了9小时了,总之建议大家省着点用,不用的时候就关掉session,多注意kaggle 右边栏的 GPU使用情况。
GPU使用限额


Kaggle 上两种免费 GPU 该如何选择?

在 Kaggle 上,Tesla P100 和 Tesla T4 是两种常见的免费 GPU,它们各有优点,具体选择要根据你的任务需求来决定。以下是它们的对比:

1. NVIDIA Tesla P100

  • 架构: Pascal
  • CUDA 核心数: 3584
  • 内存带宽: 732 GB/s
  • 显存: 16 GB HBM2
  • 计算性能: 更适合需要较大计算资源的任务,比如大规模的深度学习模型训练,尤其是卷积神经网络(CNN)。

2. NVIDIA Tesla T4

  • 架构: Turing
  • CUDA 核心数: 2560
  • Tensor 核心: 320 个,支持混合精度(FP16、FP32),对 AI 推理任务有加速效果
  • 内存带宽: 320 GB/s
  • 显存: 16 GB GDDR6
  • 计算性能: T4 支持更高效的推理(Inference)计算,因此在模型推理、轻量化模型训练(例如 BERT 微调)、混合精度计算上可能会表现得更好。

选择建议:

  • 训练大型模型(例如深度 CNN、需要大量显存的模型):Tesla P100 更好,因为它的内存带宽更高、CUDA 核心数更多。
  • 推理任务或轻量化训练(例如 NLP 模型的推理和微调、BERT 等 Transformer 模型):Tesla T4 更好,尤其是在你使用混合精度时,它的 Tensor 核心可以显著加速计算。

总结:

  • 如果你主要做 大规模模型训练,建议选择 Tesla P100
  • 如果你做 推理、轻量化训练使用混合精度 进行加速,建议选择 Tesla T4

你可以根据项目的需求在两者之间切换。

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

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

相关文章

网络编程day02(字节序、TCP编程)

目录 【1】字节序 1》大小端转换 2》端口转换 3》IP地址转换 主机字节序转换为网络字节序 (小端序->大端序) 网络字节序转换为主机字节序(大端序->小端序) 【2】TCP编程 1》流程 2》函数接口 1> socket 2> …

免费的 Mac 应用清理工具Pearcleaner v3.8.6

免费的 Mac 应用清理工具。这是一款免费开源的 Mac 应用清理工具,能够彻底卸载应用并清理残留文件。它采用 SwiftUI 开发,提供了简单易用的界面,支持右键卸载、迷你模式和 Homebrew 清理等功能。 下载链接:https://pan.quark.cn/s…

【Visual Studio 报错】vs 在使用二进制写入文件时弹窗报错:使用简体中文 gb2312 编码加载文件

如以下报错 解决办法 解决方法:文件->高级保存选项->将文件编码形式改为“UTF-8带签名” 若找不到高级保存选项,可以跟着下面路径把该选项调出来 :工具->自定义->命令->菜单栏中改成文件->预览右边点添加命令->类别中…

BRAM IP Native模式使用

简介 BRAM(‌Block RAM)是‌FPGA(Field-Programmable Gate Array)中的一种专用RAM资源,固定分布在FPGA内部的特定位置。该内容主要对BRAM(Block RAM”的缩写)Native模式下IP界面做详细描述和使用…

C语言进阶版第9课—指针(3)

文章目录 1. 字符指针变量2. 数组指针变量3. 二维数组传参的本质4. 函数指针变量5. typedef关键字6. 函数指针数组7. 函数指针数组的应用—转移表 1. 字符指针变量 练习题 2. 数组指针变量 在学习数组指针前,我们先回忆一下什么是指针数组指针数组 → 存放指针的数…

基于单片机的人脸识别的智能门禁系统设计

文章目录 前言资料获取设计介绍功能介绍设计清单核心代码具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等…

Unity Addressables 使用说明(一)概述

使用 Adressables 组织管理 Asset Addressables 包基于 Unity 的 AssetBundles 系统,并提供了一个用户界面来管理您的 AssetBundles。当您使一个资源可寻址(Addressable)时,您可以使用该资源的地址从任何地方加载它。无论资源是在…

【C++ Primer Plus习题】14.2

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include "wine.h" …

【PWN · 栈溢出 | GOT劫持】[2024 · 长城杯]consumption

通过代码审计&#xff0c;找到栈溢出漏洞点&#xff0c;覆盖关键栈变量&#xff0c;实现任意地址写 前言 本题主要是套壳了Cjson&#xff0c;实则是约定了输入格式。通过仔细代码审计&#xff0c;即可找到栈溢出&#xff0c;并实现利用 一、题目 查阅网上资料&#xff0c;得知…

如何提取视频中的音频?新手也能轻松搞定

在数字媒体处理中&#xff0c;从视频文件中提取音频是一个常见需求。无论你是希望为视频制作单独的音频版本&#xff0c;还是想将某段视频的背景音乐用于其他项目&#xff0c;掌握音频提取技术都至关重要。本文将详细介绍几种提取视频中音频的方法&#xff0c;帮助你轻松实现这…

【自考zt】【软件工程】【21.04】(部分)

一、单选 二、填空 三、简答 四、应用 小结&#xff1a;

DeepSeek缓存命中技术,成本降低10倍

DeepSeek系列升级&#xff1a; DeepSeek发布最新的缓存命中技术&#xff0c;有效降低成本至0.1元/百万tokens&#xff0c;适用于文件读取和固定提示词。 点评&#xff1a;由于token消耗大部分是在系统提示词中&#xff0c;妥善使用确实可以极大降低成本&#xff0c;同时还能保证…

音视频入门基础:WAV专题(11)——FFmpeg源码中计算WAV音频文件每个packet的pts_time、dts_time的实现

音视频入门基础&#xff1a;WAV专题系列文章&#xff1a; 音视频入门基础&#xff1a;WAV专题&#xff08;1&#xff09;——使用FFmpeg命令生成WAV音频文件 音视频入门基础&#xff1a;WAV专题&#xff08;2&#xff09;——WAV格式简介 音视频入门基础&#xff1a;WAV专题…

ssm微信小程序校园失物招领论文源码调试讲解

第二章 开发技术与环境配置 以Java语言为开发工具&#xff0c;利用了当前先进的SSM框架&#xff0c;以MyEclipse10为系统开发工具&#xff0c;MySQL为后台数据库&#xff0c;开发的一个微信小程序校园失物招领。 2.1 Java语言简介 Java是由SUN公司推出&#xff0c;该公司于20…

[git操作] git创建仓库上传github报错

操作流程如下 使用 git init使用 git remote add origin 项目ssh链接git add . 报错如下 Bus error (core dumped)然后执行任何别的操作都会报错&#xff1a; fatal: Unable to create path .. /.git/index.lock: File exists.Another git process seems to be running in …

​全国计算机软件中级资料分享

全国计算机软件中级资料分享 软考资料分析 软件设计师中间 免费资料 链接:https://pan.baidu.com/s/1GqbgIq_D0uZd-uuhIhG-Sg?pwd2atp 提取码:2atp 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 求个免费关注不过分吧。

vue实现评论滚动效果

vue插件实现滚动效果 一、安装组件 官网地址&#xff1a;https://chenxuan0000.github.io/vue-seamless-scroll/ 1、vue2安装 npm install vue-seamless-scroll --savevue3安装 npm install vue3-seamless-scroll --save二、组件引入 <template><div v-if"…

OpenCV 与 Matplotlib 的结合使用:轮毂检测与目标跟踪

目录 绘制轮廓图像 实现思路 1. 读取图像并转换为灰度图像 2. 二值化处理 3. 查找轮廓 4. 绘制轮廓 5. 显示结果 代码实现 效果展示 动态逐步显示轮廓结果 实现思路 1. 读取图像并缩放 2. 转换为灰度图像 3. 二值化处理 4. 查找轮廓 5. 动态显示轮廓 6. 显示最…

基于图神经网络的最大独立集问题的目标分支

文章目录 Abstract1 Introduction2 Related Work分支顶点选择图神经网络Abstract 分支归约方法结合了分支约束原则和归约规则,在处理以前无法管理的现实世界实例方面特别成功。分支策略决定下一个要在哪个顶点上进行分支。最近,最广泛使用的策略是选择最高度的顶点。 在这项…

C++为什么要引入智能指针?

智能指针的必要性 C 引入智能指针主要是为了解决手动管理动态分配内存时可能出现的几个问题&#xff0c;特别是内存泄漏、野指针和异常安全等问题。智能指针通过封装原始指针的操作&#xff0c;提供自动化的内存管理机制&#xff0c;以减少这些问题的发生。 具体来说&#xff…