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

【RAG探索第3讲】LlamaIndex的API调用与本地部署实战

原文链接:【RAG探索第3讲】LlamaIndex的API调用与本地部署实战

今天是2024年7月5日,星期五,天气晴,北京。 RAG的文章也看不少了,今天给大家带来一个llamaindex的实战。分为两个部分,调用ChatGLM的API来用llamaindex和本地部署qwen1.5使用llamaindex。

  1. LlamaIndex框架调用ChatGLM4 API实现RAG检索
    概述
    LlamaIndex 是一个“数据框架”,可帮助您构建 LLM 应用程序。它提供以下工具:
    (1)提供数据连接器来获取您现有的数据源和数据格式(API、PDF、文档、SQL 等)。
    (2)提供构建数据(索引、图表)的方法,以便这些数据可以轻松地与 LLM 一起使用。
    (3)为您的数据提供高级检索/查询接口:输入任何 LLM 输入提示,获取检索到的上下文和知识增强输出。
    (4)允许轻松与外部应用程序框架集成(例如 LangChain、Flask、Docker、ChatGPT 等)。
    LlamaIndex官网:https://github.com/run-llama/llama_index

在这里插入图片描述
智谱API的获取
官网:https://open.bigmodel.cn
在这里插入图片描述
点击右上角的开发工作台

在这里插入图片描述
点击查看API key

在这里插入图片描述
可在上端开发文档中的接口指南了解该API的使用(这里采用的是langchain框架调用API接口)

在这里插入图片描述
2.实践
本次运行需要通过HuggingFace连接嵌入模型,推荐在本地部署。
(1)创建test.py文件,将以下代码粘进去

from langchain_openai import ChatOpenAI
import jwt
import time
from langchain_core.messages import HumanMessage
from llama_index.core import GPTVectorStoreIndex, SimpleDirectoryReaderfrom llama_index.embeddings.huggingface import HuggingFaceEmbedding
zhipuai_api_key = "你的智谱API"def generate_token(apikey: str, exp_seconds: int):try:id, secret = apikey.split(".")except Exception as e:raise Exception("invalid apikey", e)payload = {"api_key": id,"exp": int(round(time.time() * 1000)) + exp_seconds * 1000,"timestamp": int(round(time.time() * 1000)),}return jwt.encode(payload,secret,algorithm="HS256",headers={"alg": "HS256", "sign_type": "SIGN"},)class ChatZhiPuAI(ChatOpenAI):def __init__(self, model_name):super().__init__(model_name=model_name, openai_api_key=generate_token(zhipuai_api_key, 10),openai_api_base="https://open.bigmodel.cn/api/paas/v4")def invoke(self, question):messages = [HumanMessage(content=question),]return super().invoke(messages)# 加载数据,需确认数据目录的正确性
documents = SimpleDirectoryReader('data').load_data()
#输出加载后的数据
print("documents:",documents)
# 实例化BAAI/bge-small-en-v1.5模型
baai_embedding = HuggingFaceEmbedding(model_name="BAAI/bge-small-en-v1.5")# 使用 BAAI/bge-small-en-v1.5 模型初始化GPTVectorStoreIndex
index = GPTVectorStoreIndex.from_documents(documents, embed_model=baai_embedding)chatglm = ChatZhiPuAI(model_name="glm-4")
query_engine = index.as_query_engine(llm=chatglm)
response = query_engine.query("你的问题")
print(response)

(2)在test的同等目录下创建一个data文件夹用于存放加载的数据,作者这里在data文件夹中放入的是.txt文件用于导入。
(3)运行即可以下为展示结果
数据信息:

在这里插入图片描述
输出信息:

在这里插入图片描述
由此可见,运行成功,输出信息来源于输入的数据。
3. 遇到的Bug以及解决办法
(1)

ImportError: cannot import name 'LangSmithParams' from 'langchain_core.language_models.chat_models' 

经查询:是langchain-openai包损坏,本人出现Bug是包的版本是0.1.13
解决办法: 卸载当前包 pip unstall langchain-openai,安装0.1.7即pip install langchain-openai==0.1.7
参考链接:https://github.com/langchain-ai/langchain/issues/22333
(2)

ModuleNotFoundError: No module named 'llama_index.llms.fireworks'

解决办法:安装该包:pip install llama_index.llms.fireworks
安装失败的话换源试试,本人这里采用的是清华源

但是呢,肯定会有很多人想问,如果我不想用API,或者由于某些原因没办法获得足够的API该怎么办呢?下面提供一种不需要使用官方API,直接部署就可以使用的方法,并以qwen1.5为例子进行展示。

本地部署llamaindex+qwen1.5
本地部署Qwen1.5使用LlamaIndex框架实现RAG

  1. 介绍
    LlamaIndex官网:https://github.com/run-llama/llama_index
    LlamaIndex官网提供了调用OpenAI和Llama的API构建向量存储索引。
  2. 实践
    (1)依赖包
pip install llama-index
pip install llama-index-llms-huggingface
pip install llama-index-embeddings-huggingface
pip install llama-index ipywidgets

(2)下载Qwen1.5以及嵌入模型
嵌入模型:

git clone https://www.modelscope.cn/AI-ModelScope/bge-small-zh-v1.5.git

Qwen1.5:

git clone https://www.modelscope.cn/qwen/Qwen1.5-4B-Chat.git

(3)创建data文件夹并在文件夹内放入相应的数据。本文采取txt格式,信息来自百度百科。

在这里插入图片描述
(4)创建demo.py文件夹并将下列代码粘如

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from llama_index.llms.huggingface import HuggingFaceLLM
from llama_index.core import PromptTemplate
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.core import SimpleDirectoryReader
from llama_index.core import VectorStoreIndex
from llama_index.core import Settings
import os
# os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'# Model names (make sure you have access on HF)
LLAMA2_13B_CHAT = "/home/data/aaa/llamaindex/Qwen1.5-7B-Chat"selected_model = LLAMA2_13B_CHATSYSTEM_PROMPT = """You are an AI assistant that answers questions in a friendly manner, based on the given source documents. Here are some rules you always follow:
- Generate human readable output, avoid creating output with gibberish text.
- Generate only the requested output, don't include any other language before or after the requested output.
- Never say thank you, that you are happy to help, that you are an AI agent, etc. Just answer directly.
- Generate professional language typically used in business documents in North America.
- Never generate offensive or foul language.
"""query_wrapper_prompt = PromptTemplate("[INST]<<SYS>>\n" + SYSTEM_PROMPT + "<</SYS>>\n\n{query_str}[/INST] "
)# Load model and tokenizer with device map
device = "cuda" if torch.cuda.is_available() else "cpu"tokenizer = AutoTokenizer.from_pretrained(selected_model)
model = AutoModelForCausalLM.from_pretrained(selected_model, device_map="auto")llm = HuggingFaceLLM(context_window=4096,max_new_tokens=128,  # Further reduce the number of new tokens generatedgenerate_kwargs={"temperature": 0,  # Adjusted temperature for more varied responses"do_sample": True,  # Enable sampling for more varied responses},query_wrapper_prompt=query_wrapper_prompt,tokenizer_name=selected_model,model_name=selected_model,device_map="auto"
)embed_model = HuggingFaceEmbedding(model_name="/home/data/aaa/llamaindex/bge-small-zh-v1.5")Settings.llm = llm
Settings.embed_model = embed_model# Load documents
documents = SimpleDirectoryReader("/home/data/aaa/llamaindex/data").load_data()print("载入的数据-------------")
# print(documents)
print("---------------------")index = VectorStoreIndex.from_documents(documents)# Set Logging to DEBUG for more detailed outputs
query_engine = index.as_query_engine()# Function to clear cache
def clear_cache():if torch.cuda.is_available():torch.cuda.empty_cache()clear_cache()response = query_engine.query("问题?")print("回答---------------")
print(response)clear_cache()

注:记得修改模型和数据路径
(4)输出结果
在这里插入图片描述
在这里插入图片描述

总结

本讲内容介绍了LlamaIndex框架的两种使用方法:通过API调用和本地部署,具体包括以下几个方面:

  1. LlamaIndex框架调用ChatGLM4 API实现RAG检索 LlamaIndex是一个帮助构建LLM应用程序的数据框架,提供数据连接器、数据构建方法、高级检索接口以及与外部应用集成的功能。
    获取智谱API的步骤及代码示例,包括API key的生成、数据加载和模型实例化。
    遇到的常见错误及解决方法,如包版本问题和模块缺失问题。
  2. 本地部署LlamaIndex+Qwen1.5实现RAG 提供了本地部署所需的依赖包和下载模型的步骤。
    通过创建示例代码文件,实现了LlamaIndex与Qwen1.5模型的结合,展示了从数据加载到查询响应的完整流程。
    强调了修改模型和数据路径的重要性,并展示了运行结果。

合著作者:USTB-zmh

相关阅读
【RAG探索第3讲】LlamaIndex的API调用与本地部署实战
【RAG探索第2讲】大模型与知识图谱的融合之路:优势互补与协同发展
【RAG探索第1讲】通过大模型读取外部文档的创新探索与自适应策略
大模型名词扫盲贴
RAG实战-QAnything
提升大型语言模型性能的新方法:Query Rewriting技术解析
一文带你学会关键词提取算法—TextRank 和 FastTextRank实践

相关文章:

【RAG探索第3讲】LlamaIndex的API调用与本地部署实战

原文链接&#xff1a;【RAG探索第3讲】LlamaIndex的API调用与本地部署实战 今天是2024年7月5日&#xff0c;星期五&#xff0c;天气晴&#xff0c;北京。 RAG的文章也看不少了&#xff0c;今天给大家带来一个llamaindex的实战。分为两个部分&#xff0c;调用ChatGLM的API来用l…...

C# —— 日期对象

DateTime 时间类 存储时间对象 可以获取当前时间 DateTime now DateTime.Now;// 获取当前时间 Console.WriteLine("年:" now.Year);//2023 Console.WriteLine("月:" now.Month);//9 Console.WriteLine("日:" now.Day);//12 Console.WriteLi…...

【MySQL04】【 redo 日志】

文章目录 一、前言二、redo 日志1. redo 日志格式2. Mini-Transaction2.1 以组的形式写入 redo 日志2.2 Mini-Transaction &#xff08;MTR&#xff09;概念 3. redo 日志写入过程3.1 redo 日志缓冲区3.3 redo 日志写入 log buffer 4. redo 日志文件4.1 redo 日志刷盘机制4.2 r…...

Android线性布局的概念与属性

线性布局(LinearLayout)是Android中最简单的布局方式&#xff0c;线性布局方式会使得所有在其内部的控件或子布局按一条水平或垂直的线排列。如图所示&#xff0c;图a是纵向线性布局示意图&#xff0c;图b是横向线性布局示意图。 a&#xff09;纵向线性布局示意图 …...

java反射介绍

Java反射API允许你在运行时检查和修改程序的行为。这意味着你可以动态地创建对象、查看类的字段、方法和构造函数&#xff0c;甚至调用它们。这是一个强大的特性&#xff0c;但也应该谨慎使用&#xff0c;因为它可以破坏封装性。 以下是使用Java反射的一些常见用途&#xff1a;…...

Spring中@Transactional的实现和原理

这篇文章写的很详细了&#xff0c;引自脚本之家 Java中SpringBoot的Transactional原理_java_脚本之家...

华为仓颉可以取代 Java 吗?

大家好&#xff0c;我是君哥。 在最近的华为开发者大会上&#xff0c;华为亮相了仓颉编程语言&#xff0c;这是华为历经 5 年&#xff0c;投入大量研发成本沉淀的一门编程语言。 1 仓颉简介 按照官方报告&#xff0c;仓颉编程语言是一款面向全场景智能的新一代编程语言&#…...

性能测试相关理解(一)

根据学习全栈测试博主的课程做的笔记 一、说明 若未特别说明&#xff0c;涉及术语都是jmeter来说&#xff0c;线程数&#xff0c;就是jmeter线程组中的线程数 二、软件性能是什么 1、用户关注&#xff1a;响应时间 2、业务/产品关注&#xff1a;响应时间、支持多少并发数、…...

缓存-分布式锁-原理和基本使用

分布式锁原理和使用 自旋 public Map<String, List<Catelog2Vo>> getCatalogJsonFromDBWithRedisLock() {Boolean b redisTemplate.opsForValue().setIfAbsent(Lock, Lock, Duration.ofMinutes(1));if (!b) {int i 10;while (i > 0) {Object result redisTe…...

判断国内ip

php代码 //是否国内ip function isChinaIP($ip) {saveLog("---isChinaIP----------");$url "https://searchplugin.csdn.net/api/v1/ip/get?ip".$ip;// 发送HTTP请求$response file_get_contents($url);$utf8String mb_convert_encoding($response, &…...

linux修改内核实现禁止被ping(随手记)

概述 Linux默认允许被ping。其主要决定因素为&#xff1a; 内核参数防火墙&#xff08;iptables/firewall&#xff09; 以上的决定因素是与的关系&#xff0c;即需要均满足。 因此&#xff0c;修改linux禁被ping有以上两种方法可以实现。 修改内核文件使禁ping 1. 临时生…...

mac M1安装 VSCode

最近在学黑马程序员Java最新AI若依框架项目开发&#xff0c;里面前端用的是Visual Studio Code 所以我也就下载安装了一下&#xff0c;系统是M1芯片的&#xff0c;安装过程还是有点坑的写下来大家注意一下 1.在appstore中下载 2.在系统终端中输入 clang 显示如下图 那么在终端输…...

代码随想录算法训练营第二十七天 |56. 合并区间 738.单调递增的数字 968.监控二叉树 (可跳过)

56. 合并区间 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&#xff1a;in…...

网络基础:IS-IS协议

IS-IS&#xff08;Intermediate System to Intermediate System&#xff09;是一种链路状态路由协议&#xff0c;最初由 ISO&#xff08;International Organization for Standardization&#xff09;为 CLNS&#xff08;Connectionless Network Service&#xff09;网络设计。…...

Java面试八股之如何提高MySQL的insert性能

如何提高MySQL的insert性能 提高MySQL的INSERT性能可以通过多种策略实现&#xff0c;以下是一些常见的优化技巧&#xff1a; 批量插入&#xff1a; 而不是逐条插入&#xff0c;可以使用单个INSERT语句插入多行数据。例如&#xff1a; INSERT INTO table_name (col1, col2) V…...

【密码学】什么是密码?什么是密码学?

一、密码的定义 根据《中华人民共和国密码法》对密码的定义如下&#xff1a; 密码是指采用特定变换的方法对信息等进行加密保护、安全认证的技术、产品和服务。 二、密码学的定义 密码学是研究编制密码和破译密码的技术科学。由定义可以知道密码学分为两个主要分支&#x…...

k8s record 20240703

1. containerd 它不用于直接和开发人员互动&#xff0c;在这方面不和docker竞争 containerd的用时最短&#xff0c;性能最好。 containerd 是容器的生命周期管理&#xff0c;容器的网络管理等等&#xff0c;真正让容器运行需要runC containerd 是一个独立的容器运行时&am…...

Ansible常用模块

华子目录 Ansible四个命令模块1.组成2.特点3.区别3.1command、shell模块3.2raw模块 4.command模块4.1参数表4.2free_form参数 5.shell模块5.1作用5.2例如 6.script模块6.1示例 7.raw模块7.1参数7.2示例 文件操作模块1.file模块1.1参数1.2示例 2.copy模块2.1参数 Ansible四个命令…...

【JavaScript脚本宇宙】提升用户体验:探索 JavaScript 库中的浏览器特性支持检测

深入探讨JavaScript库&#xff1a;功能、配置与应用场景 前言 在现代的Web开发中&#xff0c;JavaScript库扮演着至关重要的角色&#xff0c;帮助开发人员简化代码、提高效率、实现更好的用户体验。本文将探讨几个常用的JavaScript库&#xff0c;包括模块加载库、数据绑定库和…...

深度学习:C++和Python如何对大图进行小目标检测

最近在医美和工业两条线来回穿梭&#xff0c;甚是疲倦&#xff0c;一会儿搞搞医美的人像美容&#xff0c;一会儿搞搞工业的检测&#xff0c;最近新接的一个项目&#xff0c;关于瑕疵检测的&#xff0c;目标图像也并不是很大吧&#xff0c;需要放大后&#xff0c;才能看见细小的…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...

ubuntu中安装conda的后遗症

缘由: 在编译rk3588的sdk时&#xff0c;遇到编译buildroot失败&#xff0c;提示如下&#xff1a; 提示缺失expect&#xff0c;但是实测相关工具是在的&#xff0c;如下显示&#xff1a; 然后查找借助各个ai工具&#xff0c;重新安装相关的工具&#xff0c;依然无解。 解决&am…...