第15课:LangChain|Vector向量数据库基础|嵌入模型原理与选型指南
文章摘要 本文深入探讨了RAG系统中的两大核心技术:嵌入模型和向量数据库。嵌入模型将文本转化为高维向量,实现语义搜索而非简单关键词匹配,其中MTEB基准是评估模型质量的重要标准。主流嵌入模型可分为云端API、开源本地部署和CPU端侧三类,各有适用场景。向量数据库则通过高效索引算法实现快速相似性检索,是RAG系统的"记忆体"。文章还提供了详细的环境配置指南和模型选型建议,为构建完

文章目录
课程导读 & 学习目标
在前面几节课中,我们完整走过了LangChain的提示词工程(第5-8课)、链式编排(第9课)、记忆体系(第12-14课),已经能够构建一个不错的对话式AI应用。但如果你想让AI回答关于你自己的文档的问题(比如公司内部知识库、产品说明书、个人笔记集),单纯靠“提示词+记忆”就力不从心了——因为大模型的知识截止于训练数据,无法知道你私有的文档内容。
在RAG(检索增强生成)系统中,文档需要先通过嵌入模型转化为高维向量,再存入专门的向量数据库,才能在用户提问时快速找到最相关的内容片段。嵌入模型的质量与向量数据库的选型,直接决定了RAG应用的精准度和系统性能。嵌入模型决定检索质量的上限,向量数据库保障检索效率的底线,两者是RAG这座大厦的两块基石。
学完本节课,你将达到以下目标:
- 深入理解嵌入的本质——文本如何被转化为向量,为什么“语义相似”就等于“向量距离近”,以及MTEB等权威基准如何衡量嵌入模型质量。
- 掌握主流嵌入模型的对比与选型——从OpenAI text-embedding-3系列、通义千问、DeepSeek、Nomic到BGE,理解它们的性能、成本、隐私特点和适用场景。
- 全面了解向量数据库的分类——从入门级的Chroma,到高性能的FAISS,再到企业级的Pinecone、Milvus、pgvector,根据自身需求做出选型决策。
- 理解向量检索的核心算法和性能指标——HNSW索引、cosine相似度、Recall@K、QPS、延迟的定义和权衡。
- 完成一个完整的实战项目:使用LangChain + Chroma + 本地嵌入模型,构建一个完全离线的语义搜索系统。
前置知识与环境准备
本课涉及较多开源和云端依赖,请按如下步骤准备好运行环境。
1.1 Python版本与开发工具
继续使用前几课的langchain_course虚拟环境(Python 3.10+)。如果尚未创建环境,请参考第1课的依赖安装命令。
# 激活虚拟环境
source venv/bin/activate # Mac/Linux
# venv\Scripts\activate # Windows
# 升级pip
pip install --upgrade pip
1.2 依赖包安装
# 核心依赖
pip install langchain==0.3.7 langchain-core==0.3.21 langchain-openai==0.2.8 python-dotenv==1.0.1
# 向量存储相关
pip install chromadb faiss-cpu
# 本地嵌入模型相关(如果使用Ollama)
pip install langchain-ollama
# 文本分块工具(后续RAG课程会用到)
pip install langchain-text-splitters
# 验证安装
python -c "import chromadb; import faiss; print('✓ 向量库导入成功')"
python -c "from langchain_ollama import OllamaEmbeddings; print('✓ 本地嵌入支持导入成功')"
1.3 API密钥与模型选择
本课时涉及多种嵌入方案的代码演示,建议如下配置:
- OpenAI嵌入模型:如果你有OpenAI API Key,在
.env中添加OPENAI_API_KEY=sk-xxx。本课主要使用text-embedding-3-small,它生成1536维向量,成本低、效果好。 - 阿里云通义千问嵌入:备选方案,如果你想使用国产云端模型。
- 本地嵌入模型(推荐,零成本) :使用Ollama部署
nomic-embed-text-v2-moe。这是Nomic AI开源的Apache 2.0多语言嵌入模型,支持约100种语言,总参数475M但推理时仅激活305M,在开源模型中表现卓越。
nomic-embed-text-v2-moe通过Matryoshka嵌入技术训练,可在存储成本上降低3倍且性能降幅极小,非常适合学习和原型开发。安装命令:
ollama pull nomic-embed-text-v2-moe
如果网络不稳定或空间有限,也可选择参数量更小的
nomic-embed-text(137M参数)或BAAI/bge-small-en-v1.5(通过HuggingFace加载)。
1.4 本节与后续章节的连贯性
本课是RAG(Retrieval-Augmented Generation)篇章的开篇第一课。第16-18课将依次学习文档加载器(Document Loaders)、文本分割器(Text Splitters)、检索器(Retrievers),最终在第19课完成一个完整的RAG问答系统。本节课所学的嵌入模型和向量数据库,正是整个RAG流水线中承上启下的核心环节。
核心概念深度拆解
2.1 为什么需要“向量化”——从关键词匹配到语义理解的跨越
在传统的关键词检索系统中,搜索“AI”只能匹配到包含字母“AI”的文档,无法找到包含“人工智能”的片段。这是因为计算机只会“看字”,不会“懂意”。
嵌入模型正是解决这一问题的核心武器:它将文本转换成一串数字(即高维向量),这串数字能够捕捉文本的深层语义信息。语义相似的文本在向量空间中彼此靠近,语义不同的文本则彼此远离。把文本转化为向量后,计算机就可以通过计算两个向量的距离来判断它们的语义相似度,从而实现“语义搜索”而非简单的“关键词匹配”。
这种技术的应用场景极其广泛:在RAG系统中,它是从知识库中检索相关文档的基础;在搜索引擎中,它是实现语义搜索的底层支撑;在推荐系统中,它用于用户偏好与内容之间的匹配计算。
2.2 嵌入模型的本质与工作原理
技术本质:嵌入模型是一种经过大规模预训练的神经网络(通常是基于Transformer架构的深度学习模型)。它接收一段文本作为输入,通过网络中多层神经网络的处理,最终输出一个固定长度的浮点数向量,这个向量就是文本的“语义指纹”。
整个流程分为三个环节:
- 离线阶段(文档处理) :将知识库中的每一份文档送入嵌入模型,生成对应的向量并存入向量数据库。
- 在线阶段(用户查询) :将用户的自然语言问题同样送入同一个嵌入模型,得到查询向量。
- 相似度匹配:在向量数据库中寻找与查询向量最接近的文档向量,返回对应的原始文本,用于增强大模型的回答。
这种设计确保了“问题”和“文档”被映射到同一个语义空间中,使得语义匹配成为可能。
2.3 衡量嵌入模型质量的标尺:MTEB基准测试
MTEB(Massive Text Embedding Benchmark)是目前业界最权威的嵌入模型评测基准。它涵盖58个数据集和112种评估任务,从检索、聚类、分类、语义文本相似度等七个维度对模型进行综合打分。
2026年初,嵌入模型领域迎来了一波重大更新,各大厂商纷纷发布新一代模型。在最新的MTEB v2排名中,微软开源的Harrier系列以74.3分的成绩位居榜首,紧随其后的是Google的Gemini Embedding 2(68.32分)和Jina v5-text-small(71.7分)。开源阵营中,通义千问Qwen3-Embedding-8B以70.58分的表现成为最佳开源多语言模型,OpenAI的text-embedding-3-large以64.6分保持了很强的综合性能。
MTEB分数反映了模型在检索、聚类、分类等多个维度的综合能力。分数越高,意味着模型对不同文本信息的编码越精确,在相似度匹配时的精密度越高。但对于开发者和架构师而言,高分模型往往参数规模庞大,必须结合自己的硬件条件、成本预算和延迟要求综合权衡。如果你是在自己的笔记本上进行原型开发,MTEB排名50名开外的轻量模型可能比排名前5的大模型更适合你。
MTEB未告诉你的真相:在实际工程中,还应该关注模型在你的实际硬件上的推理速度、使用INT8量化后的质量损失、二进制向量中的表现,以及混合检索(Hybrid Search)中的效果。
2.4 主流嵌入模型对比与选型指南
根据部署方式的不同,嵌入模型可以分为三类,每一类都有明确的适用场景。
云端API方案适合追求最高检索质量、不想管理模型部署、且有预算的企业。OpenAI的text-embedding-3-small成本极低,1536维向量在MTEB上表现优异,开发便利。text-embedding-3-large质量更高但维度高达3072,成本和延迟更高。通义千问和DeepSeek也提供嵌入API,中文语境下效果极佳。
开源本地部署方案适合关注数据隐私且有GPU资源的用户。通义千问Qwen3-Embedding系列从0.6B到8B参数,中文优化极佳。BGE-M3支持多语言且支持稀疏检索,Nomic Embed Text V2是首个开源的MoE架构嵌入模型,支持Matryoshka维度裁剪。
纯CPU端侧模型适合资源受限的边缘设备或在普通笔记本上开发。all-MiniLM-L6-v2虽然MTEB分数仅56.3,但384维、仅22MB大小,在消费级CPU上飞快速检索。
| 模型类别 | 代表模型 | MTEB 检索分 | 维度 | 适合场景 |
|---|---|---|---|---|
| 云端商用 | text-embedding-3-small | ~62 | 1536 | 追求质量,不在乎成本 |
| 开源强基 | Qwen3-Embedding-8B | 70.6 | 4096 | 开源最强多语言,需GPU |
| 开源平衡 | nomic-embed-text-v2-moe | ~59 | 768 | 完全本地,数据隐私 |
| CPU轻量 | all-MiniLM-L6-v2 | ~56 | 384 | 极速原型,边缘部署 |
选型落地决策路径:如果你追求最高检索质量且有OpenAI API预算,优先选用text-embedding-3-small。如果你的应用必须私有化部署且不能有任何数据外流,Nomic系列是最平衡的选择。如果你有GPU资源且预算敏感,Qwen3-Embedding或BGE-M3是绝佳的开源备选。
2.5 向量数据库的演变与核心价值
向量数据库是指经过专门优化,对高维向量进行高效相似性搜索的数据库系统。它通过指标算法将相似的向量组织到相近的存储空间中,实现毫秒级查询响应。
向量数据库并非凭空生长,而是建立在向量索引算法之上。现代向量数据库普遍采用分层存储设计:内存中缓存热点数据,SSD存储温数据,对象存储承载冷数据。这种设计既保证了查询性能,又降低了存储成本。
当我们把嵌入模型比作“给句子测DNA”的实验室,向量数据库就是存储这些DNA样本的“冷冻库”,并允许我们快速找到相似的样本。嵌入模型负责将文本转化为向量,向量数据库负责存储和检索这些向量,两者相辅相成,共同构成RAG系统的“记忆体”。
2.6 向量检索核心算法
相似度搜索的朴素实现是计算查询向量与库中每一个向量的精确距离。随着向量数量从几千增长到几亿甚至几十亿,逐一遍历是不可接受的。这就是近似最近邻(ANN)搜索登场的原因。
HNSW是目前最流行的高性能ANN算法。它构建一个分层的图结构。搜索时从顶层沿边缘“跳跃导航”,直接逼近候选区。HNSW是当前多数向量数据库的默认索引。IVF + PQ(倒排文件 + 乘积量化) 先用聚类算法将向量分桶。查询时只需搜索最近的目标桶,并利用量化压缩大幅降低每个向量的存储空间。在需要控制成本时,IVF_PQ能把存储空间压缩到原始数据的几十分之一。
2.7 向量数据库主要分类
入门级选型首选Chroma。它是与LangChain集成度最高的轻量级向量库,适合学习和小型项目。FAISS(Facebook AI Similarity Search) 来自Meta FAIR团队。它追求极致的纯搜索性能,支持高达十亿级数据,但不以普通DB形式直接提供开箱即用的持久化和CRUD。
云原生原生架构的Pinecone是全托管向量数据库,自动处理扩容和有状态运维。缺点是完全闭源,对隐私和预算敏感的团队可能望而却步。Milvus最受大型企业和开源基金会的青睐,支持多达数十个索引算法和GPU加速。Qdrant用Rust语言编写,追求内存效率和计算正确性。pgvector在PostgreSQL生态中将向量检索融为一体,最适合不需要额外维护一套新DB的落地方式。
Chroma vs FAISS——初学者最常问的问题:
| 维度 | Chroma | FAISS |
|---|---|---|
| 开发/运营团队 | Chroma AI 公司 | Meta FAIR 团队 |
| 定位 | 轻量级本地向量库,专为LLM工作流设计 | 工业级高性能相似性搜索库 |
| 安装和使用难度 | 极低单行pip安装 | Windows或Linux有时需额外编译 |
| 性能特性 | 适合<100万向量的中小规模 | 百万级甚至十亿级规模仍保持极速 |
| 持久化 | 默认支持,开发体验丝滑 | 手动保存索引,加载流程略复杂 |
| 元数据存储 | 原生支持过滤条件 | 需外部系统补充元数据筛选 |
底层运行原理剖析
3.1 嵌入模型推理详解
以开源BGE模型为例,当输入“人工智能的现状是什么”进入一个BERT变体模型后——模型首先进行分词(Tokenization),将句子切成较小的“词元”。每个词元会映射成固定的ID。接着通过Embedding层,每个词元变成初始向量。经过12层或更多Transformer层进行语义交互,最终进行序列级别的聚合(如取平均池化),输出一个固定长度向量。
语言模型在不同层凝聚出不同粒度的信息。因此不同嵌入模型的向量维度天差地别,例如all-MiniLM-L6-v2维度仅为384,text-embedding-3-small是1536,Qwen3-Embedding-8B达到惊人的4096维度。高维度往往代表能记录更丰富多样化的语义特征。
3.2 嵌入模型的量化与优化策略
业内一般有两种常见优化路径:模型权重量化和向量精度量化。
推理性能瓶颈主要体现在首次编码文档时的模型推理和用户查询时的编码速度。通过INT8量化将模型权重从FP32降到INT8可以减少模型体积,在CPU上提速3倍以上,但质量损失很少(可控制在百分之几)。如果使用NVIDIA GPU,INT8反而变慢,此时FP16是最优选择。对于向量精度,使用bfloat16存储向量比FP16质量零损失但存储和内存占用减半。极端情况下,二进制可将每个维度压缩至一个比特,存储降至原来的三十二分之一。
核心API/组件源码解读
4.1 LangChain Embeddings 统一接口
from langchain_core.embeddings import Embeddings
class MyCustomEmbeddings(Embeddings):
def embed_documents(self, texts: List[str]) -> List[List[float]]:
"""批量嵌入文档,供离线的索引构建调用"""
pass
def embed_query(self, text: str) -> List[float]:
"""嵌入单次查询,供在线检索调用"""
pass
async def aembed_documents(self, texts: List[str]) -> List[List[float]]:
"""异步批量嵌入"""
pass
async def aembed_query(self, text: str) -> List[float]:
"""异步单查询嵌入"""
pass
所有嵌入模型类都实现了Embeddings抽象基类。LangChain在调用向量数据库from_documents时会自动调用embed_documents对整个文档集进行向量化。而在similarity_search时则自动调用embed_query对用户查询做向量化,保证使用相同的模型生成完全同语义空间的向量。
4.2 OpenAIEmbeddings 参数详解
OpenAI嵌入模型支持多维度截断(类似于Matryoshka机制),意味着如果你觉得1536维占用太大,可以减少dimensions参数生成子向量。本地嵌入模型OllamaEmbeddings则直接指向已经下载的model名称。
4.3 Chroma 向量存储核心 API
from langchain_community.vectorstores import Chroma
vectorstore = Chroma.from_documents(
documents=docs, # 文本片段列表
embedding=embeddings, # Embeddings 实例
persist_directory="./db" # 持久化目录
)
docs = vectorstore.similarity_search(
query="用户问题",
k=4 # 返回最相似的4个文档
)
手把手项目实战教学
实战一:使用OpenAI嵌入模型构建语义搜索原型
目标:体验text-embedding-3-small的高质量向量语义检索能力。
实战二:完全本地化——Nomic Embed + Chroma 离线RAG基石
目标:使用nomic-embed-text-v2-moe在Ollama中运行,完全不依赖任何云端API。
实战三:中文场景优选——通义千问嵌入 + 高性能FAISS
目标:针对纯粹中文场景的用户,如何搭建高吞吐、低成本的向量搜索系统。
实战四:国产大模型嵌入 + FAISS 大规模中文向量检索
目标:对于真正的海量中文RAG,全面拥抱国产嵌入模型+FAISS的商业级架构。
完整可运行Python代码
本最佳范例演示了轻量级与本地化两条路线:Chroma + OpenAI(快速原型)和 Ollama + Chroma(完全离线)。读者可直接复制运行,体验完整向量存储与检索流程。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""LangChain 第15课 向量数据库与嵌入模型完整演示"""
import os
from dotenv import load_dotenv
load_dotenv()
# ========== 1. 语义搜索入门:用 ChatGPT Embedding 做简单的语义检索 ==========
def demo_semantic_search_openai():
"""演示用 OpenAI text-embedding-3-small 进行语义检索"""
print("\n🧠 1. OpenAI嵌入语义检索")
if not os.getenv("OPENAI_API_KEY"):
print("⚠️ 没有 OPENAI_API_KEY,跳过。如需演示请配置。")
return
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
# 小巧的文档集
docs = [
"LangChain是专为构建大型语言模型应用而设计的框架,提供灵活链式调用接口,兼容多种大语言模型。",
"RAG核心技术之一:使用检索器从外部数据库获取相关文档,增强模型生成质量,有效减少幻觉。",
"大语言模型是一个能理解自然语言、并生成流畅、连贯文本的深度神经网络。",
"矢量数据库通过向量嵌入将文本高维编码,支持语义检索而不是简单关键词匹配。"
]
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_texts(docs, embeddings)
query = "如何减少大模型的幻觉现象?"
results = vectorstore.similarity_search(query, k=2)
print(f"查询:{query}")
for r in results:
print(f" - {r.page_content}")
# ========== 2. 完全本地化 Nomic Embed + LangChain ==========
def demo_local_nomic_embed():
"""展示如何完全离线运行本地嵌入模型 + 向量数据库(适合隐私敏感项目)"""
print("\n🔒 2. 本地 Nomic Embed + Chroma(零云端)")
try:
from langchain_ollama.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import Chroma
EMBED_MODEL_NAME = "nomic-embed-text-v2-moe"
print(f" 正在加载本地嵌入模型 {EMBED_MODEL_NAME} ...")
embeddings = OllamaEmbeddings(model=EMBED_MODEL_NAME)
documents = [
"RAG 系统能够大规模外挂知识库,让大模型回答私有文档里的特定信息。",
"嵌入模型是决定RAG检索质量上限的关键因素。现在很多开源嵌入模型效果已经很接近商用闭源模型。",
"Ollama 可以将多种大语言模型和嵌入模型无缝整合,支持多平台、完全本地化部署。"
]
vectorstore = Chroma.from_texts(documents, embeddings)
query = "什么是检索增强生成(RAG)?"
docs = vectorstore.similarity_search(query, k=2)
print(f"问题:{query}")
for d in docs:
print(f" 相关片段: {d.page_content[:100]}...")
except ImportError:
print("❌ 请先安装 langchain-ollama 并确保已经用 ollama pull 下载 nomic 嵌入模型。")
except Exception as e:
print(f"⚠️ 本地模型执行失败,如果是第一次运行请确保 ollama serve 后台运行,并已下载模型:{e}")
# ========== 3. 跨模型切换 —— 优雅工厂模式 ==========
def demo_embedding_factory():
"""演示使用配置切换多个嵌入模型"""
print("\n🔄 3. 多嵌入模型工厂切换")
from langchain_openai import OpenAIEmbeddings
try:
from langchain_ollama.embeddings import OllamaEmbeddings
except ImportError:
pass
class EmbeddingFactory:
@staticmethod
def get_embedding(provider="nomic"):
if provider == "openai":
if os.getenv("OPENAI_API_KEY"):
return OpenAIEmbeddings(model="text-embedding-3-small")
else:
raise ValueError("缺少OPENAI_API_KEY")
elif provider == "nomic":
return OllamaEmbeddings(model="nomic-embed-text-v2-moe")
elif provider == "hf-mini":
from langchain_huggingface import HuggingFaceEmbeddings
return HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
else:
return OllamaEmbeddings(model="nomic-embed-text")
try:
embed_model = EmbeddingFactory.get_embedding()
docs = ["嵌入模型是RAG流程中承上启下的核心组建。"]
vectorstore = Chroma.from_texts(docs, embed_model)
result = vectorstore.similarity_search("RAG的核心含义", k=1)
print(f"工厂自动选择嵌入模型,检索结果:{result[0].page_content if result else '无文档'}")
except Exception as e:
print(f"⚠️ 无法创建所有模型组合,请根据正确配置重试。错误:{e}")
if __name__ == "__main__":
print("=" * 60)
print("LangChain 第15课:向量数据库与嵌入模型完整演示")
print("=" * 60)
demo_semantic_search_openai()
demo_local_nomic_embed()
demo_embedding_factory()
环境依赖安装命令
# 激活虚拟环境
source venv/bin/activate # Mac/Linux
# venv\Scripts\activate # Windows
# LangChain 核心
pip install langchain==0.3.7 langchain-core==0.3.21 langchain-openai==0.2.8 python-dotenv==1.0.1
# 向量数据库
pip install chromadb faiss-cpu
# 本地嵌入式模型支持和文本分块器
pip install langchain-ollama langchain-text-splitters
# 安装 HuggingFace 集成(备选)
pip install langchain-huggingface
# 验证环境
python -c "import chromadb; import faiss; from langchain_ollama import OllamaEmbeddings; print('✓ 环境准备完毕')"
常见报错坑点与避坑方案
坑1:初次调用 OllamaEmbeddings 报连接错误
现象:Connection refused。
解决方案:打开新的终端窗口输入ollama serve。如果没有显示服务已启动,就手动执行。也可以用ollama pull nomic-embed-text-v2-moe确保模型已经下载,让服务自动拉起。
坑2:大文档直接嵌入而不预先切分,导致检索不到细节
现象:用户搜索一个非常具体的问题,向量返回的相关性都非常低。
原因:整个长文档被丢进嵌入模型后,产生的向量是整个文档的语义平均化,失去了具体段落的特殊性。
解决方案:在构建向量库前一定要用RecursiveCharacterTextSplitter做文本分块。
坑3:OpenAI API速率限制导致批量索引中断
解决方案:使用max_retries参数,或者在Embeddings初始化时加入请求之间的显式延迟。
坑4:向量库检索召回质量极低
检查清单:嵌入模型是否与查询时使用的是同一个版本;是否合理设置了k值;文档切分的chunk_size是否合理;数据库中真的有相关答案。
坑5:Chroma默认只会保存内存,重启数据丢失
解决方案:在from_documents时传入persist_directory参数。下次加载时用Chroma(persist_directory="./db", embedding_function=embeddings)。
本节核心知识点总结
📌 嵌入模型是实现语义搜索的基础。它将文本转化为向量,语义相似度≈向量距离。文本嵌入是RAG流程的基石,决定了检索质量的上限。最接近当下前沿的嵌入模型三巨头是微软Harrier系列、Google Gemini Embedding 2和OpenAI text-embedding-3-large。选型时应综合考虑MTEB分数、维度、部署方式和隐私成本。
📌 向量数据库为海量向量提供存储与检索。Chroma库是入门学习和小项目的最佳候选;FAISS追求极致的纯检索性能,适合大规模高吞吐场景;Milvus和Pinecone满足企业级的分布式和跨AZ高可用需求;pgvector适合和现有PostgreSQL生态融合的团队。对于海量数据场景,务必了解HNSW索引、维度量化压缩与冷热数据分层。
📌 LangChain提供统一的Embeddings接口。无论底层是哪个提供商,API都可以无痛替换嵌入模型,这为开发阶段的调优和部署切换提供了巨大便利。
📌 嵌入模型的质量决定了RAG的上限。你接下来要构建的文档问答系统能有多少召回率、多少精准度,很大程度上由嵌入模型决定。同样,向量数据库的选型决定系统的吞吐效率和成本。
课后练习题
选择题
1. 以下哪一选项最能解释“为什么嵌入模型能让计算机理解语义”?
A. 它直接将文本翻译成英文后,用英文字典匹配。
B. 它将相似含义的文本映射到高维向量空间中距离相近的区域。
C. 它把所有数据统一成一个巨大的表格检索。
D. 它仅缓存最常查询的内容。
答案及解析:B。嵌入模型通过学习将文本映射到向量空间,使得语义相似的向量在空间中彼此靠近。
2. 以下哪个不属于向量数据库近似最近邻(ANN)索引算法?
A. HNSW
B. IVFPQ
C. B-Tree
D. 这些都属于
答案及解析:C。B-Tree是传统关系型数据库的索引数据结构,不是专门为向量相似度搜索而设计的ANN。
简答题
3. 请用你自己的话解释,在RAG系统中,用户查询向量和文档向量为什么要由同一个嵌入模型生成。
参考答案:嵌入模型负责将自然语言映射到一个语义向量空间。同一个模型保证了文本编码的一致性,即两个句子的向量距离能准确反映出它们在人类认知上的语义差距。
实践题
4. 配置Ollama + nomic-embed-text本地模型 + Chroma,编写一个本地RAG基础组件。要求完全离线运行,并测试相似度检索。
参考答案:
from langchain_ollama import OllamaEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_text_splitters import RecursiveCharacterTextSplitter
texts = ["RAG通过外部知识库显著增强了模型生成能力……"]
splitter = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=30)
chunks = splitter.create_documents(texts)
embeddings = OllamaEmbeddings(model="nomic-embed-text-v2-moe")
vectorstore = Chroma.from_documents(documents=chunks, embedding=embeddings, persist_directory="./local_db")
query = "RAG的主要优势是什么?"
results = vectorstore.similarity_search(query, k=1)
print(results[0].page_content)
🔗《30节课 LangChain 从入门到精通》系列课程导航
🌟 感谢您耐心阅读到这里!
💡 如果本文对您有所启发欢迎:
👍 点赞📌 收藏 📤 分享给更多需要的伙伴。
🗣️ 期待在评论区看到您的想法, 共同进步。
🔔 关注我,持续获取更多干货内容~
🤗 我们下篇文章见~
更多推荐


所有评论(0)