书生大模型实战营学习[7] InternLM + LlamaIndex RAG 实践

news2024/9/27 11:03:27

在这里插入图片描述

环境配置

选择30%A100做本次任务

conda create -n llamaindex python=3.10
conda activate llamaindex
conda install pytorch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 pytorch-cuda=11.7 -c pytorch -c nvidia
pip install einops
pip install  protobuf

安装Llamaindex

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

下载 Sentence Transformer 模型
Sentence Transformer模型是一种用于句子嵌入(sentence embedding)技术的深度学习模型,旨在将句子或文本段落转换为固定长度的向量表示。这种表示可以用于多种自然语言处理任务,例如文本相似度计算、检索和分类等。

cd ~
mkdir llamaindex_demo
mkdir model
cd ~/llamaindex_demo
touch download_hf.py

粘贴到download_hf.py

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/model/sentence-transformer')

执行该脚本

cd /root/llamaindex_demo
conda activate llamaindex
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

对原始internlm2-chat-1_8b进行测试

首先把InternLM2 1.8B 软连接出来

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

创建一个python文件:

cd ~/llamaindex_demo
touch llamaindex_internlm.py

将一下代码粘贴到llamaindex_internlm.py中

from llama_index.llms.huggingface import HuggingFaceLLM
from llama_index.core.llms import ChatMessage
llm = 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}
)

rsp = llm.chat(messages=[ChatMessage(content="xtuner是什么?")])
print(rsp)

运行查看结果:

conda activate llamaindex
cd ~/llamaindex_demo/
python llamaindex_internlm.py

输出:

xtuner是一款用于播放音乐的软件,它支持多种音频格式,包括MP3、WAV、WMA、FLAC、AAC、APE、OGG、WMA、WAV、WMA

在这里插入图片描述

模型并不能很好的回答出正确答案。

RAG增强internlm2-chat-1_8b测试

首先安装词嵌入向量依赖:

conda activate llamaindex
pip install llama-index-embeddings-huggingface llama-index-embeddings-instructor

然后获取知识库:

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

创建一个pythonllamaindex_RAG.py文件:

cd ~/llamaindex_demo
touch llamaindex_RAG.py

将以下代码粘贴到llamaindex_RAG.py中:


from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings

from 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_model

llm = 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)

conda activate llamaindex
cd ~/llamaindex_demo/
python llamaindex_RAG.py

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

LlamaIndex web

pip install streamlit==1.36.0
#创建py文件
cd ~/llamaindex_demo
touch app.py

粘贴

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 HuggingFaceLLM

st.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/model/sentence-transformer"
    )
    Settings.embed_model = embed_model

    llm = 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}
    )
    Settings.llm = llm

    documents = 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)

运行

streamlit run app.py

访问:

ssh -CNg -L 8501:127.0.0.1:8501 root@ssh.intern-ai.org.cn -p 48693(需要换成自己的端口号)

在这里插入图片描述

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

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

相关文章

【UI】Vue3 + Naive-ui 使用表格Data Table 以及分页页码显示不全问题解决

参考文章&#xff1a; Vue3 Naive-ui Data Table 分页页码显示不全 Naive UI之数据表格分页pagination 数据列表分页全部代码: <n-data-tableref"tableRef"striped:columns"columns":pagination"pagination":bordered"false":d…

CSS 中的文本相关属性(line - height、font、letter - 属性、text - 属性)

目录 非 VIP 用户可前往公众号回复“css”进行免费阅读 line - height属性 字号与行高的取值约定 行高与盒子高度的关系 font、letter -属性 、text -属性 font属性 letter -属性 text - 属性 非 VIP 用户可前往公众号回复“css”进行免费阅读 line - height属性 字号与…

模形式与态、势、感、知

模形式是数学中一个重要的研究领域&#xff0c;主要出现在数论、代数几何和表示论等多个学科中。模形式可以视为在某种意义上具有“对称性”的函数&#xff0c;这些函数在特定的条件下满足一定的变换性质。具体来说&#xff0c;模形式是定义在上半平面上的复值函数&#xff0c;…

基于Linux环境安装 jdk 1.8 保姆级教程

1. 下载 jdk 1.8 首先需要下载 linux 版本的 jdk 1.8. 需要在 Oracle 官网的 JDK 1.8 下载页面 进行下载&#xff0c;找到 Linux x64 Compressed Archive 对应的链接。或者直接下载我准备好的压缩包&#xff0c;点击链接即可下载。 2. FTP压缩包文件传输 下载完成之后&…

2024南京软博会同期会议“中国信息技术应用创新大会”

软件产业作为新一代信息技术的核心驱动力&#xff0c;正以前所未有的速度推动着全球经济的转型升级。在此背景下&#xff0c;2024中国&#xff08;南京&#xff09;软件产业博览会&#xff08;以下简称“南京软博会”&#xff09;将于12月份在南京国际博览中心盛大召开&#xf…

下载配置Android Studio(2024年9月)

安装JAVA JDK 下载安装包 Java网站官网 Java Downloads | Oracle 我下载的是JDK Development Kit 17.0.12 downloads Windows x64 MSI Installer。 下载后打开文件&#xff0c;一路NEXT闭眼安装。 配置环境变量 设置-系统-系统高级设置-环境变量 1.新建一个系统环境变量&…

Java爬虫抓取数据的艺术

在信息时代&#xff0c;数据的重要性不言而喻。对于Java开发者来说&#xff0c;掌握如何使用Java进行数据抓取是一项宝贵的技能。通过编写爬虫程序&#xff0c;我们可以从互联网的海量信息中提取有价值的数据&#xff0c;用于市场分析、客户洞察、内容监控等多种场景。本文将介…

基于SSM的中小企业人力资源管理系统【附源码】

基于SSM的中小企业人力资源管理系统&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统概述 4.2 系统功能结构设计 4.3 数据库设计 4.3.1 数据库E-R图设计 4.3.2 数据库表结构设计 5 系统实现 5.1 管理员功能介绍 5.1.1 学生…

Linux之实战命令14:watch应用实例(四十八)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

9.27今日错题解析(软考)

目录 前言信息安全——网络攻击算法基础——二分查找数据库系统——数据库设计过程 前言 这是用来记录我每天备考软考设计师的错题的&#xff0c;今天知识点为网络攻击、二分查找和数据库设计过程&#xff0c;大部分错题摘自希赛中的题目&#xff0c;但相关解析是原创&#xf…

PHM技术 : 特征缩放

特征缩放 监督/无监督机器学习算法已广泛用于开发数据驱动的异常检测、诊断和预测方法。此外,对于复杂电子设备的 PHM 来说,使用高维数据是不可或缺的。然而,如果各维度没有被标准化到相似水平,机器学习算法的输出可能会偏向于某些大尺度数据。例如,大多数分类器通过欧氏距离计…

统信UOS率先适配龙芯3A6000

UOS统信率先适配龙芯3A6000的相关介绍。 文章目录 统信软件第一时间完成龙芯3A6000处理器与统信UOS的适配工作&#xff0c;功能完整&#xff0c;性能优异。 综合相关测试结果&#xff0c;龙芯3A6000处理器总体性能与Intel第10代酷睿四核处理器相当。 多年来&#xff0c;龙芯中…

【Qt】前后端交互---DataCenter类

设计目的 前后端交互系统中&#xff0c;创建并使用数据核心类的目的就是让该类作为客户端的数据中心&#xff0c;也就是说其负责管理客户端的所有数据与服务器的网络通信。 数据持久化 初始化数据文件 该函数设计的目的就是用于检查所需要的文件和目录是否存在&#xff0c;如…

【C/C++】【基础数论】33、算数基本定理

算术基本定理&#xff0c;又称正整数的唯一分解定理。 说起来比较复杂&#xff0c;但是看一下案例就非常清楚了 任何一个大于 1 的正整数都可以唯一地分解成有限个质数的乘积形式&#xff0c;且这些质数按照从小到大的顺序排列&#xff0c;其指数也是唯一确定的。 例如&#…

mvnd 初体验

https://github.com/apache/maven-mvnd/releases?page2 mvnd内嵌了Maven&#xff08;因此不需要单独安装Maven&#xff09;。mvnd客户端是通过GraalVM构建的可执行文件&#xff0c;与启动传统JVM相比&#xff0c;它的启动速度更快&#xff0c;占用的内存更少。实际构建发生在一…

【Python报错已解决】TypeError: list indices must be integers or slices, not str

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

2.归并排序算法【分治】

步骤&#xff1a; 确定分界点&#xff0c;mid (lr)/2递归排序left、right归并&#xff0c;合二为一 package base;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public class Merge_sort {static int n;static int q[];s…

TinyWebSever项目面试题整理

TinyWebSever项目面试题整理 1.为什么要做这样一个项目&#xff1f; 满足高并发和高性能需求&#xff1a;现代Web应用面对大量用户&#xff0c;Web服务器需要高效处理并发连接。比如通过线程池、非阻塞I/O、事件驱动机制&#xff08;如epoll&#xff09;&#xff0c;Web服务器…

【深度学习】(9)--调整学习率

文章目录 调整学习率一、学习率的定义二、学习率的作用三、实现调整学习率1. 使用库函数进行调整2. 手动调整学习率 总结 调整学习率 调整学习率的目的是&#xff1a;通过调整学习率&#xff0c;优化训练速度、提高训练稳定性、适应不同的训练阶段以及改善模型性能。那么&…

二维四边形网格生成算法:paving(六)行调整 Row Adjustment 与 收尾 Cleanup

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 参考论文&#xff1a;Paving: A new approach to automated quadrilateral mesh generation 关注公众号回复paving可以获得文章链接 paving&#xff08;一&#xff0…