Skip to content

LangChain嵌入模型

嵌入模型

嵌入模型

LangChain 中的 Embedding models(嵌入模型) 是用于将原始文本(如句子、段落等)转换为固定长度的稠密向量(embeddings) 的组件。这些向量能够捕捉文本的语义信息,使得语义相近的文本在向量空间中距离更近,从而支持语义搜索、相似性匹配、RAG(检索增强生成) 等下游任务。

核心作用

  • 将用户查询(query)编码为向量
  • 将文档(documents)编码为向量
  • 支持后续的向量存储(VectorStore) 和 相似性检索

LangChain 为所有嵌入模型提供了一个标准化接口,定义在 langchain_core.embeddings.Embeddings 抽象基类中,主要包含两个方法:

方法功能
embed_documents(texts: List[str]) → List[List[float]]批量嵌入多个文档
embed_query(text: str) → List[float]嵌入单个查询

嵌入模型选型

开源与闭源嵌入模型对比

模型 / 服务向量维度语言MTEB 分数长文本优势适用场景
OpenAI text-embedding-3-large3072多语言85.28k精度高、多语言强企业级 RAG、全球化
OpenAI text-embedding-3-small1536多语言80.98k成本低、速度快原型 / 中小规模
BAAI bge-m31024多语言85.0+8k稠密 + 稀疏 + 多向量中文 / 跨语言、混合检索
BAAI bge-large-zh-v1.51024中文84.0+512中文优化、检索导向中文 RAG、垂直领域

BGE系列嵌入模型对比

  • 对于大多数中国企业级RAG系统,如果业务聚焦国内,文档以中文为主且长度可控,BGE-large-zh-v1.5 是风险更低、性能经过充分验证的稳健选择。
  • 如果你的企业处于国际化进程中,或特定业务领域(如法律科技、跨境研究、法律合同分析、学术论文检索)天然涉及多语言和长文档,那么 BGE-M3 所提供的“三多”能力(多语言、多功能、多粒度)将是构建下一代智能检索系统的强大基石
  • 在决策前,强烈建议使用业务实际数据的一小部分,对两个模型进行并行的POC测试,以实测的召回率、准确率和响应延迟作为最终依据
特性维度BGE-large-zh-v1.5BGE-M3
核心定位中文场景性能王者,专为中文优化全能型多语言模型,统一解决多语言、多功能、多粒度问题
语言支持主要针对中文,在多语言场景下能力有限支持超过100种语言,在多语言和跨语言检索任务中表现卓越
输入长度最大 512 tokens,适用于常规段落。文本分割建议长度500最大 8192 tokens,可直接处理长文档,无需分段。文本分割建议1000或以上
检索功能单一稠密检索(Dense Retrieval)三合一检索:稠密检索、稀疏检索(Sparse)、多向量检索(Multi-Vector)
技术亮点基于RoBERTa架构,经大规模中文句对对比学习与指令微调,在中文语义理解上深度优化通过“位置重训-大批次训练-自知识蒸馏”技术,单模型实现三种检索输出,长文档处理能力突出
模型大小约1.2GB(Large版本)Base版约1.2GB,Large版约3.4GB
资源消耗相对较低,推理速度较快较高,尤其开启多功能或处理长文本时,需要更多计算资源

相似性指标

相似性指标(Similarity Metrics)是用来衡量两个嵌入向量之间 “接近程度”的数学方法。嵌入领域最核心三类相似性指标:

指标名称核心含义取值范围关键特性适用场景优点缺点
余弦相似度(Cosine Similarity)衡量向量方向的相似程度,与向量长度(模)无关[-1, 1]- 1:完全同向(最相似)- 0:正交(无相关)- -1:完全反向(最不相似)只关注语义方向,忽略向量模长文本嵌入、RAG 语义检索、推荐系统、跨语言匹配不受向量长度影响,计算高效,适配高维嵌入不考虑向量 “强度”(模长),仅反映方向相似性
欧氏距离(Euclidean Distance)衡量向量在 n 维空间中的直线距离[0, +∞)- 0:完全相同- 数值越大:越不相似同时考虑向量方向与长度,符合几何直觉聚类(K-Means)、异常检测、未归一化向量的相似度计算直观易懂,对空间位置差异敏感受向量长度影响大,高维空间区分度下降(维度灾难)
点积(Dot Product)归一化后等价于余弦相似度;未归一化时,同时反映方向 + 向量强度无固定范围(取决于向量值)- 归一化后:[-1, 1]- 未归一化:(-∞, +∞)计算最快,可灵活结合方向与长度归一化嵌入的大规模检索、推荐系统(需结合热度 / 强度)计算效率最高(无开方、除法),适配向量数据库索引未归一化时结果可比性差,易受向量模长干扰

说明:余弦相似度通用配置normalize_embeddings(向量归一化,让余弦相似度计算更准确,几乎所有场景都推荐开启)

参考资料

下载地址

实战Ollama嵌入服务

Ollama提供嵌入模型服务,可用于开发环境

BGE-M3使用

安装Ollama,然后执行下面命令

shell
# 下载 BAAI BGE-M3
ollama pull bge-m3:latest
# 查看模型
ollama list

安装开发依赖

shell
pip install -U langchain-ollama -i https://mirrors.aliyun.com/pypi/simple --trusted-host=mirrors.aliyun.com

基本使用

python
from langchain_ollama import OllamaEmbeddings


# 嵌入模型
embeddings = OllamaEmbeddings(model="bge-m3", base_url="http://127.0.0.1:11434")
# 单个文本
text = "hello world"
single_vector = embeddings.embed_query(text)
print(str(single_vector)[:100])
# 多个文本
texts = ["hello world", "hello python"]
vectors = embeddings.embed_documents(texts)
for vertor in vectors:
    print(str(vertor)[:100])

运行Ollama服务

重启后,Ollama服务可能处于关闭状态。此时无法调用bge-m3嵌入模型。打开CMD执行下面命令,运行Ollama服务

shell
# ollama ps命令,会触发启动Ollama服务
C:\Users\zlj>ollama ps
NAME    ID    SIZE    PROCESSOR    CONTEXT    UNTIL

C:\Users\zlj>

说明

Ollama 官方提供的 bge-m3 模型,与原始 Hugging Face 版本相比。生产环境建议使用Hugging Face 版本。

能力Hugging Face 原版Ollama bge-m3
Dense 向量✅ 完整 + 归一化✅ 有,但需手动归一化
Sparse 向量✅ 支持❌ 不支持
Multi-vector✅ 支持❌ 不支持
8K 长文本✅ 支持⚠️ 可能截断
中文效果✅ SOTA✅ 较好(但略降)
API 易用性需部署服务✅ 本地一键运行

实战Xinference嵌入服务

Xinference提供嵌入模型服务,可用于生产环境

安装与启动Xinference

安装与启动Xinference,参考文档:《Xinference安装与使用》

运行模型

访问Xinference 的UI界面:http://<IP>:9997/ui

运行模型:登录Xinference界面,Launch Model -- EMBEDDING MODELS -- bge-large-zh-v1.5

image-20260121095519951

查看状态:Running Models

image-20260121101540825

调用模型接口

调用embedding模型:注意修改model参数

shell
curl -X POST http://127.0.0.1:9997/v1/embeddings \
  -H "Content-Type: application/json" \
  -d '{
    "model": "bge-m3",
    "input": ["你好,欢迎使用 Xinference"]
  }'

调用chat模型:注意修改model参数

shell
curl -X POST http://127.0.0.1:9997/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "<model_uid>",
    "messages": [
      {"role": "user", "content": "你好,请自我介绍"}
    ]
  }'

Python SDK调用

python
from openai import OpenAI

# TODO: 替换为自己Docker的IP地址
client = OpenAI(base_url="http://172.22.62.247:9997/v1/", api_key="-")

response = client.embeddings.create(
    model="bge-m3",
    input="What is Deep Learning?",
)

print(response.data[0].embedding)

langchain中调用

shell
from langchain_community.embeddings import XinferenceEmbeddings

xinference = XinferenceEmbeddings(
    server_url="http://0.0.0.0:9997", model_uid="915845ee-2a04-11ee-8ed4-d29396a3f064"
)

其它说明

  • 如果使用pip来安装Xinference ,容易报错。
  • 如果使用TEI(Text Embeddings Inference)容器来启动,有较多硬件限制,尝试多次未能成功。