RAG第2章:向量数据库(理论和常见数据库)

💡 学习目标

  1. 向量数据库概述及核心原理
  2. Chroma向量数据库核心操作
  3. Milvus向量数据库扩展学习

1. 向量数据库

1.1. 什么是向量数据库?

向量数据库,是专门为向量检索设计的中间件!

高效存储、快速检索和管理高纬度向量数据的系统称为向量数据库

一种专门用于存储和检索高维向量数据的数据库。它将数据(如文本、图像、音频等)通过嵌入模型转换为向量形式,并通过高效的索引和搜索算法实现快速检索。

向量数据库的核心作用是实现相似性搜索,即通过计算向量之间的距离(如欧几里得距离、余弦相似度等)来找到与目标向量最相似的其他向量。它特别适合处理非结构化数据,支持语义搜索、内容推荐等场景。

核心功能:

  • 向量存储
  • 相似性度量
  • 相似性搜索

1.2. 如何存储和检索嵌入向量?

  • 存储:向量数据库将嵌入向量存储为高维空间中的点,并为每个向量分配唯一标识符(ID),同时支持存储元数据。
  • 检索:通过近似最近邻(ANN)算法(如PQ等)对向量进行索引和快速搜索。比如,FAISS和Milvus等数据库通过高效的索引结构加速检索。

1.3. 向量数据库与传统数据库对比

  1. 数据类型
  • 传统数据库:存储结构化数据(如表格、行、列)。
  • 向量数据库:存储高维向量数据,适合非结构化数据。
  1. 查询方式
  • 传统数据库:依赖精确匹配(如=、<、>)。
  • 向量数据库:基于相似度或距离度量(如欧几里得距离、余弦相似度)。
  1. 应用场景
  • 传统数据库:适合事务记录和结构化信息管理。
  • 向量数据库:适合语义搜索、内容推荐等需要相似性计算的场景。

澄清几个关键概念:

  • 向量数据库的意义是快速的检索;
  • 向量数据库本身不生成向量,向量是由 Embedding 模型产生的;
  • 向量数据库与传统的关系型数据库是互补的,不是替代关系,在实际应用中根据实际需求经常同时使用。

1.4. 主流向量数据库功能对比

扩展阅读:guangzhengli.com/blog/zh/vec...

2. Chroma 向量数据库

官方文档:docs.trychroma.com/docs/overvi...

1. 什么是 Chroma?

Chroma 是一款开源的向量数据库,专为高效存储和检索高维向量数据设计。其核心能力在于语义相似性搜索,支持文本、图像等嵌入向量的快速匹配,广泛应用于大模型上下文增强(RAG)、推荐系统、多模态检索等场景。与传统数据库不同,Chroma 基于向量距离(如余弦相似度、欧氏距离)衡量数据关联性,而非关键词匹配。

2. 核心优势

  • 轻量易用:以 Python/JS 包形式嵌入代码,无需独立部署,适合快速原型开发。
  • 灵活集成:支持自定义嵌入模型(如 OpenAI、HuggingFace),兼容 LangChain 等框架。
  • 高性能检索:采用 HNSW 算法优化索引,支持百万级向量毫秒级响应。
  • 多模式存储:内存模式用于开发调试,持久化模式支持生产环境数据落地。

2.1. Chroma 安装与基础配置

1. 安装

通过 Python 包管理器安装 ChromaDB:

python 复制代码
# 安装 Chroma 向量数据库完成功能
# !pip install chromadb

2. 初始化客户端

  • 内存模式(一般不建议使用):
python 复制代码
import chromadb

client = chromadb.Client()
  • 持久化模式:
python 复制代码
# 数据保存至本地目录
client = chromadb.PersistentClient(path="./chroma")

2.2. Chroma 核心操作流程

1. 集合(Collection)

集合是 Chroma 中管理数据的基本单元,类似关系数据库的表:

(1)创建集合

python 复制代码
from chromadb.utils import embedding_functions

# 默认情况下,Chroma 使用 DefaultEmbeddingFunction,它是基于 Sentence Transformers 的 MiniLM-L6-v2 模型
default_ef = embedding_functions.DefaultEmbeddingFunction()

# 使用 OpenAI 的嵌入模型,默认使用 text-embedding-ada-002 模型
# openai_ef = embedding_functions.OpenAIEmbeddingFunction(
#     api_key="YOUR_API_KEY",
#     model_name="text-embedding-3-small"
# )
python 复制代码
# 自定义 Embedding Functions
from chromadb import Documents, EmbeddingFunction, Embeddings

class MyEmbeddingFunction(EmbeddingFunction):
    def __call__(self, texts: Documents) -> Embeddings:
        # embed the documents somehow
        return embeddings
python 复制代码
collection = client.create_collection(
    name = "my_collection",
    configuration = {
        # HNSW 索引算法,基于图的近似最近邻搜索算法(Approximate Nearest Neighbor,ANN)
        "hnsw": {
            "space": "cosine", # 指定余弦相似度计算
            "ef_search": 100,
            "ef_construction": 100,
            "max_neighbors": 16,
            "num_threads": 4
        },
        # 指定向量模型
        "embedding_function": default_ef
    }
)

(2)查询集合

python 复制代码
collection = client.get_collection(name="my_collection")
  • peek() - returns a list of the first 10 items in the collection.
  • count() - returns the number of items in the collection.
  • modify() - rename the collection
python 复制代码
print(collection.peek())

print(collection.count())

# print(collection.modify(name="new_name"))
python 复制代码
{'ids': ['id1', 'id2'], 'embeddings': array([[ 1.60079654e-02,  1.02847122e-01,  1.15382075e-02,
        -3.34708579e-02,  1.14530073e-02,  6.35105297e-02,
         7.69377127e-02,  2.63175592e-02,  3.02551482e-02,
         5.60058244e-02,  1.71475381e-01, -5.42212315e-02,
        -1.58406403e-02, -6.51467144e-02, -1.57864839e-02,
         2.83155753e-03, -3.26167569e-02,  2.66733784e-02,
        -7.15856552e-02,  8.44806433e-03, -2.99695563e-02,
        -2.17505582e-02,  5.32626212e-02,  3.43727171e-02,
        -9.07171890e-02,  1.21168364e-02, -2.69576702e-02,
         4.59876433e-02,  1.01122260e-01, -1.81238037e-02,
         ...
         1.05566178e-02, -2.98974402e-02, -2.70893704e-02,
         3.89399305e-02, -9.87977441e-03,  2.00460758e-02,
        -5.35070635e-02,  5.25764190e-02,  5.20156361e-02,
         7.13807791e-02,  7.88660273e-02,  2.02222038e-02]]), 'documents': ['RAG是一种检索增强生成技术,在智能客服系统中大量使用', '向量数据库存储文档的嵌入表示'], 'uris': None, 'included': ['metadatas', 'documents', 'embeddings'], 'data': None, 'metadatas': [{'source': 'RAG'}, {'source': '向量数据库'}]}
2

(3)删除集合

python 复制代码
client.delete_collection(name="my_collection")

2. 添加数据

支持自动生成或手动指定嵌入向量:

python 复制代码
# 方式1:自动生成向量(使用集合指定的嵌入模型)
collection.add(
    # 文档的集合
    documents = ["RAG是一种检索增强生成技术", "向量数据库存储文档的嵌入表示", "在机器学习领域,智能体(Agent)通常指能够感知环境、做出决策并采取行动以实现特定目标的实体"],
    # 文档元数据信息
    metadatas = [{"source": "RAG"}, {"source": "向量数据库"}, {"source": "Agent"}],
    # id
    ids = ["id1", "id2", "id3"]
)

# 方式2:手动传入预计算向量(实际开发中推荐使用)
# collection.add(
#     embeddings = get_embeddings("RAG是什么?")
#     documents = ["文本1", "文本2"],
#     ids = ["id3", "id4"]
# )
python 复制代码
C:\Users\Administrator.cache\chroma\onnx_models\all-MiniLM-L6-v2\onnx.tar.gz: 100%|█| 79.3M/79.3M [00:06<00:00, 13.8Mi

3. 查询数据

  • 文本查询(自动向量化):
python 复制代码
results = collection.query(
    query_texts = ["RAG是什么?"],
    n_results = 3,
    where = {"source": "RAG"}, # 按元数据过滤
    # where_document = {"$contains": "检索增强生成"} # 按文档内容过滤
)

print(results)
python 复制代码
{'ids': [['id1']], 'embeddings': None, 'documents': [['RAG是一种检索增强生成技术,在智能客服系统中大量使用']], 'uris': None, 'included': ['metadatas', 'documents', 'distances'], 'data': None, 'metadatas': [[{'source': 'RAG'}]], 'distances': [[0.3491383194923401]]}
  • 向量查询(自定义输入):
python 复制代码
# results = collection.query(
#     query_embeddings = [[0.5, 0.6, ...]],
#     n_results = 3
# )

4. 数据管理

更新集合中的数据:

python 复制代码
collection.update(ids=["id1"], documents=["RAG是一种检索增强生成技术,在智能客服系统中大量使用"])

删除集合中的数据:

python 复制代码
collection.delete(ids=["id3"])

2.3. 4.8. Chroma Client-Server Mode

  • Server 端

默认端口 8000

python 复制代码
chroma run --path /db_path

修改端口:--port 端口号

python 复制代码
chroma run --port 8001 --path /db_path
  • Client 端
python 复制代码
import chromadb

# 远程连接 Chroma Server
chroma_client = chromadb.HttpClient(host='localhost', port=8000)
python 复制代码
# 测试
collection = chroma_client.create_collection(name = "my_collection")
collection = chroma_client.get_collection(name="my_collection")
print(collection.count())
复制代码
0

3. Qdrant 向量数据库

3.1. win10安装Qdrant

下载:

github.com/qdrant/qdra...

解压:

添加到环境变量:

将上面解压后的目录添加到环境变量

3.2. 启动

在通过 npm 全局安装 Qdrant 后,可按照以下步骤启动服务:

3.3. 启动 Qdrant 服务

输入以下命令启动 Qdrant 服务:

qdrant

3.3.1. 验证服务运行

打开浏览器访问:
http://localhost:6333/collections

如果看到 JSON 格式的响应(如空的集合列表),说明服务已成功启动。

4. Milvus 向量数据库(扩展学习)

中文官网:milvus.io/zh

Milvus 架构图

相关推荐
亚里随笔4 分钟前
稳定且高效:GSPO如何革新大型语言模型的强化学习训练?
人工智能·机器学习·语言模型·自然语言处理·llm·rlhf
SuperherRo4 小时前
Web攻防-大模型应用&LLM安全&提示词注入&不安全输出&代码注入&直接间接&数据投毒
大模型·llm·提示词注入·不安全输出·直接·间接
堆栈future6 小时前
LangGraph实践-构建AI工作流:创建一本大模型应用开发书籍
langchain·llm·aigc
大志说编程7 小时前
LangChain框架入门15:深度解析Retrievers检索器组件
python·langchain·llm
AI大模型9 小时前
基于 Ollama 本地 LLM 大语言模型实现 ChatGPT AI 聊天系统
程序员·llm·ollama
AI大模型9 小时前
AI大模型选择指南:从ChatGPT到国产新秀,一文看懂如何选对你的AI助手
gpt·程序员·llm
努力还债的学术吗喽10 小时前
2020 GPT3 原文 Language Models are Few-Shot Learners 精选注解
gpt·大模型·llm·gpt-3·大语言模型·few-shot·zero-shot
AI大模型1 天前
深度解析AI大模型【架构→训练→推理】核心技术全景图
程序员·llm·agent
AI大模型1 天前
一文读懂:大模型应用开发平台选型指南(附教程)
程序员·llm·agent