基于 InternLM 和 LangChain 搭建你的知识库
课程笔记
大模型开发范式
LLM 的局限性:
- 知识时效性受限:如何让LLM能够获取最新的知识
- 专业能力有限:如何打造垂域大模型
- 定制化成本高:如何打造个人专属的LLM应用
两种开发范式比较:
RAG | Finetune |
---|---|
低成本 | 可个性化微调 |
可实时更新 | 知识覆盖面广 |
受基座模型影响大 | 成本高昂 |
单次回答知识有限 | 无法实时更新 |
此次课程主要针对: RAG检索增强生成
LangChain 简介
LangChain 框架是一个开源工具,通过为各种 LLM 提供通用接口来简化应用程序的开发流程,帮助开发者自由构建 LLM应用。LangChain 的核心组成模块如下:
- 链(Chains) :将组件组合实现端到端应用,通过一个对象封装实现一系列LLM 操作
- Eg. 检索问答链,覆盖实现了 RAG (检索增强生成)的全部流程。也是此次课程中实践用到的。
基于LangChain搭建RAG应用流程如下图所示:
构建向量数据库
流程如下:
- 确定源文件类型,针对不同类型源文件选用不同的加载器:核心在于将带格式文本转化为无格式字符串
- 由于单个文档往往超过模型上下文上限,我们需要对加载的文档进行切分:一般按字符串长度进行分割,也可以手动控制分割块的长度和重叠区间长度
- 使用向量数据库来支持语义检索,需要将文档向量化存入向量数据库:可以使用任一一种Embedding模型来进行向量化,也可以使用多种支持语义检索的向量数据库,一般使用轻量级的Chroma
搭建知识库助手
将InternLM接入LangChain
LangChain 支持自定义LLM,可以直接接入到框架中。只需将InternLM部署在本地,并封装一个自定义LLM
类,调用本地 InternLM 即可。
构建检索问答链
- LangChain提供了检索问答链模版,可以自动实现知识检索、Prompt嵌入、LLM问答的全部流程。
- 将基于InternLM的自定义LLM和已构建的向量数据库接入到检索问答链的上游
- 调用检索问答链,即可实现知识库助手的核心功能
如下图所示:
RAG方案优化建议
基于RAG的问答系统性能核心受限于:
- 检索精度
- Prompt性能
一些可能的优化点: - 检索方面:
- 基于语义进行分割,保证每一个chunk的语义完整
- 给每一个chunk生成概括性索引,检索时匹配索引
- Prompt方面:
- 迭代优化Prompt策略
Web Demo 部署
有很多支持简易 Web 部署的框架,如 Gradio、Streamlit 等
作业
基础作业
复现课程知识库助手搭建过程
配置好相关代码,做好前置工作后,在命令行运行启动代码:
添加的预料库为上海人工智能实验室开源的一系列大模型工具开源仓库中所有的 markdown、txt 文件,包括:
- OpenCompass:面向大模型评测的一站式平台
- IMDeploy:涵盖了 LLM 任务的全套轻量化、部署和服务解决方案的高效推理工具箱
- XTuner:轻量级微调大语言模型的工具库
- InternLM-XComposer:浦语·灵笔,基于书生·浦语大语言模型研发的视觉-语言大模型
- Lagent:一个轻量级、开源的基于大语言模型的智能体(agent)框架
- InternLM:一个开源的轻量级训练框架,旨在支持大模型训练而无需大量的依赖
我们以如下图所示的OpenCompass中的最新进展为例,对构建的知识库助手进行提问:
prompt1:OpenCompass的最新进展
回答如下图所示。显然模型是对知识库进行了检索再回答的,但与知识库对比,回答的其实不是完整的。但是从另一个角度说,问最新进展,回答两个Latest应该也不能说有问题。
prompt2:OpenCompass有什么最新进展
这里我更加口语话的方式对其提问,而不是想prompt1一样直接提问。从回答可以看出,大模型检索了知识库的相关语料,并且经过了模型自己的处理而不是直接返回给我。
最后我也与未挂载知识库的InternLM-Chat-7B进行了对比,果然其无法回答出问题,并且回答中可以看出其也无法将OpenCompass理解成我们的所问。
进阶作业
选择一个垂直领域,收集该领域的专业资料构建专业知识库,并搭建专业问答助手,并在 OpenXLab 上成功部署
目前正在做一个地区的旅游问答,正在开发中