纲要
- 嵌入模型的核心作用
- 将非结构化文本转化为高维向量坐标
- 支撑语义相似度检索,是 RAG 系统的基石
- LangChain 嵌入模型接口
- 统一封装:
embed_documents与embed_query - 主流模型接入:OpenAI、Ollama、BGE、智谱等
- 统一封装:
- 嵌入缓存机制
- 原理:避免重复向量化,降低 API 调用成本
- 实现:
CacheBackedEmbeddings+ 本地文件存储
- 国产嵌入模型集成
- 以硅基流动平台的 BGE‑M3 为例
- 配置代理地址与 API Key,无缝切换
- 完整可运行代码:使用
FakeEmbeddings演示嵌入、缓存与检索,无需外部 API Key
引言
在 RAG 流水线中,文档经过加载和切片之后,必须被转换成一种机器可以理解的数学形式——向量。嵌入模型就是将文本映射为高维空间中的坐标,使得语义相近的文本在空间中彼此靠近。
LangChain 为这些模型提供了统一的调用方式,并内置缓存来优化重复嵌入的性能与成本。本文将通过可运行的代码,展示如何在 LangChain 中使用嵌入模型,并接入国产模型。
适用版本说明:本文示例基于
langchain-core==0.1.x及langchain-community==0.1.x。CacheBackedEmbeddings在langchain>=0.1.0中已稳定支持。
嵌入模型的工作原理
嵌入模型本质上是一个“翻译器”:输入一句话(如“今天天气怎么样?”),输出一个固定长度的数字数组(向量)。语义相近的句子生成的向量距离更近,反之则更远。在 RAG 系统中,嵌入模型承担两项任务:
- 入库:将知识库中的文档片段逐一向量化,存入向量数据库。
- 检索:将用户查询向量化,在数据库中搜索距离最近的 Top‑K 个片段。
LangChain 中的嵌入模型实现
所有嵌入模型都实现两个核心方法:
embed_documents(texts: List[str]):批量嵌入文档。embed_query(text: str):嵌入单个查询。
常用嵌入模型一览
| 模型 | 维度 | 语言支持 | 运行方式 |
|---|---|---|---|
OpenAItext-embedding-ada-002 | 1536 | 多语言 | API 调用 |
| BGE‑M3(BAAI) | 1024 | 多语言 | 本地 / API |
| 智谱嵌入模型 | 1024 | 中文 | API 调用 |
| Ollama 托管的开源模型 | 可配置 | 取决于模型 | 本地运行 |
选型注意事项:
- 入库和检索必须使用同一个嵌入模型,且向量数据库的维度需与模型一致。
- 中文应用优先选择专门优化中文的模型;混合语言场景则用多语言模型。
- 非本地运行的嵌入模型按 token 计费,合理使用缓存可大幅降低成本。
缓存机制
同一段文本通过同一嵌入模型得到的向量始终不变。LangChain 提供了CacheBackedEmbeddings,可将向量缓存到本地文件或 Redis,再次嵌入时直接读取,避免重复计算。
完整可运行代码
以下代码使用FakeEmbeddings模拟嵌入过程,并演示缓存的效果。无需任何 API Key,可直接在本地运行。
安装依赖:
pipinstalllangchain langchain-core langchain-community chromadb核心代码:
fromlangchain_community.embeddings.fakeimportFakeEmbeddingsfromlangchain_community.vectorstoresimportChromafromlangchain_core.documentsimportDocumentfromlangchain.embeddingsimportCacheBackedEmbeddingsfromlangchain.storageimportLocalFileStoreimporttime# 1. 准备文档docs=[Document(page_content="智能温控水杯支持手机 App 远程控温。"),Document(page_content="产品续航 48 小时,采用 316 不锈钢内胆。"),Document(page_content="充电时请使用 5V/2A 适配器。"),]base_embeddings=FakeEmbeddings(size=128)# 2. 无缓存嵌入start=time.time()vectorstore_no_cache=Chroma.from_documents(docs,base_embeddings,collection_name="no_cache")print(f"无缓存嵌入耗时:{time.time()-start:.4f}秒")# 3. 带缓存嵌入store=LocalFileStore("./embedding_cache/")cached_embeddings=CacheBackedEmbeddings.from_bytes_store(base_embeddings,store,namespace="test")start=time.time()vectorstore_cached=Chroma.from_documents(docs,cached_embeddings,collection_name="cached")print(f"首次嵌入(填充缓存)耗时:{time.time()-start:.4f}秒")# 4. 再次嵌入相同文档(命中缓存)start=time.time()vectorstore_cached2=Chroma.from_documents(docs,cached_embeddings,collection_name="cached2")print(f"再次嵌入(命中缓存)耗时:{time.time()-start:.4f}秒")# 5. 检索测试query="如何给水杯充电?"vectorstore=Chroma.from_documents(docs,cached_embeddings)result=vectorstore.similarity_search(query,k=1)print(f"检索结果:{result[0].page_content}")运行后可以观察到第二次嵌入的耗时显著减少,验证了缓存机制的效果。
注意:
CacheBackedEmbeddings.from_bytes_store在langchain>=0.1.0中可用。若使用更早版本,请参考官方文档的迁移指南。
国产嵌入模型集成示例
以硅基流动平台的 BGE‑M3 为例,它完全兼容 OpenAI 的 API 格式,只需修改模型名、API Key 和 Base URL 即可接入。
fromlangchain_openaiimportOpenAIEmbeddings embeddings=OpenAIEmbeddings(model="BAAI/bge-m3",openai_api_key="your_api_key",# 替换为实际 Keyopenai_api_base="https://api.siliconflow.cn/v1"# 平台代理地址)vectors=embeddings.embed_documents(["智能温控水杯","明天天气"])print(f"向量维度:{len(vectors[0])}")# 输出 1024版本兼容提示:
langchain-openai包在v0.1.0之后支持openai_api_base参数。若使用langchain>=0.3.0,推荐使用base_url替代openai_api_base,两者在过渡期均有效。
API 速览
本节汇总博客中涉及的核心 API:
| API | 所属库 | 方法签名 | 说明 |
|---|---|---|---|
FakeEmbeddings | langchain_community.embeddings.fake | __init__(size: int) | 生成指定维度的随机向量,用于测试 |
CacheBackedEmbeddings | langchain.embeddings | from_bytes_store(underlying_embeddings, document_embedding_store, namespace) | 包装嵌入模型,提供缓存能力 |
LocalFileStore | langchain.storage | __init__(root_path: str) | 本地文件系统存储,用于缓存持久化 |
Chroma | langchain_community.vectorstores | from_documents(documents, embedding, collection_name) | 从文档列表创建向量数据库 |
OpenAIEmbeddings | langchain_openai | __init__(model, openai_api_key, openai_api_base) | 调用 OpenAI 兼容接口的嵌入模型 |
Demo 示例
以下是一个完整的、可直接运行的 HTML 文件(使用 Python 后端),演示了嵌入、缓存与检索的完整流程。
运行说明:
- 将上述核心代码保存为
embedding_demo.py。 - 在终端执行
python embedding_demo.py。 - 观察控制台输出的耗时对比和检索结果。
代码说明:
- 使用
FakeEmbeddings模拟嵌入,无需真实 API Key。 - 通过
CacheBackedEmbeddings实现缓存,第二次嵌入耗时明显降低。 - 使用
Chroma向量数据库进行相似性检索,验证嵌入质量。
技术点总结:
- LangChain 统一的嵌入接口设计。
- 缓存机制的原理与实现方式。
- 向量数据库的创建与检索流程。
参考文档
官方文档
- LangChain Embeddings 概念文档
- LangChain CacheBackedEmbeddings API 参考
- LangChain Chroma 向量存储文档
- OpenAI Embeddings API 参考
参考链接
- 硅基流动平台 API 文档
- BGE‑M3 模型页面 (HuggingFace)
- Ollama 嵌入模型支持
总结
嵌入模型是连接文本与向量计算的桥梁,也是 RAG 检索质量的决定性因素之一。LangChain 通过embed_documents和embed_query两个方法统一了调用接口,配合缓存机制可有效控制成本。
无论是使用 OpenAI 还是国产 BGE 系列,掌握好嵌入模型的选型和接入方式,就能为 RAG 应用打下坚实基础。