找回密码
 立即注册
首页 业界区 安全 RAG和Embeddings模型

RAG和Embeddings模型

髡芯 前天 17:10
Embeddings模型

1.什么是Embeddings模型


  • Embedding模型是指将高维度的数据(例如文字、图片、视频)映射到低维度空间的过程。简单来说,embedding向量就是一个N维的实值向量,它将输入的数据表示成一个连续的数值空间中的点。Embeddings的学习通常基于无监督或弱监督的方法。对于自然语言处理任务,常用的Embeddings方法包括Word2Vec、GloVe和FastText(属于算法层面)。
    1.png

    一句话概括
    将文本转化为一组向量,向量会嵌入到一个分布图当中,距离越近,说明两者关联度越高。
2.向量空间(Vector Space)

所有的数据都变成向量,这些向量组成一个庞大的矩阵。在这个世界里,每个词、句子、图片、用户…都被表示成一个“点”(即向量),大家都有自己的“坐标”。距离表示相似度
向量之间越近:意义越相似
向量之间越远:意义越不同我们可以通过“距离”和“方向”来理解它们的关系。
2.png

使用场景
向量空间能解决什么问题呢?
• 降维:在高维度空间中,数据点之间可能存在很大的距离,使得样本稀疏,嵌入模型可以减少数据稀疏性。
• 捕捉语义信息:Embedding不仅仅是降维,更重要的是,它能够捕捉到数据的语义信息。语义相近的词在向量上也是相近的
• 特征表示:原始数据的特征往往难以直接使用,通过嵌入模型可以将特征转换成更有意义的表示。
• 计算效率:在低维度空间中对数据进行处理和分析往往更加高效。
3.向量基础学习-深度理解什么是向量
  1. # 1. 创建向量
  2. print("\n【1. 创建向量】")
  3. vector_a = np.array([1, 2, 3])
  4. vector_b = np.array([4, 5, 6])
  5. print(f"向量A: {vector_a}")
  6. print(f"向量B: {vector_b}")
  7. print(f"向量A的维度: {len(vector_a)}维")
复制代码
output:
向量A: [1 2 3]
向量B: [4 5 6]
向量A的维度: 3维
  1. # # 1. 创建向量
  2. # print("\n【1. 创建向量】")
  3. vector_a = np.array([1, 2, 3])
  4. vector_b = np.array([4, 5, 6])
  5. # 点积(重要!)
  6. dot_product = np.dot(vector_a, vector_b)
  7. print(f"A · B (点积) = {dot_product}")
  8. print(f"计算过程: 1×4 + 2×5 + 3×6 = {1*4 + 2*5 + 3*6}")
  9. # 3. 向量长度(模)
  10. print("\n【3. 向量长度】")
  11. length_a = np.linalg.norm(vector_a)
  12. length_b = np.linalg.norm(vector_b)
  13. #
  14. print(f"向量A的长度: {length_a:.4f}")
  15. print(f"计算过程: √(1² + 2² + 3²) = √{1**2 + 2**2 + 3**2} = {length_a:.4f}")
  16. print(f"向量B的长度: {length_b:.4f}")
复制代码
output:
向量A: [1 2 3]
向量B: [4 5 6]
A · B (点积) = 32
计算过程: 1×4 + 2×5 + 3×6 = 32
【3. 向量长度】
向量A的长度: 3.7417
计算过程: √(1² + 2² + 3²) = √14 = 3.7417
向量B的长度: 8.7750
计算相似度(余弦相似度)
  1. def cosine_similarity(a, b):
  2.     return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
  3. #
  4. # 模拟两个相似句子的向量
  5. sentence1 = np.array([0.8, 0.6, 0.2, 0.1, 0.9])  # "今天天气不错"
  6. sentence2 = np.array([0.75, 0.65, 0.15, 0.12, 0.85])  # "今天天气很好"
  7. sentence3 = np.array([0.1, 0.2, 0.9, 0.8, 0.15])  # "Python是编程语言"
  8. sim_1_2 = cosine_similarity(sentence1, sentence2)
  9. sim_1_3 = cosine_similarity(sentence1, sentence3)
  10. #
  11. print(f"\n句子1和句子2的相似度: {sim_1_2:.4f} (很相似!)")
  12. print(f"句子1和句子3的相似度: {sim_1_3:.4f} (不太相似)")
复制代码
句子1和句子2的相似度: 0.9976 (很相似!)
句子1和句子3的相似度: 0.3536 (不太相似)
4.langchain的文本嵌入模型(Embeddings)

*嵌入模型创建文本片段的向量表示。您可以将向量视为一个数字数组,它捕捉了文本的语义含义。 通过这种方式表示文本,您可以执行数学运算,从而进行诸如搜索其他在意义上最相似的文本等操作。
3.png

Embeddings 类是一个与文本嵌入模型接口的类,有很多嵌入大模型供应商(OpenAI、Hugging Face,BGE 等)这个类为它们提供了一个标准接口
5.下面引入一个openaiEmbedding的案例
  1. #导入 OpenAI 的 Embedding 工具
  2. from langchain_openai import OpenAIEmbeddings
  3. from openai import OpenAI
  4. from env_utils import OPENAI_API_KEY, OPENAI_BASE_URL
  5. # 初始化模型
  6. openai_embeddings = OpenAIEmbeddings(
  7.     api_key=OPENAI_API_KEY,
  8.     base_url=OPENAI_BASE_URL,
  9.     model="text-embedding-3-large",
  10.     dimensions=256
  11. )
  12. # 关键参数说明:
  13. #model="text-embedding-3-large" - OpenAI 最好的 Embedding 模型
  14. #dimensions=256 - 重点! 把原本 3072 维压缩到 256 维
  15. resp = openai_embeddings.embed_documents(
  16.     [
  17.         "I like large language models",
  18.         "今天天气非常不错"
  19.     ]
  20. )
  21. print(resp[0])
  22. print(len(resp[0]))
复制代码
向量化文本
  1. resp = openai_embeddings.embed_documents([
  2.     "I like large language models",  # 英文文本
  3.     "今天天气非常不错"                # 中文文本
  4. ])
复制代码
发生了什么?
输入: 2个文本

发送到 OpenAI API

OpenAI 处理并返回向量

输出: 2个向量(每个256维)
返回值结构:
  1. resp = [
  2.     [0.123, -0.456, ..., 0.789],  # 第1个文本的向量(256个数字)
  3.     [0.345, 0.678, ..., 0.234]    # 第2个文本的向量(256个数字)
  4. ]
复制代码
总的来说,embedding便是把文字转化为数字向量 这段代码用 OpenAI 的 API 把 2 个文本(英文+中文)转换成了 2 个 256 维的数字向量,用于后续的语义搜索或相似度计算。
传统搜索中:你输入“苹果”,只能匹配“水果”
向量搜索:你输入“苹果”,它可以将苹果转化为数字向量,并给你匹配到水果、ipone
6.私有化部署Qwen3-Embedding

4.png

为了部署Embedding模型,我们需要引入对应的工具库,目前主要有几类:

  • Sentence-Transformers: Sentence-Transformers库是基于HuggingFace的Transformers库构建的,它专门设计用于生成句子级别的嵌入。它引入了一些特定的模型和池化技术,使得生成的嵌入能够更好地捕捉句子的语义信息。Sentence-Transformers库特别适合于需要计算句子相似度、进行语义搜索和挖掘同义词等任务。
  • HuggingFace Transformers: HuggingFace的Transformers库是一个广泛使用的NLP库,它提供了多种预训练模型,如BERT、GPT-2、RoBERTa等。这些模型可以应用于各种NLP任务,如文本分类、命名实体识别、问答系统等。Transformers库支持多种编程语言,并且支持模型的微调和自定义模型的创建。虽然Transformers库的功能强大,但它主要关注于模型的使用,而不是直接提供句子级别的嵌入。
  • Langchain集成的HuggingFaceBgeEmbeddings。与3一样。
  • FlagEmbedding: 这是一个相对较新的库,其核心在于能够将任意文本映射到低维稠密向量空间,以便于后续的检索、分类、聚类或语义匹配等任务。FlagEmbedding的一大特色是它可以支持为大模型调用外部知识,这意味着它不仅可以处理纯文本数据,还能整合其他类型的信息源,如知识图谱等,以提供更丰富的语义表示。
    总的来说,FlagEmbedding强调的是稠密向量的生成和外部知识的融合;HuggingFace Transformers提供了一个广泛的预训练模型集合,适用于多种NLP任务;而Sentence-Transformers则专注于生成高质量的句子嵌入,适合那些需要深入理解句子语义的应用场景。
  1. from sentence_transformers import SentenceTransformer
  2. # pip install sentence-transformers
  3. # 引入Qwen3模型
  4. qwen3_embedding = SentenceTransformer('Qwen/Qwen3-Embedding-0.6B')
  5. resp = qwen3_embedding.encode(
  6.     [
  7.         "I like large language models",
  8.         "今天天气非常不错"
  9.     ]
  10. )
复制代码
7.BGE-Large的Embadding+Huggingface私有化


  • HuggingFace 上的 BGE 模型是最好的开源嵌入模型之一。 BGE 模型由北京人工智能研究院 (BAAI) 创建。 是一家从事 AI 研发的私营非营利组织
    配置HuggingFace镜像站:https://hf-mirror.com/  pip install --upgrade --quiet  sentence_transformers
    下面来看一个示例
  1. from langchain_community.embeddings import HuggingFaceBgeEmbeddings
  2. model_name = "BAAI/bge-small-zh-v1.5"
  3. model_kwargs = {'device': 'cpu'}
  4. encode_kwargs = {'normalize_embeddings': True} # set True to compute cosine similarity
  5. bge_hf_embedding = HuggingFaceBgeEmbeddings(
  6.     model_name=model_name,
  7.     model_kwargs=model_kwargs,
  8.     encode_kwargs=encode_kwargs
  9. )
  10. resp = bge_hf_embedding.embed_documents(
  11.     [
  12.         "I like large language models",
  13.         "今天天气非常不错"
  14.     ]
  15. )
  16. print(resp[0])
  17. print(len(resp[0]))
复制代码
8.一个美食评论案例

5.png

在开始这个案例之前,我们要先讲一下 余弦距离这个概念

  • 余弦距离(Cosine Distance)​的计算,用于衡量两个向量在方向上的相似性。代表 文本语义的相似性
    6.png

    ||a|| : 计算向量 a 的欧几里得范数(L2范数),即向量的长度。公式为 sqrt(a₁² + a₂² + ... + aₙ²)
    ab: 计算向量 a 和 b 的点积(内积),即对应元素相乘后求和。
    完整代码:
  1. import ast
  2. import  pandas  as pd
  3. from langchain_community.embeddings import HuggingFaceBgeEmbeddings
  4. import numpy as np
  5. model_name = "BAAI/bge-small-zh-v1.5"    # 北京智源研究院开发的中文嵌入模型,专门用于将文本转换为向量。
  6. model_kwargs = {'device': 'cpu'}
  7. encode_kwargs = {'normalize_embeddings': True}  # set True to compute cosine similarity
  8. # 初始化模型
  9. bge_hf_embedding = HuggingFaceBgeEmbeddings(
  10.     model_name=model_name,
  11.     model_kwargs=model_kwargs,
  12.     encode_kwargs=encode_kwargs
  13. )
  14. # 将单个文本转化为向量
  15. def text_2_embedding(text):
  16.     """通过调用Embedding模型 得到向量"""
  17.     resp = bge_hf_embedding.embed_documents(
  18.         [text]
  19.     )
  20.     return resp[0]
  21. def consine_distance(a,b):
  22.     return np.dot(a,b) / (np.linalg.norm(a) * np.linalg.norm(b))
  23. def embedding_2_file(source_file,target_file):
  24.     """读取原始的美食评论数据,通过调用Embedding模型 得到向量 并保存到新文件中"""
  25.     # 步骤1 准备数据 读取数据
  26.     df = pd.read_csv(source_file,index_col=0)
  27.     df = df[['Time','Summary','Text']]
  28.     # 步骤2 数据清洗 合并数据
  29.     # df = df.dropna()
  30.     # 评论的摘要和内容合并成一个字段 方便后续处理
  31.     df['text_content'] = 'Summary: ' + df.Summary.str.strip() + '; Text: ' + df.Text.str.strip() #
  32.     # 步骤3 向量化 存到一个新的文件中
  33.     df['embedding'] = df.text_content.apply(lambda x:text_2_embedding(x))
  34.     df.to_csv(target_file)
  35.     # Time        Summary    Text              text_content                           embedding
  36.     # 2023-01-01  很好吃     菜品新鲜...       Summary: 很好吃; Text: 菜品新鲜...    [0.12, -0.45, ...]
  37.     # 2023-01-02  一般般     价格有点贵        Summary: 一般般; Text: 价格有点贵     [0.34, 0.67, ...]
  38. def search_text(input,embedding_file,top_n=3):
  39.     """
  40.     根据用户输入的问题进行语译检索,返回最相似的top n 结果
  41.     """
  42.     df_data  = pd.read_csv(embedding_file)
  43.     #  把字符串转化为向量
  44.     df_data['embedding_vector'] = df_data['embedding'].apply(ast.literal_eval)
  45.     # 将用户输入转换为向量
  46.     input_vector = text_2_embedding(input)
  47.     df_data['similarity'] = df_data.embedding_vector.apply(lambda x: consine_distance(x,input_vector))
  48.     res = (
  49.         df_data.sort_values("similarity",ascending=False)
  50.         .head(top_n)
  51.         .text_content.str.replace("Summary: ","")
  52.         .str.replace('; Text: ',';')
  53.     )
  54.     for r in res:
  55.         print(r)
  56.         print("-" * 30)
  57. if __name__ == '__main__':
  58.     embedding_2_file('../datas/fine_food_reviews_1k.csv','../datas/output_embedding.csv')
  59.     search_text('buy coffee','../datas/output_embedding.csv')
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册