【AI大模型】Embedding模型解析 文本向量知识库的构建和相似度检索

🚀 作者 :“大数据小禅”

🚀 文章简介 :本专栏后续将持续更新大模型相关文章,从开发到微调到应用,需要下载好的模型包可私。

🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬


1 什么是Embedding

  • 在大模型中,"embedding"指的是将某种类型的输入数据(如文本、图像、声音等)转换成一个稠密的数值向量的过程。
  • 这些向量通常包含较多维度,每一个维度代表输入数据的某种抽象特征或属性。
  • Embedding 的目的是将实际的输入转化为一种格式,使得计算机能够更有效地处理和学习
    在这里插入图片描述
  • 文本Embedding
    在自然语言处理(NLP)中,文本embedding是一个常见的概念。是将文字或短语转换成数值向量的过程。这些向量捕捉了单词的语义特征,例如意义、上下文关系等。比如,使用词嵌入技术(如Word2Vec、GloVe或BERT),模型可以将具有相似意义的词映射到向量空间中的相近位置。
    - 图像Embedding
    对于图像,embedding过程通常涉及使用卷积神经网络(CNN)等模型来提取图像中的特征,并将这些特征转换为一个高维向量。这样的向量可以代表图像的内容、风格、色彩等信息,从而用于图像识别、分类或检索任务。
    - 声音Embedding
    在声音处理领域,embedding通常指的是将音频信号转换为一个表示其特征的向量,这包括音调、节奏、音色等。通过这样的转换,可以进行声音识别、音乐生成等任务。
2 为什么使用Embedding
  • Embedding的主要优势是能够将实体转换为计算机易于处理的数值形式,同时减少信息的维度和复杂度。
  • 有助于提高处理效率,而且也使得不同实体之间的比较(如计算相似度)变得可行。
  • embedding通常通过大量数据的训练而得到,能够捕捉到复杂的模式和深层次的关系,这是传统方法难以实现的
3 数据向量化的处理流程

1. 收集
这一步骤是数据收集阶段,涉及到从不同的来源(如数据库、网站、文档等)收集需要分析的文本数据。这些数据可以是文章、评论、报告等形式。重点是确定数据源,并确保数据的相关性和质量。

2. 切块
对于大型文档,直接处理可能会因为模型的输入限制(如Token数量限制)而变得不可行。在这种情况下,需要将大文档分割成更小的部分。这些部分应该尽可能保持语义的完整性,例如按段落或章节切分。切块的目的是确保每块文本的大小适合模型处理,同时尽量减少上下文信息的丢失。

3. 嵌入
在切块后,每个文本块将被转换为数值向量,即通过OpenAI的embedding API进行嵌入。这一步涉及调用API,将文本数据发送到OpenAI的服务器,服务器会返回文本的向量表示。这些向量捕捉了文本的深层语义特征,使得文本之间的比较、搜索和分析变得可能。

4. 结果存储
嵌入向量生成后,需要将它们存储起来以便于后续的检索和分析。对于大型数据集,推荐使用专门的向量数据库(如Faiss、Annoy、Elasticsearch等),这些数据库优化了向量的存储和相似性搜索操作。存储不仅要保证数据的可检索性,也要考虑查询效率和存储成本

4 Embedding实战
  • 演示是通过OPENAI的embedding进行,根据最新的api测试
  • 在这里插入图片描述
  • 测试代码如下
response = openai.embeddings.create(
    input="abc s da d asd a da d ",
    model="text-embedding-ada-002"  # 选择一个合适的模型,如ada
)
print("测试数据:",response.data[0].embedding)
  • 文本转化向量
    在这里插入图片描述
    - 如何计算两个向量的相似度?
    余弦相似度是一种用来衡量两个向量方向上的相似性的方法。在文本分析中,它常用于比较两段文本的语义相似性。当我们使用向量化模型(如OpenAI的text-embedding-ada-002模型)将文本转化为向量后,每个向量的维度表示某种语义特征,向量中的值反映了相应特征的强度。

余弦相似度的计算公式为:
在这里插入图片描述
其中, v e c 1 ⋅ v e c 2 \mathbf{vec1} \cdot \mathbf{vec2} vec1vec2 表示两个向量的点积, ∣ v e c 1 ∣ |\mathbf{vec1}| vec1 ∣ v e c 2 ∣ |\mathbf{vec2}| vec2 分别是这两个向量的欧几里得范数(即向量的长度)。
这个比例的本质是测量两个向量之间夹角的余弦值,范围从-1到1:
当余弦值为1时,表示两个向量方向完全相同。
当余弦值为0时,表示两个向量正交,即在高维空间中不相关。
当余弦值为-1时,表示两个向量方向完全相反。
在文本相似度测量中,如果两个文本的向量化表示在方向上更接近,它们的余弦相似度就更高,这意味着它们在语义上更相似。因此,通过计算向量之间的余弦相似度,我们可以有效地评估两段文本的相似性。这种方法适用于处理高维空间中的数据,如自然语言处理中的文本数据。

  • 整体实战代码 文本检索匹配
import time
from typing import List
import os
import pandas as pd
# 导入 tiktoken 库。Tiktoken 是 OpenAI 开发的一个库,用于从模型生成的文本中计算 token 数量。
import tiktoken
from openai import OpenAI
import numpy as np
os.environ['OPENAI_API_KEY']='sk-api-0REliWJkobjeqQlObLN0T3BlbkFJ0j4bHtDhEEQGEAboNYah'

openai = OpenAI()

def embed_text(text):
    """ 使用OpenAI API将文本向量化 """
    response =openai.embeddings.create(
        input=text,
        model="text-embedding-ada-002"  # 选择一个合适的模型,如ada
    )
    return response.data[0].embedding

def cosine_similarity(vec1, vec2):
    """ 计算两个向量之间的余弦相似度 """
    return np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))


def find_top_similar_texts(input_text, text_list, top_n=3):
    """ 找出与输入文本最相似的top_n个文本 """
    input_vec = embed_text(input_text)
    similarities = []
    for text in text_list:
        text_vec = embed_text(text)
        similarity = cosine_similarity(input_vec, text_vec)
        similarities.append((text, similarity))

    # 按相似度排序并返回最高的top_n个结果
    similarities.sort(key=lambda x: x[1], reverse=True)
    return similarities[:top_n]

# 示例文本库
text_corpus = [
    "The quick brown fox jumps over the lazy dog.",
    "A fast brown fox leaps over a sleepy dog.",
    "Exploring the mountains of the moon.",
    "Data science involves the analysis of large amounts of data.",
    "The capital of France is Paris.",
    "Programming in Python is fun and versatile."
]

# 输入文本
input_text = "Python is"

# 执行查找
top_similar_texts = find_top_similar_texts(input_text, text_corpus)

# 打印结果
for text, similarity in top_similar_texts:
    print(f"Text: {text}\nSimilarity: {similarity:.2f}\n")

#
# # 示例文本
# text1 = "The quick brown fox jumps over the lazy dog."
# text2 = "A fast brown fox leaps over a sleepy dog."
# text3 = "Exploring the mountains of the moon."
#
# # 向量化文本
# vec1 = embed_text(text1)
# vec2 = embed_text(text2)
# vec3 = embed_text(text3)
#
# # 计算相似度
# similarity12 = cosine_similarity(vec1, vec2)
# similarity13 = cosine_similarity(vec1, vec3)
#
# print(f"Similarity between text 1 and text 2: {similarity12:.2f}")
# print(f"Similarity between text 1 and text 3: {similarity13:.2f}")

response = openai.embeddings.create(
    input="abc s da d asd a da d ",
    model="text-embedding-ada-002"  # 选择一个合适的模型,如ada
)
print("测试数据:",response.data[0].embedding)
  • 结果
    在这里插入图片描述
  • 最终检索到匹配度前三的文本向量 后续会使用到向量数据库 完成知识库的搭建
  • 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 有问题可以咨询主页

<think>好的,我需要回答用户关于如何构建大模型知识库以及适用的检索方式的问题。首先,我得回顾已有的知识,特别是参考提供的引用内容。根据引用[1],知识库构建包括数据收集、预处理、知识表示存储。引用[2]提到使用向量数据库作为RAG知识库的实现,涉及生成模型的选择检索策略。 用户想知道构建方法检索技术,所以需要分步骤解释。第一步是数据收集,要强调多源异构数据的重要性。预处理部分要包括清洗、分词标注。知识表示方面,向量化是关键,如使用Embedding模型文本转化为向量,可能还需要图结构处理关系型数据。 存储方面,向量数据库如Faiss或Milvus是常用的,关系型数据库适合结构化数据,图数据库处理复杂关系。检索方式部分,要介绍向量相似度检索、混合检索分块检索,以及重排序技术。 技术实现部分,需要结合RAG模型,说明如何将检索到的信息与大模型生成结合,同时考虑模型选择生成策略,如束搜索或采样。最后,给出代码示例,展示从文本处理到向量存储的流程。 还要注意用户可能关心的问题,比如如何处理不同数据类型的融合、优化检索效率的方法、评估知识库质量的标准,以及实时更新知识库的策略。这些问题需要自然地融入回答,帮助用户全面理解。 最后,检查是否符合格式要求:行内公式用$...$,独立公式用$$...$$,结构清晰,引用正确标注。确保所有技术点都有对应的引用支持,比如在提到知识表示时引用[1],提到模型选择生成时引用[2]。同时,生成的代码示例要符合Python语法,展示关键步骤,如加载模型、处理文本构建向量库。</think>### 大模型知识库构建方法与检索技术实现 #### 一、知识库构建方法 1. **数据收集与预处理** - **多源异构数据整合**:从结构化数据库、非结构化文档(PDF/HTML)、API接口等多渠道采集数据,需进行去重、标准化噪声过滤[^1]。 - **语义分割与标注**:使用自然语言处理技术(如BERT分词器)对文本分块,并添加实体、关系等标签,例如: $$ \text{句子} \rightarrow [\text{实体}_1, \text{实体}_2, \text{关系}] $$ 2. **知识表示与存储** - **向量化表示**:通过Embedding模型(如Sentence-BERT、OpenAI text-embedding)将文本转化为高维向量,例如$v=\text{Embedding}(\text{“大模型应用”}) \in \mathbb{R}^{768}$。 - **结构化存储**:采用向量数据库(如Faiss、Milvus)存储稠密向量,同时使用图数据库(Neo4j)处理知识图谱关系[^2]。 #### 二、检索方式与技术实现 1. **核心检索技术** - **向量相似度检索**:通过余弦相似度$ \cos(\theta) = \frac{A \cdot B}{\|A\|\|B\|} $匹配查询与知识库向量,返回Top-K结果。 - **混合检索**:结合稀疏检索(BM25算法)与稠密检索,平衡召回率与准确率。 - **分块检索**:对长文本按语义分块,通过层级检索降低计算复杂度。 2. **优化技术** - **重排序(Re-Rank)**:使用交叉编码器(Cross-Encoder)对初筛结果二次排序,例如: $$ \text{score} = \text{CrossEncoder}([\text{Query}, \text{Doc}_i]) $$ - **动态上下文注入**:在检索阶段引入实体链接、时间过滤等约束条件,提升上下文相关性[^1]。 #### 三、完整代码示例(基于RAG框架) ```python from sentence_transformers import SentenceTransformer import faiss import numpy as np # 1. 加载Embedding模型 model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2') # 2. 生成本地知识库向量 corpus = ["大模型需要高质量数据", "RAG通过检索增强生成"] corpus_vectors = model.encode(corpus) # 3. 构建FAISS索引 dimension = corpus_vectors.shape[1] index = faiss.IndexFlatIP(dimension) index.add(corpus_vectors) # 4. 检索相似内容 query = "如何构建大模型知识库?" query_vector = model.encode([query]) scores, indices = index.search(query_vector, k=2) print("检索结果:", [corpus[i] for i in indices[0]]) ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据小禅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值