LlamaIndex 实现 RAG (一)

理解过 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

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

  • 17
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
实现大模型的RAG(Retrieval Augmented Generation)主要包括**数据准备阶段和应用阶段**两个关键环节。具体步骤如下: 1. **数据准备阶段**: - **数据提取**:首先需要确定并提取适用于特定领域的私域数据,这些数据可以是PDF文件、数据库内容或其他形式的私有知识库。 - **文本分割**:将提取出的文档进行分块处理,以便于后续的处理和检索。 - **向量化**:对分割后的文本块进行向量化操作,即将文本转换为机器能够高效处理的数值表示形式。 - **数据入库**:处理好的数据需要构建索引并存入向量数据库中,为接下来的检索任务做准备。 2. **应用阶段**: - **用户提问**:当用户提出问题时,同样需要将这个查询向量化。 - **数据检索**:利用向量数据库的检索能力,找出与用户提问相似度最高的k个文档片段。 - **注入Prompt**:将检索到的结果结合用户的原始提问,按照一定的Prompt模板组装成一个完整的输入提示给大语言模型。 - **LLM生成答案**:大语言模型根据提供的Prompt生成最终的回答。 此外,还需要考虑如何优化数据的准备过程,比如选择适合的向量化技术(如使用词嵌入模型)以及如何设计高效的检索算法来快速准确地从大量数据中找到相关信息。同时,在应用阶段,需要精心设计Prompt模板,以便大模型能更好地理解问题和检索到的信息,从而给出更准确的回答。 值得一提的是,RAG架构的优势在于它结合了大模型的强大语言理解和生成能力以及向量检索系统的高效信息获取能力,使得大模型能够在专业场景或行业细分领域中提供更加精准和丰富的回答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值