



























除了微调,还有一种模式就是知识库,用来增强大模型信息检索的能力,我们称之为检索增强生成(RAG),这是目前非常流行的一种做法,知识库模式相比于微调有 2 个好处。
- 知识准确:先把知识进行向量化,存储到向量数据库里,使用的时候通过向量检索从向量库把知识检索出来,这样可以确保知识的准确性。
- 更新频率快:当你发现知识库里的知识不全的时候,可以随时补充,不需要像微调一样,重新跑微调任务、验证结果、重新部署等。

1~7 是文档完成向量化存储的过程,8~15 是知识库检索的过程。 先简单了解一下“向量”这个概念。在计算机科学和数学中,向量是由一系列数字组成的数组,这些数字可以表示任何东西,从物理空间的方向和大小到商品的特性和用户偏好等。
相似度计算
比如,在评价一部电影时,你给它的评分包括剧情 8 分、特效 7 分、演技 9 分、音乐 6 分。这四个评分点就可以构成一个向量 [8, 7, 9, 6]。在这个向量中,每一个维度都代表了电影的一个属性。现在,假设你是一位开发工程师,你正在构建一个推荐系统。你的目标是根据用户的喜好向他们推荐电影。用户的喜好也可以用一个向量来表示,比如一个用户可能喜欢剧情和演技重于特效和音乐,他们的喜好向量可能是 [10, 5, 10, 4]。现在,如果你想找出哪部电影最符合这类用户的口味,你可以计算用户喜好向量和每部电影向量之间的相似度。在向量空间中,这通常通过计算向量之间的距离来完成,如欧氏距离或余弦相似度。距离越小或相似度越高,表示电影越符合用户的口味。
import numpy as np
# 定义计算余弦相似度的函数
def calculate_similarity(vector1, vector2):
# 使用numpy库来计算余弦相似度
dot_product = np.dot(vector1, vector2)
norm_vector1 = np.linalg.norm(vector1)
norm_vector2 = np.linalg.norm(vector2)
similarity = dot_product / (norm_vector1 * norm_vector2)
return similarity
# 假设我们有一个向量代表用户偏好
user_preference = np.array([10, 5, 10, 4])
# 我们有一系列电影向量
movie_vectors = np.array([
[8, 7, 9, 6], # 电影A
[9, 6, 8, 7], # 电影B
[10, 5, 7, 8] # 电影C
])
# 计算并打印每部电影与用户偏好之间的相似度
for i, movie_vector in enumerate(movie_vectors):
similarity = calculate_similarity(user_preference, movie_vector)
print(f"电影{chr(65+i)}与用户偏好的相似度为: {similarity:.2f}")
这段代码定义了一个计算余弦相似度的函数calculate_similarity,使用了NumPy库来进行向量运算。首先定义了用户偏好向量user_preference和一系列电影向量movie_vectors,然后通过循环计算并打印每部电影与用户偏好之间的相似度。余弦相似度是一种衡量两个向量方向的相似程度的指标,值在-1到1之间,值越大表示相似度越高。
在循环中,enumerate函数用于同时获取电影向量和对应的索引,然后调用calculate_similarity函数计算相似度,并打印出结果。
电影A与用户偏好的相似度为: 0.97
电影B与用户偏好的相似度为: 0.97
电影C与用户偏好的相似度为: 0.95
文本向量
在自然语言处理(NLP)中,一个词的向量值是通过在大量文本上训练得到的。一个词的向量值取决于它是如何被训练的,以及训练数据的性质。例如在不同的 Word2Vec 模型中,即使是相同的词,向量值也可能完全不同,因为它们可能基于不同的文本集或使用不同的参数训练。
常见的 Word2Vec 模型会生成几百维的向量。我们举一个例子来说明不同的词之间向量是怎么表示的,以及相似度是如何计算的。下面的例子是基于 GoogleNews-vectors-negative300.bin 模型计算的,计算男人和男孩的向量表示以及相似度。
import numpy as np
from gensim.models import KeyedVectors
model = KeyedVectors.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)
def cosine_similarity(vec_a, vec_b):
# 计算两个向量的点积
dot_product = np.dot(vec_a, vec_b)
# 计算每个向量的欧几里得长度
norm_a = np.linalg.norm(vec_a)
norm_b = np.linalg.norm(vec_b)
# 计算余弦相似度
return dot_product / (norm_a * norm_b)
# 获取man和boy两个词的向量
man_vector = model['man']
boy_vector = model['boy']
# 打印出这两个向量的前10个元素
print(man_vector[:10])
print(boy_vector[:10])
similarity_man_boy = cosine_similarity(man_vector, boy_vector)
print(f"男人和男孩的相似度: {similarity_man_boy}")
这段代码首先导入了NumPy库和gensim中的KeyedVectors模块,然后加载了预训练的Google News词向量模型'GoogleNews-vectors-negative300.bin'。接下来定义了一个计算余弦相似度的函数cosine_similarity,该函数使用了NumPy库来进行向量运算。然后通过模型获取了"man"和"boy"两个词的词向量,并打印出它们的前10个元素。最后计算了"man"和"boy"两个词向量之间的余弦相似度,并打印出结果。这段代码的功能是使用预训练的词向量模型计算并展示了"man"和"boy"两个词的相似度。
[ 0.32617188 0.13085938 0.03466797 -0.08300781 0.08984375 -0.04125977
-0.19824219 0.00689697 0.14355469 0.0019455 ]
[ 0.23535156 0.16503906 0.09326172 -0.12890625 0.01599121 0.03613281
-0.11669922 -0.07324219 0.13867188 0.01153564]
男人和男孩的相似度: 0.6824870705604553

此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。