# Embedding 文本嵌入模型介绍与使用

# 原始图示

Embedding 中的语义关系

向量空间可以表达一定语义关系,但 RAG 更关注稳定召回。

文本到向量

文本经过模型编码后变成向量,再用于相似度计算。

# Embedding 的作用

Embedding 模型把文本转换成一组浮点数,这组数就是向量。向量不是给人直接阅读的,而是给相似度算法使用的。语义相近的文本在向量空间里距离更近,语义差异大的文本距离更远。

RAG 中至少有两类文本会被向量化:用户问题和文档 chunk。只有它们使用同一个 Embedding 模型、同一套预处理规则、同一个向量空间,计算相似度才有意义。不能用 A 模型生成文档向量,再用 B 模型生成问题向量直接检索。

# 相似度与维度

向量维度是 Embedding 模型输出长度。维度越高不代表一定越好,它会影响存储成本、索引大小、检索延迟和模型表达能力。实际选型应该看评测结果,而不是只看维度。

常见相似度包括余弦相似度、欧氏距离和内积。余弦相似度关注方向,欧氏距离关注空间距离,内积常配合归一化向量使用。不同向量库和模型对距离度量的默认配置不同,建库时必须确认。

# 国王与王后的例子

Embedding 的经典例子是“king - man + woman 接近 queen”。这个例子说明向量空间有时能表达某些语义关系。但在 RAG 工程中,不要把这种例子理解成模型真的具有稳定符号逻辑。Embedding 更可靠的用途是语义召回,而不是做精确推理。

# 源码示例

from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

query_vector = embeddings.embed_query("如何申请退款?")
document_vectors = embeddings.embed_documents([
    "退款通常会在 1-3 个工作日到账。",
    "发票需要在报销系统中上传。",
])

print(len(query_vector))
print(len(document_vectors), len(document_vectors[0]))
1
2
3
4
5
6
7
8
9
10
11
12

# 拓展

可以从三个方向继续扩展:第一,把当前组件放回完整 RAG 链路中观察,不只看单点能力;第二,为每次参数变化建立固定问题集,避免凭感觉判断效果;第三,把来源、版本、权限、时间和评估结果写入 metadata 或日志,让线上问题能追溯。

这类基础能力越早规范,后面接入多查询、重排、混合检索、父文档检索和权限隔离时越省力。

# 最新版 LangChain 用法提示

最新版 LangChain 中,OpenAI Embedding 推荐从 langchain_openai 导入:from langchain_openai import OpenAIEmbeddings。旧的 langchain_community.embeddings.OpenAIEmbeddings 在参考中仍能看到,但新项目应优先使用独立集成包。Embedding 接口仍围绕 embed_query() 和 embed_documents() 展开。

# 常见问题

# 这类组件应该先在什么规模上验证?

先用一小批真实文档和真实问题验证,而不是直接全量入库。验证时至少观察三类结果:检索是否命中正确片段、返回片段是否包含足够上下文、最终回答是否严格基于证据。

# 只看相似度分数够不够?

不够。相似度分数只能说明向量距离,不代表答案一定正确。还要看 chunk 是否完整、metadata 是否正确、过滤条件是否过严或过松,以及 Prompt 是否要求模型只根据上下文回答。

# 参数应该怎么调?

先固定评测问题集,再一次只改一个变量,例如 chunk 大小、overlap、top_k、Embedding 模型或过滤条件。每次改动都记录召回命中率、答案准确率、延迟和成本。

# 面试题

# 1. RAG 链路里最容易被忽略的工程点是什么?

最容易被忽略的是数据处理和评估。很多问题不是 LLM 不会答,而是文档解析错误、chunk 切坏、metadata 丢失、向量版本混乱、检索过滤条件错误,导致模型拿不到正确证据。

# 2. 为什么不能只依赖 LLM 自身参数记忆?

参数记忆存在知识过期、领域知识缺失、事实边界不清和不可追踪的问题。RAG 通过检索外部证据,把回答范围约束在可追踪内容上,适合企业知识库、产品文档和实时资料问答。

# 3. 如何判断一个 RAG 系统的问题出在检索还是生成?

先直接查看检索返回的文档。如果返回内容已经不相关,问题在加载、切分、Embedding、向量库或 Retriever;如果返回内容正确但回答错误,问题多半在 Prompt、上下文压缩、引用组织或模型输出约束。

# 生产问题排查

问题 常见原因 处理方式
回答看起来合理但没有依据 Prompt 没要求基于上下文,或检索片段不相关 增加拒答策略、引用来源、检索结果抽样检查
召回结果经常跑偏 chunk 过短、Embedding 模型不适合、query 表达不完整 调整切分策略,评估 Embedding,必要时做查询改写
命中了旧内容 文档更新后没有重新入库,或缓存没有区分版本 使用文档 hash、版本号、更新时间和重建任务
多租户数据串库 metadata filter 缺失或字段设计不严谨 强制 tenant_id / dataset_id 过滤,并做权限测试
成本增长明显 重复 Embedding、top_k 过大、无缓存 增加缓存、批处理、限流和调用统计
延迟不稳定 向量库网络抖动、LLM 响应慢、检索链路串行 并行化可并行步骤,增加超时、重试和降级策略