RAG(Retrieval-Augmented Generation)与Finetune
传统大模型有以下几点问题:
- 无法及时更新知识
- 知识面广,但在专业领域深度不够
为了解决以上诸多问题,有很多尝试方案。例如通过微调模型(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极简教程