02-嵌入模型和向量数据库

一、 向量表征(Vector Representation)

在人工智能领域,向量表征(Vector Representation)是核心概念之一。通过将文本、图像、声音、行为甚至复杂关系转化为高维向量(Embedding),AI系统能够以数学方式理解和处理现实世界中的复杂信息。这种表征方式为机器学习模型提供了统一的"语言"。

1、向量表征的典型应用场景

(1)自然语言处理(NLP)

  • **词向量(Word2Vec、GloVe):**单词映射为向量,解决"一词多义"问题(如"苹果"在"水果"和"公司"上下文中的不同向量)。

  • **句向量(BERT、Sentence-BERT):**整句语义编码,用于文本相似度计算、聚类(如客服问答匹配)。

  • **知识图谱嵌入(TransE、RotatE):**将实体和关系表示为向量,支持推理(如预测"巴黎-首都-法国"的三元组可信度)。

(2)计算机视觉(CV)

  • **图像特征向量(CNN特征):**ResNet、ViT等模型提取图像语义,用于以图搜图、图像分类。

  • **跨模态对齐(CLIP):**将图像和文本映射到同一空间,实现"描述文字生成图片"或反向搜索。

(3)推荐系统

  • **用户/物品向量:**用户行为序列(点击、购买)编码为用户向量,商品属性编码为物品向量,通过向量内积预测兴趣匹配度(如YouTube推荐算法)。

(4)复杂系统建模

  • **图神经网络(GNN):**社交网络中的用户、商品、交互事件均表示为向量,捕捉网络结构信息(如社区发现、欺诈检测)。

  • **时间序列向量化:**将股票价格、传感器数据编码为向量,预测未来趋势(如LSTM、Transformer编码)。

2、向量表征的技术实现

(1)经典方法

  • **无监督学习:**Word2Vec通过上下文预测(Skip-Gram)或矩阵分解(GloVe)生成词向量。

  • **有监督学习:**微调预训练模型(如BERT)适应具体任务,提取任务相关向量。

(2)前沿方向

  • **对比学习(Contrastive Learning):**通过构造正负样本对(如"同一图片的不同裁剪"为正样本),拉近正样本向量距离,推开负样本(SimCLR、MoCo)。

  • **多模态融合:**将文本、图像、语音等多模态信息融合为统一向量(如Google的MUM模型)。

  • **动态向量:**根据上下文动态调整向量(如Transformer的注意力机制),解决静态词向量无法适应多义性的问题

二. 什么是向量

向量是一种有大小和方向的数学对象。它可以表示为从一个点到另一个点的有向线段。例如,二维空间中的向量可以表示为 (𝑥,𝑦),表示从原点 (0,0) 到点 (𝑥,𝑦) 的有向线段。

2.1 文本向量

  • 文本转向量 :将自然语言句子(如 "这个多少钱""我想要这个")转换为一组 N 维的浮点数,即文本向量(Embeddings)。图中每个句子都对应一个由不同颜色数字块表示的高维向量。
  • 向量空间映射:这些高维向量被映射到二维坐标系中。语义相近的句子(如 "这个多少钱""这个什么价格""给我报个价"),其向量点(红色)在空间中距离较近,聚集成簇;而语义不同的句子(如 "我想要这个""这个给我吧"),其向量点(蓝色)则聚集成另一簇,且与红色簇距离较远。
  • 核心逻辑:向量之间的空间距离,直接对应了句子的语义相似度 ------ 距离越近,语义越相似;距离越远,语义差异越大。

2.2 文本向量是怎么得到的

2.3 向量间的相似度计算

python 复制代码
"""
文本嵌入向量计算与相似度分析
使用阿里百炼平台(兼容OpenAI API)获取文本嵌入向量
实现余弦相似度和欧氏距离计算
"""

import os
import numpy as np
from numpy import dot
from numpy.linalg import norm
from openai import OpenAI

# ==================== 客户端配置 ====================
# 注意:需要在系统环境变量中配置以下两个变量:
# 1. DASHSCOPE_API_KEY: 阿里百炼平台的API密钥
# 2. DASHSCOPE_BASE_URL: 阿里百炼服务的API端点

# 创建OpenAI客户端实例(兼容阿里百炼API)
client = OpenAI(
    # 从环境变量获取API密钥,如未配置可在此直接替换为您的API Key
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 阿里百炼服务的base_url,使OpenAI SDK能访问百炼服务
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)


# ==================== 相似度计算函数 ====================

def cos_sim(a, b):
    """
    计算两个向量的余弦相似度
    
    参数:
        a, b: 待比较的两个向量(列表或numpy数组)
    
    返回值:
        余弦相似度值(范围[-1, 1])
        值越接近1表示越相似,越接近-1表示越不相似
    """
    return dot(a, b) / (norm(a) * norm(b))


def l2(a, b):
    """
    计算两个向量之间的欧氏距离(L2距离)
    
    参数:
        a, b: 待比较的两个向量(列表或numpy数组)
    
    返回值:
        欧氏距离值(非负实数)
        值越小表示越相似
    """
    x = np.asarray(a) - np.asarray(b)  # 转换为numpy数组并计算差值
    return norm(x)  # 计算L2范数(欧氏距离)


# ==================== 嵌入向量获取函数 ====================

def get_embeddings(texts, model="text-embedding-v1", dimensions=None):
    """
    使用阿里百炼的Embedding模型获取文本的嵌入向量
    
    参数:
        texts: 文本列表(可以是单个文本或文本列表)
        model: 使用的模型名称,默认为"text-embedding-v1"
        dimensions: 嵌入向量的维度数,某些模型支持指定维度
    
    返回值:
        文本对应的嵌入向量列表
        每个文本对应一个浮点数向量
    """
    # 根据模型类型和维度参数调用不同的API
    if model == "text-embedding-v1":
        dimensions = None  # 该模型不支持指定维度
    
    if dimensions:
        # 调用支持指定维度的API
        data = client.embeddings.create(
            input=texts, 
            model=model, 
            dimensions=dimensions
        ).data
    else:
        # 调用默认维度的API
        data = client.embeddings.create(
            input=texts, 
            model=model
        ).data
    
    # 提取每个文本的嵌入向量
    return [x.embedding for x in data]


# ==================== 测试代码 ====================

if __name__ == "__main__":
    # 测试1:获取单个文本的嵌入向量
    print("=== 测试1:获取嵌入向量基本信息 ===")
    test_query = ["AI - 用科技力量,构建智能未来!"]
    vec = get_embeddings(test_query)[0]
    print(f"向量总维度: {len(vec)}")  # 通常为1536维(text-embedding-v1模型)
    print(f"前10个元素: {vec[:10]}")  # 查看向量的前10个元素
    print()
    
    # 测试2:计算查询与文档的相似度
    print("=== 测试2:相似度计算示例 ===")
    query = "国际争端"
    # 注意:模型支持跨语言,可以尝试英文查询
    # query = "global conflicts"
    
    # 文档列表
    documents = [
        "联合国就苏丹达尔富尔地区大规模暴力事件发出警告",
        "土耳其、芬兰、瑞典与北约代表将继续就瑞典入约问题进行谈判",
        "日本岐阜市陆上自卫队射击场发生枪击事件3人受伤",
        "国家游泳中心(水立方):恢复游泳、嬉水乐园等水上项目运营",
        "我国首次在空间站开展舱外辐射生物学暴露实验",
    ]
    
    # 获取查询和文档的嵌入向量
    query_vec = get_embeddings([query])[0]  # 查询文本的嵌入向量
    doc_vecs = get_embeddings(documents)    # 所有文档的嵌入向量列表
    
    # 计算余弦相似度
    print("余弦相似度计算(值越大越相似):")
    print(f"Query与自己的余弦相似度: {cos_sim(query_vec, query_vec):.4f}")  # 应为1.0
    
    print("Query与各Document的余弦相似度:")
    for i, doc_vec in enumerate(doc_vecs, 1):
        similarity = cos_sim(query_vec, doc_vec)
        print(f"  文档{i}: {similarity:.4f} - {documents[i-1][:20]}...")  # 显示前20个字符
    
    print()
    
    # 计算欧氏距离
    print("欧氏距离计算(值越小越相似):")
    print(f"Query与自己的欧氏距离: {l2(query_vec, query_vec):.4f}")  # 应为0.0
    
    print("Query与各Document的欧氏距离:")
    for i, doc_vec in enumerate(doc_vecs, 1):
        distance = l2(query_vec, doc_vec)
        print(f"  文档{i}: {distance:.4f} - {documents[i-1][:20]}...")
    
    print()
    
    # 测试3:验证距离度量的特性
    print("=== 测试3:距离度量验证 ===")
    print("相同文本的余弦相似度应为1.0,欧氏距离应为0.0")
    
    # 创建两个不同的测试文本
    text1 = ["机器学习"]
    text2 = ["人工智能"]
    
    vec1 = get_embeddings(text1)[0]
    vec2 = get_embeddings(text2)[0]
    
    print(f"文本1: {text1[0]}")
    print(f"文本2: {text2[0]}")
    print(f"余弦相似度: {cos_sim(vec1, vec2):.4f}")
    print(f"欧氏距离: {l2(vec1, vec2):.4f}")
    
    # 分析结果
    print("\n=== 结果分析 ===")
    print("1. 相同文本的相似度度量:")
    print("   - 余弦相似度应为1.0(完全相似)")
    print("   - 欧氏距离应为0.0(距离为0)")
    print("\n2. 语义相似度检测:")
    print("   - '国际争端'最相关的文档应该是关于国际冲突的新闻")
    print("   - 余弦相似度值越高或欧氏距离值越低,表示语义越接近")

三、Embedding Models 嵌入模型

3.1. 什么是嵌入(Embedding)?

嵌入(Embedding)是指非结构化数据转换为向量的过程,通过神经网络模型或相关大模型,将真实世界的离散数据投影到高维数据空间上,根据数据在空间中的不同距离,反映数据在物理世界的相似度。

3.2. 嵌入模型概念及原理

1. 嵌入模型的本质

嵌入模型(Embedding Model)是一种将离散数据(如文本、图像)映射到连续向量空间的技术。通过高维向量表示(如 768 维或 3072 维),模型可捕捉数据的语义信息,使得语义相似的文本在向量空间 中距离更近。例如,"忘记密码"和"账号锁定"会被编码为相近的向量,从而支持语义检索而非仅关键词匹配。

2. 核心作用

  • **语义编码:**将文本、图像等转换为向量,保留上下文信息(如 BERT 的 CLS Token 或均值池化。相似度计算:通过余弦相似度、欧氏距离等度量向量关联性,支撑检索增强生成(RAG)、推荐系统等应用。

  • **信息降维:**压缩复杂数据为低维稠密向量(),提升存储与计算效率。

3. 关键技术原理

  • **上下文依赖:**现代模型(如 BGE-M3)动态调整向量,捕捉多义词在不同语境中的含义。

  • **训练方法:**对比学习(如 Word2Vec 的 Skip-gram/CBOW)、预训练+微调(如 BERT)。

3.3. 主流嵌入模型分类与选型指南

Embedding 模型将文本转换为数值向量,捕捉语义信息,使计算机能够理解和比较内容的"意义"。选择 Embedding 模型的考虑因素: 最重要的就是"多语言支持",向量模型只负责把文字转换成向量

因素 说明
任务性质 匹配任务需求(问答、搜索、聚类等)
领域特性 通用vs专业领域(医学、法律等)
多语言支持** 需处理多语言内容时考虑
维度 权衡信息丰富度与计算成本
许可条款 开源vs专有服务
最大Tokens 适合的上下文窗口大小

最佳实践:为特定应用测试多个 Embedding 模型,评估在实际数据上的性能而非仅依赖通用基准。

模型选择

1. 通用全能型

  • **BGE-M3:**北京智源研究院开发,支持多语言、混合检索(稠密+稀疏向量),处理 8K 上下文,适合企业级知识库。
  • **NV-Embed-v2:**基于 Mistral-7B,检索精度高(MTEB 得分 62.65),但需较高计算资源。

2. 垂直领域特化型

  • 中文场景: BGE-large-zh-v1.5 (合同/政策文件)、 M3E-base (社交媒体分析)。
  • 多模态场景: BGE-VL (图文跨模态检索),联合编码 OCR 文本与图像特征。

3. 轻量化部署型

  • **nomic-embed-text:**768 维向量,推理速度比 OpenAI 快 3 倍,适合边缘设备。
  • **gte-qwen2-1.5b-instruct:**1.5B 参数,16GB 显存即可运行,适合初创团队原型验。

选型决策树:

  1. 中文为主 → BGE 系列 > M3E;

  2. 多语言需求 → BGE-M3 > multilingual-e5;

  3. 预算有限 → 开源模型(如 Nomic Embed)

Embddding Leaderboard

3.4. OpenAI 新发布的两个 Embedding 模型

2024 年 1 月 25 日,OpenAI 新发布了两个 Embedding 模型

  • text-embedding-3-large
  • text-embedding-3-small

其最大特点是,支持自定义的缩短向量维度,从而在几乎不影响最终效果的情况下降低向量检索与相似度计算的复杂度。

通俗的说:越大越准、越小越快。

注:MTEB 是一个大规模多任务的 Embedding 模型公开评测集

3.5. 嵌入模型使用

  1. 使用 API 调用方式
python 复制代码
"""
阿里百炼平台文本嵌入向量生成示例
功能:使用阿里百炼的文本嵌入模型(兼容OpenAI API)将文本转换为向量表示
注意:需要先配置DASHSCOPE_API_KEY环境变量
"""

# 导入必要的模块
import os
from openai import OpenAI  # 导入OpenAI库,用于与API交互

# 创建OpenAI客户端实例
# 注意:这里适配了阿里百炼平台,通过指定base_url连接到百炼服务
client = OpenAI(
    # 从系统环境变量获取API密钥
    # 安全建议:将API密钥存储在环境变量中,避免在代码中硬编码
    # 如果未配置环境变量,可以在此直接替换为您的API Key(不推荐用于生产环境)
    api_key=os.getenv("DASHSCOPE_API_KEY"),  
    
    # 设置API基础URL,指向阿里百炼服务的兼容模式端点
    # 这使得标准的OpenAI SDK能够与百炼平台进行通信
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"  
)

# 调用文本嵌入API,将文本转换为向量表示
completion = client.embeddings.create(
    # 指定使用的嵌入模型
    # text-embedding-v4:阿里百炼的第四代文本嵌入模型,支持多语言和长文本
    model="text-embedding-v4",
    
    # 需要转换为向量的输入文本
    # 可以是单个字符串或字符串列表(支持批量处理)
    input='聚客AI学院',
    
    # 指定输出向量的维度
    # 1024:中等维度,平衡了表达能力和计算效率
    # 注意:不同模型支持的维度可能不同,需参考官方文档
    dimensions=1024,
    
    # 指定向量编码格式
    # "float":返回浮点数数组,这是最常用的格式
    # 其他可选格式(如果有):"base64"等
    encoding_format="float"
)

# 输出API返回的完整响应(JSON格式)
# model_dump_json()方法将响应对象转换为JSON字符串
# 这有助于调试和查看响应的完整结构
print(completion.model_dump_json())

# 可选:提取和查看具体的向量数据
# 响应结构通常包含:模型名称、向量数据、使用量统计等信息
# 示例:如何获取向量数据
# vector_data = completion.data[0].embedding
# print(f"向量维度: {len(vector_data)}")
# print(f"前5个元素: {vector_data[:5]}")

四、向量数据库

4.1. 什么是向量数据库?

简单来说,向量数据库是一种为"相似性搜索"而生的专用数据管理系统

它的核心工作流程是:将非结构化数据(如文本、图片、音频)通过一个嵌入模型​ 转换成一系列高维度的数字列表,即"向量"。然后,它高效地存储这些向量,并利用数学方法(计算向量间的"距离"或"相似度")来快速找到与查询目标"最相似"的向量。

它最重要的特性是语义理解能力。例如,您搜索"小狗",它不仅能返回含有关键字"小狗"的结果,还能理解语义,返回"金毛"、"柯基"等相关内容。

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

存储过程:

  1. 嵌入 :首先,使用嵌入模型(如 OpenAI 的 text-embedding-ada-002)将原始数据(一段话、一张图)转换成一个固定长度的浮点数数组,即向量。

  2. 入库:向量数据库将这个向量(通常附带一个唯一ID和相关的元数据,如原文、作者、类别)作为一个"点"存入其构建的高维空间中。

  3. 检索:通过近似最近邻(ANN)算法(如PQ等)对向量进行索引和快速搜索。比如,FAISS和Milvus等数据库通过高效的索引结构加速检索。

检索过程(核心):

传统数据库查找数据像在电话簿里按名字精确找人。向量数据库则像在一个房间里,蒙上眼睛说"找一个离我最近的人"。为了实现这种"相似性"的快速查找,它使用了一种叫近似最近邻搜索​ 的算法。

这些算法通过构建智能索引来避免逐一计算所有向量间的距离("暴力搜索"),从而在速度、精度和内存​ 之间取得平衡。您资料中提到的几种主流算法包括:

  • IVFFlat (如 Faiss​ 所用):先将所有向量"聚类"成多个小组。搜索时,先确定查询向量属于哪个或哪几个小组,然后只在这些小组内部进行精确搜索。

  • HNSW (如 ChromaQdrant​ 所用):构建一个分层的"小世界"网络图。搜索时从顶层开始,利用长连接快速跳跃到目标区域,再逐层向下精确定位。

  • PQ:通过"有损压缩"技术大幅缩减向量占用的内存,牺牲少量精度来换取处理海量数据的能力。

  • LSH:设计特殊的哈希函数,让相似的向量有很大概率被映射到同一个"哈希桶"中,搜索时只需对比同一个桶里的少量向量。

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

这是一个根本性的范式转变,它们服务于不同的需求:

特性 传统数据库 (如 MySQL, PostgreSQL) 向量数据库 (如 Milvus, Qdrant)
核心数据 结构化数据(数字、字符串、日期,有固定格式)。 非结构化数据向量表示(高维浮点数数组)。
查询模式 精确匹配 。通过索引查找 WHERE column = 'value' 相似性搜索。查找 "与这个向量最像的 N 个邻居"。
索引目标 加速精确查询和范围查询(B树,哈希索引)。 加速近似最近邻搜索(HNSW, IVFFlat 等)。
主要应用 业务交易、用户管理、财务记录------需要绝对准确性的场景。 语义搜索、推荐系统、图像/音频检索、RAG------需要理解和匹配"含义"或"内容"的场景。

关键澄清:

  • 互补而非替代:在实际系统中,二者常结合使用。例如,先用向量数据库找到相似的图片ID,再用关系型数据库根据ID查询图片的详细元数据(标题、作者、价格)。

  • 不生成向量:向量数据库本身不具备将文本/图片转为向量的能力,这是一个独立的 AI 模型(嵌入模型)的任务。

  • 核心价值是"快速检索":在海量高维向量中实现毫秒级的相似性搜索是其存在的根本意义。

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

根据您提供的链接和公开信息,主流选项对比如下:

项目 开源/商用 主要部署方式 特点与定位
Milvus 开源 可独立部署 / 云托管 专为海量向量搜索设计,架构复杂但功能强大,生态丰富。
Qdrant 开源 可独立部署 / 云托管 使用 Rust 开发,性能出色,API 设计友好,云服务体验好。
Weaviate 开源 可独立部署 / 云托管 内置多种模块(如推理、向量化),更像一个"AI原生数据库",开箱即用。
Pinecone 商业 仅云托管 完全托管的 SaaS 服务,无需运维,开发者体验极简,但锁定其平台。
Chroma 开源 嵌入式 / 客户端-服务器 轻量级、易集成,适合快速原型和中等规模应用,Python/JS 生态友好。
pgvector 开源 (PostgreSQL扩展) 作为 PostgreSQL 插件 最大优势是与 PostgreSQL 生态无缝集成,可利用现有的事务、备份、权限等所有功能。适合已有 PG 或希望简化技术栈的团队。
Redisearch 开源 (Redis模块) 作为 Redis 模块 在成熟的 Redis 内存数据库中增加向量搜索能力,适合需要极低延迟和利用 Redis 其他数据结构的场景。
Faiss 开源 (Facebook) 库,非数据库 是一个高效的向量相似性搜索库,需要自己处理存储、可用性、分布式等,常作为其他系统的底层引擎。
Elasticsearch 商业/开源 可独立部署 / 云托管 传统全文搜索的王者,近年增加了向量搜索能力,适合需要将关键词搜索语义搜索紧密结合的场景。

扩展阅读:https://guangzhengli.com/blog/zh/vector-database

4.5. 关于 Chroma 向量数据库

1. 什么是 Chroma?

Chroma 是一个开源的嵌入式向量数据库。它的设计哲学是轻量化和开发者友好,旨在让开发者能像使用一个软件库一样轻松地将向量搜索功能添加到应用程序中,而无需运维一个复杂的独立数据库服务。

2. 核心优势

  • 易于上手 :一个 pip install chromadb即可开始使用。

  • 多模式运行

    • 内存模式:适合开发和测试,数据在程序运行时存在于内存中。

    • 客户端-服务器模式:可部署为独立服务,供多个应用连接,数据持久化到磁盘。

  • 与 AI 生态无缝集成:天然支持与 LangChain、LlamaIndex 等主流 AI 框架配合,轻松构建 RAG 应用。

  • 功能完备:虽然轻量,但提供了向量数据库的核心功能,包括基于 HNSW 的索引、元数据过滤等。

3. 典型使用场景

由于其轻量特性,Chroma 非常适合:

  • 快速原型验证:在项目早期验证向量搜索的可行性。

  • 中小规模应用:数据量在百万级以内的生产应用。

  • 边缘计算或嵌入式场景:需要将数据库和应用程序打包在一起的场合。

4.6 安装 ChromaDB

出现存储目录

4.7. Chroma 核心操作流程

向量数据库的核心在于如何存储和查询数据。Chroma 通过"集合"来组织数据,其操作遵循"创建集合 → 添加数据 → 查询/管理 → (可选)删除"的基本流程。

1. 集合 (Collection)

集合是Chroma中管理数据的基本单元,类似于关系数据库中的"表"。它定义了数据的存储结构和检索方式。

(1) 创建集合

创建集合时,最关键的是指定嵌入函数,它决定了文本如何转化为向量。您可以选择内置的,也可以自定义。

python 复制代码
from chromadb.utils import embedding_functions

# 使用默认的句子转换器模型 (MiniLM-L6-v2)
default_ef = embedding_functions.DefaultEmbeddingFunction()

# 使用OpenAI的嵌入模型 (需要API密钥)
openai_ef = embedding_functions.OpenAIEmbeddingFunction(
    api_key="YOUR_API_KEY",
    model_name="text-embedding-3-small"
)

# 自定义嵌入函数
from chromadb import Documents, EmbeddingFunction, Embeddings
class MyEmbeddingFunction(EmbeddingFunction):
    def __call__(self, texts: Documents) -> Embeddings:
        # 在这里实现您自己的文本转向量逻辑
        return embeddings

# 创建集合并配置
collection = client.create_collection(
    name="my_collection",
    metadata={
        "hnsw:space": "cosine", # 使用余弦相似度进行检索
        "hnsw:construction_ef": 100,
    },
    embedding_function=default_ef # 指定嵌入函数
)

要点理解hnsw:space参数定义了向量间的"距离"如何计算,"cosine"适用于语义相似性搜索。

(2) 查询与删除集合

集合对象本身提供了一些管理方法。

python 复制代码
# 获取已存在的集合
collection = client.get_collection(name="my_collection")

# 查看集合概览(前10项)和统计总数
print(collection.peek())
print(collection.count())

# 重命名集合
# collection.modify(name="new_name")

# (慎用)从客户端彻底删除整个集合
client.delete_collection(name="my_collection")
2. 添加数据

可以向集合中添加文档,并让Chroma自动为其生成向量,也可以手动提供预计算的向量。

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

# 方式2:手动传入预计算的向量(适合已有嵌入流水线的场景)
# collection.add(
# embeddings = get_embeddings("RAG是什么?") # 假设这是您自己的函数
# documents = ["文本1", "文本2"],
# ids = ["id3", "id4"]
# )
3. 查询数据

查询是向量数据库的核心功能,可以根据文本或直接根据向量进行语义搜索。

python 复制代码
# 文本查询(最常用,Chroma会自动将其向量化)
results = collection.query(
    query_texts=["什么是RAG技术?"], # 查询问题
    n_results=2, # 返回最相似的2条结果
    where={"source": "RAG"}, # (可选)按元数据过滤,例如只从source为"RAG"的文档中查
    where_document={"$contains": "生成"} # (可选)按文档内容过滤,例如只查包含"生成"的文档
)
print(results)

# 向量查询(如果您自己计算好了查询向量)
# results = collection.query(
# query_embeddings=[[0.1, 0.2, ...]], # 您提供的查询向量
# n_results=2
# )
4. 数据管理

可以更新或删除集合中已存在的特定数据项。

python 复制代码
# 更新:根据ID更新文档内容及其向量(会自动重新生成向量)
collection.update(
    ids=["id1"],
    documents=["RAG是一种检索增强生成技术,在智能客服系统中大量使用"]
)

# 删除:根据ID删除数据项
collection.delete(ids=["id3"])

4.8. Chroma 客户端-服务器模式

对于生产环境,通常将Chroma作为独立服务运行,这更稳定、便于多程序访问。

  • Server 端 (服务端)

    python 复制代码
    # 在服务器上启动Chroma服务,指定数据存储路径
    chroma run --path D:/Conda/chromaDB
    
    # 可以指定端口(默认8000)
    chroma run --port 8001 --path D:/Conda/chromaDB
  • Client 端 (客户端)

    python 复制代码
    import chromadb
    
    # 连接到远程Chroma服务器
    chroma_client = chromadb.HttpClient(host='localhost', port=8000)
    
    # 之后的操作与本地客户端完全一致
    collection = chroma_client.create_collection(name="my_collection")
    collection = chroma_client.get_collection(name="my_collection")

五. Milvus 扩展学习

https://milvus.io/zh

Milvus:面向AI的向量数据库引擎

1. 市场发展与占有率

Milvus是目前全球最受欢迎的开源向量数据库。它起源于2019年,由Zilliz公司开源,专门为处理海量非结构化数据(如图片、文本、视频)的向量相似性搜索而设计。

  • 市场地位:在开源向量数据库领域,Milvus长期占据GitHub Star数、社区活跃度和企业采用率的领先地位。它已成为许多AI基础设施栈中的标准组件。

  • 核心价值 :解决了传统数据库无法高效处理"语义搜索"的痛点。如您第一张图所示,"荷里活"与"好莱坞"是同一事物的不同音译,传统的关键词匹配完全失效,而向量数据库能理解它们语义相同。

2. 解决的核心问题:语义鸿沟

您图片中提到的两个场景,正是Milvus的典型应用:

  1. 商户描述 vs. 用户描述不同

    • 问题:用户搜索"允许携带宠物",但酒店标签写的是"可携带宠物"、"宠物友好"。关键词不匹配导致无法召回。

    • Milvus的解决方案 :将用户查询和酒店标签都转化为向量。即使字面不同,语义相似的向量在向量空间中也距离相近。通过计算余弦相似度(如表格中的0.96),系统能准确召回"可携带宠物"的酒店,而排除虽有"宠物"二字但语义不完全匹配的选项(如"宠物友好"可能特指特定服务)。

  2. 语种/表述差异

    • 问题:"荷里活"(粤语音译)与"好莱坞"(普通话音译)指代同一事物,但字面毫无重合。

    • Milvus的解决方案 :强大的多语言嵌入模型(如text-embedding-v3)能将不同语言、不同表述但含义相同的文本,映射到向量空间中非常接近的位置。搜索"荷里活"时,其向量与"好莱坞"的向量相似度极高,从而实现跨语言、跨表述的精准召回

3. 架构设计

Milvus采用云原生、计算存储分离的分布式架构,使其能够轻松应对千万级甚至亿级的数据规模。

  • 离线向量化

    • 对应"实体数据离线向量化"模块。Milvus本身不生成向量,它接收由AI模型(如OpenAI、BERT)预先处理好的向量。

    • 流程:酒店/标签实体-> 嵌入模型-> 向量-> 持久化存入Milvus

  • 在线召回服务

    • 对应"向量化召回服务"模块。这是Milvus的核心在线服务。

    • 流程:用户查询-> 向量化-> Milvus向量数据库(近似最近邻搜索ANN) ​ -> 返回TopK相似实体-> 业务过滤-> 返回结果

4. 技术选型:为什么是Milvus?

在众多向量数据库中,选择Milvus通常基于以下考量:

  • 性能与规模的极致平衡(图片3的关键数据)

    • HNSW索引:召回快(TOP20仅30ms),精度高,但内存占用大(1700万向量需131G)。适合对延迟极度敏感的场景。

    • IVF_SQ8索引 :内存占用小(仅49G),可实现单机部署,性能略低但仍在毫秒级。适合成本敏感或数据量极大的场景。

    • 可扩展性:Milvus集群可以水平扩展,轻松应对百亿甚至千亿向量的检索。

  • 功能完备性

    • 多向量/标量混合查询:不仅能按向量相似度搜,还能结合"价格<1000"、"城市=上海"等结构化条件(即您第五张图中的"依赖检查")。

    • 动态数据管理:支持实时插入、删除、更新,无需重建整个索引。

5. 什么是"召回"?

"召回"是搜索和推荐系统中的第一阶段,核心是"海选"

  • 传统召回:基于倒排索引,匹配关键词。对于"音译差异"、"同义不同词"问题无能为力,导致大量相关结果根本无法进入后续排序阶段(即"漏召")。

  • 向量召回(语义召回) :如图片5所示,利用Milvus等向量数据库,根据语义相似度 从全量数据库中快速筛选出最相关的几百个候选结果(TopK)。它不再拘泥于字面匹配,而是理解意图,从根本上解决了第一张图和第二张图揭示的"表述差异"问题,极大地提升了召回率

总结

Milvus是解决语义搜索AI数据检索难题的基础设施。它将非结构化数据转化为向量,并通过高效的相似性搜索,弥合了用户意图(多种表述)与商户内容(多种描述)之间的鸿沟。其分布式架构和丰富的索引算法(如HNSW/IVF_SQ8),使其既能满足图片3中携程这样超大规模、高并发的生产需求,又能通过语义理解彻底解决图片1、2中的传统搜索顽疾,是构建下一代智能应用(搜索、推荐、问答)的核心引擎。

前提摘要:获取Qwen大模型api

1、前往

https://bailian.console.aliyun.com

阿里有180天、一百万的免费token

下滑找到第二步

2、申请key


追加到test环境变量

  1. 激活 test 环境(在终端中执行):

    复制代码
    conda activate test
  2. 设置环境变量

    复制代码
    conda env config vars set DASHSCOPE_API_KEY='sk-dab4c8deb1964315bc7dc4dd6c13772a'
    conda env config vars set DASHSCOPE_BASE_URL='https://dashscope.aliyuncs.com/compatible-mode/v1'
  3. 重新激活环境使变量生效:

    复制代码
    conda deactivate
    conda activate test
  4. 验证是否设置成功

    复制代码
    conda env config vars list

    或者

    复制代码
    echo $DASHSCOPE_API_KEY

记得重启jupyter lab,后才生效

相关推荐
kaoa0002 小时前
Linux入门攻坚——67、MySQL数据库-4
linux·运维·数据库·mysql
学Linux的语莫2 小时前
skills的使用
java·数据库·python
码云数智-园园2 小时前
MySQL 性能调优实战:高效处理 ORDER BY 与 GROUP BY 查询
数据库·mysql
大模型玩家七七2 小时前
关系记忆不是越完整越好:chunk size 的隐性代价
java·前端·数据库·人工智能·深度学习·算法·oracle
全栈前端老曹3 小时前
【Redis】Pipeline 与性能优化——批量命令处理、提升吞吐量、减少网络延迟
前端·网络·数据库·redis·缓存·性能优化·全栈
知识分享小能手3 小时前
SQL Server 2019入门学习教程,从入门到精通,SQL Server 2019 创建和使用索引 — 语法知识点及使用方法详解(12)
数据库·学习·sqlserver
一 乐3 小时前
林业资源管理|基于java + vue林业资源管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·林业资源管理系统
l1t3 小时前
DeepSeek总结的PostgreSQL 18 EXPLAIN 中新增的 Index Searches
数据库·postgresql
g***27993 小时前
使用 Canal 实时从 MySql 向其它库同步数据
数据库·mysql