背景描述
Text Embedding在大模型中的应用
Text Embedding涉及到将高维度的数据(如文本、图像等)映射到低维度空间的过程。这一过程不仅有助于减少数据处理的复杂性,还能够捕捉和表达数据的语义信息,从而提升模型的性能和效率。
Text Embedding通过深度神经网络(如BERT、GPT等)将文本中的词语、句子或段落转换为固定长度的向量表示。这些向量不仅包含了词语的字面意思,还蕴含了上下文信息、语义关联等深层次特征。
应用场景
- 文本分类:通过将文本转换为向量,可以训练分类器进行情感分析、主题分类等任务
- 信息检索:计算文本向量间的相似度,实现高效的语义搜索
- 机器翻译:建立跨语言的向量空间映射,提升翻译质量
- 问答系统:将问题和答案映射到同一空间进行匹配
- 推荐系统:分析用户和内容的向量表示,实现个性化推荐
主流方法
- Word2Vec:最早的词向量模型,通过预测上下文学习词向量
- GloVe:基于全局词频统计的词向量模型
- BERT:基于Transformer的双向预训练模型,能生成上下文相关的词向量
- Sentence-BERT:专门用于句子级别嵌入的改进模型
工作原理
Text Embedding的核心思想是将文本中的单词、短语或句子转换为实数向量(也称为嵌入向量)。这些向量通常存在于一个高维的连续向量空间中(常见维度为50-300维),其空间结构能够有效捕捉语言的语义特征和语法关系。
关键特性
-
语义相关性:通过向量空间中的几何关系来体现语义相似性
- 语义相近的词汇(如”猫”和”狗”)在向量空间中距离较近
- 语义相反的词汇(如”好”和”坏”)可能呈现对称的向量关系
- 类比关系(如”国王-王后”≈“男人-女人”)可以通过向量运算体现
-
数学可操作性:
- 支持向量加减运算(如:向量(“巴黎”)-向量(“法国”)+向量(“日本”)≈向量(“东京”))
- 可以计算余弦相似度等度量来评估语义相关性
- 便于机器学习模型处理
安装依赖
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团队开发的一个高效相似性搜索和密集向量聚类的库。它能够快速处理大规模向量数据集的最近邻搜索问题,特别适合机器学习应用中常见的向量相似度计算场景。
核心特点
- 高效性能:FAISS针对大规模向量搜索进行了高度优化
- 灵活可扩展:支持从数百万到数十亿级别的向量规模
- 多平台支持:提供Python接口,同时底层使用C++实现以保证效率
典型应用场景
- 推荐系统:寻找相似用户或物品
- 自然语言处理:语义搜索、文档检索、问答系统
- 计算机视觉:图像检索、人脸识别
- 异常检测:通过向量距离识别异常样本
安装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])