langchain基础教程(6)---构建知识库--②向量数据库-milvus

milvus和chromadb有一点不一样

  1. milvus可以区分db_name 和 collection_name

    db_name="milvus_db" # 指定数据库名称 不填默认default, 不会自动创建
    创建使用 milvus_client.create_database(db_name="milvus_db")

  2. milvus要用Schema 定义 Collections 的数据结构

    可以设置字段: 例如 主键,向量.元数据等,并设置数据类型
    其中字符串类型的要使用DataType.VARCHAR类型, 且指定长度 max_length
    索引id可以设置为自动

  3. milvus还可以设置索引

    milvus索引大体分 向量索引 和 标量索引
    向量索引重点关注精度和内存占用

  4. milvus使用是需要将集合(collection)加载进内存中

    这里的加载是将数据从milvus的磁盘中添加进milvus的内存中, 不用的时候也可以将集合卸载

  5. 查询 milvus的查询 get,Query,Search

    三者都必须填写 collection_name
    get 根据id获取
    search: 向量搜索,使用filter 可以过滤指定标量字段, 使用filter时是先过滤后搜索
    query 标量查询
    统计数量使用 milvus_client.get_collection_stats(collection_name=collection_name)
    获取集合字段信息使用:  client.describe_collection(collection_name)

案例代码:

复制代码
from pymilvus import MilvusClient, DataType

def get_embedding_dim():
    embedding_model_name=r"D:/MyWork/GitProject/LLM/my_llm/.model/embedding/bge-small-zh-v1.5"
    from sentence_transformers import SentenceTransformer
    model = SentenceTransformer(embedding_model_name)
    print(f"嵌入模型输出维度:{model.get_sentence_embedding_dimension()}") # 512


from langchain_huggingface import HuggingFaceEmbeddings
embedding_model = HuggingFaceEmbeddings(
    model_name=r"D:\MyWork\GitProject\LLM\my_llm\.model\embedding\bge-small-zh-v1.5",
    model_kwargs={
        "device": "cpu",
        "trust_remote_code": True,
    },
    encode_kwargs={"normalize_embeddings": True},
)

collection_name = "my_milvus_demo_collection"

def milvus_demo():
    milvus_client = MilvusClient(uri="http://10.10.10.10:19530",
                                  db_name=collection_name  #  指定数据库名称  不填默认default, 不会自动创建
                                 )
 

    # milvus_client = MilvusClient(uri="https://inxxxxxxxxxxxxxxx.serverless.ali-cn-hangzhou.cloud.zilliz.com.cn",
    #                               token="bea9f8facxxxxxxxxxxxxxxxxxxx" #  指定数据库名称  不填默认default, 不会自动创建
    #                              )

    # milvus_client.create_database(db_name="milvus_db")    #创建数据库

    print(milvus_client.list_databases())     # 查看数据库列表
    print(milvus_client.list_collections())   # 查看集合列表
    # if True:
    #     return
    # 删除集合
    # milvus_client.drop_collection(collection_name="mem0_memory")
    # milvus_client.drop_collection(collection_name="mem0migrations")
    # # 删除数据库  必须先删除集合再删除数据库
    # milvus_client.drop_database("mem0_db")
    # print(milvus_client.list_databases())

    # 创建集合

    # 删除
    milvus_client.drop_collection(collection_name=collection_name)

    schema = milvus_client.create_schema()
    schema.add_field(
        field_name="id", # Primary field name
        is_primary=True, # 设置为主建
        auto_id=True,  #  设置主键自增
        datatype=DataType.INT64  # 主建类型
    )
    schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=512)
    schema.add_field(field_name="document", datatype=DataType.VARCHAR,max_length=2048)
    schema.add_field(field_name="metadata", datatype=DataType.JSON)
    schema.add_field(field_name="color", datatype=DataType.VARCHAR, max_length=100)


    if not milvus_client.has_collection(collection_name = collection_name):
        milvus_client.create_collection(collection_name = collection_name,  
                                       # dimension=512,
                                        schema= schema,
                                        properties={"collection.ttl.seconds": 1209600},  # 设置TTL 过期自动删除
                                        )
    # 设置索引
    index_params = MilvusClient.prepare_index_params()
    index_params.add_index(
        field_name="embedding",
        metric_type="COSINE",
        index_type= "HNSW",
        index_name="vector_index"
    )
    milvus_client.create_index(collection_name=collection_name, index_params=index_params)

    print(f'集合列表 -->  {milvus_client.list_collections()}')   
    res = milvus_client.describe_collection(collection_name=collection_name)
    print(f'集合描述 -->  {res}')

    documents_list = [
        "中国大唐集团有限公司成立于2002年12月29日,是中央直接管理的国有特大型能源企业,注册资本金370亿元,主要业务覆盖电力、煤炭煤化工、金融、环保、商贸物流和新兴产业。所属二级单位包括45家分、子公司和2家直属机构。其中,5家上市公司分别是:首家在伦敦上市的中国企业、首家在香港上市的电力企业------大唐国际发电股份有限公司;较早在国内上市的大唐华银电力股份有限公司、广西桂冠电力股份有限公司;在香港上市的中国大唐集团新能源股份有限公司、大唐环境产业集团股份有限公司。中国大唐积极践行"四个革命、一个合作"能源安全新战略,认真履行能源央企经济责任、政治责任、社会责任,企业使命是"提供绿色能源、点亮美好生活";企业愿景是打造"绿色低碳、多能互补、高效协同、数字智慧"的世界一流能源供应商,成为美丽中国建设的领军企业;企业价值观是"惟实惟新、共创共享";企业精神是"同心聚力、追求卓越"。截至2024年底,中国大唐发电装机容量突破2亿千瓦。在役及在建资产分布在全国31个省(自治区、直辖市)和香港特别行政区,以及缅甸、柬埔寨、老挝、印尼等多个国家和地区。连续16次入选世界500强。中国大唐建成世界在役最大火力发电厂------内蒙古大唐国际托克托发电公司、我国首个百万千瓦风电基地------内蒙古赤峰塞罕坝风电场、世界首台六缸六排汽百万千瓦机组------大唐东营发电公司。肩负着首都一半以上电力供应的重任,承担着"三北"地区近9.3亿平方米供热任务。",
        "在用户遵守本文件的前提下,海康威视授予用户关于本网站的有限的、不可转让的、非独占的、可撤销的、仅为合法及非商业性目的使用的权利。在任何情形下,本网站内容及服务仅被许可由用户本人使用而不得被出售或转让。海康威视保留本文件未特别授予的所有权利。用户在使用本网站过程中,必须遵循以下规则:1)遵守所有适用的法律和法规;2)遵守本文件及所有相关的协议、规定和程序,同时也必须遵循与因特网、本网站内容及服务使用有关的程序和惯例;3)不得利用本网站从事任何违法犯罪、危害国家安全或有损社会公共利益活动,包括但不限于分裂国家、教唆他人犯罪、侵犯计算机安全系统、干扰或混乱网络服务等;4)不得利用本网站进行任何可能对互联网正常运转造成不利影响的行为;5)不得侵犯海康威视或其他任何第三方的专利权、著作权、商标权等知识产权、名誉权或其他任何合法权益,或从事损害海康威视利益或对海康威视造成不利影响的行为。6)除非已遵守了本文件的其它规定或已取得了海康威视事先许可,用户不得为任何目的从事以下行为:-下载、复制、展示、分发、传播、上载、出版、发行本网站内容;-修改、编辑或以其他方式演绎本网站内容;-转让、转售、出租本网站内容或服务。如用户在使用本网站时违反上述或本文件相关规定,海康威视可自行判断要求用户改正或主动采取一切必要的措施(包括但不限于删除用户上传的内容、暂停或终止用户使用本网站的权利)以减轻用户不当行为造成的影响。",
        "海康威视不能保证于本网站下向用户提供的服务是连续的、即时的、准确的,不能保证缺陷一定会被及时纠正,也不能保证所提供的服务或服务器不受病毒或黑客等有害成分的侵袭。2)海康威视保留随时修改、增减、取消、暂停、中断或终止提供本网站的服务(全部或部分)而无需事先告知用户的权利,除非另有法规要求,海康威视在行使前述各项权利时亦无需对用户承担任何责任。3)本网站如因服务器系统维护或升级、硬件故障等而须暂停服务时,将尽量事先公告。于暂停服务期间造成的一切不便和资料、数据等遗失,本网站将尽力挽救恢复;如确实无法恢复,本网站不承担任何责任。4)海康威视不承担由于用户提供信息而可能产生的任何责任,包括但不限于因其他用户在没有获得授权的情形下使用用户提供信息,或因用户提供的信息包含错误、不准确、 病毒、诽谤、中伤、侵权等违反法律或侵害社会公共利益的内容而产生的任何责任。海康威视亦不对用户提供信息在任何情形下的丢失、删除、 移除或传输失败承担任何责任,用户应对其提供的信息自行保留备份。海康威视保留随时删除或移除任何用户提供信息的权利,而无需通知用户,且不需承担法律明确规定以外的责任。5)对于用户通过本网站或外部链接与第三方发生的任何法律行为,包括但不限于与第三方的交易,由用户与该第三方自行承担全部的责任,海康威视不承担任何责任。6)用户特此承认并接受:对于用户因使用本网站而遭受的任何直接或间接的损失,包括但不限于由于网站内容或服务的延误、不准确、错误和遗漏而产生的任何损害、责 任、请求、损失或费用,在相关法律法规允许的范围内,海康威视不承担任何责任。"
    ]

    
    ids = [1,2,3]
    colors =["红","蓝","绿"]
    metadatas =[{"type":"公司简介"},{"type":"海康威视"},{"type":"服务条款"}]
    embedding_results = embedding_model.embed_documents(documents_list)

    data = [
        { "metadata": metadata, "embedding": embedding,"color":color,"document":document}
        for metadata, embedding,document, color in zip( metadatas, embedding_results,documents_list,colors)
    ]

    # print(f'插入数据 -->  {data}')

    milvus_client.insert(collection_name=collection_name, data=data)

    



def milvus_search():  
    milvus_client = MilvusClient(uri="http://10.0.10.42:19530",
                                db_name="milvus_db" #  指定数据库名称  不填默认default, 不会自动创建
                                )
    print(milvus_client.list_collections())   # 查看集合列表

    load_state = milvus_client.get_load_state(collection_name=collection_name)
    print(f"集合{collection_name}的加载状态:{load_state}")
    if load_state.get("state") == "Loaded":
        print(f"集合{collection_name}已经加载")
    else:
        milvus_client.load_collection(collection_name=collection_name)  # 加载集合
    

    collection_stats = milvus_client.get_collection_stats(collection_name=collection_name)
    print(f"集合{collection_name}的统计信息:{collection_stats}")

    coll_desc = milvus_client.describe_collection(collection_name=collection_name)
    print(f"集合{collection_name}的描述信息:{coll_desc}")


    query_embedding = embedding_model.embed_query("大唐")
    result =milvus_client.search(collection_name=collection_name,
                          data=[query_embedding],
                          output_fields=["id","metadata","color"],
                          filter='color == "红"',
                            limit=10)
    print(f'搜索结果 -->  {result}')




if __name__ == '__main__':
    # get_embedding_dim()
    # milvus_demo()
    milvus_search()
    
    pass
相关推荐
TDengine (老段)2 小时前
TDengine IDMP 产品路线图
大数据·数据库·人工智能·ai·时序数据库·tdengine·涛思数据
刺客xs3 小时前
MySQL数据库----通配符,正则表达式
数据库·mysql·正则表达式
无限大.3 小时前
计算机十万个为什么--数据库索引
数据库·oracle
思成不止于此4 小时前
MySQL 数据操作:增删改核心语法全解析
数据库·笔记·学习·mysql
得物技术4 小时前
数据库AI方向探索-MCP原理解析&DB方向实战|得物技术
数据库
Arva .4 小时前
MySQL 的锁类型有哪些
数据库·mysql
APIshop5 小时前
微店关键词搜索商品列表 API 实战:micro.item_search 全流程指南
数据库
用户377833043495 小时前
( 教学 )Agent 构建 Prompt(提示词)6. 输出修正解析器 OutputFixingParser
人工智能·langchain
翔云1234565 小时前
在MySQL中,使用物理备份工具 xtrabackup备份扩容从库,从库上的gtid_executed和gtid_purged变化过程
数据库·mysql