背景描述

Text Embedding在大模型中的应用

Text Embedding涉及到将高维度的数据(如文本、图像等)映射到低维度空间的过程。这一过程不仅有助于减少数据处理的复杂性,还能够捕捉和表达数据的语义信息,从而提升模型的性能和效率。

Text Embedding通过深度神经网络(如BERT、GPT等)将文本中的词语、句子或段落转换为固定长度的向量表示。这些向量不仅包含了词语的字面意思,还蕴含了上下文信息、语义关联等深层次特征。

应用场景

  1. 文本分类:通过将文本转换为向量,可以训练分类器进行情感分析、主题分类等任务
  2. 信息检索:计算文本向量间的相似度,实现高效的语义搜索
  3. 机器翻译:建立跨语言的向量空间映射,提升翻译质量
  4. 问答系统:将问题和答案映射到同一空间进行匹配
  5. 推荐系统:分析用户和内容的向量表示,实现个性化推荐

主流方法

  • Word2Vec:最早的词向量模型,通过预测上下文学习词向量
  • GloVe:基于全局词频统计的词向量模型
  • BERT:基于Transformer的双向预训练模型,能生成上下文相关的词向量
  • Sentence-BERT:专门用于句子级别嵌入的改进模型

工作原理

Text Embedding的核心思想是将文本中的单词、短语或句子转换为实数向量(也称为嵌入向量)。这些向量通常存在于一个高维的连续向量空间中(常见维度为50-300维),其空间结构能够有效捕捉语言的语义特征和语法关系。

关键特性

  1. 语义相关性:通过向量空间中的几何关系来体现语义相似性

    • 语义相近的词汇(如”猫”和”狗”)在向量空间中距离较近
    • 语义相反的词汇(如”好”和”坏”)可能呈现对称的向量关系
    • 类比关系(如”国王-王后”≈“男人-女人”)可以通过向量运算体现
  2. 数学可操作性

    • 支持向量加减运算(如:向量(“巴黎”)-向量(“法国”)+向量(“日本”)≈向量(“东京”))
    • 可以计算余弦相似度等度量来评估语义相关性
    • 便于机器学习模型处理

安装依赖

pip install -qU langchain-core langchain-openai

编写代码

from langchain_openai import OpenAIEmbeddings

embeddings_model = OpenAIEmbeddings()

embeddings = embeddings_model.embed_documents(
    [
        "Hi there!",
        "Oh, hello!",
        "What's your name?",
        "My friends call me World",
        "Hello World!"
    ]
)
print(len(embeddings))
print(len(embeddings[0]))

embedded_query = embeddings_model.embed_query("What was the name mentioned in the conversation?")
print(embedded_query[:5])

运行结果

➜ python3 test22.py
5
1536
[0.005339288459123527, -0.0004900397315547535, 0.03888638540715689, -0.0029435385310610336, -0.00899561173676785]

存储至FAISS

基本概念

FAISS(Facebook AI Similarity Search)是Facebook AI Research团队开发的一个高效相似性搜索和密集向量聚类的库。它能够快速处理大规模向量数据集的最近邻搜索问题,特别适合机器学习应用中常见的向量相似度计算场景。

核心特点

  1. 高效性能:FAISS针对大规模向量搜索进行了高度优化
  2. 灵活可扩展:支持从数百万到数十亿级别的向量规模
  3. 多平台支持:提供Python接口,同时底层使用C++实现以保证效率

典型应用场景

  1. 推荐系统:寻找相似用户或物品
  2. 自然语言处理:语义搜索、文档检索、问答系统
  3. 计算机视觉:图像检索、人脸识别
  4. 异常检测:通过向量距离识别异常样本

安装FAISS

pip install --upgrade --quiet  langchain-openai faiss-cpu

编写代码

from langchain_openai import OpenAIEmbeddings
from langchain.storage import LocalFileStore
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain_text_splitters import CharacterTextSplitter

underlying_embeddings = OpenAIEmbeddings()
store = LocalFileStore("./cache/")
cached_embedder = CacheBackedEmbeddings.from_bytes_store(
    underlying_embeddings, store, namespace=underlying_embeddings.model
)
print(list(store.yield_keys()))

raw_documents = TextLoader("./state_of_the_union.txt").load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)

db = FAISS.from_documents(documents, cached_embedder)
print(list(store.yield_keys())[:5])