1. 课程导入
在金融行业,信息就是定价的依据、风控的底线和决策的起点。每天产生的研报、公告、财报、新闻、监管文件、内部邮件与客服记录,构成了一个体量庞大、更新极快、专业门槛极高的文本世界。传统关键词检索(如基于倒排索引的 BM25)在处理“贵州茅台三季度毛利率变化”“某城商行房地产敞口风险”这类问题时,往往只能匹配字面词项,无法理解“毛利率”与“盈利能力”、“敞口”与“风险暴露”之间的语义关联。这正是本课程要解决的核心问题:如何让机器真正“读懂”金融文本,并在此基础上实现高效、精准、可解释的检索与重排。
一、金融文本智能检索的三大挑战
金融文本检索不同于通用网页搜索,它有三个显著特征,直接决定了技术选型的难度。
- 语义密集且专业术语多:“久期”“凸性”“拨备覆盖率”“净息差”等术语在通用语料中稀疏,通用 Embedding 模型往往无法准确编码其金融含义,导致向量空间中“相似”与“相关”脱节。
- 时效性与数值敏感:一条“降准 0.25 个百分点”的新闻,其语义会随发布时间、机构、政策语境发生剧烈变化;同时,财务数字、同比环比、单位量纲的细微差异,都会改变检索结果的相关性排序。
- 合规与可解释要求高:金融检索结果常需追溯依据、审计留痕。纯黑盒向量相似度难以满足“为什么这条被召回”的合规解释需求,必须结合重排与元数据过滤。
一个典型反例:用户查询“新能源车险赔付率上升”,BM25 可能召回大量含“新能源”“车险”但讨论“保费收入”的文档;而通用 Embedding 又可能把“赔付率”与“赔付支出”混为一谈。金融领域需要的是“领域适配的语义表示 + 结构化约束 + 精排校准”的组合方案。
二、Embedding 与向量检索的价值定位
Embedding 的本质,是把离散文本映射到低维稠密向量空间,使语义相近的文本在空间中距离更近。对金融场景而言,它的价值体现在三个层面:
- 语义泛化:即使用户查询与文档没有共同关键词,也能通过向量近邻召回语义相关的内容,例如“银行资本充足率下滑”可召回“核心一级资本承压”的段落。
- 多语言与多模态扩展:中英文研报、表格标题、图表说明可统一编码,为跨语言检索和后续多模态融合打基础。
- 可组合的检索流水线:向量检索负责高召回,重排模型负责高精度,元数据过滤负责合规与时效,三者可插拔组合,适应不同业务场景。
但必须清醒认识到:向量检索不是银弹。它的召回质量高度依赖 Embedding 模型的领域适配程度、切块策略、索引参数与查询改写。因此,本课程不会停留在“调个 API 就完事”,而是深入模型选型、微调、索引构建与重排校准的完整链路。
三、课程整体框架与学习路径
本课程共 30 章,按“认知—构建—优化—落地”四阶段递进。第 1 至 6 章建立金融文本检索的问题意识与 Embedding 基础;第 7 至 15 章深入向量索引、切块策略、领域微调与检索评估;第 16 至 24 章聚焦重排模型、混合检索与多路召回融合;第 25 至 30 章以真实金融场景(研报问答、公告风控、客服工单)完成端到端实战与性能调优。
| 阶段 | 章节范围 | 核心目标 | 关键产出 |
|---|---|---|---|
| 认知与基础 | 第 1–6 章 | 理解金融检索挑战,掌握 Embedding 原理与选型 | 领域模型对比报告 |
| 构建与索引 | 第 7–15 章 | 完成切块、编码、索引与召回评估 | 可运行的向量检索服务 |
| 重排与融合 | 第 16–24 章 | 引入 Cross-Encoder 重排与混合检索策略 | 高精度检索流水线 |
| 实战与调优 | 第 25–30 章 | 端到端金融场景落地与性能压测 | 生产级检索系统方案 |
四、常见误区与学习建议
误区一:把通用 Embedding 直接用于金融文本。通用模型在金融术语上的向量分布往往过于分散,导致“召回不准”。建议至少做领域对比实验,必要时用金融语料做对比学习微调。
误区二:只关注召回率,忽视重排与合规过滤。高召回低精度会让下游 LLM 产生幻觉,金融场景必须加入重排与元数据约束。
误区三:切块越大越好或越小越好。切块粒度直接影响语义完整性与检索精度,需结合文档结构与查询类型做实验。
误区二:只关注召回率,忽视重排与合规过滤。高召回低精度会让下游 LLM 产生幻觉,金融场景必须加入重排与元数据约束。
误区三:切块越大越好或越小越好。切块粒度直接影响语义完整性与检索精度,需结合文档结构与查询类型做实验。
学习路径建议:先跑通一个最小向量检索 Demo(如用 sentence-transformers + FAISS),再逐步替换为金融领域模型、加入重排与评估指标。每章都配有可复现的代码片段与参数配置,建议边学边动手。
# 最小向量检索示例(伪代码)
from sentence_transformers import SentenceTransformer
import faiss
model = SentenceTransformer("BAAI/bge-large-zh-v1.5")
docs = ["贵州茅台三季度毛利率提升", "某城商行房地产敞口风险可控"]
emb = model.encode(docs, normalize_embeddings=True)
index = faiss.IndexFlatIP(emb.shape[1])
index.add(emb)
query = "白酒企业盈利能力变化"
q_emb = model.encode([query], normalize_embeddings=True)
scores, ids = index.search(q_emb, k=2)
print(ids, scores)