概念定义

嵌入(Embedding)是将文本、图像等高维离散数据映射为低维连续向量的技术,使计算机能够理解和处理语义信息,是现代AI应用的基础技术。

详细解释

什么是嵌入?

嵌入技术将人类可读的文本转换为机器可处理的数值向量,每个向量代表文本在高维语义空间中的位置。相似含义的文本在向量空间中距离较近。 核心特性
  • 语义保留:向量距离反映语义相似度
  • 固定维度:无论输入长度,输出维度固定
  • 数值表示:将离散文本转为连续数值
  • 可计算性:支持向量运算和相似度计算
应用价值
  • 语义搜索和信息检索
  • 推荐系统和个性化
  • 聚类分析和分类任务
  • 跨语言理解和翻译
形象比喻想象一个巨大的语义地图,每个词汇或句子都是地图上的一个点:
  • 位置关系:“猫”和”狗”距离很近(都是宠物)
  • 方向含义:“国王”-“男人”+“女人”≈“女王”(向量运算)
  • 距离度量:点之间的距离代表语义差异
嵌入就是给每个文本分配在这个地图上的坐标(向量)。

技术演进历程

2013-2018:Word2Vec时代
  • 词级别嵌入,维度通常100-300
  • Skip-gram和CBOW模型
  • 无法处理一词多义
2018-2022:Transformer时代
  • 上下文感知的动态嵌入
  • BERT、GPT等预训练模型
  • 维度提升至768-1024
2023-2024:新一代嵌入
  • OpenAI text-embedding-3系列
  • 动态维度调整(256-3072)
  • 多语言、多粒度支持

工作原理

嵌入生成流程

向量空间特性

语义运算示例
# 词向量的语义运算
embedding("国王") - embedding("男人") + embedding("女人") ≈ embedding("女王")
embedding("北京") - embedding("中国") + embedding("日本") ≈ embedding("东京")
相似度计算
import numpy as np

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

# 示例
sim_score = cosine_similarity(
    embedding("人工智能"),
    embedding("机器学习")
)  # 结果接近0.85,表示高度相关

最新模型对比(2024)

OpenAI系列

模型名称默认维度可调范围价格($/1K tokens)特点
text-embedding-ada-0021536固定0.0001上一代标准
text-embedding-3-small1536512-15360.00002性价比最高
text-embedding-3-large3072256-30720.00013性能最强
动态维度特性(2024年1月发布)
  • 使用Matryoshka表示学习
  • 可通过截断向量末尾降维
  • 256维的3-large性能超过1536维的ada-002

中文嵌入模型

BGE-M3(2024年1月)
  • 多语言:支持100+语言
  • 多功能:密集检索、多向量检索、稀疏检索
  • 多粒度:支持8192 token输入
  • 性能领先:超越OpenAI模型的混合检索效果
M3E系列
  • 中文优化:2200万中文句对训练
  • 领域覆盖:百科、金融、医疗、法律等
  • 开源可用:支持本地部署
  • 性能数据:T2Ranking评测超过OpenAI-ada-002
选择建议
  1. 通用英文:OpenAI text-embedding-3-small(便宜高效)
  2. 高精度需求:text-embedding-3-large(可调维度)
  3. 中文场景:BGE-M3或M3E(本地化优势)
  4. 多语言:BGE-M3(100+语言支持)
  5. 成本敏感:考虑开源模型本地部署

实际应用

API调用示例

OpenAI嵌入API(2024版)
from openai import OpenAI
client = OpenAI()

def get_embedding(text, model="text-embedding-3-small", dimensions=None):
    """获取文本嵌入向量"""
    params = {
        "model": model,
        "input": text
    }
    
    # 新功能:动态调整维度
    if dimensions:
        params["dimensions"] = dimensions
    
    response = client.embeddings.create(**params)
    return response.data[0].embedding

# 使用示例
embedding_full = get_embedding("人工智能的未来")  # 默认1536维
embedding_small = get_embedding("人工智能的未来", dimensions=512)  # 降至512维
中文嵌入模型使用
from sentence_transformers import SentenceTransformer

# 加载BGE-M3模型
model = SentenceTransformer('BAAI/bge-m3')

# 批量编码
texts = [
    "人工智能正在改变世界",
    "机器学习是AI的核心技术",
    "今天天气真好"
]

embeddings = model.encode(texts, normalize_embeddings=True)
print(f"嵌入维度:{embeddings.shape}")  # (3, 1024)

# 计算相似度
similarities = embeddings @ embeddings.T
print(f"文本1和2的相似度:{similarities[0][1]:.4f}")  # 约0.85
print(f"文本1和3的相似度:{similarities[0][2]:.4f}")  # 约0.20

典型应用场景

语义搜索系统
class SemanticSearch:
    def __init__(self, embedding_model="text-embedding-3-small"):
        self.model = embedding_model
        self.document_embeddings = []
        self.documents = []
    
    def index_documents(self, documents):
        """为文档建立嵌入索引"""
        for doc in documents:
            embedding = get_embedding(doc, self.model)
            self.document_embeddings.append(embedding)
            self.documents.append(doc)
    
    def search(self, query, top_k=5):
        """语义搜索"""
        query_embedding = get_embedding(query, self.model)
        
        # 计算相似度
        similarities = []
        for idx, doc_embedding in enumerate(self.document_embeddings):
            sim = cosine_similarity(query_embedding, doc_embedding)
            similarities.append((idx, sim))
        
        # 返回最相似的文档
        similarities.sort(key=lambda x: x[1], reverse=True)
        return [(self.documents[idx], score) 
                for idx, score in similarities[:top_k]]
RAG应用集成
def enhance_prompt_with_context(query, knowledge_base):
    """使用嵌入检索增强提示词"""
    # 1. 获取查询嵌入
    query_embedding = get_embedding(query)
    
    # 2. 从知识库检索相关内容
    relevant_docs = knowledge_base.search(query_embedding, top_k=3)
    
    # 3. 构建增强的提示词
    context = "\n".join([doc for doc, _ in relevant_docs])
    enhanced_prompt = f"""
    基于以下相关信息回答问题:
    
    {context}
    
    问题:{query}
    """
    
    return enhanced_prompt

优化技巧

维度选择策略

性能vs成本权衡
def optimize_embedding_dimensions(texts, test_queries):
    """测试不同维度的性能"""
    dimensions = [256, 512, 1024, 1536, 3072]
    results = {}
    
    for dim in dimensions:
        # 生成嵌入
        embeddings = [get_embedding(t, dimensions=dim) for t in texts]
        
        # 评估检索质量
        avg_precision = evaluate_retrieval(embeddings, test_queries)
        
        # 计算成本
        storage_cost = calculate_storage_cost(len(texts), dim)
        
        results[dim] = {
            "precision": avg_precision,
            "storage_mb": storage_cost,
            "cost_efficiency": avg_precision / storage_cost
        }
    
    return results

批处理优化

高效批量编码
def batch_encode(texts, batch_size=100):
    """批量处理大规模文本"""
    all_embeddings = []
    
    for i in range(0, len(texts), batch_size):
        batch = texts[i:i + batch_size]
        
        # API支持批量请求
        response = client.embeddings.create(
            model="text-embedding-3-small",
            input=batch
        )
        
        batch_embeddings = [item.embedding for item in response.data]
        all_embeddings.extend(batch_embeddings)
    
    return all_embeddings
注意事项
  1. Token限制:注意模型的最大输入长度
  2. 归一化:某些应用需要归一化向量
  3. 缓存策略:重复文本应缓存嵌入结果
  4. 版本管理:模型更新可能改变嵌入空间
  5. 隐私考虑:敏感数据的嵌入处理需谨慎

前沿发展

2024年技术趋势

多模态嵌入
  • 文本、图像、音频的统一表示
  • CLIP、ALIGN等跨模态模型
  • 支持图文检索和理解
长文本嵌入
  • 支持8K-100K token输入
  • 分层注意力机制
  • 适用于文档级别理解
领域专用嵌入
  • 法律、医疗、金融等垂直领域
  • 专业术语和知识的准确表示
  • 更高的领域内检索精度

实验性技术

稀疏嵌入
  • 结合密集和稀疏表示
  • 提高可解释性
  • 降低存储成本
自适应嵌入
  • 根据任务动态调整
  • 个性化嵌入空间
  • 持续学习能力

相关概念

延伸阅读

推荐资源最后更新:2024年12月