学习终于接近尾声了, 这一章节的学习任务主要是介绍一些开源的RAG应用是怎样搭建的
主要介绍了两个RAG项目, 个人知识库的搭建和帮我们写敬酒词的天机助手
其中个人知识库的搭建我们已经在前五个task的学习中, 对其中各模块的组成部分有所了解了, 这里我们可以看一下个人知识库RAG的组成部分:
首先, 用户提出问题我们需要给embedding成向量, 然后根据我们个人的需求去准备和加载对应的知识库文档(这里我认为文档是任意的,比如如果想使自己搭建的系统变身为历史专家, 就可以加载历史相关的文档, 另外, 一定要保证文档的正确性), 接下来就是对知识库文档做分割、数据清洗, 然后对整理后的文档做embedding成向量后, 再使用chroma等搭建向量数据库建立索引, 接着就可以用langchain搭建思维链, 得到在知识库文档中匹配出最与问题Query相近的Top k个向量, 然后把匹配到的知识库文本和上下文输入到prompt中, 就可以将这个prompt输入给LLM生成回答answer了
最后 一个能保存历史的问答思维链的实现方式如下:
而材料2中的天机大模型我的理解是将知识库文本替换为敬酒词相关的语料, 再加上对prompt做一些调整, 就能使LLM输出想要的敬酒词
补充内容: 高级RAG技巧:
- 多种格式的文件处理:langchain可支持处理csv文件
也可以用来处理PPTX文件 from langchain.document_loaders.powerpoint import UnstructuredPowerPointLoader
也可以用于处理docx文件 from langchain_community.document_loaders.word_document import UnstructuredWordDocumentLoader
数据清洗时, re正则表达式是很常用的手段, 后续需要仔细研究正则表达式的使用
2.对文本进行分块: 使 embedding 后的向量提取到完整的语义信息。一般 embedding model 的 max token 即最大可 embedding 句子长度通常为512至1024 token,过长的分块或分块中有多个语义的句子在 embedding 时很难从中提取完整的语义信息。优化分块后理想的文本块中语义是单一的,长度是合理的,很容易通过 embedding 提取出完整且的语义信息。分块的方式有: 定长分块、字符分块、文本分块、最大token数分块、语义分块等等, 而且都可以使用langchain中的text_splitter库来做
3. 使用不同的embedding模型, 在hugging face上, 有许多sota的embedding模型, 如果当前的RAG系统遇到瓶颈了, 可以试一下新的embedding模型看是否能有提升
- 另外, 我们使用hugging face开源的embedding模型, 往往是基于一个通用的dataset的, 可能并不是很好贴合我们使用的数据, 因此我们可以对embedding模型做微调, 首先需要安装hugging face的datasets库, 另外对于不同的数据库, 对应的loss也不同
数据集和对应的loss还是见课程, 这里不再赘述
在了解数据集以后就可以进行微调模型
首先对数据集和模型做加载
然后就可以做微调
这里在加载dataset时, 如果用dataset重新赋值的话会有bug, 如果卡在这一步报错然后没有重新加载dataset的话就会报错, 这里建议对dataset的名字做一个修改, 比如dataset_ 目前准备提PR
正常跑长这样
然后后面就是可以用LLM构建数据集再对embedding做微调了