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

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

大模型开发范式

在这里插入图片描述

Finetune

在大型语言模型中,Finetune(微调)是一种技术,用于调整预训练的模型以提高其在特定任务或数据集上的表现。这种方法通常涉及以下步骤:

预训练模型:首先,需要一个预训练的大型语言模型,如GPT、BERT或其他变体。这些模型通常在大型文本语料库上训练,以学习语言的广泛特征和结构。

特定任务的数据:接着,收集和准备针对特定任务的数据集。这个数据集应该包括输入和期望的输出,例如,用于情感分析的句子和它们的情感标签,或者用于翻译任务的句子对。

微调:然后,使用特定任务的数据集对预训练模型进行微调。这通常涉及在该数据集上继续训练模型一段时间,调整模型的权重以优化任务特定的性能。微调时,学习率通常设置得比预训练阶段低,以避免过快破坏预训练时学到的有用特征。

评估和调整:最后,评估微调后模型的性能,并根据需要调整微调过程(如调整学习率、训练更多的轮次或修改数据处理方式)以进一步提高性能。

微调的优势在于能够利用预训练模型在广泛数据上学习到的丰富知识,从而需要较少的标注数据就可以达到较高的性能。这对于数据稀缺的任务尤其有价值。然而,微调也有其挑战,例如过拟合(特别是在小数据集上)、调整过程中的超参数选择等。
在这里插入图片描述
Retrieval Augmented Generation (RAG)
RAG是一种自然语言处理技术,结合了信息检索和文本生成的能力,以提高模型在处理复杂查询时的性能和准确性。在RAG系统中,首先利用一个检索组件查询一个大型文档数据库,以找到与给定查询最相关的信息。然后,这些检索到的文档被送入一个生成模型,如序列到序列的转换模型,这个模型利用检索到的信息来生成回答或完成给定的文本任务。

RAG模型的关键在于它结合了检索的精确性和生成模型的灵活性。通过这种方式,RAG能够在需要具体信息或知识支持时提供更准确、更丰富的回答。例如,在回答特定的事实问题、撰写有关特定主题的文章或生成信息丰富的对话回复时,RAG模型可以展现出比传统的生成模型更优越的性能。

RAG技术的一个主要优势是它能够有效地处理那些对传统生成模型来说过于复杂或需要外部知识的查询。它通过检索相关文档来直接利用现有的知识库,然后将这些信息融入生成过程中,从而提高了生成文本的相关性和准确性。这使得RAG尤其适合于需要广泛背景知识的应用场景,如问答系统、内容创作和对话系统等。

RAG模型的实现通常涉及到两个主要组件的训练和优化:检索组件和生成组件。检索组件负责从大型文档集中快速有效地检索出与查询最相关的文档,而生成组件则负责处理这些文档,并基于它们生成连贯和相关的文本输出。这两个组件的协同工作使得RAG能够在许多自然语言处理任务中实现高性能。

在这里插入图片描述

LangChain是一个开源框架,旨在利用最新的自然语言处理(NLP)技术,尤其是大型语言模型(LLM),来构建和部署语言应用。它提供了一套工具和API,使开发者能够轻松集成复杂的语言理解和生成能力到他们的应用中。LangChain通过提供与检索增强生成(RAG)、链式推理、对话系统等高级功能的集成,促进了创新应用的开发。以下是几种结合LangChain可能的应用场景:

  • 增强的问答系统:利用LangChain,可以构建更智能、更准确的问答系统,这些系统能够通过检索和引用大量的外部知识源来回答复杂的问题。结合RAG等技术,这些系统不仅能够生成准确的答案,还能提供答案的来源,增加透明度和可信度。
  • 知识管理和信息检索:LangChain可以帮助企业和组织构建先进的知识管理系统,这些系统能够理解自然语言查询,并从大型文档库中检索和总结相关信息。这对于提高研究效率和支持决策过程特别有价值。
  • 自动内容创作:利用LangChain,可以开发出能够自动生成文章、报告、摘要等内容的应用。结合RAG等技术,这些应用能够引用和整合来自多个来源的信息,创造出既丰富又准确的内容。
  • 交互式对话系统和聊天机器人:LangChain提供的工具和API使得开发者能够构建高度互动的对话系统和聊天机器人,这些系统能够进行复杂的对话、解答问题、提供推荐,甚至执行特定的任务或服务。
  • 教育和学习:通过LangChain,可以开发辅助学习和教学的应用,例如自动生成练习题、提供个性化的学习资料和反馈,以及构建能够解答学生问题的智能助手。
  • 创意写作和娱乐:LangChain也可以用于支持创意写作,包括自动生成故事、诗歌、剧本等。此外,它还可以用于开发互动游戏和娱乐应用,其中包括复杂的故事情节和角色对话。

基于langChain搭建RAG
在这里插入图片描述

构建向量数据库

加载源文件 -》文档分块 -》文档向量
在这里插入图片描述

搭建知识库助手

在这里插入图片描述

构建一个检索问答链(Retrieval Question-Answering Chain, RQAC)涉及到创建一个系统,它可以通过检索相关信息并基于这些信息生成回答来处理复杂的查询。这个过程通常涉及到以下几个关键步骤:

需求分析:

确定系统的目标用户和用例。
确定需要检索的信息类型和来源。
选择或构建检索系统:

确定适合的检索技术(例如,Elasticsearch, Solr, 或自定义检索算法)。
构建或配置检索数据库,确保它包含足够的信息来回答用户的问题。
实现一个检索模块,它可以根据用户的查询从数据库中检索相关文档或信息。
选择或开发问答生成模型:

选择一个现有的语言模型(如GPT-4, BERT, T5等),这些模型可以用来理解查询和生成回答。
根据需要,训练或微调模型以提高对特定域或任务的回答质量。
集成检索和问答系统:

实现一个流程,其中用户的查询首先触发检索模块来查找相关信息。
将检索到的信息作为上下文输入到问答模型中,生成针对用户查询的回答。
用户界面设计:

设计一个用户界面,用户可以通过它提交查询并接收回答。
确保界面简洁易用,能够清楚地展示检索到的信息和生成的回答。
测试和优化:

对系统进行彻底测试,包括单元测试、集成测试和用户接受测试。
根据反馈优化检索准确性和回答质量。
部署和维护:

部署系统到生产环境。
定期更新数据库和模型,确保系统能够处理新出现的查询和信息。
在这里插入图片描述
在这里插入图片描述

web demo

有很多支持简易Web部署的框架,如Gradio,streamlit

环境搭配

conda activate InternLM

安装一些重要的包

# 升级pip
python -m pip install --upgrade pippip 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

模型下载

在目录下新建 download.py 文件并在其中输入以下内容,粘贴代码后记得保存文件,如下图所示。并运行 python download.py 执行下载,模型大小为 14 GB,下载模型大概需要 10~20 分钟

import torch
from modelscope import snapshot_download, AutoModel, AutoTokenizer
import os
model_dir = snapshot_download('Shanghai_AI_Laboratory/internlm-chat-7b', cache_dir='../model', revision='v1.0.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
首先需要使用 huggingface 官方提供的 huggingface-cli 命令行工具。安装依赖:

pip install -U huggingface_hub

目录下新建python文件 download_hf.py,填入以下代码:

  • resume-download:断点续下
  • local-dir:本地存储路径。(linux环境下需要填写绝对路径)
import os# 下载模型os.system('huggingface-cli download --resume-download sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 --local-dir ../model/sentence-transformer')

下载 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

数据收集

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

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

进入到数据库盘

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

将数据整理出来的脚本

# 首先导入所需第三方库
from langchain.document_loaders import UnstructuredFileLoader
from langchain.document_loaders import UnstructuredMarkdownLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
from tqdm import tqdm
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# 加载文件函数
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:# 如果是不符合条件的文件,直接跳过continuedocs.extend(loader.load())return docs# 目标文件夹
tar_dir = ["/root/data/InternLM","/root/data/InternLM-XComposer","/root/data/lagent","/root/data/lmdeploy","/root/data/opencompass","/root/data/xtuner"
]# 加载目标文件
docs = []
for dir_path in tar_dir:docs.extend(get_text(dir_path))# 对文本进行分块
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=150)
split_docs = text_splitter.split_documents(docs)# 加载开源词向量模型
embeddings = HuggingFaceEmbeddings(model_name="/root/data/model/sentence-transformer")# 构建向量数据库
# 定义持久化路径
persist_directory = 'data_base/vector_db/chroma'
# 加载数据库
vectordb = Chroma.from_documents(documents=split_docs,embedding=embeddings,persist_directory=persist_directory  # 允许我们将persist_directory目录保存到磁盘上
)
# 将加载的向量数据库持久化到磁盘上
vectordb.persist()

实行
在这里插入图片描述
DEMO

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

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

相关文章

【MySQL】:DQL查询

🎥 屿小夏 : 个人主页 🔥个人专栏 : MySQL从入门到进阶 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一. DQL1.1 基本语法1.2 基础查询1.3 条件查询1.3 聚合函数 🌤️ 全篇…

【Linux取经路】文件系统之被打开的文件——文件描述符的引入

文章目录 一、明确基本共识二、C语言文件接口回顾2.1 文件的打开操作2.2 文件的读取写入操作2.3 三个标准输入输出流 三、文件有关的系统调用3.1 open3.1.1 比特位级别的标志位传递方式 3.2 write3.2.1 模拟实现 w 选项3.2.2 模拟实现 a 选项 3.3 read 四、访问文件的本质4.1 再…

C#系列-EntityFrameworkCore.SqlServer.NodaTime实例(37)

EntityFrameworkCore.SqlServer.NodaTime 是一个扩展包,它允许你使用 NodaTime 库中的日期和时间类型与 SQL Server 数据库进行交互。NodaTime 是一个流行的.NET 日期和时间库,它提供了比 .NET 内置的 DateTime 和 DateTimeOffset 类型更丰富的功能和更好…

探讨:工业物联网,纯上报设备的数采

事情是这样的,有一台设备是modbus-tcp协议,手工操作测量,自动发送测量结果,就这,没别的了。 开始看起来挺简单,连接上去就等着收数据嘛,多简单!后来发现麻烦得很啊,关键的…

【深度学习】S2 数学基础 P4 概率论

目录 基本概率论概率论公理随机变量 多个随机变量联合概率条件概率贝叶斯定理求和法则独立性 期望与方差小结 基本概率论 机器学习本质上,就是做出预测。而概率论提供了一种量化和表达不确定性水平的方法,可以帮助我们量化对某个结果的确定性程度。 在…

状态模式:灵活管理对象状态的设计策略

状态模式:灵活管理对象状态的设计策略 在软件开发的过程中,我们经常会遇到对象根据其内部状态的改变而改变其行为的场景。传统的处理方式可能会使用大量的条件判断语句来处理不同的状态转换以及相应的行为,这不仅使得代码难以维护&#xff0…

【UI自动化测试技术】自动化测试研究:Python+Selenium+Pytest+Allure,详解UI自动化测试,iframe、窗口等控件切换(精)(五)

导言 在上一篇文章里,我们一起学习了键盘事件、鼠标事件以及其它的一些特殊情况的处理。这篇文章我们一起学习Selenium中一些特殊窗口以及iframe,如何处理。 学习目标 了解对浏览器的基本功能操作(本节重点)学习如何对弹窗进行操…

素数算法(普通求解,埃氏筛,欧拉筛)

素数算法(常规求解,埃氏筛,欧拉筛) 1. 常规求解1.1 原理解释1.2 算法实现 2 . 埃氏筛2.1 原理解释2.2 算法实现 3. 欧拉筛3.1 原理解释3.2 算法实现 1. 常规求解 1.1 原理解释 枚举法是一种简单的求解素数的方法,其基…

黑马程序员java部分笔记(持续更新)九点五:数组的动态初始化与常见问题

为什么有动态初始化呢? 当 不知道数组里几个元素的具体值时用动态初始化 动态初始化:初始化时只指定数组长度,由系统分配初始值 格式:数据类型[]数组名new 数据类型[数组长度]; 特点:在创建的时候有自己指定数组长度,…

Java的集合框架和泛型

文章目录 集合框架什么是集合框架类和接口总览 集合框架的重要性背后所涉及的数据结构以及算法什么是数据结构容器背后对应的数据结构什么是算法 包装类基本数据类型和对应的包装类装箱和拆箱自动装箱和自动拆箱 泛型什么是泛型引出泛型语法泛型类泛型的上界(没有下界)泛型方法…

心理辅导|高校心理教育辅导系统|基于Springboot的高校心理教育辅导系统设计与实现(源码+数据库+文档)

高校心理教育辅导系统目录 目录 基于Springboot的高校心理教育辅导系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、学生功能模块的实现 (1)学生登录界面 (2)留言反馈界面 (3)试卷列表界…

方式0控制流水灯循环点亮

#include<reg51.h> //包含51单片机寄存器定义的头文件 #include<intrins.h> //包含函数_nop_()定义的头文件 unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码,该数组被定义为全局变量 sbit P17=P1^7; /*****************…

100.网游逆向分析与插件开发-网络通信封包解析-C++还原网络通信系统发送功能

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;数据包组织与发送过程逆向分析 码云地址&#xff08;游戏窗口化助手 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;ec54e9ae1ca0efe96b87d5…

C/C++如何把指针所指向的指针设为空指针?

实践出真知&#xff0c;指针对于初学的友友来说&#xff0c;头都要大了。喵喵一直遵循在实践中学&#xff0c;在学习中实践&#xff0c;相信你也会有所得&#xff01; 以下是该问题的解决方案&#xff1a; int** ptrPtr new int*; // 创建指向指针的指针 int* ptr new int;…

《动手学深度学习(PyTorch版)》笔记8.2

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

基于Springboot的社区物资交易互助平台(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的社区物资交易互助平台&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

深度学习||YOLO(You Only Look Once)深度学习的实时目标检测算法(YOLOv1~YOLOv5)

目录 YOLOv1: YOLOv2: YOLOv3: YOLOv4: YOLOv5: 总结: YOLO(You Only Look Once)是一系列基于深度学习的实时目标检测算法。 自从2015年首次被提出以来,YOLO系列不断发展,推出了多个版本,包括YOLOv1, YOLOv2, YOLOv3, YOLOv4, 和YOLOv5等。下面是对YOLO系列的详解…

【光学】学习记录1-几何光学的近轴理论

课程来源&#xff1a;b站资源-光学-中科大-崔宏滨老师&#xff08;感谢&#xff09;&#xff0c;本系列仅为自学笔记 【光学 中科大 崔宏滨老师 1080p高清修复&#xff08;全集&#xff09;】https://www.bilibili.com/video/BV1NG4y1C7T9?p2&vd_source7ba37b2cff2a1b783…

MATLAB计算极限和微积分

一.函数与极限 计算极限&#xff1a;lim(3*x^2/(2x1))&#xff0c;x分别趋于0和1&#xff0c;代码如下&#xff1a; syms x; limit(3*x*x/(2*x1),x,0) limit(3*x*x/(2*x1),x,1) 结果分别为0和1&#xff1a; 1.计算双侧极限 计算极限&#xff1a;lim(3*x^2/(2x1))&#xff0…

wordpress日主题模版Ripro-v5 6.4开心版

RiPro主题全新V5版本&#xff0c;&#xff08;原RiPro v2旧版已停更&#xff09;是一个优秀且功能强大、速度极快&#xff0c;易于管理、现代化的WordPress虚拟资源商城主题。支持首页模块化布局和WP原生小工具模块化首页可拖拽设置&#xff0c;让您的网站设计体验更加舒适。同…