• milvus 结合Thowee 文本转向量 ,新建表,存储,搜索,删除


    1.向量数据库科普

    【上集】向量数据库技术鉴赏
    【下集】向量数据库技术鉴赏
    milvus连接

    from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility
    connections.connect(host='124.****', port='19530')
    
    • 1
    • 2

    2.milvus + Thowee 文本转向量 使用

    @app.route("/es",methods=["GET","POST"])
    def es_sous():
        ans_pipe = (
            pipe.input('subject')
                .map('subject', 'vector', ops.text_embedding.dpr(model_name="facebook/dpr-ctx_encoder-single-nq-base"))#将输入的问题文本转换为向量表示,使用名为 "facebook/dpr-ctx_encoder-single-nq-base" 的预训练模型进行文本嵌入。
                .map('vector', 'vector', lambda x: x / np.linalg.norm(x, axis=0))#对上一步得到的向量进行归一化处理,使得向量的每个维度都被缩放到相同尺度。
                .output('vector')
        )
        param = request.args.get('prop')#传入一个文本
        ans = ans_pipe(param)#文本转向量
        ans = DataCollection(ans)#格式化
        ans.show() #
        print(type(ans[0].vector))
        list1 = ans[0].vector.tolist()
        return list1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    3.milvus + openai 文本转向量 使用

    import openai
    OPENAI_ENGINE = 'text-embedding-ada-002'#使用哪种嵌入模型
    openai.api_key = 'sk-*****'#您的 OpenAI 帐户密钥
    def embed(texts): #返回 向量
        embeddings = openai.Embedding.create(
            input=texts,
            engine=OPENAI_ENGINE
        )
        return [x['embedding'] for x in embeddings['data']]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4. milvus + 微软openai 文本转向量 使用

    import openai
    openai.api_key = "0**********"    # Azure 的密钥
    openai.api_base = "https://zhan.op*****"  # Azure 的终结点
    openai.api_type = "azure"
    openai.api_version = "2023-03-15-preview" # API 版本,未来可能会变
    model = "text"  # 模型的部署名
    def embed(texts):
        embeddings = openai.Embedding.create(
            input=texts,
            engine=model
        )
        return [x['embedding'] for x in embeddings['data']]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    5.milvus 新建表

    在这里插入图片描述
    在这里插入图片描述

    def create_milvus_collection(collection_name,dim):
        if utility.has_collection(collection_name):
            utility.drop_collection(collection_name)
        fields = [
            FieldSchema(name = 'id',dtype=DataType.INT64,description='ids',is_primary=True),
            FieldSchema(name='answer',dtype=DataType.VARCHAR,max_length = 2000,description='答案'),
            FieldSchema(name='subject',dtype=DataType.VARCHAR,max_length = 1000,description='题目'),
            FieldSchema(name='subject_embedding', dtype=DataType.FLOAT_VECTOR, dim=dim,description = '题目矢量'),
            FieldSchema(name='url', dtype=DataType.VARCHAR, max_length = 255,description = '路径')
        ]
        # CollectionSchema:这是一个用于定义数据表结构的类。
        schema = CollectionSchema(fields = fields,description='Test')
        collection = Collection(name=collection_name,schema=schema)
        index_params = {
            'metric_type': 'L2',
            'index_type': "IVF_FLAT",
            'params': {"nlist": 2048}
        }
        collection.create_index(field_name="subject_embedding",index_params=index_params)
        return collection
    collections = create_milvus_collection('Test',768) # 表名 , 模型维度
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    6.milvus存储

    1.milvus存储 和 thowee 管道

    insert = (
        pipe.input('id','subject','answer','url','subject_embedding')
        #将输入的问题文本转换为向量表示,使用名为 "facebook/dpr-ctx_encoder-single-nq-base" 的预训练模型进行文本嵌入。
        .map('subject','vec',ops.text_embedding.dpr(model_name='facebook/dpr-ctx_encoder-single-nq-base'))
        # 对上一步得到的向量进行归一化处理,使得向量的每个维度都被缩放到相同尺度。
        .map('vec', 'vec', lambda x: x / np.linalg.norm(x, axis=0))
        
        .map(('id','answer','subject','vec','url'),'insert_status',ops.ann_insert.milvus_client(host='124。*****', port='19530', collection_name='Test'))#进行存储
        .output()#返回
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.milvus存储 和 原始的存储方案

     milvus = Milvus(host=HOST, port=PORT) # milvus 连接
        data1 = [
            [],
            [],# subject
            [],# option
            [],# answer
            [],#knowledgepoints
            [],#img
            [],#video
            [],#parse
        ]
        data1[0].append(None)
        data1[1].append(request.args.get('subject'))
        data1[2].append(request.args.get('option'))
        data1[3].append(request.args.get('answer'))
        data1[4].append(request.args.get('knowledgepoints'))
        data1[5].append(request.args.get('img'))
        data1[6].append(request.args.get('video'))
        data1[7].append(request.args.get('parse'))
        data1.append(embed(data1[1]))# 转向量
        
        milvus.insert(collection_name=COLLECTION_NAME,entities=data1)# 调用 insert 新增 表名+数据
        return "ok"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    7.milvus 搜索

    # milvus 搜索
    # 搜索 索引
    QUERY_PARAM = {
        "metric_type": "L2",
        "params": {"ef": 64},
    }
    
    collection.search()
    
    res = collection.search(embed(request.args.get('subject')), anns_field='subject_embedding', param=QUERY_PARAM, limit = 1, output_fields=['id', 'subject', 'answer','option'])
    # 向量 , 指定被搜索字段,索引,top1,返回字段
    
    ______________________________________________例子
    import openai
    from pymilvus import connections, utility, FieldSchema, Collection, CollectionSchema, DataType
    HOST = '124.**********'
    PORT = 19530
    COLLECTION_NAME = 'mo'#在 Milvus 中如何命名
    DIMENSION = 1536 #嵌入的维度
    OPENAI_ENGINE = 'text-embedding-ada-002'#使用哪种嵌入模型
    openai.api_key = 'sk-***************'#您的 OpenAI 帐户密钥
    QUERY_PARAM = {
        "metric_type": "L2",
        "params": {"ef": 64},
    }
    connections.connect(host=HOST, port=PORT)
    def embed(texts):
        embeddings = openai.Embedding.create(
            input=texts,
            engine=OPENAI_ENGINE
        )
        return [x['embedding'] for x in embeddings['data']]
    collection = Collection(COLLECTION_NAME) 
    def query(query, top_k = 5):
        text = query
        res = collection.search(embed(text), anns_field='subject_embedding', param=QUERY_PARAM, limit = top_k, output_fields=['id', 'subject', 'answer'])
        print(res)
    my_query = ('P、V操作是一种')
    
    query(my_query)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    在这里插入图片描述

    milvus 搜索 + thowee管道 搜索

    ans_pipe = (
        pipe.input('subject')
            .map('subject', 'vector', ops.text_embedding.dpr(model_name="facebook/dpr-ctx_encoder-single-nq-base"))#将输入的问题文本转换为向量表示,使用名为 "facebook/dpr-ctx_encoder-single-nq-base" 的预训练模型进行文本嵌入。
            .map('vector', 'vector', lambda x: x / np.linalg.norm(x, axis=0))#对上一步得到的向量进行归一化处理,使得向量的每个维度都被缩放到相同尺度。
            .flat_map('vector', ('id','score', 'answer','subject'), ops.ann_search.milvus_client(host='124.222.24.191',
                                                                                       port='19530',
                                                                                       collection_name='Test',
                                                                                       output_fields=['answer','subject']))
            .output('subject','id','score','answer')
    )
    ans = ans_pipe('恶性肿瘤是什么?')
    ans = DataCollection(ans)
    ans.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    8.milvus 删除

    emb_collection.delete(expr=f"id == [{emb_id}]") # failed
    
    emb_collection.delete(expr=f"id in [{emb_id}]") # Success
    
    • 1
    • 2
    • 3
  • 相关阅读:
    linux-硬盘
    万字长文 - Python 日志记录器logging 百科全书 之 基础配置
    Serverless如何赋能餐饮行业数字化?乐凯撒思变之道
    信使mRNA甲基化偶联3-甲基胞嘧啶(m3C)|mRNA-m3C
    Java设计模式之迭代器模式
    软件测试基础-测试环境项目部署
    阿里P8又出一份堪称天花板级别《Java 核心面试笔记》被 GitHub 开源了
    C语言程序设计(二)基础内容
    强化学习基础(2)—常用算法总结
    介绍drawio和图表使用场景
  • 原文地址:https://blog.csdn.net/qq_56352553/article/details/133433335