文章目录
- 大模型应用开发范式
- LangChain简介
- 构建向量数据库
- 搭建知识库助手
- RAG方案优化建议
大模型应用开发范式
通用大模型的优势:
- 强大的语言理解、指令跟随、语言生成的能力
- 可以理解用户自然语言的指令
- 具有强大的知识储备和一定的逻辑推理能力。
通用大模型局限性:
- 知识时效性受限:如何让LLM能够获取最新的知识
- 专业能力有限:如何打造垂域大模型
- 定制化成本高:如何打造个人专属的LLM应用
两种核心开发范式:
- 检索增强生成(RAG):核心思想是给大模型外挂一个知识库,对用户的提问,先从知识库中匹配对应回答的相关文档,将文档和提问一起输入大模型来生成答案,从而提高大模型的知识储备
- 延承传统自然语言处理的微调(Finetune):核心思想是在一个新的较小的数据集上进行轻量级的训练微调,从而提升模型在这个新的数据集上的能力
这两种开发范式都能够突破通用大模型自身的局限,但也存在不同的优劣势
RAG | Finetune |
---|---|
低成本 | 可个性化微调 |
可实时更新 | 知识覆盖面广 |
受基座模型影响大 | 成本高昂 |
单次回答知识有限 | 无法实时更新 |
无需重新训练,大跨度需要总结性的文本表现不佳 | 需要重新训练,回答的风格模拟效果好 |
RAG范式原理:
向量输入模型Sentence Transformer将用户输入文本转化为向量,并在向量数据库中匹配相似的文本段(认为相似的文本段包含用户需要的答案),然后将用户的输入和检索到的相似文本段一起嵌入到模型的Prompt,传递给InternLM对问题做出最终的回答,最后输出答案。
LangChain简介
- LangChain是针对大模型开发的第三方开源库,为各种大模型(LLM)提供通用接口,来简化应用程序的开发流程,帮助开发者自由构建LLM应用
- LangChain封装了很多组件,通过这些组件的组合,可以构建多种类型RAG的应用,开发者可以直接将私域数据嵌入到LangChain中的组件,通过对这些组件的组合来构建适用于自己应用场景的RAG应用
- LangChain的核心组件是链(Chains),一个链将多个组件组合在一起的端到端应用,通过一个链可以封装一系列的大模型操作
基于LangChain搭建RAG应用:以本地文档形式存在的个人知识库使用Unstrucked Loader组件来加载本地文档,将本地不同格式的文档转化为统一的纯文本格式,使用Text Splitter组件对提取出来的纯文本分割成Chunks,再通过开源词向量模型Sentence Transformer将文本段转化为向量格式,存储到基于Chroma的向量数据库中。接下来将用户的每一个输入,通过Sentence Transformer转化为同样维度的向量,通过在向量数据库中进行相似度匹配,找到和用户输入相关的文本段,将相关的文本段嵌入到写好的Prompt Template中,再通过InternLM进行最后的回答
构建向量数据库
- 加载源文件
确定源文件类型,针对不同类型源文件选用不同的加载器,核心是将带格式文本转化为无格式字符串 - 文档分块
由于单个文件往往超过模型上下文上限,需要对加载的文档进行分切- 一般按字符串长度进行分割
- 可以手动控制分割的长度和重叠区间长度
- 文档向量化
使用向量数据库来支持语义检索,需要将文档向量化存入向量数据库- 可以使用任一一种Embedding模型来进行向量化
- 可以使用多种支持语义检索的向量数据库,一般使用轻量级的Chroma
搭建知识库助手
将InternLM接入LangChain
- LangChain支持自定义LLM,可以直接接入到框架中
- 只需要将InternLM不是在本地,并封装一个自定义LLM类,调用本地InternLM即可
构建检索问答链
- LangChain提供了检索问答链模板,可以自动实现知识检索、Prompt嵌入、LLM问答的全部流程
- 将基于InterLM的自定义LLM和已构建的向量数据库接入到检索问答链的上游
- 调用检索问答链,即可实现知识库助手的核心功能
RAG方案优化建议
基于RAG的问答系统性能核心受限于:
- 检索精度
- Prompt性能
优化点
- 检索方面
- 基于语义进行分割,保证每一个chunk的语义完整
- 给每一个chunk生成概括性索引,检索时匹配索引
- Prompt方面
- 迭代优化Prompt策略