当前位置: 首页 > news >正文

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

目录

  • 一、项目简介
    • 概述
    • 时间
    • 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 EmbeddedOptionsclient = 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 Filterresponse = 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
queryField 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
filtersField 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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Windows下使用cmake编译OpenCV
  • Linux脚本实现自动化运维:系统自动备份、资源监控
  • Linux内核线程
  • Metal知识集锦
  • CTK框架(六):服务工厂
  • 本地搭建 Whisper 语音识别模型
  • 万能无线航模模拟器加密狗说明书
  • 图像与文本并存,多模态检索如何带来新的搜索革命
  • Linux:目录及文件管理
  • Parsec问题解决方案
  • 猜测、实现 B 站在看人数
  • WinCC V7.5与S7-1200 PLC 通信
  • Linux学习-Ansible(一)
  • 自建,前端sdk库(react-utils-dev-sdk)
  • C++入门项目:Linux下C++轻量级Web服务器 跑通|运行|测试(小白进)
  • 分享的文章《人生如棋》
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • Angular 2 DI - IoC DI - 1
  • flutter的key在widget list的作用以及必要性
  • Java读取Properties文件的六种方法
  • JWT究竟是什么呢?
  • KMP算法及优化
  • Redis的resp协议
  • Ruby 2.x 源代码分析:扩展 概述
  • vue 个人积累(使用工具,组件)
  • 关于字符编码你应该知道的事情
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 我的zsh配置, 2019最新方案
  • 我有几个粽子,和一个故事
  • 物联网链路协议
  • 最近的计划
  • 1.Ext JS 建立web开发工程
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​一些不规范的GTID使用场景
  • ## 1.3.Git命令
  • #include
  • (1) caustics\
  • (二)原生js案例之数码时钟计时
  • (附源码)计算机毕业设计高校学生选课系统
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (十一)手动添加用户和文件的特殊权限
  • (四) Graphivz 颜色选择
  • (四)图像的%2线性拉伸
  • (五)关系数据库标准语言SQL
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • ./和../以及/和~之间的区别
  • .a文件和.so文件
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .htaccess配置重写url引擎
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET8使用VS2022打包Docker镜像
  • .NET导入Excel数据
  • .net和php怎么连接,php和apache之间如何连接