完成文本分块后,下一步就是文本嵌入(也叫向量化)。人类的自然语言无法直接被计算机计算相似度,而嵌入模型的作用,就是把文本块转换为固定维度的稠密向量,将文本的语义信息编码为数值表示,让计算机可以通过向量计算,判断两段文本的语义相似度。

嵌入模型的核心原理与价值

嵌入模型的核心逻辑是:语义相似的文本,在向量空间中的距离更近

举个简单的例子:

  • 句子1:"我家养了一只猫",嵌入向量为[1.2, 3.4, 0.8, 2.1]
  • 句子2:"我家有一只宠物猫咪",嵌入向量为[1.1, 3.5, 0.9, 2.0]
  • 句子3:"今天天气很好,适合出去旅游",嵌入向量为[5.6, 0.2, 3.1, 1.2]

通过计算余弦相似度,句子1和句子2的向量夹角极小,相似度极高;而句子1和句子3的向量距离极远,相似度极低。这就是RAG语义检索的核心基础。

嵌入模型为RAG系统提供了核心能力支撑:

  1. 语义匹配:通过向量相似度计算,实现基于语义的匹配,而非传统的关键词匹配,解决同义词、近义词、句式变换的匹配问题;
  2. 语义检索:用户查询无需与知识库中的文本有完全一致的关键词,只需语义相关,就能检索到对应的内容;
  3. 信息聚类与挖掘:通过向量聚类,可对知识库内容进行分类、去重,优化知识库结构。

LangChain中嵌入模型的核心API

LangChain对嵌入模型做了统一的抽象封装,无论使用闭源API还是开源本地模型,都使用统一的接口,核心提供两个方法:

  • embed_query(text: str):针对用户查询语句的向量化,输入单个字符串,返回对应的向量;
  • embed_documents(texts: List[str]):针对文档块的批量向量化,输入字符串列表,返回对应的向量列表。

示例:嵌入模型使用

import os

from openai import OpenAI

input_text = "衣服的质量杠杠的"

client = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)

completion = client.embeddings.create(
    model="text-embedding-v4",
    input=input_text
)
# 向量信息
print(completion.model_dump_json())
# 向量维度
print(completion.data[0].embedding.__len__())

示例:开源嵌入模型使用(以BGE为例)

国内生产环境中,更推荐使用开源嵌入模型,可本地部署,无数据泄露风险,且中文效果远超通用模型。

# 前置依赖:pip install langchain-huggingface
from langchain_huggingface import HuggingFaceEmbeddings

# 初始化BGE开源嵌入模型(中文场景首选)
embeddings_model = HuggingFaceEmbeddings(
    model_name="BAAI/bge-large-zh-v1.5",  # 中文大模型,效果标杆
    model_kwargs={"device": "cuda"},  # 有GPU用cuda,无GPU用cpu
    encode_kwargs={"normalize_embeddings": True},  # 归一化,适配余弦相似度计算
)

# 向量化用法与OpenAI模型完全一致
query = "RAG的核心作用是什么?"
query_embedding = embeddings_model.embed_query(query)
print(f"开源模型向量维度:{len(query_embedding)}")

2.3 开源vs闭源嵌入模型选型指南

模型类型

代表产品

优势

劣势

适用场景

闭源API嵌入模型

OpenAI text-embedding系列、Azure OpenAI嵌入服务、阿里云通义千问嵌入模型

开箱即用、无需算力、维护成本低、多语言效果均衡

数据需上传至第三方服务器,有隐私风险;按Token计费,大规模知识库成本高;无法微调适配业务场景

快速原型验证、非敏感数据场景、中小企业无GPU算力场景

开源本地嵌入模型

BGE系列、M3E系列、bge-m3、gte系列

可本地部署、数据隐私可控、可微调适配业务场景、中文效果更优、无长期使用成本

需要GPU算力支持、有一定的部署和维护成本

企业私有知识库、敏感数据场景、生产环境落地、需要定制化优化的场景

中文场景选型推荐

  • 轻量级场景:bge-small-zh-v1.5,CPU即可运行,效果远超同体量模型;
  • 通用生产场景:bge-large-zh-v1.5,中文效果标杆,平衡精度与性能;
  • 多语言/长文本场景:bge-m3,支持多语言、超长文本,同时适配稠密检索、稀疏检索、多向量检索。

向量存储(Vector Stores):RAG的知识底座

介绍

完成文本向量化后,我们需要一个专门的数据库来存储文本向量与对应的原始文档,同时提供高效的相似性检索能力,这就是向量数据库(Vector Stores)。

传统的关系型数据库无法高效处理高维向量的相似度计算,而向量数据库专为向量数据设计,通过向量索引算法,实现千万级、亿级向量的毫秒级相似性检索,是RAG系统的知识底座。

理解向量存储

将文本向量化之后,下一步就是进行向量的存储。这部分包含两块:

向量的存储 :将非结构化数据向量化后,完成存储

向量的查询 :查询时,嵌入非结构化查询并检索与嵌入查询“最相似”的嵌入向量。即具有相似性 检索能力

向量数据库的核心能力

向量数据库的核心能力,围绕RAG的核心需求设计:

  1. 向量存储:存储高维向量数据,同时关联对应的原始文本、元数据,实现向量与原始内容的一一对应;
  2. 高效相似性检索:内置多种向量索引算法(如HNSW、IVF),支持海量向量的毫秒级相似度查询;
  3. 相似度计算:内置多种距离计算方式(余弦相似度、欧氏距离、内积),适配不同的嵌入模型与检索场景;
  4. 元数据过滤:支持检索时基于元数据进行条件过滤,缩小检索范围,提升精准度;
  5. 持久化存储:支持向量数据的磁盘持久化,避免程序重启后数据丢失,适配生产环境。

向量数据库的理解

向量数据库是一种专门用于存储和检索高维向量数据的数据库。以摄影师管理照片为例,传统的关系型数据库(如 MySQL、PostgreSQL)可以存储照片的元数据,如拍摄时间、地点、相机型号等,但当你希望根据照片的内容(颜色、纹理、物体等)进行搜索时,传统数据库就难以满足需求。

向量数据库的核心思路是:先将照片的内容通过特征提取算法映射到一个高维空间,每张照片对应空间中的一个点,再通过原点与这些点构成向量。向量化后,就可以利用向量之间的距离或相似度进行搜索。当用户查询时,数据库返回与查询向量最相似的照片,而不是精确匹配,实现模糊搜索。

这种方法不仅适用于照片,也可以用于视频、商品等其他素材,实现以图搜图、视频相关推荐、相似商品推荐等功能,大幅提升检索效率和用户体验。

主流向量数据库对比与选型

LangChain集成了超过50种向量数据库:

向量数据库

类型

核心优势

劣势

适用场景

Chroma

本地嵌入式开源数据库

开箱即用、零配置、API极简、完美适配LangChain、支持持久化

分布式能力弱,不支持超大规模数据

原型验证、个人项目、中小规模知识库(百万级向量以内)

FAISS

Meta开源的向量检索库

性能极强、算法丰富、轻量化、CPU/GPU都适配

无内置持久化(需自行实现)、无服务端、分布式能力弱

高性能检索场景、本地部署、与其他数据库搭配使用

Milvus

开源分布式向量数据库

专为生产环境设计、支持分布式部署、亿级向量毫秒级检索、完善的运维工具、云原生适配

部署复杂度高、需要集群资源、有一定的运维成本

企业级生产环境、大规模知识库(千万级以上向量)、高并发检索场景

PGVector

PostgreSQL的向量扩展

基于关系型数据库,可同时存储结构化数据与向量数据、事务支持、无需额外维护一套数据库

极致性能弱于专用向量数据库、超大规模数据适配性一般

已有PostgreSQL业务、结构化+非结构化混合存储场景、中小规模企业应用

Pinecone

云托管向量数据库服务

开箱即用、Serverless架构、无需运维、支持弹性扩缩容、超大规模数据适配

闭源收费、数据需上传至云端、国内访问有网络限制、隐私合规风险

海外业务、快速上线、无运维能力的团队、非敏感数据场景

选型法则

  • 学习/原型验证:首选Chroma,零配置,与LangChain无缝衔接,快速可跑通全流程;
  • 本地部署/中小规模生产:首选FAISS+本地持久化,或Chroma持久化模式;
  • 企业级大规模生产:首选Milvus,分布式架构,适配高并发、海量数据场景;
  • 已有PostgreSQL业务:首选PGVector,减少技术栈复杂度,降低运维成本。

向量数据库实战:存储、基础检索与持久化

这里我们以Chroma为例,详解向量数据库的完整操作,包括数据入库、持久化、多种检索方式。

 Chroma实战

前置依赖pip install langchain-chroma chromadb

1. 基础存储与检索(内存模式)
import os

from langchain_community.document_loaders import TextLoader
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_text_splitters import RecursiveCharacterTextSplitter

# 初始化嵌入模型
embeddings = DashScopeEmbeddings(model="text-embedding-v4",
                        dashscope_api_key=os.getenv("DASHSCOPE_API_KEY")
                        )
# 加载并拆分文档
loader = TextLoader("./data/rag_intro.txt", encoding="utf-8")
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=20)
split_docs = text_splitter.split_documents(docs)

# 文档向量化并存储到Chroma(内存模式)
db = Chroma.from_documents(
    documents=split_docs,
    embedding=embeddings,
)

# 基础相似性检索
query = "RAG的核心优势是什么?"
# 检索最相关的3个文档块
result_docs = db.similarity_search(query, k=3)

# 查看检索结果
print(f"检索到相关文档数量:{len(result_docs)}")
for i, doc in enumerate(result_docs):
    print(f"\n结果{i+1}:{doc.page_content}")
    print(f"元数据:{doc.metadata}")

2. 持久化存储与加载

内存模式下,程序重启后数据会丢失,生产环境必须使用持久化模式:

# 1. 数据持久化到磁盘
db = Chroma.from_documents(
    documents=split_docs,
    embedding=embeddings,
    persist_directory="./chroma_db",  # 指定持久化目录
    collection_name="enterprise_knowledge_base",  # 指定集合名称,区分不同知识库
)

# 2. 程序重启后,直接加载已持久化的向量库
db = Chroma(
    persist_directory="./chroma_db",
    embedding_function=embeddings,
    collection_name="enterprise_knowledge_base",
)

# 3. 加载后即可直接检索
query = "RAG如何缓解大模型幻觉?"
result_docs = db.similarity_search(query, k=2)
for doc in result_docs:
    print(doc.page_content)
3. 进阶检索能力

Chroma提供了多种进阶检索方式,适配不同的业务场景:

# 带相似度分数的检索(L2距离,分数越小越相似)
docs_with_score = db.similarity_search_with_score(
    query="RAG的核心优势是什么?",
    k=3
)
for doc, score in docs_with_score:
    print(f"相似度分数:{score:.4f},内容:{doc.page_content[:50]}")

# 基于向量的直接检索
query = "RAG的核心优势是什么?"
query_embedding = embeddings.embed_query(query)
docs = db.similarity_search_by_vector(query_embedding, k=3)

# 元数据过滤检索(仅检索指定来源的文档)
docs = db.similarity_search(
    query="RAG的核心优势是什么?",
    k=3,
    filter={"source": "./data/rag_intro.txt"}  # 元数据过滤条件
)

# MMR检索(最大边际相关性,平衡相关性与多样性,避免结果冗余)
docs = db.max_marginal_relevance_search(
    query="RAG的核心优势是什么?",
    k=3,
    lambda_mult=0.7  # 0=最大多样性,1=最小多样性
)
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐