Documentation Index
Fetch the complete documentation index at: https://docs.apiyi.com/llms.txt
Use this file to discover all available pages before exploring further.
概念定义
嵌入(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-002 | 1536 | 固定 | 0.0001 | 上一代标准 |
| text-embedding-3-small | 1536 | 512-1536 | 0.00002 | 性价比最高 |
| text-embedding-3-large | 3072 | 256-3072 | 0.00013 | 性能最强 |
动态维度特性(2024年1月发布)
- 使用Matryoshka表示学习
- 可通过截断向量末尾降维
- 256维的3-large性能超过1536维的ada-002
中文嵌入模型
BGE-M3(2024年1月)
- 多语言:支持100+语言
- 多功能:密集检索、多向量检索、稀疏检索
- 多粒度:支持8192 token输入
- 性能领先:超越OpenAI模型的混合检索效果
M3E系列
- 中文优化:2200万中文句对训练
- 领域覆盖:百科、金融、医疗、法律等
- 开源可用:支持本地部署
- 性能数据:T2Ranking评测超过OpenAI-ada-002
选择建议
- 通用英文:OpenAI text-embedding-3-small(便宜高效)
- 高精度需求:text-embedding-3-large(可调维度)
- 中文场景:BGE-M3或M3E(本地化优势)
- 多语言:BGE-M3(100+语言支持)
- 成本敏感:考虑开源模型本地部署
实际应用
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
注意事项
- Token限制:注意模型的最大输入长度
- 归一化:某些应用需要归一化向量
- 缓存策略:重复文本应缓存嵌入结果
- 版本管理:模型更新可能改变嵌入空间
- 隐私考虑:敏感数据的嵌入处理需谨慎
前沿发展
2024年技术趋势
多模态嵌入
- 文本、图像、音频的统一表示
- CLIP、ALIGN等跨模态模型
- 支持图文检索和理解
长文本嵌入
- 支持8K-100K token输入
- 分层注意力机制
- 适用于文档级别理解
领域专用嵌入
- 法律、医疗、金融等垂直领域
- 专业术语和知识的准确表示
- 更高的领域内检索精度
实验性技术
稀疏嵌入
自适应嵌入
相关概念
延伸阅读