LlamaIndex 实现 RAG (一)

news2024/11/25 16:33:40

理解过 LlamaIndex 的功能之后,本文通过 LlamaIndex 快速实现一个简单的 RAG 应用,主要包括以下几个部分:

  1. 创建知识库,并进行 Embedding
  2. 集成本地 Ollama 模型或者 Qwen 模型
  3. 通过 Streamlit 可视化 RAG

文末提供了源代码地址

创建 LlamaIndex 环境

安装 LlamaIndex 依赖,LlamaIndex是模块化设计,每个集成点在 LlamaIndex 中都是

pip install llama-index

集成 LLM 模型

本地模型
  1. 集成 Ollama 本地模型

集成 Ollama 本地大语言模型,需要安装 Ollama 依赖

pip install llama-index-llms-ollama
  1. 集成 Ollama Qwen2:7b

如需要安装 Ollama 环境,请移步至安装文档。首先下载 Qwen2:7b

ollama pull qwen2:7b

下载完成之后,运行Qwen,确保安装成功。

ollama run qwen2:7b

在这里插入图片描述
3. 通过 LlamaIndex 集成 Ollama 并调用模型,初始化 Ollama 时,如果使用的不是本地的 Ollama,需要指定 base_url,如果使用的是本地的 Ollama 可以忽略该参数,使用 LlamaIndex 阅读源码能快速理解 API,文档写的很清晰。调用模型时可以使用 Complete 或者 Chat,区别单轮和多轮对话,API 带有前缀 “stream” 时,代表流式输出。

from llama_index.llms.ollama import Ollama
from llama_index.core.llms import ChatMessage

# 创建 Ollama
llm = Ollama(base_url="http://10.91.3.116:11434", model="qwen2:7b", request_timeout=30.0)

# # 调用模型

response = llm.complete("介绍一下故宫")

print (response)
## 流式
response = llm.stream_complete("介绍一下故宫")
for r in response:
    print(r.delta, end="")


# # 多轮对话
messages = [
    ChatMessage(
        role="system", content="你是一个幽默风趣的导游"
    ),
    ChatMessage(role="user", content="介绍一下故宫"),
]
response = llm.chat(messages)
print (response)

## 流式
response = llm.stream_chat(messages)
for r in response:
    print(r.delta, end="")

通义千问模型

本例中 Ollama 使用的是 7B 模型,有时本地模型精确度达不到应用的要求,需要用更高参数的模型,可以是使用通义千问的商用模型,具体费用可以参考官网。要使用通义千问,需要安装 Dashscope 依赖,并申请 API KEY,在项目目录下创建 .env, 并配置 DASHSCOPE_API_KEY。

pip install load_dotenv
pip install llama-index-llms-dashscope

初始化通义千问模型

from llama_index.llms.dashscope import DashScope, DashScopeGenerationModels
from dotenv import load_dotenv
def get_tongyi():
    load_dotenv()
    return DashScope(model_name=DashScopeGenerationModels.QWEN_TURBO)

模型用法同本地模型。

文档索引

实现 RAG 之前,我们需要创建本地知识库,这里我们拿单个文档进行举例,一个功能完善的知识库需要包括很多功能,但召回的底层逻辑是相似的。

首先导入文档,并对文档进行切块,随后进行 Embedding 并保存到文件中。生产环境中我们需要将文档保存到向量数据中,以保证数据可靠性,后面会单独去讲向量数据库存储的方式。知识库的创建完成之后,就可以开始进行 Retrieve 阶段的代码开发:

from llama_index.core import SimpleDirectoryReader
from llama_index.core import VectorStoreIndex
from llama_index.embeddings.ollama import OllamaEmbedding

# 创建 OllamaEmbedding 实例,用于指定嵌入模型和服务的基本 URL
ollama_embedding = OllamaEmbedding(
    model_name="nomic-embed-text",
    base_url="http://10.91.3.116:11434"
)

# 读取 "./data" 目录中的数据并加载为文档对象
documents = SimpleDirectoryReader("./data").load_data()

# 从文档中创建 VectorStoreIndex,并使用 OllamaEmbedding 作为嵌入模型
vector_index = VectorStoreIndex.from_documents(documents, embed_model=ollama_embedding)
vector_index.set_index_id("vector_index")  # 设置索引 ID
vector_index.storage_context.persist("./storage")  # 将索引持久化到 "./storage"

# 创建 retriever
query_engine = vector_index.as_retriever()

response = query_engine.retrieve("当前社保情况?")

LLM 增强

数据从本地知识库查询结束之后,需要构建查询上下文,并将 Query 一同传给大模型进行回答。LlamaIndex 通过 Setting 进行模型大模型设置,LlamaIndex 运行时会通过 Settings.llm 获取当前使用的 LLM,并进一步对模型进行的操作。index.as_query_engine() 这行始终点,LlamaIndex 把 RAG 的主流程都封装在这个方法中了。

from llm import get_llm
from docs import get_index
from llama_index.core import Settings

Settings.llm = get_llm()

index = get_index()

query  = index.as_query_engine()

print (query.query("当前社保情况?"))

可视化 RAG

通过 StreamLit 可视化 RAG,StreamLit 是一个 Python 可是化框架,和 Gradio 类似,通过可视化可以直接让我们上面完成代码转为可视化 Demo。首先安装 StreamLit 依赖包

pip install streamlit

streamlit 组件都已经内置了,自己需要我们对其进行设计就好。

from llm import get_llm
from docs import get_index
from llama_index.core import Settings
import streamlit as st
# 设置 LLM
Settings.llm = get_llm()



@st.cache_resource(show_spinner=False)
def load_data():
    return get_index()

index = load_data()

# 初始化消息历史
if "messages" not in st.session_state.keys():  
    st.session_state.messages = [
        {
            "role": "assistant",
            "content": "问我一些关于2023 年度人力资源和社会保障事业发展统计公报的问题!",
        }
    ]

if "chat_engine" not in st.session_state.keys():  # 初始化引擎
    st.session_state.chat_engine = index.as_chat_engine(
        chat_mode="condense_question", verbose=True, streaming=True
    )

if prompt := st.chat_input(
    "请提问"
):  # 用户输入
    st.session_state.messages.append({"role": "user", "content": prompt})
    
for message in st.session_state.messages:  # 消息历史
    with st.chat_message(message["role"]):
        st.write(message["content"])

# 发送请求到 Engine 进行 Prompt 回答
if st.session_state.messages[-1]["role"] != "assistant":
    with st.chat_message("assistant"):
        response_stream = st.session_state.chat_engine.stream_chat(prompt)
        st.write_stream(response_stream.response_gen)
        message = {"role": "assistant", "content": response_stream.response}
        # 添加历史消息
        st.session_state.messages.append(message)

启动 Stream

streamlit run simple_rag.py    

在这里插入图片描述

总结

本文简单实现 RAG 的流程,并实现了可视化页面,关于文档的切分以及 RAG 不同组件的详细讲解,会在后续文章继续分享。

代码地址:https://gitcode.com/hawk2014bj/llamaindex/overview

源代码也可以从资源中下载。

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

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

相关文章

HarmonyOS开发实战:应用权限/通知设置跳转方案

场景描述 引导用户跳转到系统设置页进行权限,通知的相关设置,类似android和iOS应用中常见的应用内跳转到设置进行通知开启或权限设置的操作。 应用经常会遇到如下的业务诉求: 场景一:如果应用首次拒绝了消息通知,应…

免费高效:2024年四大视频剪辑软件推荐!

不管是不是专业人士,相信大家多多少少都会有视频剪辑的需求,对于很多新手来说,一款好用且免费的视频剪辑工具十分必要,接下来就为大家推荐几个好用的视频剪辑免费软件! 福昕视频剪辑 链接:www.pdf365.cn/…

Linux(CentOS7)虚拟机安装教程

创建虚拟机 自定义高级,就下一步 选择Workstation 17.x,完好后就继续下一步,下面就如图所示 虚拟机内存看情况加 磁盘大小也看情况加 完成! 开启此虚拟机 鼠标放进去直接回车 可能有点慢,请耐心等待 一.进入日期时间 二.进入软件选择 三.配置…

[创业之路-138] :产品需求、产品研发、产品生产、库存管理、品控、售后全流程 - 时序图

目录 一、产品研发全流程 1. 客户/市场需求 2. 供应链采购 3. 设计研发 4. 库房管理 5. 品控质检 6. 物流运输 7. 客户现场验证 8. 返修售后 二、产品生产全流程 1. 客户/市场需求 2. 供应链采购 3. 生产加工 4. 库房管理 5. 品控质检 6. 物流运输 7. 客户现场…

物理可微分神经算法:深度学习与物理世界的桥梁

物理可微分神经算法:深度学习与物理世界的桥梁 前言物理可微分神经算法的核心PyTorch中的实现讨论与展望结语 前言 在这个信息爆炸的时代,人工智能(AI)已成为推动技术革新的关键力量。深度学习,作为AI领域的一个重要分…

CAPL如何实现在网络节点中添加路由Entry

其实不只是CANoe的网络节点,所有设备的应用程序如果要通过Socket套接字发送报文,在网络层都需要根据路由表里配置的路由条目选择发送路径。这个路由条目可以是静态配置,也可以是自动添加。 如果CANoe的网络节点添加一个网络接口,配置IP地址和子网掩码: 说明此网络节点在1…

外挂程序:增强点及辅助

1.关于前几篇介绍的外挂程序,SAP中的业务单据还是要区分具体的操作人员。如建立财务凭证,工号A,B,C使用相同的SAP账号,那就没办法知道是谁操作的了啊,所以sap的业务单据需要细分到具体人员的都要增强实现以下: 如生产工单: 具体的增强点: 2.辅助程序:SAP账号自动锁定功…

【Redis】基本全局命令

Redis的基本全局命令 keysexistsdelexpirettltype Redis 有 5 种数据结构,但它们都是键值对种的值,对于键来说有⼀些通⽤的命令。 keys 返回所有满足样式 (pattern)的key。支持如下统配样式。 h?llo 匹配 hello , hallo 和 hxl…

D-ID 推出人工智能视频翻译工具,拥有语音克隆和口型同步等功能

D-ID公司以其创新的人工智能技术在视频创作领域取得了突破性进展。这家人工智能视频创作平台最近推出了一项新工具,允许用户将视频翻译成多达30种不同的语言,包括阿拉伯语、普通话、日语、印地语、西班牙语和法语等。这项技术不仅能够自动翻译视频内容&a…

面试题 08.06. 汉诺塔问题(整活版)(不讲武德)

题目具体要求看面试题 08.06. 汉诺塔问题(递归法)-CSDN博客 class Solution { public:void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {CA;A.clear();} };

Blender新手入门笔记收容所(二)

材质篇 学习来源&#xff1a;B站 【Kurt】Blender零基础入门教程 | Blender中文区新手必刷教程(已完结) Blender材质基础 PBR(Physically Based Rendering)&#xff1a;基于物理的渲染BSDFBRDF(反射)BTDF(透射) 原理化BSDF详解 中间部分利用率80% 材质篇第一节课笔记 纹…

健身房预约小程序,提高市场竞争力

随着“全民健身”的风靡&#xff0c;各大健身场所受到了较大的关注&#xff0c;健身市场的发展迎来了爆发期&#xff01;健身房预约系统是一个在线预约管理系统&#xff0c;对于健身房来说&#xff0c;一个操作简单、功能齐全的预约系统至关重要&#xff0c;他不仅可以帮助学员…

代码随想录打卡第六十一天

代码随想录–图论部分 day 62 图论第十一天&#xff08;完结&#xff09; 文章目录 代码随想录–图论部分一、卡码网97--小明逛公园二、卡码网126--骑士的攻击总结 一、卡码网97–小明逛公园 代码随想录题目链接&#xff1a;代码随想录 给定一个公园景点图&#xff0c;图中有…

Flink常用转换(transformation)算子使用教程(DataSTream API)

前言 一个 Flink 程序,其实就是对 DataStream 的各种转换。具体来说,代码基本上都由以下几部分构成,如下图所示: 获取执行环境(execution environment)读取数据源(source)定义基于数据的转换操作(transformations)定义计算结果的输出位置(sink)触发程序执行(exec…

Linux入门——06 基础IO

1.什么是当前路径 exe -> /home/lin/Desktop/Linux_learn/fork_learn/test 当前进程执行是磁盘路径下的哪一个程序 cwd -> /home/lin/Desktop/Linux_learn/fork_learn 当前进程的工作目录------》当前进程 1.1当前路径这个地址能改吗&#xff1f; 可以&#xff0c;使…

spring-boot-maven-plugin:repackage分析

springboot项目打包插件为&#xff1a;spring-boot-maven-plugin,使用如下: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&…

【python实现通过复数进程互相检测防止关闭和删除】

python实现通过复数进程互相检测防止关闭和删除 要使用 Python 实现通过多个进程互相检测来防止关闭和删除&#xff0c;可以使用 multiprocessing 模块来创建多个进程&#xff0c;并通过进程间通信来实现心跳检测。以下是一个简单的示例代码&#xff0c;展示了如何使用两个进程…

【学术前沿】基于非易失性存储器硬件特性的存算一体神经网络设计方法

【学术前沿】基于非易失性存储器硬件特性的存算一体神经网络设计方法 Lixia HAN, Peng HUANG, Yijiao WANG, Zheng ZHOU, Haozhang YANG, Yiyang CHEN, Xiaoyan LIU & Jinfeng KANG, Mitigating Methodology of Hardware Non-ideal Characteristics for Non-volatile Memo…

经常打喷嚏和浮毛猫毛满天飞有关吗?能去浮毛的空气净化器推荐

近年来&#xff0c;随着生活品质的提升&#xff0c;越来越多的家庭选择养宠物&#xff0c;养宠物的同时也带来了不少的困扰。比如&#xff0c;下班归家&#xff0c;迎接的可能是满室的异味与漂浮的毛发&#xff0c;瞬间让好心情大打折扣。长期置身于这样的环境中还对健康有影响…

笔记本没电造成数据丢失怎么恢复?速览几种有效方法

在日常使用笔记本电脑的过程中&#xff0c;我们时常会遇到电量耗尽而突然关机的情况。这种突如其来的断电不仅可能打断我们的工作流程&#xff0c;更有可能导致未保存的数据丢失&#xff0c;给我们的生活和工作带来不小的困扰。面对这种情况&#xff0c;许多用户可能会感到手足…