书生大模型实战营第三期基础岛第四课——llamaindex+Internlm2 RAG实践

embedded/2024/10/22 13:40:54/

llamaindex+Internlm2 RAG实践

  • 基础作业:
    • 配置基础环境
    • 创建LLAMAINDEX文件夹存放课程相关文件
    • 创建模型下载脚本download_hf.py
    • 下载 Sentence Transformer 模型
    • 下载 NLTK 相关资源
    • LlamaIndex HuggingFaceLLM
    • LlamaIndex RAG
    • 新建脚本llamaindex_RAG.py
    • LlamaIndex web部署
    • 来问问模型一点专业的医学知识

基础作业:

  • 任务要求:基于 LlamaIndex 构建自己的 RAG 知识库,寻找一个问题 A 在使用 LlamaIndex 之前InternLM2-Chat-1.8B模型不会回答,借助 LlamaIndex 后 InternLM2-Chat-1.8B 模型具备回答 A 的能力,截图保存。

配置基础环境

conda create -n llamaindex python=3.10
conda activate llamaindex
pip install llama-index==0.10.38 llama-index-llms-huggingface==0.2.0 "transformers[torch]==4.41.1" "huggingface_hub[inference]==0.23.1" huggingface_hub==0.23.1 sentence-transformers==2.7.0 sentencepiece==0.2.0
pip install einops==0.7.0 protobuf==5.26.1

在这里插入图片描述

创建LLAMAINDEX文件夹存放课程相关文件

mkdir LLAMAINDEX
cd LLAMAINDEX
mkdir model

创建模型下载脚本download_hf.py

touch download_hf.py

输入以下代码

python">import os# 设置环境变量
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'# 下载模型
os.system('huggingface-cli download --resume-download sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 --local-dir /root/LLAMAINDEX/model/sentence-transformer')

下载 Sentence Transformer 模型

python download_hf.py

在这里插入图片描述

下载 NLTK 相关资源

cd /root
git clone https://gitee.com/yzy0612/nltk_data.git  --branch gh-pages
cd nltk_data
mv packages/*  ./
cd tokenizers
unzip punkt.zip
cd ../taggers
unzip averaged_perceptron_tagger.zip

这样使用时服务器即会自动使用已有资源,无需再次下载在这里插入图片描述

LlamaIndex HuggingFaceLLM

cd ~/LLAMAINDEX/model
ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b/ ./
cd ..
touch llamaindex_internlm.py

输入以下代码

python">from llama_index.llms.huggingface import HuggingFaceLLM
from llama_index.core.llms import ChatMessage
llm = HuggingFaceLLM(model_name="/root/LLAMAINDEX/model/internlm2-chat-1_8b",tokenizer_name="/root/LLAMAINDEX/model/internlm2-chat-1_8b",model_kwargs={"trust_remote_code":True},tokenizer_kwargs={"trust_remote_code":True}
)rsp = llm.chat(messages=[ChatMessage(content="xtuner是什么?")])
print(rsp)

运行脚本,看模型输出效果

python llamaindex_internlm.py

在这里插入图片描述
模型居然认为xtuner是一个音乐播放器

LlamaIndex RAG

安装依赖

pip install llama-index-embeddings-huggingface==0.2.0 llama-index-embeddings-instructor==0.1.3

在这里插入图片描述

下载知识文档

mkdir data
cd data
git clone https://github.com/InternLM/xtuner.git
mv xtuner/README_zh-CN.md ./

新建脚本llamaindex_RAG.py

touch llamaindex_RAG.py
python">
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settingsfrom llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.llms.huggingface import HuggingFaceLLM#初始化一个HuggingFaceEmbedding对象,用于将文本转换为向量表示
embed_model = HuggingFaceEmbedding(
#指定了一个预训练的sentence-transformer模型的路径model_name="/root/model/sentence-transformer"
)
#将创建的嵌入模型赋值给全局设置的embed_model属性,
#这样在后续的索引构建过程中就会使用这个模型。
Settings.embed_model = embed_modelllm = HuggingFaceLLM(model_name="/root/model/internlm2-chat-1_8b",tokenizer_name="/root/model/internlm2-chat-1_8b",model_kwargs={"trust_remote_code":True},tokenizer_kwargs={"trust_remote_code":True}
)
#设置全局的llm属性,这样在索引查询时会使用这个模型。
Settings.llm = llm#从指定目录读取所有文档,并加载数据到内存中
documents = SimpleDirectoryReader("/root/llamaindex_demo/data").load_data()
#创建一个VectorStoreIndex,并使用之前加载的文档来构建索引。
# 此索引将文档转换为向量,并存储这些向量以便于快速检索。
index = VectorStoreIndex.from_documents(documents)
# 创建一个查询引擎,这个引擎可以接收查询并返回相关文档的响应。
query_engine = index.as_query_engine()
response = query_engine.query("xtuner是什么?")print(response)

运行脚本,看看RAG技术后模型输出是否有认识xtuner

python llamaindex_RAG.py

在这里插入图片描述
模型给出了我们想要的答案

LlamaIndex web部署

安装依赖

pip install streamlit==1.36.0

在这里插入图片描述

创建app文件

touch app.py

输入以下代码

python">import streamlit as st
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.llms.huggingface import HuggingFaceLLMst.set_page_config(page_title="llama_index_demo", page_icon="🦜🔗")
st.title("llama_index_demo")# 初始化模型
@st.cache_resource
def init_models():embed_model = HuggingFaceEmbedding(model_name="/root/LLAMAINDEX/model/sentence-transformer")Settings.embed_model = embed_modelllm = HuggingFaceLLM(model_name="/root/LLAMAINDEX/model/internlm2-chat-1_8b",tokenizer_name="/root/LLAMAINDEX/model/internlm2-chat-1_8b",model_kwargs={"trust_remote_code": True},tokenizer_kwargs={"trust_remote_code": True})Settings.llm = llmdocuments = SimpleDirectoryReader("/root/llamaindex_demo/data").load_data()index = VectorStoreIndex.from_documents(documents)query_engine = index.as_query_engine()return query_engine# 检查是否需要初始化模型
if 'query_engine' not in st.session_state:st.session_state['query_engine'] = init_models()def greet2(question):response = st.session_state['query_engine'].query(question)return response# Store LLM generated responses
if "messages" not in st.session_state.keys():st.session_state.messages = [{"role": "assistant", "content": "你好,我是你的助手,有什么我可以帮助你的吗?"}]    # Display or clear chat messages
for message in st.session_state.messages:with st.chat_message(message["role"]):st.write(message["content"])def clear_chat_history():st.session_state.messages = [{"role": "assistant", "content": "你好,我是你的助手,有什么我可以帮助你的吗?"}]st.sidebar.button('Clear Chat History', on_click=clear_chat_history)# Function for generating LLaMA2 response
def generate_llama_index_response(prompt_input):return greet2(prompt_input)# User-provided prompt
if prompt := st.chat_input():st.session_state.messages.append({"role": "user", "content": prompt})with st.chat_message("user"):st.write(prompt)# Gegenerate_llama_index_response last message is not from assistant
if st.session_state.messages[-1]["role"] != "assistant":with st.chat_message("assistant"):with st.spinner("Thinking..."):response = generate_llama_index_response(prompt)placeholder = st.empty()placeholder.markdown(response)message = {"role": "assistant", "content": response}st.session_state.messages.append(message)

部署模型app

streamlit run app.py

来问问模型一点专业的医学知识

打开浏览器,访问 http://localhost:7860
在这里插入图片描述
模型回答的很随意,看着像瞎编

现在从openxlab的数据集下载医学文档,放到 /root/LLAMAINDEX/data 目录下
在这里插入图片描述
在这里插入图片描述

再次部署模型,并访问
在这里插入图片描述

整了点医学知识后,回答就专业很多

ps:这个数据集是复制电子书的,所以上面会有一些乱码和符号,需要自己清理一下,否则模型也是回答不出来


http://www.ppmy.cn/embedded/105075.html

相关文章

文件包含之session.upload_progress的使用

目录 原理 环境搭建 渗透 结果 一次项目经历复现 原理 session.auto_start顾名思义,如果开启这个选项,则PHP在接收请求的时候会自动初始化Session,不再需要执行session_start()。但默认情况下,也是通常情况下,这…

49.【C语言】解释“数组和指针”容易混淆的地方

#include <stdio.h> int main() {int arr1[5] { 1,2,3,4,5 };int* p1 &arr1;int arr2[5]{ 0 };int *p2[5] &arr2;int arr3[5]{ 0 };int (*p3)[5] &arr3;int arr4[5]{ 0 };int* (*p4)[5] &arr4;return 0; } 上方代码运行是否有错误?写的内容是否规…

pyecharts可视化数据大屏

1. 简介 1.1. 概述 PyECharts 是一个用于生成 ECharts 图表的 Python 库。ECharts 是一款由阿里巴巴开发的开源 JavaScript 图表库,广泛应用于网页端的数据可视化。而 PyECharts 将 ECharts 的功能带到了 Python 环境中,使得 Python 开发者可以方便地在数据分析、机器学习等…

使用python导出Excel表格中的lua配置

背景&#xff1a;游戏开发中&#xff0c; 策划使用Excel配置游戏中的参数数据&#xff0c;写一个工具用于导出这些配置 工具选择使用 python来开发&#xff0c;这样Windows、macOS、Linux平台都可以使用&#xff0c;而且有丰富的第三方模块。 本机先安装python&#xff0c;我…

Windows Docker 部署 Java Jar 包

一、简介 Docker 是一种流行的容器化平台&#xff0c;可以用于部署各种类型的应用程序&#xff0c;包括 Java 项目中的 JAR 文件。今天讲的是 Windows Docker 部署 JAR 项目的基本教程。 二、示例项目 这里以基于 Java 语言的 XXL-JOB 项目为例&#xff0c;使用里面 xxl-job…

《“草莓”引领风潮:全能AI与专业型AI的未来市场较量》

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

笔记:如何使用Process Explorer分析句柄泄露溢出问题

一、目的&#xff1a;如何使用Process Explorer分析句柄泄露溢出问题 使用 Process Explorer 分析句柄泄漏问题是一个非常有效的方法。句柄泄漏通常是由于应用程序在创建系统资源&#xff08;如文件、注册表项、GDI 对象等&#xff09;后没有正确释放这些资源。以下是使用 二、…

Ei、Scopus双检索 | 2025年第四届人工智能与机器学习前沿国际会议

会议简介 Brief Introduction 2025年第四届人工智能与机器学习前沿国际会议(FAIML 2025) 会议时间&#xff1a;2025年4月25日-27日 召开地点&#xff1a;中国沈阳 大会官网&#xff1a;www.faiml.org FAIML 2025 将围绕“人工智能与机器学习”的最新研究成果展开&#xff0c;为…