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

news/2024/7/19 12:56:08 标签: milvus

1.向量数据库科普

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

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

milvus__Thowee___10">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

在这里插入图片描述

milvus___openai___30">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']]

milvus___openai___43">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']]

milvus__59">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) # 表名 , 模型维度

milvus_87">6.milvus存储

milvus__thowee__88">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()#返回
)

milvus___102">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"

milvus__129">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)

在这里插入图片描述

milvus___thowee__174">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()

milvus__192">8.milvus 删除

emb_collection.delete(expr=f"id == [{emb_id}]") # failed

emb_collection.delete(expr=f"id in [{emb_id}]") # Success

http://www.niftyadmin.cn/n/5059748.html

相关文章

【文献阅读】Pocket2Mol : 基于3D蛋白质口袋的高效分子采样 + CrossDocked数据集说明

Pocket2Mol: Efficient Molecular Sampling Based on 3D Protein Pockets code: GitHub - pengxingang/Pocket2Mol: Pocket2Mol: Efficient Molecular Sampling Based on 3D Protein Pockets 所用数据集 与“A 3D Generative Model for Structure-Based Drug Desi…

怎样给Ubuntu系统安装vmware-tools

首先我要告诉你:Ubuntu无法安装vmware-tools,之所以这么些是因为我一开始也是这样认为的,vmware-tools是给Windows系统准备的我认为,毕竟Windows占有率远远高于Linux,这也可以理解。 那么怎么样实现Ubuntu虚拟机跟Wind…

雷柏mv20鼠标使用体验

用了1年多,第一次用竖着的鼠标,现在已经很习惯了,感觉还不错。说说使用感受: 1、 仍然是长时间使用鼠标,但是很少出现手腕痛的情况,确实是有一定效果的。 2、使用场景是有限制的,我是配合笔记…

C++标准模板(STL)- 输入/输出操纵符-(std::setprecision,std::setw)

操纵符是令代码能以 operator<< 或 operator>> 控制输入/输出流的帮助函数。 不以参数调用的操纵符&#xff08;例如 std::cout << std::boolalpha; 或 std::cin >> std::hex; &#xff09;实现为接受到流的引用为其唯一参数的函数。 basic_ostream::…

每日一博 - 闲聊 Java 中的中断

文章目录 概述常见的中断问题中断一个处于运行状态的线程中断一个正在 sleep 的线程中断一个由于获取 ReentrantLock 锁而被阻塞的线程 如何正确地使用线程的中断标识JDK 的线程池 ThreadPoolExecutor 内部是如何运用中断实现功能的小结 概述 在 Java 中&#xff0c;中断是一种…

查看端口被占用:lsof

lsof 安装命令 [sarahhadoop102 bin]$ sudo yum install -y lsof如何查看 比如查看8080端口被谁占用了 [sarahhadoop102 bin]$ lsof -i:8080 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 8769 sarah 53u IPv6 7950020 0t0 TCP *:webcache …

Leetcode---364场周赛

题目列表 2864. 最大二进制奇数 2865. 美丽塔 I 2866. 美丽塔 II 2867. 统计树中的合法路径数目 一、最大二进制奇数 这题只要你对二进制有了解(学编程的不会不了解二进制吧)&#xff0c;应该问题不大&#xff0c;这题要求最大奇数&#xff0c;1.奇数&#xff1a;只要保证…

各种数据库表名长度限制整理

因为工作原因&#xff0c;需要整理下系统支持的数据库的表名长度限制&#xff0c;现发出来&#xff0c;以节省大家的整理时间&#xff0c;如有不对的敬请斧正&#xff01; 数据库类型长度ORACLE 30GreenPlum40KINGBASEES63PostgreSql63Gbase63瀚高63OSCAR64MYSQL 64HBASE64Mar…