AI Agent白手起家45: LangChain 嵌入模型实战 — 从文本到向量
2026/8/8 8:26:20 网站建设 项目流程

纲要

  • 嵌入模型的核心作用
    • 将非结构化文本转化为高维向量坐标
    • 支撑语义相似度检索,是 RAG 的基石
  • LangChain 嵌入模型接口
    • 统一封装:embed_documentsembed_query
    • 主流模型接入:OpenAI、Ollama、BGE、质谱等
  • 嵌入缓存机制
    • 原理:避免重复向量化,降低 API 调用成本
    • 实现:CacheBackedEmbeddings+ 本地文件存储
  • 国产嵌入模型集成
    • 以硅基流动平台的 BGE‑M3 为例
    • 配置代理地址与 API Key,无缝切换
  • 完整可运行代码:使用FakeEmbeddings演示嵌入、缓存与检索,无需任何外部 Key

引言

在 RAG 流水线中,文档经过加载和切片之后,必须被转换成一种机器可以理解的数学形式——向量。嵌入模型就是将文本映射为高维空间中的坐标,使得语义相近的文本在空间中彼此靠近。LangChain 为这些模型提供了统一的调用方式,并内置缓存来优化重复嵌入的性能与成本。本文将通过可运行的代码,展示如何在 LangChain 中使用嵌入模型,并接入国产模型。

嵌入模型的工作原理

嵌入模型本质上是一个“翻译器”:输入一句话(如“今天天气怎么样?”),输出一个固定长度的数字数组(向量)。语义相近的句子生成的向量距离更近,反之则更远。在 RAG 系统中,嵌入模型承担两项任务:

  1. 入库:将知识库中的文档片段逐一向量化,存入向量数据库。
  2. 检索:将用户查询向量化,在数据库中搜索距离最近的 Top‑K 个片段。

文档 / 用户查询

嵌入模型

高维向量

向量数据库存储 / 相似性搜索

LangChain 中的嵌入模型实现

所有嵌入模型都实现两个核心方法:

  • embed_documents(texts: List[str]):批量嵌入文档。
  • embed_query(text: str):嵌入单个查询。

常用嵌入模型一览

模型维度语言支持运行方式
OpenAItext-embedding-ada-0021536多语言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_documentsembed_query两个方法统一了调用接口,配合缓存机制可有效控制成本。

无论是使用 OpenAI 还是国产 BGE 系列,掌握好嵌入模型的选型和接入方式,就能为你的 RAG 应用打下坚实基础。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询