RAG--03--Milvus基本用法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


操作Milvus数据库

数据库操作

a、连接数据库

bash 复制代码
from pymilvus import MilvusClient

client = MilvusClient(
    uri="http://39.100.64.14:19530",
    token="root:Milvus",
)


client = MilvusClient(
    uri="http://39.100.64.14:19530",
    user="root",
    password="Milvus",
    # db_name="default",
)

print(client.list_databases())
print(client.list_users())

b、用户管理

bash 复制代码
# 创建新用户
client.create_user(
    user_name="user_zs",
    password="P@ssw0rd",
)

print(client.describe_user("user_zs"))

# 更新用户密码
client.update_password(
    user_name="user_zs",
    old_password="P@ssw0rd",
    new_password="P@ssw0rd123"
)

# 删除用户
client.drop_user(user_name="user_zs")

c、数据库管理

bash 复制代码
# 创建数据库
client.create_database(
    db_name="my_database",
    properties={
        "database.max.collections": 10
    }
)
print(client.list_databases())
# 查看数据库信息
print(client.describe_database(
    db_name="my_database"
))
# 使用数据库(切换数据库)
client.use_database(
    db_name="my_database"
)
# 删除数据库
client.drop_database(
    db_name="my_database"
)
print(client.list_databases())

1、DDL操作

1.1 Database

1.2 Collection

2、DML操作

确保已删除名为docs 的collection,下文会重新创建

2.1 准备嵌入模型

2.2 准备collection

python 复制代码
{
    'collection_name': 'docs',
    'auto_id': False,
    'num_shards': 1,
    'description': '',
    'fields': [
        {
            'field_id': 100,
            'name': 'id',
            'description': '',
            'type': <DataType.INT64: 5>,
            'params': {},
            'is_primary': True
        },
        {
            'field_id': 101,
            'name': 'vector',
            'description': '',
            'type': <DataType.FLOAT_VECTOR: 101>,
            'params': {'dim': 1024}
        }
    ],
    'functions': [],
    'aliases': [],
    'collection_id': 467040847074183555,
    'consistency_level': 2,
    'properties': {'timezone': 'UTC'},
    'num_partitions': 1,
    'enable_dynamic_field': True,
    'enable_namespace': False,
    'created_timestamp': 467041742317420562,
    'update_timestamp': 467041742317420562
}

2.3 准备数据

2.4 写入数据

3、DQL操作

3.1 扫描数据

通过query_iterator 扫描collection下的所有数据

python 复制代码
iterator = client.query_iterator(
    collection_name=collection_name,
    filter="",
    output_fields=["*"]
)

i = 0
while True:

    rows = iterator.next()

    if not rows:
        break

    for row in rows:
        print(f"第{i + 1}条数据:")
        # print(row)

        print(f"id : {row["id"]},vector = {row["vector"][:5]},text = {row["text"]},source = {row["source"]}")

        i += 1

iterator.close()
python 复制代码
第1条数据:
id : 0,vector = [-0.011260323226451874, 0.04925568029284477, 0.04267069697380066, -0.0021236573811620474, 0.005432611797004938],text = LangChain 是一个用于构建 LLM 应用的开发框架。,source = demo
第2条数据:
id : 1,vector = [-0.02432798594236374, 0.0016291062347590923, 0.01846320368349552, 0.00872476864606142, -0.009267804212868214],text = Milvus 是一个适合 AI 应用的向量数据库。,source = demo
第3条数据:
id : 2,vector = [-0.004508086945861578, 0.030777014791965485, 0.0059316931292414665, -0.03660701960325241, -0.0033217482268810272],text = RAG 的核心是先检索相关知识,再让大模型生成答案。,source = demo
第4条数据:
id : 3,vector = [0.005521129816770554, 0.013496095314621925, -0.013929124921560287, -0.02554875798523426, -0.010753572918474674],text = Docker Desktop 可以方便地在本地运行 Milvus Standalone。,source = demo

3.2 通过主键查询数据

python 复制代码
res = client.get(
    collection_name=collection_name,
    ids=[0,1,2]
)

print(len(res))

for i in range(len(res)):
    print(f"第{i + 1}条数据:")
    print(f"id : {res[i]["id"]},vector = {res[i]["vector"][:5]},text = {res[i]["text"]},source = {res[i]["source"]}")
    # print(res[i])
python 复制代码
3
第1条数据:
id : 0,vector = [-0.011260323226451874, 0.04925568029284477, 0.04267069697380066, -0.0021236573811620474, 0.005432611797004938],text = LangChain 是一个用于构建 LLM 应用的开发框架。,source = demo
第2条数据:
id : 1,vector = [-0.02432798594236374, 0.0016291062347590923, 0.01846320368349552, 0.00872476864606142, -0.009267804212868214],text = Milvus 是一个适合 AI 应用的向量数据库。,source = demo
第3条数据:
id : 2,vector = [-0.004508086945861578, 0.030777014791965485, 0.0059316931292414665, -0.03660701960325241, -0.0033217482268810272],text = RAG 的核心是先检索相关知识,再让大模型生成答案。,source = demo

3.3 相似度检索

① 准备查询嵌入

python 复制代码
#%%
# 相似度检索
query = "什么是向量数据库?"
query_vector = embed_model.embed_query(query)

② 检索

python 复制代码
results = client.search(
    collection_name=collection_name,
    data=[query_vector],
    limit=3,
    output_fields=["text","source","id"]
)

for res in results[0]:
    print(res)
python 复制代码
{'id': 0, 'distance': 0.6388449668884277, 'entity': {'id': 0, 'text': 'LangChain 是一个用于构建 LLM 应用的开发框架。', 'source': 'demo'}}
{'id': 3, 'distance': 0.31398770213127136, 'entity': {'id': 3, 'text': 'Docker Desktop 可以方便地在本地运行 Milvus Standalone。', 'source': 'demo'}}
{'id': 2, 'distance': 0.2985413074493408, 'entity': {'id': 2, 'text': 'RAG 的核心是先检索相关知识,再让大模型生成答案。', 'source': 'demo'}}

collections和数据操作

一、Schema 和字段

python 复制代码
from pymilvus import MilvusClient, DataType

schema = MilvusClient.create_schema()

a、主键和 AutoId

python 复制代码
schema.add_field(
    field_name="my_id",
    datatype=DataType.INT64,
    is_primary=True,
    auto_id=False,
    
)

schema.add_field(
    field_name="my_id",
    datatype=DataType.VARCHAR,
    is_primary=True,
    auto_id=True,
    max_length=512,
)

b、向量字段

  • 向量字段接受各种稀疏和密集向量嵌入。,您可以向 Collections 添加最多四个向量字段。

  • 密集向量主要用于需要理解数据语义的场景,如语义搜索和推荐系统。在语义搜索中,密集向量有助于捕捉查询和文档之间的潜在联系,提高搜索结果的相关性。在推荐系统中,密集矢量有助于识别用户和项目之间的相似性,从而提供更加个性化的建议。

  • 稠密向量可使用各种嵌入模型生成,这些模型将原始数据转化为高维空间中的点,捕捉数据的语义特征。

  • 密集向量通常表示为具有固定长度的浮点数数组,如0.2, 0.7, 0.1, 0.8, 0.3, ..., 0.5 。这些向量的维度通常从数百到数千不等,如 128、256、768 或 1024。每个维度都能捕捉对象的特定语义特征,通过相似性计算使其适用于各种场景。

python 复制代码
schema.add_field(field_name="dense_vector", datatype=DataType.FLOAT_VECTOR, dim=1024)
为向量字段设置索引参数

为了加速语义搜索,必须为向量字段创建索引。索引可以大大提高大规模向量数据的检索效率。

python 复制代码
index_params = client.prepare_index_params()

index_params.add_index(
    field_name="dense_vector",
    index_name="dense_vector_index",
    index_type="AUTOINDEX",
    metric_type="IP"
)

client.create_collection(
    collection_name="my_collection",
    schema=schema,
    index_params=index_params
)

c、稀疏向量

python 复制代码
schema.add_field(field_name="sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR)
schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=65535, 
python 复制代码
index_params = client.prepare_index_params()

index_params.add_index(
    field_name="sparse_vector",
    index_name="sparse_inverted_index",
    index_type="SPARSE_INVERTED_INDEX",
    metric_type="BM25",
    params={"inverted_index_algo": "DAAT_MAXSCORE"}, # or "DAAT_WAND" or "TAAT_NAIVE"
)

d、全文索引和搜索

python 复制代码
analyzer_params = {
    "tokenizer": "jieba",
    "filter": ["cnalphanumonly"]
}

analyzer_params = {
    "type": "chinese",
}
python 复制代码
analyzer_params = {
        "tokenizer": "standard",
        "filter": [
                "lowercase",
                {
                        "type": "stemmer",
                        "language": "english"
                }, {
                        "type": "stop",
                        "stop_words": "_english_"
                }
        ]
}

现在,定义一个将文本转换为稀疏向量表示的函数,然后将其添加到 Schema 中:

python 复制代码
bm25_function = Function(
    name="text_bm25_emb",  # Function name
    input_field_names=["text"],  # Name of the VARCHAR field containing raw text data
    output_field_names=["sparse"],
    # Name of the SPARSE_FLOAT_VECTOR field reserved to store generated embeddings
    function_type=FunctionType.BM25,  # Set to `BM25`
)
schema.add_function(bm25_function)

e、标量字段

python 复制代码
schema.add_field(
    field_name="my_array",
    datatype=DataType.ARRAY,
    element_type=DataType.VARCHAR,
    max_capacity=5,
    max_length=512,
)

schema.add_field(
    field_name="my_json",
    datatype=DataType.JSON,
)

schema.add_field(
    field_name="my_bool",
    datatype=DataType.BOOL,
)

schema.add_field(
    field_name="my_int64",
    datatype=DataType.INT64,  # Milvus 支持的数字类型有Int8,Int16,Int32,Int64,Float 和Double 。
)

schema.add_field(
    field_name="my_varchar",
    datatype=DataType.VARCHAR,
    # highlight-next-line
    max_length=512
)

f、可归零和默认值

python 复制代码
schema.add_field(field_name="age", datatype=DataType.INT64, nullable=True) 
schema.add_field(field_name="age", datatype=DataType.INT64, default_value=18)

二、创建Collection

python 复制代码
from pymilvus import MilvusClient, DataType, Function, FunctionType



client = MilvusClient(
    uri="http://39.100.64.14:19530",
    user="root",
    password="Milvus",
    # db_name="default",
)


schema = client.create_schema()
schema.add_field(field_name='id', datatype=DataType.INT64, is_primary=True, auto_id=True)
schema.add_field(field_name='text', datatype=DataType.VARCHAR, max_length=6000, enable_analyzer=True,
                 analyzer_params={"tokenizer": "jieba", "filter": ["cnalphanumonly"]})
schema.add_field(field_name='category', datatype=DataType.VARCHAR, max_length=1000, nullable=True)
schema.add_field(field_name='filename', datatype=DataType.VARCHAR, max_length=1000, nullable=True)
schema.add_field(field_name='filetype', datatype=DataType.VARCHAR, max_length=1000, nullable=True)
schema.add_field(field_name='title', datatype=DataType.VARCHAR, max_length=1000, nullable=True)
schema.add_field(field_name='sparse', datatype=DataType.SPARSE_FLOAT_VECTOR)
schema.add_field(field_name='dense', datatype=DataType.FLOAT_VECTOR, dim=1024)

bm25_function = Function(
    name="text_bm25_emb",  # Function name
    input_field_names=["text"],  # Name of the VARCHAR field containing raw text data
    output_field_names=["sparse"],
    function_type=FunctionType.BM25,  # Set to `BM25`
)
schema.add_function(bm25_function)
index_params = client.prepare_index_params()

index_params.add_index(
    field_name="sparse",
    index_name="sparse_inverted_index",
    index_type="SPARSE_INVERTED_INDEX",  # Inverted index type for sparse vectors
    metric_type="BM25",
    params={
        "inverted_index_algo": "DAAT_MAXSCORE",
        "bm25_k1": 1.2,  # 1.2 ~ 2.0 (1.2) 词频 (TF) 的饱和度: 高频词的贡献越大,词频影响越线性,饱和度增长越慢(通俗:控制一个词出现多少次才算"多")
        "bm25_b": 0.75  # 0.0 ~ 1.0 (0.75) 文档长度归一化的强度: 文档长度的影响越大,对长文档的惩罚越强(通俗:控制"长篇大论"相对于"言简意赅"的劣势有多大,旨在避免长文档仅仅因为包含更多词汇而在相似度计算中占据不公平的优势。)
    },
)
index_params.add_index(
    field_name="dense",
    index_name="dense_inverted_index",
    index_type="AUTOINDEX",
    metric_type="IP"
)

client.create_collection(
    collection_name='t_doc_collection',
    schema=schema,
    index_params=index_params
)

# 查看集合信息
res = client.describe_collection(
    collection_name="t_doc_collection"
)

print(res)
python 复制代码
# 加载 Collections 时,Milvus 会将索引文件和所有字段的原始数据加载到内存中,以便快速响应搜索和查询。
# 在载入 Collections 后插入的实体会自动编入索引并载入。
client.load_collection(
    collection_name="t_doc_collection"
)

res = client.get_load_state(
    collection_name="t_doc_collection"
)

print(res)

# 释放当前不使用的 Collection。
client.release_collection(
    collection_name="t_doc_collection"
)

res = client.get_load_state(
    collection_name="t_doc_collection"
)

print(res)

# 删除集合
# client.drop_collection(
#     collection_name="t_doc_collection"
# )

三、插入数据

python 复制代码
client = MilvusClient(
    uri="http://39.100.64.14:19530",
    user="root",
    password="Milvus",
    # db_name="default",
)
# 准备三条示例数据
sample_data = [
    {
        "text": "机器学习是人工智能的一个子领域,它使计算机系统能够从数据中学习并改进,而无需明确编程。常见的应用包括图像识别、自然语言处理和推荐系统。",
        "category": "人工智能",
        "filename": "ml_intro.pdf",
        "filetype": "PDF",
        "title": "机器学习基础"
    },
    {
        "text": "Python是一种高级、解释型的通用编程语言。其设计哲学强调代码的可读性,语法允许程序员用更少的代码行表达概念。Python支持多种编程范式,包括结构化、面向对象和函数式编程。",
        "category": "编程语言",
        "filename": "python_guide.docx",
        "filetype": "Word",
        "title": "Python 语言特性"
    },
    {
        "text": "区块链是一种分布式数据库,用于维护持续增长的记录列表,称为块。这些块使用加密技术链接和保护。区块链技术是比特币等加密货币的基础,但也在供应链管理、数字身份等领域有应用。",
        "category": "信息技术",
        "filename": "blockchain_overview.txt",
        "filetype": "Text",
        "title": "区块链技术简介"
    }
]


qwen3_embedding = SentenceTransformer("Qwen/Qwen3-Embedding-0.6B")
# resp = qwen3_embedding.encode('I like large language models.')
# print(resp)


# 为每条数据的 text 字段生成 dense 向量
for data in sample_data:
    data["dense"] = qwen3_embedding.encode(data["text"])


print(sample_data)

# 插入数据
insert_result = client.insert(
    collection_name="t_doc_collection",
    data=sample_data
)

print(f"成功插入 {insert_result['insert_count']} 条数据。")
print(f"生成的主键 IDs: {insert_result['ids']}")
相关推荐
像风一样自由20201 小时前
20.Milvus常见问题检索不到维度错误和数据一致性
人工智能·大模型·milvus
TDengine (老段)1 小时前
TDengine 线程模型 — 网络、调度、执行
大数据·数据库·物联网·制造·时序数据库·tdengine·涛思数据
上学的小垃圾2 小时前
01-数据库系统概述
数据库
二进制漫游记3 小时前
FastAPI项目集成 Qdrant向量数据库+阿里云Embedding完整实战(工具封装+业务调用)
数据库·python·阿里云·embedding
2501_928996223 小时前
GPT-4o换DeepSeek迁移成本多少?中科热备解析API聚合平台技术账本
前端·数据库·人工智能
泡干脆面就番茄5 小时前
MySQL_子查询_分页查询与联合查询详解
数据库·mysql
devpotato6 小时前
缓存与数据库更新顺序不一致问题
java·数据库·redis
天若有情6736 小时前
Node+MySQL小型全栈笔记项目实战课程分享
数据库·笔记·mysql
wxwx_bscxy3227 小时前
基于springboot宠物领养系统的设计与实现
数据库·spring boot·后端·spring·宠物