概述

embedding向量化是将文本转换为向量表示的过程,在rag知识库中最重要的是要匹配用户的输入和知识库的内容,根据用户的问题检索出与问题相关的文档。计算机无法直接理解文本,因此要将知识库切分并转为向量表示,用户的输入也需要转为向量表示,然后计算向量之间的相似度,从而匹配出与用户问题相关的文档。

简单使用

不同的模型支持不同的向量化维度,例如text-embedding-v4支持64~2048维

from openai import OpenAI
from config.settings import settings

client = OpenAI(
    api_key=settings.api_key,
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

result = client.embeddings.create(input="你好", model="text-embedding-v4")

print( result)
打印出一个向量化后的结果
""" 
CreateEmbeddingResponse(data=[Embedding(embedding=[0.00775288138538599, -0.06167956814169884, 0.07296541333198547, 0.06845107674598694, .... ... 0.03675258532166481, 0.04067809507250786, 0.0319683700799942], index=0, object='embedding')], model='text-embedding-v4', object='list', usage=Usage(prompt_tokens=2, total_tokens=2), id='bc2dea3a-90b7-9de9-ae49-df270ca791c4')
"""

向量间的相似度计算

1、Cosine相似度:
定义:两个向量之间的余弦相似度是它们夹角的余弦值,范围在[-1, 1]之间。值越接近1表示越相似,值越接近-1表示越不相似。
2、欧氏距离:
定义:两个向量之间的欧氏距离是它们在空间中的实际距离,即点到点的距离。
3、点积:
定义:两个向量之间的点积是它们对应元素的乘积之和。

Cosine相似度

公式: consine_similarity = A · B / (||A|| * ||B||) 其中,A和B是两个向量,||A||和||B||分别是A和B的范数(即向量的长度)。

import numpy as np

def cosine_similarity(A, B):
    """
    计算两个向量之间的余弦相似度
    :param A: 向量A
    :param B: 向量B
    :return: 余弦相似度
    """
    dot_product = np.dot(A, B)
    norm_A = np.linalg.norm(A)
    norm_B = np.linalg.norm(B)
    return dot_product / (norm_A * norm_B)

欧氏距离

d(A,B)=∥A−B∥ 其中,A和B是两个向量,||A−B||是A和B之间的欧氏距离。

import numpy as np

def euclidean_distance(A, B):
    """
    计算两个向量之间的欧氏距离
    :param A: 向量A
    :param B: 向量B
    :return: 欧氏距离
    """
    return np.linalg.norm(A - B)

向量数据库

向量数据库是一种用于存储和检索向量表示的数据库。它可以根据向量的相似度快速匹配出与查询向量相关的向量。 向量数据库有:

Chroma

Pinecone

milvus

faiss

💻 代码实现

案例代码使用了langchain来实现最基础的rag流程,包括:

  • 文档加载
  • 文档切分成文档块
  • 文档块向量化并存储到向量数据库Chroma里
  • 用户输入向量化
  • 从向量数据库Chroma里检索出与用户输入最相似的文档块
  • 整合文档块和用户的问题成新的prompt
  • 使用新的prompt调用大模型生成回答

rag基础实现代码案例