AI创想

标题: 向量数据库详解 [打印本页]

作者: 邓金婵9    时间: 7 小时前
标题: 向量数据库详解
作者:猩火燎猿
一、什么是向量数据库?

向量数据库(Vector Database)是一种专门为存储和检索高维向量(如 128、256、768 甚至数千维)而优化的数据库。
每个向量可以理解为一个有序的数值数组,通常由深度学习模型、特征工程、嵌入算法(如 word2vec、BERT、CLIP、ResNet 等)生成。
典型应用:

二、向量数据库与传统数据库的区别

对比项关系型/NoSQL数据库向量数据库
数据结构表、文档、键值向量(数组)+元数据
检索方式精确查找/条件过滤相似度查找(ANN)
查询目标结构化信息语义相似、最近邻
性能优化索引、分区向量索引、分片、ANN
适用场景传统业务AI、推荐、语义搜索

三、核心技术原理

1. 高维向量存储

2. 相似度检索(ANN)

3. 向量索引

4. 混合检索


四、主流向量数据库产品

1. Milvus

2. Faiss

3. Weaviate

4. Pinecone

5. Qdrant

6. Elasticsearch/OpenSearch 向量检索


五、典型应用场景


六、基本操作与查询示例(以 Milvus 为例)

1. 插入向量

from pymilvus import Collection# 创建集合collection = Collection("demo")  # 已定义 schema# 插入向量entities = [[0.12, -0.98, ..., 0.56], [0.23, -0.87, ..., 0.45]]collection.insert(entities)2. 相似度检索

# 查询与目标向量最相近的前5条results = collection.search([[0.10, -0.90, ..., 0.50]], "embedding", params={"metric_type": "L2"}, limit=5)for hit in results[0]:    print(hit.id, hit.distance)3. 混合过滤检索

results = collection.search(    [[0.10, -0.90, ..., 0.50]],    "embedding",    limit=5,    expr="label == 'cat' and ts > 1680000000")
七、架构与性能优化


八、选型建议


九、向量数据库与 AI 的结合

向量数据库已成为 AI Agent、知识库、RAG 等新一代智能应用的核心基础设施。
它能让大模型“记住”海量知识、实现语义理解和推理,极大提升智能化水平。
十、Milvus 安装方式

1. Docker 一键安装(推荐)

适合个人开发、测试和小型生产环境。
# 下载官方 docker-compose 文件wget https://github.com/milvus-io/milvus/releases/download/v2.3.12/milvus-standalone-docker-compose.yml -O docker-compose.yml# 启动 Milvusdocker-compose up -d# 查看服务状态docker-compose ps
2. 本地二进制安装

适合有特殊定制需求的场景。
3. 云/集群部署


十一、Milvus 基本使用(Python为例)

1. 安装 Python SDK

pip install pymilvus2. 连接 Milvus 服务

from pymilvus import connectionsconnections.connect("default", host="localhost", port="19530")3. 创建 Collection(表)

定义 schema,包括主键和向量字段:
from pymilvus import FieldSchema, CollectionSchema, DataType, Collectionfields = [    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=False),    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128)]schema = CollectionSchema(fields, description="向量检索测试")collection = Collection("demo_collection", schema)4. 插入向量数据

import numpy as npids = [1, 2, 3]vectors = np.random.random((3, 128)).tolist()collection.insert([ids, vectors])5. 构建索引(提高检索效率)

index_params = {    "index_type": "IVF_FLAT",    # 可选 HNSW、IVF_PQ 等    "metric_type": "L2",         # 可选 COSINE、IP    "params": {"nlist": 128}}collection.create_index(field_name="embedding", index_params=index_params)6. 向量检索

search_vectors = np.random.random((1, 128)).tolist()results = collection.search(    search_vectors,    "embedding",    params={"metric_type": "L2", "nprobe": 10},    limit=5)for hit in results[0]:    print(f"id: {hit.id}, distance: {hit.distance}")7. 结构化过滤/混合检索(如有其他字段)

results = collection.search(    search_vectors,    "embedding",    limit=5,    expr="id > 1")8. 删除/更新数据

collection.delete("id in [2,3]")
十二、管理与运维


十三、常见问题与建议


十四、Milvus Java/Go 客户端示例

1. Java 客户端(milvus-sdk-java)

1.1 Maven 依赖

<dependency>    <groupId>io.milvus</groupId>    <artifactId>milvus-sdk-java</artifactId>    <version>2.3.4</version> <!-- 请使用 Milvus 官网最新版本 --></dependency>1.2 基本操作示例

import io.milvus.client.*;import io.milvus.grpc.DataType;import java.util.Arrays;import java.util.List;public class MilvusDemo {    public static void main(String[] args) {        MilvusServiceClient milvusClient = new MilvusServiceClient(            ConnectParam.newBuilder()                .withHost("localhost")                .withPort(19530)                .build()        );        // 创建集合        FieldType idField = FieldType.newBuilder()                .withName("id")                .withDataType(DataType.Int64)                .withPrimaryKey(true)                .withAutoID(false)                .build();        FieldType vectorField = FieldType.newBuilder()                .withName("embedding")                .withDataType(DataType.FloatVector)                .withDimension(128)                .build();        CreateCollectionParam createCollectionReq = CreateCollectionParam.newBuilder()                .withCollectionName("java_demo")                .withDescription("Java Milvus Demo")                .withShardsNum(2)                .addFieldType(idField)                .addFieldType(vectorField)                .build();        milvusClient.createCollection(createCollectionReq);        // 插入数据        List<Long> ids = Arrays.asList(1L, 2L, 3L);        List<List<Float>> vectors = Arrays.asList(            Arrays.asList(0.1f, 0.2f, ...), // 128维向量            Arrays.asList(0.3f, 0.4f, ...),            Arrays.asList(0.5f, 0.6f, ...)        );        InsertParam insertParam = InsertParam.newBuilder()                .withCollectionName("java_demo")                .addField("id", ids)                .addField("embedding", vectors)                .build();        milvusClient.insert(insertParam);        // 检索        List<List<Float>> searchVectors = Arrays.asList(Arrays.asList(0.1f, 0.2f, ...));        SearchParam searchParam = SearchParam.newBuilder()                .withCollectionName("java_demo")                .withMetricType(MetricType.L2)                .withOutFields(Arrays.asList("id"))                .withTopK(5)                .withVectors(searchVectors)                .withVectorFieldName("embedding")                .withParams("{\"nprobe\":10}")                .build();        SearchResults searchResults = milvusClient.search(searchParam);        // 处理 searchResults...        milvusClient.close();    }}
省略部分请用实际维度补全。更多细节见Milvus Java SDK文档。

2. Go 客户端(milvus-sdk-go)

2.1 安装

go get github.com/milvus-io/milvus-sdk-go/v2@latest2.2 基本操作示例

package mainimport (    "context"    "fmt"    "github.com/milvus-io/milvus-sdk-go/v2/client"    "github.com/milvus-io/milvus-sdk-go/v2/entity")func main() {    ctx := context.Background()    cli, err := client.NewGrpcClient(ctx, "localhost:19530")    if err != nil {        panic(err)    }    defer cli.Close()    // 创建集合    schema := &entity.Schema{        CollectionName: "go_demo",        Description:    "Milvus Go Demo",        Fields: []*entity.Field{            entity.NewField().                WithName("id").                WithDataType(entity.FieldTypeInt64).                WithIsPrimaryKey(true).                WithAutoID(false),            entity.NewField().                WithName("embedding").                WithDataType(entity.FieldTypeFloatVector).                WithDim(128),        },    }    err = cli.CreateCollection(ctx, schema, 2)    if err != nil {        panic(err)    }    // 插入数据    ids := entity.NewColumnInt64("id", []int64{1, 2, 3})    vectors := entity.NewColumnFloatVector("embedding", 128, [][]float32{        {0.1, 0.2, ...}, // 128维        {0.3, 0.4, ...},        {0.5, 0.6, ...},    })    _, err = cli.Insert(ctx, "go_demo", "", ids, vectors)    if err != nil {        panic(err)    }    // 检索    searchVec := [][]float32{{0.1, 0.2, ...}}    res, err := cli.Search(ctx, "go_demo", []string{}, "", []string{"embedding"}, searchVec, "embedding", entity.L2, 5, nil)    if err != nil {        panic(err)    }    fmt.Println(res)    // 更多API见官方[Go SDK文档](https://milvus.io/docs/go_sdk.md)}
十五、分布式部署配置(Kubernetes Helm)

1. 前提

2. 安装 Milvus Helm Chart

helm repo add milvus https://milvus-io.github.io/milvus-helm/helm repo update# 查看可用版本helm search repo milvus# 安装分布式集群helm install my-milvus milvus/milvus --set cluster.enabled=true3. 主要组件

4. 主要配置项

可通过 values.yaml 或 --set 参数自定义副本数、存储、资源等。
cluster:  enabled: true  queryNode:    replicaCount: 2  dataNode:    replicaCount: 2  minio:    persistence:      size: 100Gi  etcd:    replicaCount: 3完整配置见官方 Helm 文档。
5. 访问方式


十六、与 LLM/知识库集成方案(RAG 实践)

1. 典型流程

2. Python 端到端示例

import openaifrom pymilvus import Collection, connections# 1. 连接 Milvusconnections.connect("default", host="localhost", port="19530")collection = Collection("knowledge_base")# 2. 用户提问question = "什么是向量数据库?"q_emb = openai.Embedding.create(model="text-embedding-ada-002", input=question)["data"][0]["embedding"]# 3. 检索相关知识段results = collection.search([q_emb], "embedding", limit=5)context = "\n".join([hit.entity.get("content") for hit in results[0]])# 4. 拼接上下文给大模型prompt = f"已知知识:{context}\n请回答:{question}"answer = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=[{"role": "user", "content": prompt}])print(answer["choices"][0]["message"]["content"])3. Java/Go 集成建议

知识传递,互通有无,创作不易,点点关注!

原文地址:https://blog.csdn.net/onlymscn/article/details/151793066




欢迎光临 AI创想 (https://www.llms-ai.com/) Powered by Discuz! X3.4