3. Embedding基础
在金融场景中,我们面对的不是抽象文本,而是研报、公告、财报、新闻、客服对话与监管文件。要让机器“理解”这些内容并完成检索、聚类、推荐与风控匹配,第一步就是把文本映射为可计算的向量,也就是Embedding。本节从词向量讲到句向量,再落到稠密检索与相似度度量,帮助你建立后续向量库与重排模块的数学直觉。
一、核心原理:从离散符号到连续语义空间
传统关键词检索把词视为离散符号,无法处理“营收下滑”与“业绩承压”这类同义表达。Embedding的核心思想是:把词、句、段落映射到同一个高维连续向量空间,使语义相近的对象在空间中距离更近。词向量阶段以Word2Vec、GloVe为代表,通过上下文共现学习每个词的稠密表示;句向量阶段则通过Pooling、Sentence-BERT或对比学习,把整句压缩为一个定长向量。
金融文本的难点在于:专业术语多、缩写多、时效性强,且同一词在不同语境下含义差异大。例如“头寸”在债券、外汇、期货语境下指向不同对象。因此,Embedding模型不仅要“懂语言”,还要在领域语料上微调,才能让“久期”“凸性”“信用利差”等概念在向量空间中形成合理的邻域结构。
二、方法流程:相似度度量与检索链路
得到向量后,检索的核心是“比较”。常见度量包括欧氏距离、余弦相似度与内积。在文本Embedding中,余弦相似度最常用,因为它只关注方向、忽略向量长度,适合处理长短文本差异。当向量已做L2归一化时,余弦相似度与内积等价,这也是很多向量库默认使用内积的原因。
稠密检索的典型流程是:离线阶段将金融文档切块、编码为向量并写入向量库;在线阶段将用户Query编码为同空间向量,通过近似最近邻(ANN)索引召回Top-K候选,再交给重排模型精排。金融场景中,Query可能是“某公司近三年现金流变化”,也可能是“某债券违约风险”,需要模型同时理解实体、时间与指标。
| 度量方式 | 公式直觉 | 适用场景 | 注意事项 |
|---|---|---|---|
| 余弦相似度 | 向量夹角余弦,关注方向 | 文本语义匹配、长短文本混合 | 需归一化,否则长度影响大 |
| 内积 | 方向与长度共同作用 | 已归一化向量、ANN索引加速 | 未归一化时偏向长向量 |
| 欧氏距离 | 空间直线距离 | 图像、聚类、低维嵌入 | 对量纲和长度敏感 |
三、案例场景:金融研报检索中的Embedding选择
假设我们要构建一个研报检索系统,用户输入“新能源车补贴退坡对电池企业利润的影响”。如果只用关键词,可能召回大量含“补贴”但不相关的宏观新闻。使用句向量后,模型会把“补贴退坡”“利润承压”“电池成本”等语义相近的段落拉近。
实践中,常见Embedding模型可分为三类:通用模型如text-embedding-3、BGE、GTE;多语言模型如m3e、multilingual-e5;金融领域模型如FinBERT衍生句向量、BloombergGPT相关嵌入。选择时需关注维度、最大输入长度、推理成本与领域适配度。例如BGE-large-zh在中文语义检索上表现稳定,而金融领域微调模型在术语匹配上更精准。
# 以sentence-transformers为例,加载BGE模型并编码
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('BAAI/bge-large-zh-v1.5')
texts = ["公司营收同比下滑", "业绩承压明显", "净利润不及预期"]
embeddings = model.encode(texts, normalize_embeddings=True)
# 归一化后,内积即余弦相似度
scores = embeddings @ embeddings.T
print(scores)
四、误区与复盘:别让向量“看起来像”却“搜不对”
- 误区一:维度越高越好。高维可能带来“维度灾难”,检索速度下降,且并非所有任务都受益。金融短文本用768维通常足够。
- 误区二:忽略归一化。若使用内积检索却未归一化,长文档会因向量模长更大而获得虚高分数。
- 误区三:用通用模型直接处理金融术语。“久期”与“持续时间”在通用空间中可能很近,但在金融语境下含义完全不同,需领域微调或加入业务词典。
- 误区四:只做向量召回,不做重排。稠密检索擅长语义召回,但精度有限,金融合规场景必须叠加Cross-Encoder重排与规则过滤。
理解Embedding的本质,是在“语义空间”中建立可计算的相似性。词向量解决词的表示,句向量解决整句压缩,稠密检索则把这种表示用于大规模召回。掌握余弦相似度与内积的关系,选对领域模型,并配合重排与评估,才能让金融文本检索从“关键词匹配”走向“语义理解”。