Type RAG
Created Aug 08, 2026, 06:30:00 / Updated Aug 08, 2026, 06:30:00
Views — / Comments — / Words 5,308
向量数据库与索引
向量数据库阶段把切片后的文本转换为向量,并将向量、原文、唯一 ID 和元数据一起持久化。它负责索引构建、过滤条件、相似度搜索和数据生命周期管理,不负责生成最终答案。 | 边界 | 数据 | 关键字段或返回值 | | --- | --- | --- | | 输入 | 或文本块 | 、 、 ,必要时带已有 | | E...
向量数据库阶段把切片后的文本转换为向量,并将向量、原文、唯一 ID 和元数据一起持久化。它负责索引构建、过滤条件、相似度搜索和数据生命周期管理,不负责生成最终答案。
| 边界 | 数据 | 关键字段或返回值 |
|---|---|---|
| 输入 | Node[] 或文本块 | id_、text、metadata,必要时带已有 embedding |
| Embedding 输出 | list[float] | 固定维度的浮点向量;查询和文档必须使用兼容模型 |
| 入库记录 | 向量记录 | id、embedding、document/text、metadata |
| 索引输出 | VectorStoreIndex 等索引对象 | 保存索引配置并提供 as_retriever()、as_query_engine() 等入口 |
| 持久化输出 | Collection / 持久化目录 | 数据库文件、集合配置、docstore、index store 或框架存储上下文 |
embed_model.get_text_embedding(text) 通常返回一个浮点数列表。VectorStoreIndex.from_documents(...) 或 VectorStoreIndex(nodes, ...) 返回索引对象。调用入库接口时,很多数据库返回新增 ID、操作结果或空值,不能把它当作检索结果。
flowchart LR
A[Node 列表] --> B[准备唯一 ID 与 metadata]
B --> C[Embedding 模型]
C --> D[文本向量]
D --> E{向量库选型}
E -->|本地 / 原型| F[ChromaDB]
E -->|分布式 / 大规模| G[Milvus 等]
F --> H[Collection / Vector Store]
G --> H
H --> I[StorageContext / VectorStoreIndex]
I --> J[持久化]
J --> K[Retriever / QueryEngine]
K --> L[进入查询检索]
StorageContext 或索引对象。以下内容保留源文档的全部正文、表格、代码、参数、链接和原有流程图,仅调整标题级别,使其纳入当前文档结构。
RAG的入库流程,也称为索引构建或数据摄取 (Ingestion),这个流程的核心目标是:将非结构化的文本数据,转化为结构化的、富含语义信息“知识碎片”,并建立高效的索引,转化为大型语言模型 (LLM) 可以检索和利用的结构化知识库的过程。入库的质量直接决定了RAG系统检索的上限,一个高质量、易于检索的知识库,直接决定了您的大模型在回答特定领域问题时的准确性和可靠性。
代码段
graph LR
Doc[Documents] --> Loader([Loader])
Loader -- Text --> Splitter([Splitter])
subgraph Embedding Model
Embed1{Embedding}
Embed2{Embedding}
end
Splitter -- Chunks --> Embed1
Embed1 -- "[x,x,...,x]" --> VS[(Vector Store)]
User([User]) -- Question --> Embed2
Embed2 -- "[x,x,...,x]" --> Retrieval([Retrieval])
VS --> Retrieval
Retrieval -- Relevant Chunks --> Prompt[/Prompt/]
Prompt --> LLM((LLM))
LLM -- Answer --> User
在检索增强生成(Retrieval-Augmented Generation, RAG)系统中, 嵌入(Embedding)模型承担着将文本转换为向量表示的核心职责, 直接决定检索质量的上限与整体系统的可扩展性。本节课围绕LlamaIndex框架, 系统梳理与评估主流Embedding模型的集成路径、性能特征与成本结构, 面向企业级落地给出可操作的选型策略与实施路线。
| 集成类型 | 典型依赖 | 配置要点 | 优势 | 注意事项 |
|---|---|---|---|---|
| 云端API(OpenAI、Cohere) | 对应Python客户端、API密钥 | 通过LlamaIndex的Embedding类配置模型ID与参数;可设置base_url兼容自建兼容层 | 快速上线、免运维、弹性扩容 | 成本随调用量线性增长;需关注速率限制与数据出境合规 |
| 本地开源 (HuggingFace/SentenceTransformers、 BGE) | sentence-transformers或特定模型库;可选ONNX/Optimum | 通过HuggingFaceEmbedding等类加载;可配置最大序列长度、维度与指令模板;可导出ONNX加速 | 数据可控、长期TCO友好、可离线使用 | 初期工程投入较高;需自建服务与监控;硬件与吞吐需评估 |
BGE / M3E)。text-embedding-3-small 或 jina-embeddings-v2。Embedding + Reranker(OpenAI/BGE Reranker)。| 模型系列 | 代表模型 | 维度 | 最大序列长度(Tokens) | 核心优势 | 主要适用场景 |
|---|---|---|---|---|---|
| OpenAI | text-embedding-3-large | 3072 / 1536 / 512 | 8192 | 顶级通用语义理解、多语言能力强 | 高质量检索、复杂和多语言业务 |
| OpenAI | text-embedding-3-small | 1536 / 512 | 8192 | 极高性价比、性能均衡 | 大规模索引、成本敏感型应用 |
| Cohere | embed-multilingual-v3.0 | 1024 | 512 | 强大的多语言能力,与Rerank模型生态协同好 | 全球化业务、需要高质量精排的场景 |
| BGE (BAAI) | BGE-M3 | 1024 | 8192 | 多功能(稠密、稀疏、多向量)、长文本、中英文强 | 混合检索、长文档问答、中英混合场景 |
| M3E (Moka AI) | m3e-base / m3e-large | 768 | 8192 | 多语混合(中英优),长文本支持、检索表现强 | 企业多语种检索、中文主导场景、长文档问答 |
| Jina AI | jina-embeddings-v2-base-en | 768 | 8192 | 性价比高,长文本支持好 | 预算有限但需要处理长文本的场景 |
| 智谱AI | Embedding-3 | 256 / 512 / 1024 / 2048 | 8K | 维度上进行多种选择 | 支持中文/英文混合、大段文本、甚至跨模态的语义检索 |
BAAI/bge-small-zh 或 moka-ai/m3e-base。BGE-M3(支持稠密/稀疏/多向量,长文本检索)。| 指标 | 定义 | 计算逻辑 | 解释与适用场景 |
|---|---|---|---|
| Hit Rate@k | 前k条检索结果包含正确答案的是否命中 | Hit Rate = 命中查询数 / 总查询数 | 衡量“能否找到”,适合召回充分性的对比 |
| MRR@k | 正确答案的首次出现位置的倒数,在前k条内的平均值 | MRR = (1/rank_i)之和 / 总查询数,其中rank_i为第i个查询的正确答案首次排名 | 强调“找得准”,适合首条答案质量敏感的业务 |
在实际RAG评估中的应用建议
top_k。BGE-M3、较大维度模型。| 向量存储 | 存储文本 | 元数据过滤 | 混合检索 | 删除/更新 | 持久化形态 | 部署复杂度 | 典型场景 |
|---|---|---|---|---|---|---|---|
| SimpleVectorStore | 是(默认内存,可持久化) | 支持(框架层过滤) | 依赖后端能力 | 支持删除与持久化 | 本地文件 | 低 | 快速实验、本地小规模 |
| Chroma | 支持(集合中管理文本与元数据) | 支持 | 部分能力(依实现与查询) | 支持 add/update/upsert/delete | 本地/持久化/容器 | 中 | 开发者友好、本地到中小规模 |
| Pinecone | 否(侧重向量,文档内容依赖外部存储) | 支持 | 支持(稠密/稀疏/混合) | 支持删除与命名空间清理 | 云托管 (Serverless) | 低-中 | 云端高并发、低延迟 |
| Weaviate | 支持(集合中管理对象与文本) | 支持 | 支持(与 BM25 等稀疏结合) | 支持(动态批处理) | 自托管/云 | 中 | 现有集群集成、混合检索 |
| Qdrant | 支持(集合中管理 payloads) | 支持 | 支持(稠密+BM25) | 支持(集合级操作) | 自托管/云 | 中 | 混合检索、性能取向 |
| Milvus | 依集成与模式(向量为主) | 支持(字段过滤) | 依索引与实现 | 支持(集合/分区级) | 自托管/云 | 中-高 | 亿级向量、毫秒级检索 |
| Faiss | 否(仅存储向量) | 否 | 否 | 删除未实现 | 本地文件 | 低 | 本地高效相似度搜索 |
目的:让检索不仅“找得近”,还“找得对”。通过元数据过滤限定业务域、部门、时间段、语种等。
建模示例:
{"source": "policy.pdf", "section": "leave", "page": 12, "lang": "zh", "department": "HR", "updated_at": "2024-08-01"}统一元数据键名与取值范围;时间使用 ISO 格式;必要时建立“路由层”先根据元数据选择库或命名空间。
能力关注:持久化与一致性、元数据过滤、混合检索支持、删除/更新能力、部署复杂度与成本。
元数据设计建议:source / section / page / lang / department / updated_at 等,便于过滤与路由。
入库执行时机:离线全量与增量更新。
# 1. 初始化存储组件
vector_store = ChromaVectorStore(chroma_collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
# 2. 创建向量索引 (自动使用storage_context)
index = VectorStoreIndex.from_documents(
documents,
storage_context=storage_context,
embed_model=OpenAIEmbedding()
)
# 3. 查询时自动利用存储上下文
query_engine = index.as_query_engine()
response = query_engine.query("查询问题")
| 组件 | 职责 | 数据流向 |
|---|---|---|
| StorageContext | 存储管理、持久化、多存储协调 | 向下管理具体存储后端 |
| VectorStoreIndex | 索引构建、查询处理、相似性计算 | 向上提供查询接口 |
chromadb.PersistentClient(path=...) (数据库层级持久化)import chromadb
# 数据库层级的持久化
chroma_client = chromadb.PersistentClient(path="./chroma_db")
特点:自动实时持久化,数据一致性更高;频繁 I/O,资源消耗较高,适合生产。
vector_store.persist(persist_path=...) (框架层级持久化)from llama_index.vector_stores.chroma import ChromaVectorStore
# 框架层级的持久化
chroma_client = chromadb.PersistentClient(path="./chroma_db")
vector_store = ChromaVectorStore(chroma_collection=chroma_client.get_or_create_collection("docs"))
# 或者显式调用
vector_store.persist(persist_path="./chroma_db")
VectorDB 是 LlamaIndex 提供的一个 向量数据库工具封装类,它继承自 BaseToolSpec。
VectorStoreIndex 封装为可被智能体 (Agent) 调用的工具,支持多源知识库与路由检索。VectorDB (面向 Agent, 底层 VectorStoreIndex) 、 QueryEngineTool (封装 QueryEngine) 、 ToolSpec (基础类) 、 RetrieverQueryEngine (执行检索) 。RetrieverQueryEngine + MetadataFilters + Agent, 按用户角色/部门/语种做路由与权限控制。它不是直接用来检索的,而是把一个“向量检索能力”包装成一个可调用工具 (ToolSpec);之后,你可以在 Agent、QueryEngineTool、或者多工具组合系统 (Multi-Tool Agent) 中直接使用;它能让大语言模型通过自然语言调用底层向量检索逻辑(例如 Milvus、Pinecone、FAISS等);同时保留了 LlamaIndex 原有的过滤、权重和组合能力。
| 使用场景 | 说明 |
|---|---|
| Agent 工具集成 | 让一个 LLM (如 GPT) 能通过自然语言调用“知识库检索”功能。 |
| 多模态或多知识源融合 | 当系统有多个 VectorIndex (例如”报告知识库""产品知识库”),可以给每个建一个 VectorDB,并交给 Agent 动态选择调用。 |
| 自定义 Query Engine 集成 | 将 VectorDB 与 RetrieverQueryEngine 或 RouterQueryEngine 组合,实现多源路由检索。 |
| 企业内部知识问答系统 | 通常配合 Milvus / Pinecone / MongoDB Vector Store 使用,将不同业务库做成不同 Tool。 |
在构建基于RAG(检索增强生成)等AI应用时,向量数据库的安全性和多租户能力是确保系统稳定、可靠、合规的基石。多租户架构的核心目标是让多个租户(可以是不同部门、不同业务线或不同客户)共享同一套系统,但保证每个租户的数据、配置和性能表现是相互隔离的。
向量数据库的优化是一个系统工程,贯穿了从数据准备、入库到查询的全链路。核心思路在于:“前置减轻负担,中间加速处理,后续精准打击”。 前置:通过合适的模型和量化技术,从源头减少数据体积。 中间:利用批处理和缓存,提升系统整体的吞吐量和响应速度。 后续:在检索时,通过 top_k 与 Reranker 的配合,以最小成本获取最佳答案。
top_k 与重排:召回 top_k 不宜过大;结合 Reranker 提升前几条质量而不显著增加成本。各主流向量数据库官网地址
Comments
Notes, questions, and follow-ups are welcome here.
Comments are temporarily unavailable because
WALINE_SERVER_URL or PUBLIC_WALINE_SERVER_URLis not configured.