书生.浦语大模型LangChain实战

发布时间:2024年01月11日

RAG(Retrieval-Augmented Generation)与Finetune

传统大模型有以下几点问题:

  1. 无法及时更新知识
  2. 知识面广,但在专业领域深度不够

为了解决以上诸多问题,有很多尝试方案。例如通过微调模型(Finetune)来适应专业领域知识,但这种方式对技术要求较高,属于计算密集型,很难灵活使用。

在这里插入图片描述

2020 年Lewis等人,在知识密集型 NLP 任务中,提出了一种更灵活的技术,称为检索增强生成(RAG)[参考论文:https://arxiv.org/abs/2005.11401]。在本文中,研究人员将生成模型与检索器模块相结合,以提供来自外部知识源的附加信息,并且这些信息可以很方便的进行更新维护。

即在大模型外部增加了一个知识库,大模型专门负责知识推理。

参数知识:神经网络只存储在训练期间学习到的知识。

非参数知识:知识存储在外部知识库中,例如向量知识库

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

构建向量数据库

  • 加载源文件:由于知识库文件格式不同,因此需要针对不同类型源文件采用不同的加载器
  • 文档分块(chunk):单个知识文档长度可能会超过模型上下文上限,需要对文档拆分
    • 按字符串长度分割
    • 手动控制分割长度和重叠区间长度
  • 文档向量块
    • 使用任意一种Embedding模型将块转化为向量,存入向量数据库
    • 使用支持语义检索的向量数据库,例如轻量级的Chroma

搭建知识库助手

在这里插入图片描述

创建虚拟环境

在这里插入图片描述

基础模型下载
LangChain相关环境配置

在这里插入图片描述

下载词向量模型sentence Transformer

在这里插入图片描述

下载NLTK库相关资源

知识库搭建

准备知识库数据

克隆几个仓库,利用其中的文本文档作为知识库数据

加载数据

利用langchain将不同格式的文本文档转化为字符串

分块及词向量持久化

利用sentence transformer将分块后的文档转化为词向量,并最终将其持久化保存

InternLM 接入LangChain

自定义一个InternLM的LLM类,继承LangChain的LLM类。重写其__init__()_call_()函数。在init中加载本地LLM模型,在call中调用模型的chat方法,传入prompt,返回response。

构建检索问答链

加载向量数据库
实例化自定义的LLM
实例化Prompt Template

在这里插入图片描述

在这里插入图片描述

reference

一文带你了解RAG(检索增强生成) | 概念理论介绍+ 代码实操(含源码)

Python自然语言处理:NLTK入门指南

向量数据库Chroma极简教程

文章来源:https://blog.csdn.net/L1142456160/article/details/135532829
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。