LLM大模型一般训练的数据都是滞后的,这是就需要用到RAG知识库,RAG知识库可以降低大模型在输出答案时的幻觉,也能够让大模型知识拓展。
文档内容切片
- 按字数切片
- 按句切片
- 递归切片
不管是哪个切片方法,目的是保留语义的完整性,因此不是某个好或某个坏,根据实际需求进行选择。
文字向量化
将每个切片文字块转换为关系向量
关系向量是怎么来的? 这些是通过对模型进行大量的上下文训练,得到的词语与词语,句子与句子的语义关系上的关联,这是LLM的基础。
不同的文字向量模型输出的向量矩阵也会不同,因此在构建和检索时需要用同一个文字向量模型进行转换。
向量数据库
- 两个向量的余弦角大小
- 两千问 Qwen 教程个向量的欧氏举例
- 两个向量的分类区域
用文本也能搜索,为什么要用向量呢? 文本的数据库检索一般通过正则搜索,这种无法关联语义进行检索,因为我们无法保证大模型在检索时能够按照固定的格式。举个例子:
本次都利用千问的语言模型,和FAISS向量数据库演示,来演示
代码的流程如下:
- 初始化RAG:文本切片->文本向量模型->构建向量数据库
- 询问ai:提示词->文本向量模型->向量数据库检索->组合prompt->喂给LLM->回答问题->记录历史对话
文本切片
这里利用了langchain提供的文本分词器(递归分词)
构建向量数据库
这部分要注意:新版FAISS读取现有数据库要设置:allow_dangerous_deserialization=True,不然会报错
提示词模板
之前没有讲到历史对话记录,这次补充下:
这个是langchain框架的占位符(其实是框架写好了prompt模板,告诉ai这个是历史对话),使用时将历史对话记录的数组放在这里设置的字段中,在添加历史对话时要使用相关的类进行声明对话(告诉ai这句话是ai说的还是用户说的)
Chain链的解释(核心逻辑)
Chain链流程:
- 查询RAG的chain:获取字段->内容交给向量数据库检索->将检索的内容(数组)转换为字符串格式->保存到字段并传递给下一个任务
- 询问LLM的chain:获取,,字段->填充上面定义的prompt模板->喂给LLM模型->解析成文本并保存在字段
是获取上一个任务传递过来的字段内容。
如果❤喜欢❤本系列教程,就点个关注吧,后续不定期更新~
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/259245.html原文链接:https://javaforall.net
