书生·浦语大模型--第三节课笔记--基于 InternLM 和 LangChain 搭建你的知识库

这篇具有很好参考价值的文章主要介绍了书生·浦语大模型--第三节课笔记--基于 InternLM 和 LangChain 搭建你的知识库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

书生·浦语大模型--第三节课笔记--基于 InternLM 和 LangChain 搭建你的知识库,InternLM大模型,笔记,langchain,语言模型,chatgpt

大模型开发范式

LLM的局限性:时效性(最新知识)、专业能力有限(垂直领域)、定制化成本高(个人专属)

两种开发范式:

  • RAG(检索增强生成):外挂知识库,首先匹配知识库文档,交给大模型。优势:成本低,实时更新,不需要训练。但受限于基座模型,知识有限,总结性回答不佳。
  • Finetune(微调):轻量级训练微调,可个性化微调,是一个新的个性化大模型。但是需要在新的数据集上训练,更新成本仍然很高,无法解决实时更新的问题。

RAG

  • 基本思想
    书生·浦语大模型--第三节课笔记--基于 InternLM 和 LangChain 搭建你的知识库,InternLM大模型,笔记,langchain,语言模型,chatgpt

LangChain框架:

通过组件组合进行开发,自由构建大模型应用。将私人数据嵌入到组件中。
书生·浦语大模型--第三节课笔记--基于 InternLM 和 LangChain 搭建你的知识库,InternLM大模型,笔记,langchain,语言模型,chatgpt
步骤:首先,Unstructed Loader 组件加载本地文档,将不同格式的文档提取为纯文本格式。通过Text Splitter组件对提取的纯文本进行分割成Chunk。再通过开源词向量模型Sentence Transformer来将文本段转化为向量格式,存储到基于Chroma的向量数据库中,接下来对用户的每个输入会通过Sentence Transformer转为为同样维度的向量,通过在向量数据库中进行相似度匹配找到和用户输入的文本段,将相关的文本段嵌入到已经写好的Prompt Template中,最后交给LLM回答即可。书生·浦语大模型--第三节课笔记--基于 InternLM 和 LangChain 搭建你的知识库,InternLM大模型,笔记,langchain,语言模型,chatgpt

构建向量数据库

基于个人数据构建向量数据库。LangChain支持自定义LLM,可以直接接入到框架中。

  • 多种数据类型,针对不同类型选取不同加载器,转化为无格式字符串。
  • 由于单个文档超过模型上下文上限,还需要对文档进行切分。
  • 使用向量数据库支持语义检索,需要将文本向量化存入向量数据库

构建检索问答链

自动实现知识检索、Prompt嵌入、LLM问答。
问答性能还有所局限

书生·浦语大模型--第三节课笔记--基于 InternLM 和 LangChain 搭建你的知识库,InternLM大模型,笔记,langchain,语言模型,chatgpt

优化建议

基于语义切分而不是字符串长度。
给每个chunk生成概括性索引。
书生·浦语大模型--第三节课笔记--基于 InternLM 和 LangChain 搭建你的知识库,InternLM大模型,笔记,langchain,语言模型,chatgpt

web 部署

简易框架:Gradio、Streamlit等

实践部分

环境配置

bash
/root/share/install_conda_env_internlm_base.sh InternLM

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

模型下载:
直接复制

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

LangChain 相关环境配置

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

由于使用 huggingface 下载可能速度较慢,我们可以使用 huggingface 镜像下载

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

在使用开源词向量模型构建开源词向量的时候,需要用到第三方库 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

下载本项目代码

cd /root/data
git clone https://github.com/InternLM/tutorial

知识库搭建

数据收集

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

# 进入到数据库盘
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

接着,为语料处理方便,我们将选用上述仓库中所有的 markdown、txt 文件作为示例语料库。

import os 
def get_files(dir_path):
    # args:dir_path,目标文件夹路径
    file_list = []
    for filepath, dirnames, filenames in os.walk(dir_path):
        # os.walk 函数将递归遍历指定文件夹
        for filename in filenames:
            # 通过后缀名判断文件类型是否满足要求
            if filename.endswith(".md"):
                # 如果满足要求,将其绝对路径加入到结果列表
                file_list.append(os.path.join(filepath, filename))
            elif filename.endswith(".txt"):
                file_list.append(os.path.join(filepath, filename))
    return file_list

加载数据

得到所有目标文件路径之后,我们可以使用 LangChain 提供的 FileLoader 对象来加载目标文件,得到由目标文件解析出的纯文本内容。由于不同类型的文件需要对应不同的 FileLoader,我们判断目标文件类型,并针对性调用对应类型的 FileLoader,同时,调用 FileLoader 对象的 load 方法来得到加载之后的纯文本对象:

from tqdm import tqdm
from langchain.document_loaders import UnstructuredFileLoader
from langchain.document_loaders import UnstructuredMarkdownLoader

def get_text(dir_path):
    # args:dir_path,目标文件夹路径
    # 首先调用上文定义的函数得到目标文件路径列表
    file_lst = get_files(dir_path)
    # docs 存放加载之后的纯文本对象
    docs = []
    # 遍历所有目标文件
    for one_file in tqdm(file_lst):
        file_type = one_file.split('.')[-1]
        if file_type == 'md':
            loader = UnstructuredMarkdownLoader(one_file)
        elif file_type == 'txt':
            loader = UnstructuredFileLoader(one_file)
        else:
            # 如果是不符合条件的文件,直接跳过
            continue
        docs.extend(loader.load())
    return docs

构建向量数据库

得到该列表之后,我们就可以将它引入到 LangChain 框架中构建向量数据库。由纯文本对象构建向量数据库,我们需要先对文本进行分块,接着对文本块进行向量化。

from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500, chunk_overlap=150)
split_docs = text_splitter.split_documents(docs)

接着我们选用开源词向量模型 Sentence Transformer 来进行文本向量化。LangChain 提供了直接引入 HuggingFace 开源社区中的模型进行向量化的接口:

from langchain.embeddings.huggingface import HuggingFaceEmbeddings

embeddings = HuggingFaceEmbeddings(model_name="/root/data/model/sentence-transformer")

同时,考虑到 Chroma 是目前最常用的入门数据库,我们选择 Chroma 作为向量数据库,基于上文分块后的文档以及加载的开源向量化模型,将语料加载到指定路径下的向量数据库:

from langchain.vectorstores import Chroma

# 定义持久化路径
persist_directory = 'data_base/vector_db/chroma'
# 加载数据库
vectordb = Chroma.from_documents(
    documents=split_docs,
    embedding=embeddings,
    persist_directory=persist_directory  # 允许我们将persist_directory目录保存到磁盘上
)
# 将加载的向量数据库持久化到磁盘上
vectordb.persist()

构建检索问答链

加载向量数据库

首先我们需要将上文构建的向量数据库导入进来,我们可以直接通过 Chroma 以及上文定义的词向量模型来加载已构建的数据库:

实例化自定义 LLM 与 Prompt Template

接着,我们实例化一个基于 InternLM 自定义的 LLM 对象:
构建检索问答链,还需要构建一个 Prompt Template,该 Template 其实基于一个带变量的字符串,在检索之后,LangChain 会将检索到的相关文档片段填入到 Template 的变量中,从而实现带知识的 Prompt 构建。我们可以基于 LangChain 的 Template 基类来实例化这样一个 Template 对象:

构建检索问答链

最后,可以调用 LangChain 提供的检索问答链构造函数,基于我们的自定义 LLM、Prompt Template 和向量知识库来构建一个基于 InternLM 的检索问答链:
得到的 qa_chain 对象即可以实现我们的核心功能,即基于 InternLM 模型的专业知识库助手。我们可以对比该检索问答链和纯 LLM 的问答效果:

部署 Web Demo

在完成上述核心功能后,我们可以基于 Gradio 框架将其部署到 Web 网页,从而搭建一个小型 Demo,便于测试与使用。文章来源地址https://www.toymoban.com/news/detail-799586.html

到了这里,关于书生·浦语大模型--第三节课笔记--基于 InternLM 和 LangChain 搭建你的知识库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 书生·浦语大模型开源体系(二)笔记

    💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢迎在文章下方留下你的评论和反馈。我期待着与你分享知识、互

    2024年04月09日
    浏览(85)
  • 书生·浦语大模型开源体系(四)笔记

    💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢迎在文章下方留下你的评论和反馈。我期待着与你分享知识、互

    2024年04月28日
    浏览(28)
  • 书生·浦语大模型实战营-学习笔记4

    常见的两种微调策略:增量预训练、指令跟随 指令跟随微调 数据是一问一答的形式 对话模板构建 每个开源模型使用的对话模板都不相同 指令微调原理: 由于只有答案部分是我们期望模型来进行回答的内容,所以我们只对答案部分进行损失的计算 增量预训练微调 数据都是

    2024年01月22日
    浏览(42)
  • 书生·浦语大模型实战营-第四课笔记

    期待已久的微调课 增量预训练和指令跟随是两种微调模式,即两种微调策略。   1)增量预训练 投喂新的领域知识即可,例如书籍、文章、代码 2)指令跟随 采用高质量对话和问答数据进行训练 两者是微调的方法,即算法。 xtuner是一种微调框架。

    2024年02月21日
    浏览(46)
  • 【书生·浦语大模型实战】“PDF阅读小助手”学习笔记

    《新版本Lmdeploy量化手册与评测》 项目主页:【tcexeexe / pdf阅读小助手】 在InternStudio平台中选择 A100 (1/4) 的配置,镜像选择 Cuda11.7-conda ,可以选择已有的开发机 langchain ; Note: /home/tcexeexe/data/model/sentence-transformer :此路径来自于make_knowledge_repository.py 以上脚本会生成数据库文

    2024年01月24日
    浏览(44)
  • 书生·浦语大模型全链路开源体系【大模型第2课-笔记】

    1.1 什么是大模型?   大模型通常指的是机器学习或人工智能领域中参数数量巨大、拥有庞大计算能力和参数规模的模型。这些模型利用大量数据进行训练,并且拥有数十亿甚至数千亿个参数。大模型的出现和发展得益于增长的数据量、计算能力的提升以及算法优化等因素

    2024年01月19日
    浏览(93)
  • 书生·浦语大模型实战营第四次课堂笔记

    哈哈到这才想起来写笔记 倒回去看发现要求将不要葱姜蒜换成自己的名字和昵称! 好好好我就是不配玩(换成管理员也不行!) 诶怎么能进这个环境?要进双系统ubuntu? 现在看视频发现原来是我进入成功了,可以接着往下做omygod!!!! 但是 还是看看视频吧 微调是在海量

    2024年01月20日
    浏览(49)
  • 【 书生·浦语大模型实战营】学习笔记(一):全链路开源体系介绍

    🎉 AI学习星球推荐: GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料,配有全面而有深度的专栏内容,包括不限于 前沿论文解读、资料共享、行业最新动态以、实践教程、求

    2024年04月23日
    浏览(40)
  • 大模型学习之书生·浦语大模型6——基于OpenCompass大模型评测

    Why What 有许多任务评测,包括垂直领域 How 包含客观评测和主观评测,其中主观评测分人工和模型来评估。 提示词工程 主流评测框架 模型层 能力层 方法层 工具层 支持丰富的模型 评测流水线设计 ,能切分多个独立执行的任务,最大化利用计算资源。 大模型能力对比结果输

    2024年01月22日
    浏览(34)
  • 【书生·浦语大模型实战营05】《(5)LMDeploy 大模型量化部署实践》学习笔记

    课程文档:《LMDeploy 的量化和部署》 定义 将训练好的模型在特定软硬件环境中启动的过程,使模型能够接收输入并返回预测结果 为了满足性能和效率的需求,常常需要对模型进行优化,例如模型压缩和硬件加速 产品形态 云端、边缘计算端、移动端 内存开销巨大 庞大的参数

    2024年01月22日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包