嵌入模型
通过嵌入模型转化为向量坐标,并存储到向量数据库中,再通过相似性搜索找到相关文档的过程。

- 将文本转换为数字向量表示
- 使用简单的数学运算来比较嵌入向量
- 嵌入模型是向量化的核心
- 市场上有海量的嵌入模型
- LangChain提供了标准接口
- 嵌入过程本质是一组高维坐标
- 常见的相似性算法有:
- 余弦相似度:测量两个向量之间角度的余
- 欧几里得距离:测量亮点之间的直线距离
- 点积:测量一个向量到另一个向量的投影
LangChain的嵌入实现
LangChain封装了统一的嵌入模型接口,支持多文本和单问题嵌入,强调选择模型时需注意语言适配性、嵌入维度一致性及成本控制,推荐使用多语言模型,
主要的方法:
- embed_documents:用于嵌入多个文本(文档)
- embed_query:用于嵌入单个文本(查询)
主要合作模型
| 模型名 | 模型方 | 说明 |
|---|---|---|
| OpenAIEmbeddings | openai | 多个模型,一般嵌入维度1024 |
| OllamaEmbeddings | 多方 | 可以运行多种开源嵌入模型 |
| JinaEmbeddings | Jina.ai | 顶级多语言嵌入模型 |
| ZhipuAIEmbeddings | zhipu | 中文能力较强,嵌入维度1024 |
- 嵌入模型选择需要注意模型的适配语言
- 嵌入和检索的维度要相同
- 最好选择多语言嵌入模型
- 非开源嵌入模型一样有token消耗
嵌入模型的使用示例
示例一:embed_documents 向量转化和embed_query 向量查询
1 | from langchain_openai import OpenAIEmbeddings |
示例二:缓存嵌入结果(依托于向量数据库)
需要安装依赖
1 | pip install --upgrade --quiet faiss-cpu |
示例代码
1 | from langchain.embeddings import CacheBackedEmbeddings |
示例三使用国产嵌入模型
选取硅基流动中的嵌入模型: https://cloud.siliconflow.cn/models?types=embedding
1 | import os |
向量数据库
向量数据库的作用及与关系型数据库的区别,指出向量数据库用于存储高维向量数据并支持相似性搜索,适用于图像检索、语义搜索等场景,而关系型数据库适合结构化数据的精确查询。

- 问题被嵌入向量化后进入向量库
- 使用向量搜索找到相关文档片段
向量数据库是RAG的关键组件
向量数据库中存储了所有的外挂知识
向量库本身内置算法对于检索很关键
向量库与关系型数据库区别较大
- 向量数据库
- 向量化存储
- 相似度搜索
- 高性能检索
- 关系型数据库
- 结构化存储
- 精确查询
- 事务处理
LangChain的向量数据库操作
主要方法:
- add_documents:将文本列表添加到矢量存储中
- delete:从向量存储中删除文档列表
- similarity_search:搜索与给定查询类似的文档

常用向量数据库使用
| 名称 | 开源信息 | 官网 | 支持语言 | 云服务 | 特点介绍 |
|---|---|---|---|---|---|
| Milvus | ✔️ 21.5K star | https://github.com/milvus-io/milvus | Go、Python、C++ | ✔️ | - 面向下一代的生产式AI向量数据库,支持云原生。 - 极高的检索性能,万亿向量数据的毫秒检索 - 非结构化数据的简单管理 - 高度可扩展与弹性,支持混合检索 - 统一的lambda架构,具有高可靠的故障转移 - 拥有超过1000个企业用户 |
| Faiss | ✔️ 3.2K star | https://github.com/facebookresearch/faiss | C++、Python | ❌ | - Meta团队开发 - 支持高效的相似性搜索和密集向量聚类 - 可以搜索任何大小的向量集 - 支持CPU计算和GPU计算 |
| Pinecone | ❌ | https://www.pinecone.io/ | ❌ | ✔️ | - 全托管的向量数据库,大幅减轻运维负担,用户可聚焦数据价值抽取;免费版支持500w向量存储,用法简单、价格低,能快速验证向量检索业务;特性上具备高速、准确、可扩展,还支持单元级元数据过滤、尖端稀疏-密集索引等高级功能。 |
| Chroma | ✔️ 7.4K star | https://github.com/chroma-core/chroma | Python | ❌ | - 简单:类型完整、测试全面、文档完整 - 整合:支持LangChain(Python和JS)、LlamaIndex等 - 开发流程:Python Notebook中运行的API可直接用于集群环境 - 功能丰富:查询、过滤、密度估计等 |
| LanceDB | ✔️ 1.6K star | https://github.com/lancedb/lancedb | Rust、Python、JavaScript | ❌ | - 支持存储、查询、过滤向量、元数据及多模态数据(文本、图像、视频、点云等) - 支持向量相似度搜索、全文检索和SQL语法 - 支持Python和JavaScript/Typescript - 零拷贝、自动版本控制,无需额外架构即可管理数据版本 - 支持基于GPU的向量索引 - 支持与LangChain、LlamaIndex、Pandas等生态集成 |
向量数据的操作
1.向量库的数据增加
1 | import os |
2.向量库的数据删除
根据1中的代码继续操作
1 | vector_store.delete(ids=["doc1"]) |
3.向量库的相似性搜索
根据1中的代码继续操作
1 | query = "遛狗" |
还可以使用“向量”查相似”向量“的方式来进行搜索
1 | # 将"遛狗"转化为向量,这种方式会更精确 |
注意:langchain只是在接口层面进行了封装,具体的搜索实现要依赖向量库本身的能力,比如Pinecone就可以进行元数据过滤,内存向量就不可以
以pinecone为例结合向量数据的能力进行相似性搜索
数据库地址:https://docs.pinecone.io/guides/get-started/quickstart
需要注册pinecone账号,获取key,注该数据库不是开源的
安装依赖
1 | pip install -qU langchain-pinecone pinecone-notebooks |
1 | # 向量数据库配置 |
相似性搜索支持元数据过滤
1
2
3
4
5
6
7results = vector_store.similarity_search(
"看电影",
k=1, # 召回数据条数,默认是4
filter={"source": "tweet"}, # 支持元数据的过滤
)
for res in results:
print(f"* {res.page_content} [{res.metadata}]")
通过source分数进行搜索
1
2
3
4
5
6
7results = vector_store.similarity_search_with_score(
"明天热吗?",
k=1, # 设置为1,则召回最相关的一条
filter={"source": "news"}
)
for res, score in results:
print(f"* [SIM={score:3f}] {res.page_content} [{res.metadata}]")
4. 高级使用:MMR(最大边际相关性)
注意:并非所有向量数据库都支持
该例子也是以向量数据库pinecone为示例,紧接3中的例子进行
1 | vector_store.max_marginal_relevance_search( |
5.高级使用:混合搜索
先用关键字进行过滤,再使用向量机制进行搜索
安装依赖
1 | pip install -qU pinecone-text |
1 | # 初始化pinecone数据库 |