纲要
- 嵌入模型的核心作用
- 将非结构化文本转化为高维向量坐标
- 支撑语义相似度检索,是 RAG 的基石
- LangChain 嵌入模型接口
- 统一封装:
embed_documents与embed_query - 主流模型接入:OpenAI、Ollama、BGE、质谱等
- 统一封装:
- 嵌入缓存机制
- 原理:避免重复向量化,降低 API 调用成本
- 实现:
CacheBackedEmbeddings+ 本地文件存储
- 国产嵌入模型集成
- 以硅基流动平台的 BGE‑M3 为例
- 配置代理地址与 API Key,无缝切换
- 完整可运行代码:使用
FakeEmbeddings演示嵌入、缓存与检索,无需任何外部 Key
引言
在 RAG 流水线中,文档经过加载和切片之后,必须被转换成一种机器可以理解的数学形式——向量。嵌入模型就是将文本映射为高维空间中的坐标,使得语义相近的文本在空间中彼此靠近。LangChain 为这些模型提供了统一的调用方式,并内置缓存来优化重复嵌入的性能与成本。本文将通过可运行的代码,展示如何在 LangChain 中使用嵌入模型,并接入国产模型。
嵌入模型的工作原理
嵌入模型本质上是一个“翻译器”:输入一句话(如“今天天气怎么样?”),输出一个固定长度的数字数组(向量)。语义相近的句子生成的向量距离更近,反之则更远。在 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()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()Chroma.from_documents(docs,cached_embeddings,collection_name="cached")print(f"首次嵌入(填充缓存)耗时:{time.time()-start:.4f}秒")# 4. 再次嵌入相同文档(命中缓存)start=time.time()Chroma.from_documents(docs,cached_embeddings,collection_name="cached2")print(f"再次嵌入(命中缓存)耗时:{time.time()-start:.4f}秒")# 5. 检索测试query="如何给水杯充电?"vectorstore=Chroma(docs,cached_embeddings)result=vectorstore.similarity_search(query,k=1)print(f"检索结果:{result[0].page_content}")运行后可以观察到第二次嵌入的耗时显著减少,验证了缓存机制的效果。
国产嵌入模型集成示例
以硅基流动平台的 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总结
嵌入模型是连接文本与向量计算的桥梁,也是 RAG 检索质量的决定性因素之一。LangChain 通过embed_documents和embed_query两个方法统一了调用接口,配合缓存机制可有效控制成本。
无论是使用 OpenAI 还是国产 BGE 系列,掌握好嵌入模型的选型和接入方式,就能为你的 RAG 应用打下坚实基础。