【书生·浦语大模型实战营】学习笔记3

news2025/2/27 2:09:20

文章目录

  • 1. 大模型开发范式
  • 2. LangChain简介
  • 3. 构建向量数据库
  • 4. 搭建知识库助手
  • 5. Web Demo部署
  • 6. 动手实战环节
    • 环境配置
    • 知识库搭建
    • InternLM接入LangChain
    • 构建检索问答链
    • 部署Web Demo
  • 参考资料

1. 大模型开发范式

LLM局限性:
知识时效性:LLM无法获取最新的知识
专业能力有限:如何打造垂直领域大模型
定制化成本高:如何打造个人专属的LLM应用

两种大模型开发范式
检索增强生成RAG
外挂知识库
低成本、实时更新、受基座模型影响大、单次回答知识有限(知识库中文档占据上下文大)
LLM微调finetune
在小的数据集上进行轻量级训练
个性化微调、知识覆盖面广、成本高昂、无法实时更新

RAG检索增强生成的基本思路
一个假设是向量数据库中检索到的和用户输入文本相似的文本段大概率是包含了问题答案
image.png

2. LangChain简介

针对LLM开发,为各种LLM提供通用接口的开源框架
核心组成模块
链(Chains):封装实现一系列LLM操作实现端到端应用,如检索问答链覆盖实现了RAG的全部流程

开发思路:将开发者的私域数据直接嵌入LangChain组件来构建RAG应用

开发流程图
image.png
Unstructed Loader:将用户文档全部转化为纯文本格式
Text Splitter:将纯文本分割为Text Chunks 文本块
Sentence Transformer:开源词向量模型,将文本段转化为向量格式;将用户输入转化为向量

3. 构建向量数据库

步骤
加载源文件、文档分块、文档向量化

  1. 将不同类型的源文件使用不同的加载器统一转化为无格式字符串
  2. 由于LLM的上下文长度有限,按字符串长度划分已加载的文档为多个chunks
  3. 使用Embedding模型(Sentence Transformer)将chunks文本向量化存入支持语义检索的向量数据库(Chroma)中

4. 搭建知识库助手

将InternLM接入LangChain
将InternLM部署在本地,并封装成一个自定义的LLM类,接入到LangChain框架中,直接调用本地的InternLM

构建检索问答链
LangChain提供了检索问答链模板——实现知识检索、prompt嵌入、LLM问答的全部流程
方法:将基于InternLM的自定义LLM和已构建的向量数据库接入到检索问答链上游,再调用检索问答链就可实现知识库助手的全部功能

RAG方案优化建议
基于RAG的问答系统缺陷在于

  1. 检索精度:将基于字符串长度的chunk分割改为基于语义的分割以保证chunk的语义完整性;给每个chunk生成概况性索引,检索时直接匹配索引而非全文匹配
  2. Prompt性能:迭代优化Prompt

5. Web Demo部署

支持简易Web部署的框架:gradio、streamlit等
本次lesson使用gradio框架完成知识库助手的web部署

6. 动手实战环节

环境配置

  1. InternLM模型部署
  2. 模型下载
  3. 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

Embedding选择
开源词向量模型Sentence Transformer
借助hugging face下载Embedding模型

import os

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

# 下载模型 --resume-download 断点续下;--local-dir 本地存储路径
os.system('huggingface-cli download --resume-download sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 --local-dir /root/data/model/sentence-transformer')
  1. 下载NLTK相关资源
git clone https://gitee.com/yzy0612/nltk_data.git  --branch gh-pages
  1. 下载本项目代码

知识库搭建

  1. 数据收集:语料库来源
    image.png
    选取语料库中的.txt文件和.md文件

  2. 加载数据
    使用LangChain提供的FileLoader对象加载目标文件,得到由目标文件解析出的纯文本内容

from langchain.document_loaders import UnstructuredFileLoader
from langchain.document_loaders import UnstructuredMarkdownLoader
  1. 构建向量数据库
    先对文本进行分块,再对文本块进行向量化
    分块
    RecursiveCharacterTextSplitter字符串递归分割器,选择分块大小为 500,块重叠长度为 150
from langchain.text_splitter import RecursiveCharacterTextSplitter

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

块向量化
使用开源词向量模型Sentence Transformer进行文本向量化
使用Chroma向量数据库实现文本向量的本地存储

# 文本向量化
from langchain.embeddings.huggingface import HuggingFaceEmbeddings

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

# 文本向量存储
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()

InternLM接入LangChain

为了实现将InternLM接入LangChain框架从而达到模型封装的目的,这里需要基于本地部署的 InternLM,继承 LangChain 的 LLM 类自定义一个 InternLM LLM 子类
如何自定义LangChain的LLM子类
从 LangChain.llms.base.LLM 类继承一个子类,并重写构造函数与 _call 函数

构建检索问答链

  1. 加载向量数据库
# 加载数据库
vectordb = Chroma(
    persist_directory=persist_directory, 
    embedding_function=embeddings
)
  1. 实例化自定义LLM与Prompt Template
# 实例化自定义的LLM
from LLM import InternLM_LLM
llm = InternLM_LLM(model_path = "/root/data/model/Shanghai_AI_Laboratory/internlm-chat-7b")
llm.predict("你是谁")

# 常用的Prompt Template构建
from langchain.prompts import PromptTemplate

# 我们所构造的 Prompt 模板
template = """使用以下上下文来回答用户的问题。如果你不知道答案,就说你不知道。总是使用中文回答。
问题: {question}
可参考的上下文:
···
{context}
···
如果给定的上下文无法让你做出回答,请回答你不知道。
有用的回答:"""

# 调用 LangChain 的方法来实例化一个 Template 对象,该对象包含了 context 和 question 两个变量,在实际调用时,这两个变量会被检索到的文档片段和用户提问填充
QA_CHAIN_PROMPT = PromptTemplate(input_variables=["context","question"],template=template)
  1. 构建检索问答链
from langchain.chains import RetrievalQA

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

对比原生llm问答效果和加入检索问答链的llm问答效果

# 检索问答链回答效果
question = "什么是InternLM"
result = qa_chain({"query": question})
print("检索问答链回答 question 的结果:")
print(result["result"])

# 仅 LLM 回答效果
result_2 = llm(question)
print("大模型回答 question 的结果:")
print(result_2)

部署Web Demo

基于 Gradio 框架将上述带有检索问答链并接入了LangChain框架的InternLM部署到 Web 网页
运行效果如下:
image.png

参考资料

  1. 书生·浦语大模型全链路开源体系

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

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

相关文章

【Vue3】组件通信的的各种方式和tsx风格

组件通信 Vue2组件通信方式全局事件总线bus,可以实现组件通信 Vue3组件通信方式propsprovide与inject依赖注入 全局APiVue3其他改变组件通信之自定义事件组件通信之事件总线组件通信之v-model多个v-model传值 TSX风格使用风格一使用tsx风格,使用optionsA…

V-JEPA模型,非LLM另外的选择,AGI的未来:迈向Yann LeCun先进机器智能(AMI)愿景的下一步

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Flink源码解析(1)job启动,从JM到TM过程详解

网络传输模型 首先在看之前,回顾一下akka模型: Flink通讯模型—Akka与Actor模型-CSDN博客 注:ActorRef就是actor的引用,封装好了actor 下面是jm和tm在通讯上的概念图: RpcGateway 不理解网关的作用,可以先移步看这里:网关_百度百科 (baidu.com) 用于定义RPC协议,是…

JS11-scroll相关属性和缓动动画

scroll 相关属性 window.onscroll() 方法 当我们用鼠标滚轮,滚动网页的时候,会触发 window.onscroll() 方法。效果如下:(注意看控制台的打印结果) 如果你需要做滚动监听,可以使用这个方法。 我们来看看和…

用C语言打造自己的Unix风格ls命令

在Unix或类Unix操作系统中,ls是一个非常基础且实用的命令,它用于列出当前目录或指定目录下的文件和子目录。下面,我们将通过C语言编写一个简化的ls命令,展示如何利用dirent.h头文件提供的函数接口实现这一功能。 #include "…

开始喜欢上了runnergo,JMeter out了?

RunnerGo是一款基于Go语言、国产自研的测试平台。它支持高并发、分布式性能测试。和JMeter不一样的是,它采用了B/S架构,更灵活、更方便。而且,除了API测试和性能测试,RunnerGo还加上了UI测试和项目管理等实用功能,让测…

Jenkins Pipeline中when的用法

目录 概述内置条件branchbuildingTagchangesetchangeRequestequalsexpressiontriggeredBytagenvironmentnotallOfanyOf 在进入 stage 的 agent 前评估 whenbeforeAgentbeforeInputbeforeOptions 示例单一条件、声明性流水线多条件、声明式管道嵌套条件(与前面的示例…

综合实验---Web---进阶版

目录 实验配置: 1.PHP调整主配置文件时,修改文件内容 1.原内容调整(在编译安装的情况下) 2.调整如下 3.没有调整的,根据之前配置就行 2.配置Nginx支持PHP解析 1.原内容如下 2.调整如下 3.验证PHP测试页 1.原内容如下 2.调整如下 4…

U盘安装Linux系统报dracut-initqueue错误,解决方案

U盘安装Linux系统报dracut-initqueue错误,是因为系统所在U盘路径不对,需要修改 解决方法: dracut:/# cd dev >dracut:/# ls |grep sdb 查看你的u盘是哪个一般是sdbX,X是一个数字,也有可能是sda等,如果上边都不对…

C语言数据结构基础——二叉树学习笔记(二)topk问题

1.top-k问题 1.1思路分析 TOP-K 问题:即求数据结合中前 K 个最大的元素或者最小的元素,一般情况下数据量都比较大 。 比如:专业前 10 名、世界 500 强、富豪榜、游戏中前 100 的活跃玩家等。 对于 Top-K 问题,能想到的最简单直…

词令微信小程序怎么添加到我的小程序?

微信小程序怎么添加到我的小程序? 1、找到并打开要添加的小程序; 2、打开小程序后,点击右上角的「…」 3、点击后底部弹窗更多选项,请找到并点击「添加到我的小程序」; 4、添加成功后,就可以在首页下拉我的…

代码随想录算法训练营第二十七天 |131.分割回文串,一些思考

实际上,分割子集问题也是组合问题 (图源代码随想录网站) 一个套路,也就是说,每次递归函数参数列表传入start的时候,选中的元素相当于是在最后面划了一条分割线 回文子串的判断剪枝操作就很简单了&#xf…

AIGC元年大模型发展现状手册

零、AIGC大模型概览 AIGC大模型在人工智能领域取得了重大突破,涵盖了LLM大模型、多模态大模型、图像生成大模型以及视频生成大模型等四种类型。这些模型不仅拓宽了人工智能的应用范围,也提升了其处理复杂任务的能力。a.) LLM大模型通过深度学习和自然语…

什么是闭包?闭包的优缺点?闭包的应用场景?

什么是闭包&#xff1f; 闭包是指有权访问另外一个函数作用域中的变量的函数。 闭包形成的必要条件&#xff1a; 函数嵌套内部函数使用外部函数的变量内部函数作为返回值 举个栗子&#xff1a;实现每隔1s递增打印数字 使用闭包实现 for(var i1; i<5; i) {(function(i) {se…

Cointelegraph 策略主管 JASON CHOI确认出席Hack.Summit() 2024区块链开发者大会

随着区块链技术的蓬勃发展和广泛应用&#xff0c;一场备受瞩目的盛会即将拉开帷幕。Hack.Summit() 2024区块链开发者大会&#xff0c;由Hack VC主办&#xff0c;AltLayer和Berachain协办&#xff0c;Solana、The Graph、Blockchain Academy、ScalingX、0G、SNZ和数码港等机构的…

Python——模块

自定义模块 module_exercise.py文件 data 100 def func01():print("func01执行喽") class Myclass:def func02(self):print("func02执行喽")classmethoddef func03(cls):print("func03执行喽") exercise.py文件 # 调用方法1&#xff1a;&quo…

Unity2D实现鼠标拖动物体移动(简单好抄)

1.新建脚本&#xff0c;并将脚本拖到你想要拖动的物体上即可 using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine;public class text : MonoBehaviour {private Vector3 offset;public int x 1;void OnMouseDown(…

入门:vue使用Echarts绘制地图的步骤

匠心接单中...8年前端开发和UI设计接单经验&#xff0c;完工项目1000&#xff0c;持续为友友们分享有价值、有见地的干货观点&#xff0c;有业务需求的老铁&#xff0c;欢迎关注发私信。 安装echarts和echarts-map插件 npm install echarts --save npm install echarts-map --…

深入理解mysql 从入门到精通

1. MySQL结构 由下图可得MySQL的体系构架划分为&#xff1a;1.网络接入层 2.服务层 3.存储引擎层 4.文件系统层 1.网络接入层 提供了应用程序接入MySQL服务的接口。客户端与服务端建立连接&#xff0c;客户端发送SQL到服务端&#xff0c;Java中通过JDBC来实现连接数据库。 …

YOLOV5 部署:基于web网页的目标检测(本地、云端均可)

1、前言 YOLOV5推理的代码很复杂,大多数都是要通过命令行传入参数进行推理,不仅麻烦而且小白不便使用。 本章介绍的web推理,仅仅需要十几行代码就能实现本地推理,并且只需要更改单个参数就可以很方便的部署云端,外网也可以随时的使用 之前文章介绍了QT的可视化推理界面,…