存在意义

使用langchain或者其他框架操作prompts,总是希望模型能够记忆之前用户和模型对话的关键信息,但是大模型作为一个续写的深度学习模型不会自带记忆,需要有对应的外加操作来保存历史对话和从历史对话中检索相似或者有关的信息拼接prompts,存储消息的方式可以和后端存储数据一样,于是有了向量数据库,将历史对话做分词,分词映射成向量,组合形成向量数组,存储到向量数据库中并检索匹配的操作,即RAG

基本流程

包裹索引, 检索和生成

  1. 索引阶段

将用户的语言按照一定数据源(可以自己定义),将其切分成标准长度的文本块(chunk),进行向量化嵌入(embedding),存储在向量数据库中

  • 加载文件
  • 内容提取
  • 文本切割
  • 文本向量化
  • 存向量数据库
  1. 检索
    在向量数据库检索相似的前topk个文本块,将文本块拼接在调用的message里面,询问大模型

  2. 生成对应的response,根据自己定义的数据格式或者根据返回可以做后续操作

embedding

向量化的细节操作

  • 离线流程: 知识和信息 -> 嵌入化 -> 存入数据库
  • 在线流程: 询问 -> 嵌入化 -> 在向量库里面匹配

embedding模型
![[Pasted image 20260318140626.png]]

个人理解:
大概过程是

先分词算法,将string拆成多个单一词,之后内置实现了embedding矩阵,给每个string分配一个唯一ID,然后存入“矩阵”,查询时候将数字拿出来,拼接成向量

余弦相似算法

余弦相似度 = 两个向量的点积 / 两个向量的乘积

cos = $\frac{A·B}{||A|| ||B||}$

1
2
3
4
5
6
7
8
9
10
11
12
13
def get(vec_a, vec_b):  
if len(vec_a) != len(vec_b):
raise ValueError('vector len not same')

sum = 0
s1 = 0
s2 = 0
for i in range(len(vec_a)):
s1 += vec_a[i] * vec_a[i]
s2 += vec_b[i] * vec_b[i]
sum += vec_a[i] * vec_b[i]

return 1.0 * sum / (math.sqrt(s1) * math.sqrt(s2))