基于 LlamaIndex 构建自己的 RAG 知识库

  1. 创建虚拟环境用于运行

    1. 运行 InternLM 的基础环境,命名为 llamaindex
      conda create -n llamaindex python=3.10
    2. 查看存在的环境 
      conda env list
    3. 激活刚刚创建的环境 
      conda activate llamaindex
    4. 安装基本库pytorch,torchvision ,torchaudio,pytorch-cuda 并指定通道(建议写上对应的版本号)
      1. conda install pytorch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 pytorch-cuda=11.7 -c pytorch -c nvidia
  2. 安装 Llamaindex

    1. 此操作在对应的虚拟环境中安装 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
  3. 下载 Sentence Transformer 模型

    1. 为了方面管理建立对应的路径,在根目录下创建2个文件(
      mkdir llamaindex_demo
      mkdir model
    2. 然后在llamaindex_demo目录下创建下载脚本(
      touch llamaindex_demo/download_hf.py
    3. 在download_hf.py文件中写入
      1. import os

        # 设置环境变量
        os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'

        # 下载模型下载源词向量模型Sentence Transformer
        os.system('huggingface-cli download --resume-download sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 --local-dir /root/model/sentence-transformer')

    4. 执行下载模型脚本
      python download_hf.py
    5. 如果上面的步骤不存在nltk此处需要手动下载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)
  4. LlamaIndex HuggingFaceLLM

    1. 下载模型internlm2-chat-1_8b (pip install internlm2-chat-1_8b )
    2. 如果有对应的模型可以软链接出来ln -s 模型路径 要复制到哪里的路径如(
      cd ~/model
      ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b/ ./
    3. 创建运行模型脚本 touch 
      touch ~/llamaindex_demo/llamaindex_internlm.py
    4. 编辑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)
    5. 运行模型 
      python llamaindex_internlm.py
  5. LlamaIndex RAG

    1. 安装 LlamaIndex 词嵌入向量依赖(

      pip install llama-index-embeddings-huggingface llama-index-embeddings-instructor

    2. 如果上面步骤报错请根据提示安装对应的插件版本(如 pip install huggingface-hub==0.23.5)

    3. 获取知识库(创建data 把xtuner包中文件移动到对应的目录cd ~/llamaindex_demo
      mkdir data
      cd data
      git clone https://github.com/InternLM/xtuner.git
      mv xtuner/README_zh-CN.md ./)

    4. 创建运行模型代码

      llamaindex_RAG.py
    5. llamaindex_RAG.py文件内容(from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settingsfrom llama_index.embeddings.huggingface import HuggingFaceEmbedding
      from llama_index.llms.huggingface import HuggingFaceLLMembed_model = HuggingFaceEmbedding(model_name="/root/model/sentence-transformer"
      )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}
      )
      Settings.llm = llmdocuments = SimpleDirectoryReader("/root/llamaindex_demo/data").load_data()
      index = VectorStoreIndex.from_documents(documents)
      query_engine = index.as_query_engine()
      response = query_engine.query("xtuner是什么?")print(response))
    6. 运行
      python llamaindex_RAG.py
  6. 浏览器上运行对话

    1. 安装服务依赖
      pip install streamlit==1.36.0
    2. 创建运行脚本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)

    3. 运行

      streamlit run app.py
    4. 默认端口8503( http://localhost:8503)
    5. 最终效果

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

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

相关文章

【React】JSX 实现列表渲染

文章目录 一、基础语法1. 使用 map() 方法2. key 属性的使用 二、常见错误和注意事项1. 忘记使用 key 属性2. key 属性的选择 三、列表渲染的高级用法1. 渲染嵌套列表2. 条件渲染列表项3. 动态生成组件 四、最佳实践 在 React 开发中,列表渲染是一个非常常见的需求。…

Mac装虚拟机占内存吗 Mac用虚拟机装Windows流畅吗

如今,越来越多的Mac用户选择在他们的设备上安装虚拟机来运行不同的操作系统。其中,最常见的是使用虚拟机在Mac上运行Windows。然而,许多人担心在Mac上装虚拟机会占用大量内存,影响电脑系统性能。此外,有些用户还关心在…

Nginx Proxy缓存

Proxy缓存 缓存类型 网页缓存 (公网)CDN数据库缓存 memcache redis网页缓存 nginx-proxy客户端缓存 浏览器缓存 模块 ngx_http_proxy_module 语法 缓存开关 Syntax: proxy_cache zone | off; Default: proxy_cache off; Context: http,…

【JavaEE】Bean的作用域和生命周期

一.Bean的作用域. 1.1 Bean的相关概念. 通过Spring IoC和DI的学习(不清楚的可以看的前面写过的总结,可以快速入门, http://t.csdnimg.cn/K8Xr0),我们知道了Spring是如何帮助我们管理对象的 通过 Controller , Service , Repository , Component , Configuration , Bean 来声明…

开发桌面程序-Electron入门

Electron是什么 来自官网的介绍 Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验。 总…

JL 跳转指令的理解

一般情况下,JU 和 JC 是最常见的跳转指令;但有时会用到JL 指令,JL 说起来更像是一组指令,类似C,C# 语言中的 switch case 语句,但是有个明显的不同,前者的判断条件可以是任意合理数字,后者范围…

C语言 之 理解指针(1)

文章目录 1. 内存和地址2. 指针变量和地址2.1 取地址操作符(&)2.2 指针变量和解引用操作符(*)2.2.1 指针变量2.2.2 指针类型的理解2.2.3 解引用操作符(*) 2.3 指针变量的大小 3. 指针变量类型的意义3.1 指针的解引用3.2 指针-…

【科研】# Taylor Francis 论文 LaTeX template模版 及 Word模版

【科研写论文】系列 文章目录 【科研写论文】系列前言一、Word 模板(附下载网址):二、LaTeX 版本方法1:直接网页端打开(附网址)方法2:直接下载到本地电脑上编辑下载地址说明及注意事项 前言 给…

计算机网络基础:4.HTTP与HTTPS

一、回顾设定 想象你在经营一家繁忙的餐厅,顾客们通过点餐系统(网卡)下单,订单被前台(路由器)接收并分发到各个厨房区域(网络设备)。光猫像是食材供应商,通过高效的物流系…

lua 游戏架构 之 游戏 AI (四)ai_autofight_find_target

定义一个名为 ai_autofight_find_target 的类,继承自 ai_base 类。 lua 游戏架构 之 游戏 AI (一)ai_base-CSDN博客文章浏览阅读237次。定义了一套接口和属性,可以基于这个基础类派生出具有特定行为的AI组件。例如,可…

初识redis:通用命令

今天我们简单介绍一些关于redis的基础命令。 目录 get 和 set 全局命令 keys EXISTS del(delete) expire TTL Redis的key过期策略是怎么实现的? type get 和 set 连接到云服务器后,通过redis-cli命令进入到redis客户端…

设计模式--创建型

实现 #include <iostream> #include <memory>// 抽象产品类 class Product {public:virtual void Operation() const 0; };// 具体产品 类A class ConcreteProductA : public Product {public:virtual void Operation() const override {std::cout << &quo…

学术研讨 | 区块链治理与应用创新研讨会顺利召开

学术研讨 近日&#xff0c;国家区块链技术创新中心组织&#xff0c;长安链开源社区支持的“区块链治理与应用创新研讨会”顺利召开&#xff0c;会议围绕区块链治理全球发展现状、研究基础、发展趋势以及区块链行业应用创新展开研讨。北京大学陈钟教授做了“区块链治理与应用创…

【STM32嵌入式系统设计与开发拓展】——12_Timer(定时器中断实验)

目录 1、什么是定时器&#xff1f;定时器用于测量时间间隔&#xff0c;而计数器用于计数外部事件的次数 2、定时器的主要功能和用途&#xff1f;3、定时器类型&#xff1f;4、定时器的编写过程5、代码分析定时器计算&#xff1f;计算过程周期&#xff08;arr&#xff09;&#…

Apollo使用(3):分布式docker部署

Apollo 1.7.0版本开始会默认上传Docker镜像到Docker Hub&#xff0c;可以按照如下步骤获取 一、获取镜像 1、Apollo Config Service 获取镜像 docker pull apolloconfig/apollo-configservice:${version} 我事先下载过该镜像&#xff0c;所以跳过该步骤。 2、Apollo Admin S…

Leetcode3219. 切蛋糕的最小总开销 II

Every day a Leetcode 题目来源&#xff1a;3219. 切蛋糕的最小总开销 II 解法1&#xff1a;贪心 谁的开销更大&#xff0c;就先切谁&#xff0c;并且这个先后顺序与切的次数无关。 代码&#xff1a; /** lc appleetcode.cn id3219 langcpp** [3219] 切蛋糕的最小总开销 I…

医疗信息化之PACS系统源码,C#医学影像系统源码,成熟在用稳定运中

C#语言开发的一套PACS系统源码&#xff0c;C/S架构&#xff0c;成熟稳定&#xff0c;多家大型综合医院应用案例。自主版权&#xff0c;支持二次开发&#xff0c;授权后可商用。 医学影像存储与传输系统是针对数据库存储、传输服务、图像处理进行了优化,存储更安全、传输更稳定、…

人工智能与机器学习原理精解【6】

文章目录 数值优化基础理论凹凸性定义在国外与国内存在不同国内定义国外定义总结示例与说明注意事项 国内凹凸性二阶定义的例子凹函数例子凸函数例子 凸函数&#xff08;convex function&#xff09;的开口方向凸函数的二阶导数凸函数的二阶定义单变量函数的二阶定义多变量函数…

C# 知识点总结

入门 C#程序在.NET上运行&#xff0c;.NET framework包含两个部分&#xff1a; ①&#xff1a;.NET framework类库 ②&#xff1a;公共语言运行库CLR&#xff08;.NET虚拟机&#xff09; CLS&#xff08;公共语言规范&#xff09; CTS&#xff08;通用类型系统&#xff09; .N…

【Node.js基础04】包的理解与使用

一&#xff1a;包的理解与简介 1 什么是包 包是一个将模块、代码、以及其他资料聚合成的文件夹 2 包的分类 项目包&#xff1a;编写项目代码的文件夹 软件包&#xff1a;封装工具和方法供开发者使用 3 为什么要在软件包中编写package.json文件 记录包的清单信息 二&…