【第三课课后作业】基于 InternLM 和 LangChain 搭建你的知识库

news2025/1/5 11:01:11

基于 InternLM 和 LangChain 搭建你的知识库

1. 基础作业:

环境配置

1.1 InternLM 模型部署

创建开发机

在这里插入图片描述

进入 conda 环境之后,使用以下命令从本地一个已有的 pytorch 2.0.1 的环境,激活环境,在环境中安装运行 demo 所需要的依赖。

conda activate InternLM

# 升级pip
python -m pip install --upgrade pip

pip install modelscope==1.9.5
pip install transformers==4.35.2
pip install streamlit==1.24.0
pip install sentencepiece==0.1.99
pip install accelerate==0.24.1

在这里插入图片描述

1.2 模型下载

在本地的 /root/share/temp/model_repos/internlm-chat-7b 目录下已存储有所需的模型文件参数,可以直接拷贝到个人目录的模型保存地址:

mkdir -p /root/data/model/Shanghai_AI_Laboratory
cp -r /root/share/temp/model_repos/internlm-chat-7b /root/data/model/Shanghai_AI_Laboratory/internlm-chat-7b

在这里插入图片描述

1.3 LangChain 相关环境配置

在已完成 InternLM 的部署基础上,还需要安装以下依赖包:

pip install langchain==0.0.292
pip install gradio==4.4.0
pip install chromadb==0.4.15
pip install sentence-transformers==2.2.2
pip install unstructured==0.10.30
pip install markdown==3.3.7

下载并使用开源词向量模型 Sentence Transformer

pip install -U huggingface_hub

使用huggingface镜像下载
在这里插入图片描述
在这里插入图片描述

1.4 下载 NLTK 相关资源

我们在使用开源词向量模型构建开源词向量的时候,需要用到第三方库 nltk 的一些资源。正常情况下,其会自动从互联网上下载,但可能由于网络原因会导致下载中断,此处我们可以从国内仓库镜像地址下载相关资源,保存到服务器上。

我们用以下命令下载 nltk 资源并解压到服务器上:

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

在这里插入图片描述

知识库搭建

2.1 数据收集
选择由上海人工智能实验室开源的一系列大模型工具开源仓库作为语料库来源,包括:

OpenCompass:面向大模型评测的一站式平台
IMDeploy:涵盖了 LLM 任务的全套轻量化、部署和服务解决方案的高效推理工具箱
XTuner:轻量级微调大语言模型的工具库
InternLM-XComposer:浦语·灵笔,基于书生·浦语大语言模型研发的视觉-语言大模型
Lagent:一个轻量级、开源的基于大语言模型的智能体(agent)框架
InternLM:一个开源的轻量级训练框架,旨在支持大模型训练而无需大量的依赖

首先我们需要将上述远程开源仓库 Clone 到本地,可以使用以下命令:

# 进入到数据库盘
cd /root/data
# clone 上述开源仓库
git clone https://gitee.com/open-compass/opencompass.git
git clone https://gitee.com/InternLM/lmdeploy.git
git clone https://gitee.com/InternLM/xtuner.git
git clone https://gitee.com/InternLM/InternLM-XComposer.git
git clone https://gitee.com/InternLM/lagent.git
git clone https://gitee.com/InternLM/InternLM.git

在这里插入图片描述

新建/root/data/demo用于存放构建个人向量数据库的代码
在这里插入图片描述
并运行该脚本

python create_db.py

在这里插入图片描述
运行完后demo目录下出现了data_base目录,在这个文件夹中就存放了我们所需要的向量数据库的文件
在这里插入图片描述

InternLM 接入 LangChain

LLM.py

from langchain.llms.base import LLM
from typing import Any, List, Optional
from langchain.callbacks.manager import CallbackManagerForLLMRun
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

class InternLM_LLM(LLM):
    # 基于本地 InternLM 自定义 LLM 类
    tokenizer : AutoTokenizer = None
    model: AutoModelForCausalLM = None

    def __init__(self, model_path :str):
        # model_path: InternLM 模型路径
        # 从本地初始化模型
        super().__init__()
        print("正在从本地加载模型...")
        self.tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
        self.model = AutoModelForCausalLM.from_pretrained(model_path, trust_remote_code=True).to(torch.bfloat16).cuda()
        self.model = self.model.eval()
        print("完成本地模型的加载")

    def _call(self, prompt : str, stop: Optional[List[str]] = None,
                run_manager: Optional[CallbackManagerForLLMRun] = None,
                **kwargs: Any):
        # 重写调用函数
        system_prompt = """You are an AI assistant whose name is InternLM (书生·浦语).
        - InternLM (书生·浦语) is a conversational language model that is developed by Shanghai AI Laboratory (上海人工智能实验室). It is designed to be helpful, honest, and harmless.
        - InternLM (书生·浦语) can understand and communicate fluently in the language chosen by the user such as English and 中文.
        """
        
        messages = [(system_prompt, '')]
        response, history = self.model.chat(self.tokenizer, prompt , history=messages)
        return response
        
    @property
    def _llm_type(self) -> str:
        return "InternLM"

web_demo.py:

from langchain.vectorstores import Chroma
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
import os
from LLM import InternLM_LLM
from langchain.prompts import PromptTemplate
from langchain.chains import RetrievalQA

import gradio as gr


def load_chain():
    # 加载问答链
    # 定义 Embeddings
    embeddings = HuggingFaceEmbeddings(model_name="/root/data/model/sentence-transformer")

    # 向量数据库持久化路径
    persist_directory = 'data_base/vector_db/chroma'

    # 加载数据库
    vectordb = Chroma(
        persist_directory=persist_directory,  # 允许我们将persist_directory目录保存到磁盘上
        embedding_function=embeddings
    )

    # 加载自定义 LLM
    llm = InternLM_LLM(model_path = "/root/data/model/Shanghai_AI_Laboratory/internlm-chat-7b")

    # 定义一个 Prompt Template
    template = """使用以下上下文来回答最后的问题。如果你不知道答案,就说你不知道,不要试图编造答
    案。尽量使答案简明扼要。总是在回答的最后说“谢谢你的提问!”。
    {context}
    问题: {question}
    有用的回答:"""

    QA_CHAIN_PROMPT = PromptTemplate(input_variables=["context","question"],template=template)

    # 运行 chain
    qa_chain = RetrievalQA.from_chain_type(llm,retriever=vectordb.as_retriever(),return_source_documents=True,chain_type_kwargs={"prompt":QA_CHAIN_PROMPT})
    
    return qa_chain

class Model_center():
    """
    存储检索问答链的对象 
    """
    def __init__(self):
        # 构造函数,加载检索问答链
        self.chain = load_chain()

    def qa_chain_self_answer(self, question: str, chat_history: list = []):
        """
        调用问答链进行回答
        """
        if question == None or len(question) < 1:
            return "", chat_history
        try:
            chat_history.append(
                (question, self.chain({"query": question})["result"]))
            # 将问答结果直接附加到问答历史中,Gradio 会将其展示出来
            return "", chat_history
        except Exception as e:
            return e, chat_history


# 实例化核心功能对象
model_center = Model_center()
# 创建一个 Web 界面
block = gr.Blocks()
with block as demo:
    with gr.Row(equal_height=True):   
        with gr.Column(scale=15):
            # 展示的页面标题
            gr.Markdown("""<h1><center>InternLM</center></h1>
                <center>书生浦语</center>
                """)

    with gr.Row():
        with gr.Column(scale=4):
            # 创建一个聊天机器人对象
            chatbot = gr.Chatbot(height=450, show_copy_button=True)
            # 创建一个文本框组件,用于输入 prompt。
            msg = gr.Textbox(label="Prompt/问题")

            with gr.Row():
                # 创建提交按钮。
                db_wo_his_btn = gr.Button("Chat")
            with gr.Row():
                # 创建一个清除按钮,用于清除聊天机器人组件的内容。
                clear = gr.ClearButton(
                    components=[chatbot], value="Clear console")
                
        # 设置按钮的点击事件。当点击时,调用上面定义的 qa_chain_self_answer 函数,并传入用户的消息和聊天历史记录,然后更新文本框和聊天机器人组件。
        db_wo_his_btn.click(model_center.qa_chain_self_answer, inputs=[
                            msg, chatbot], outputs=[msg, chatbot])

    gr.Markdown("""提醒:<br>
    1. 初始化数据库时间可能较长,请耐心等待。
    2. 使用中如果出现异常,将会在文本输入框进行展示,请不要惊慌。 <br>
    """)
gr.close_all()
# 直接启动
demo.launch()
python web_demo.py

在这里插入图片描述

在你自己的本地机命令行输入:

ssh -CNg -L 7860:127.0.0.1:7860 root@ssh.intern-ai.org.cn -p [your server port]

在本地浏览器输入127.0.0.1:7860,即可访问:

在这里插入图片描述

2. 进阶作业:

选择一个垂直领域,收集该领域的专业资料构建专业知识库,并搭建专业问答助手,并在 OpenXLab 上成功部署(截图,并提供应用地址)

2.1 本地试运行

自己的知识库数据集
在这里插入图片描述

# 目标文件夹
tar_dir = [
    "/root/data/Autonomous-vehicles-mydata
]

requirements.txt

pytorch==2.0.1
modelscope==1.9.5
transformers==4.35.2
streamlit==1.24.0
sentencepiece==0.1.99
accelerate==0.24.1
langchain==0.0.292
gradio==4.4.0
chromadb==0.4.15
sentence-transformers==2.2.2
unstructured==0.10.30
markdown==3.3.7

在这里插入图片描述

配置git环境:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
提交到本地仓库:
在这里插入图片描述

成果

GitHub - autonomous-vehicles-chat

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

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

相关文章

【赠书第17期】Excel高效办公:文秘与行政办公(AI版)

文章目录 前言 1 了解Excel的强大功能和工具 2 提升Excel技能的方法 3 结合AI技术提升Excel应用 4 注意事项 5 推荐图书 6 粉丝福利 前言 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;我们的工作方式也在发生深刻变革。其中&#xff0c;Excel 作…

Ubuntu上安装部署Qt

首先需要下载对应的虚拟机软件和ubuntu镜像&#xff0c;虚拟机软件使用VMware或者Virtual Box都行&#xff0c;我用的是前者&#xff0c;这里是VMware的下载链接&#xff1a;下载 VMware Workstation Pro | CN。Ubuntu镜像推荐去清华的网站下载&#xff1a;Index of /ubuntu-re…

如何查找设备的公共IP地址?这里提供三种方法

每个以某种方式连接到互联网的设备都有一个IP地址。这是你的设备使用的唯一标识符,可以被互联网或本地网络上的其他设备识别。 如果你使用的是直接连接到互联网的智能手机或平板电脑等设备,你的公共IP地址将由你的移动运营商直接分配。 另一方面,如果你使用的是连接到本地…

CentOS 系统创建网卡bond0

很多时候在机房运维的过程中&#xff0c;我们会遇到客户要求的建立网卡光口的bond0设置&#xff0c;通俗点说就是将两个光口合并为一个口进行链接设置。创建这个设置是有两种设置&#xff0c;一是在安装系统的过程中对bond0进行创建设置&#xff0c;另一种就是通过系统里面对网…

MAX27——处理max模型导出Zbrush中,无UV,或者UV炸开,反向等问题。

现在很多小伙伴要做数字人的时候会用到zbrush拓补高模。制作法线。有些人喜欢在zbrush中去做封套。也有喜欢直接用max做低模&#xff0c;做好的uv导入到Zbrush中&#xff0c;直接把高模法线&#xff0c;烘焙到低模UV的。这里主要讲解以下max导出到zbrush中&#xff0c;UV炸开&a…

SpringMvc中拦截器的配置及应用

拦截器原理 在 Spring MVC 中&#xff0c;拦截器&#xff08;Interceptor&#xff09;是一种机制&#xff0c;用于拦截请求并在处理程序&#xff08;Controller&#xff09;执行之前或之后执行一些操作。拦截器允许您在请求的不同阶段&#xff08;如处理程序执行前、处理程序执…

【C++干货基地】namespace超越C语言的独特魅力(文末送书)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

学习笔记之——3D Gaussian SLAM,SplaTAM配置(Linux)与源码解读

SplaTAM全称是《SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAM》&#xff0c;是第一个&#xff08;也是目前唯一一个&#xff09;开源的用3D Gaussian Splatting&#xff08;3DGS&#xff09;来做SLAM的工作。 在下面博客中&#xff0c;已经对3DGS进行了…

[计算机提升] Bitlocker驱动器加密与关闭

4.12 Bitlocker驱动器加密与关闭 BitLocker驱动器加密是一种安全功能&#xff0c;主要用于保护计算机中的数据免受未经授权的访问和泄漏。它通过加密Windows操作系统卷上存储的所有数据提供保护。 BitLocker的使用可确保计算机即使在无人参与、丢失或被盗的情况下也不会被篡改…

Cesium叠加超图二维服务、三维场景模型

前言 Cesium作为开源的库要加超图的服务则需要适配层去桥接超图与Cesium的数据格式。这个工作iClient系列已经做好&#xff0c;相比用过超图二维的道友们可以理解&#xff1a;要用Openlayer加载超图二维&#xff0c;那就用iClient for Openlayer库去加载&#xff1b;同样的要用…

如何用GPT进行绘图?

详情点击链接&#xff1a;如何用GPT进行绘图&#xff1f; 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析&#xff0c;AI画图&#xff0c;图像识别&#xff0c;文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude2二定制自己的GP…

【python题解11】 输入两个非负十进制整数A和B以及D(进制数),输出A+B的D(1< D ≤ 10)进制数。

1. 题目&#xff1a;输入两个非负十进制整数A和B以及D&#xff08;进制数&#xff09;&#xff0c;输出AB的D&#xff08;1< D ≤ 10&#xff09;进制数。 输入格式: 在一行中依次给出三个整数A、B和D&#xff08;进制数&#xff09;。 输出格式: AB的D进制数。 2. 主要考…

如何使用 Helm 在 K8s 上集成 Prometheus 和 Grafana|Part 3

在本教程的前两部分&#xff0c;我们分别了解和学习了Prometheus 和 Grafana 的基本概念和使用的前提条件&#xff0c;以及使用 Helm 在 Kubernetes 上安装 Prometheus。 在今天的教程中&#xff0c;我们将为你介绍以下内容&#xff1a; 安装 Grafana&#xff1b;集成 Promethe…

开源网安推出“国产替代续航惠企计划”,实现“两不三保”目标

​随着全球安全威胁态势越发严峻&#xff0c;国内网络安全监管趋严&#xff0c;Adobe、Tableau、Salesforce、Nutanix、Citrix、checkmarx等外企陆续裁员离华&#xff0c;国产替代从战略层的备选项&#xff0c;也将逐步变为需要快速落地的必选项。 为了确保用户能高效应对外企离…

[C++]:12:模拟实现list

[C]:12:模拟实现list 一.看一看SGI的stl_list的源码&#xff1a;1.基础结构构造函数1.节点结构&#xff1a;2.节点构造函数&#xff1a;3.链表结构&#xff1a;4.链表的构造函数&#xff1a; 2.析构1.节点析构&#xff1a;2.链表的析构&#xff1a; 3.迭代器 二.模拟实现list1.…

十二款·富文本编辑器:数字创作的瑞士军刀

在数字化时代&#xff0c;内容创作已经成为我们日常生活中不可或缺的一部分。无论是撰写一封电子邮件、准备一份报告、还是在社交媒体上分享心情&#xff0c;文字都是我们表达和沟通的基石。而在这个过程中&#xff0c;富文本编辑器就如同一把瑞士军刀&#xff0c;为我们提供了…

商品详情APP端原数据淘宝数据采集API接口代码接入示例

商品详情APP端原数据API接口&#xff08;接口接入入口&#xff09;的作用是提供APP端商品的详细信息&#xff0c;包括价格、描述、图片、折后价、优惠券信息等。通过调用这个API接口&#xff0c;开发者可以获取到APP端商品详情相关的数据&#xff0c;从而进行数据分析&#xff…

怎么录屏?这里有一份超详细教程!

随着科技的发展&#xff0c;录屏已经成为人们日常生活中经常需要使用的功能&#xff0c;无论是录制游戏、教学演示、在线会议等都需要用到录屏。可是您知道怎么录屏才是最好的吗&#xff1f;接下来&#xff0c;本文将为您介绍三种流行的录屏方法&#xff0c;并提供详细的分步骤…

【遥感数字图像处理(朱文泉)】各章博文链接汇总及思维导图

遥感数字图像处理课程汇总 第0章 绪论第一章 数字图像基础第二章 数字图像存储与处理第三章 空间域处理方法第四章 变换域处理方法第五章 辐射校正第六章 几何校正第七章 图像去噪声第八章 图像增强第九章 感兴趣目标及对象提取第十章 特征提取与选择第十一章 遥感数字图像分类…

Unity 编辑器篇|(九)编辑器美化类( GUIStyle、GUISkin、EditorStyles) (全面总结 | 建议收藏)

目录 1. GUIStyle1.1 参数总览1.2 样式代码 2. GUISkin2.1 参数总览2.2 创建自定义Skin 3. EditorStyles2.1 参数总览1.2 反射获取所有EditorStyles 1. GUIStyle GUIStyle是一个用于定制GUI控件样式的类&#xff0c;它包含了控件的外观属性&#xff0c;如字体、颜色、背景等。…