外观
向量化
约 774 字大约 3 分钟
2025-04-07
一、定义与作用
文本向量化是将文本(如句子、段落或文档)转换为高维空间中的数值向量表示的过程。这些向量能够捕捉语义、上下文关系和关键词信息,使计算机能够通过数学运算(如相似度计算)理解文本间的关联性。在RAG(检索增强生成)系统中,向量化是连接外部知识库与大语言模型的核心技术,通过将知识库内容向量化存储,实现快速语义检索。
二、代码示例
import os
from openai import OpenAI
import matplotlib.pyplot as plt
import numpy as np
import ollama
class BaseEmbeddings:
"""
向量化的基类,用于将文本转换为向量表示。不同的子类可以实现不同的向量获取方法。
"""
def __init__(self, path: str, is_api: bool) -> None:
"""
初始化基类。
参数:
path (str) - 如果是本地模型,path 表示模型路径;如果是API模式,path可以为空
is_api (bool) - 表示是否使用API调用,如果为True表示通过API获取Embedding
"""
self.path = path
self.is_api = is_api
def get_embedding(self, text: str, model: str) -> List[float]:
"""
抽象方法,用于获取文本的向量表示,具体实现需要在子类中定义。
参数:
text (str) - 需要转换为向量的文本
model (str) - 所使用的模型名称
返回:
list[float] - 文本的向量表示
"""
raise NotImplementedError
@classmethod
def cosine_similarity(cls, vector1: List[float], vector2: List[float]) -> float:
"""
计算两个向量之间的余弦相似度,用于衡量它们的相似程度。
参数:
vector1 (list[float]) - 第一个向量
vector2 (list[float]) - 第二个向量
返回:
float - 余弦相似度值,范围从 -1 到 1,越接近 1 表示向量越相似
"""
dot_product = np.dot(vector1, vector2) # 向量点积
magnitude = np.linalg.norm(vector1) * np.linalg.norm(vector2) # 向量的模
if not magnitude:
return 0
return dot_product / magnitude # 计算余弦相似度
class OpenAIEmbedding(BaseEmbeddings):
"""
使用 OpenAI 的 Embedding API 来获取文本向量的类,继承自 BaseEmbeddings。
"""
def __init__(self, path: str = '', is_api: bool = True) -> None:
"""
初始化类,设置 OpenAI API 客户端,如果使用的是 API 调用。
参数:
path (str) - 本地模型的路径,使用API时可以为空
is_api (bool) - 是否通过 API 获取 Embedding,默认为 True
"""
super().__init__(path, is_api)
if self.is_api:
# 初始化 OpenAI API 客户端
from openai import OpenAI
self.client = OpenAI()
self.client.api_key = os.getenv("OPENAI_API_KEY") # 从环境变量中获取 API 密钥
self.client.base_url = os.getenv("OPENAI_BASE_URL") # 从环境变量中获取 API 基础URL
def get_embedding(self, text: str, model: str = "mxbai-embed-large") -> List[float]:
"""
使用 OpenAI 的 Embedding API 获取文本的向量表示。
参数:
text (str) - 需要转化为向量的文本
model (str) - 使用的 Embedding 模型名称,默认为 'mxbai-embed-large'
返回:
list[float] - 文本的向量表示
"""
if self.is_api:
# 去掉文本中的换行符,保证输入格式规范
text = text.replace("\n", " ")
# 调用 OpenAI API 获取文本的向量表示
return self.client.embeddings.create(input=[text], model=model).data[0].embedding
else:
return ollama.embeddings(model=model, prompt=text).embedding
# 初始化 Embedding 模型
embedding_model = OpenAIEmbedding("", False)
text1 = '我喜欢吃苹果'
text2 = "苹果是我最喜欢吃的水果"
vector1 = embedding_model.get_embedding(text1)
vector2 = embedding_model.get_embedding(text2)
similarity = BaseEmbeddings.cosine_similarity(vector1, vector2)
print(f"两段文本的余弦相似度为: {similarity}")
版权所有
版权归属:NateHHX