ToB企服应用市场:ToB评测及商务社交产业平台

标题: 最强中文Embedding模子m3e和向量数据库Qdrant联动 [打印本页]

作者: 熊熊出没    时间: 2024-6-11 08:30
标题: 最强中文Embedding模子m3e和向量数据库Qdrant联动
目录

择要
M3e先容
向量数据库Qdrant
实际案例
向量数据库的查询
总结

择要

        将文本进行嵌入(embedding)并存入向量数据库的过程通常用于将文本数据转化为一连的向量表示,以便于进行呆板学习、天然语言处置惩罚或信息检索等使命。本文将先容怎样将文本存入通过m3e进行embedding然后存入到Qdrant的向量数据库。重要应用场景大模子的问答检索、关键词匹配检索等。

M3e先容

huggingface链接:moka-ai/m3e-base · Hugging Face
M3E 是 Moka Massive Mixed Embedding 的缩写


向量数据库Qdrant

        Qdrant是一个基于向量数据库的开源项目,重要用于高效存储和检索向量数据。以下是一些关于Qdrant的基本信息:

实际案例

代码如下:
  1. # -*- coding: utf-8 -*-
  2. from qdrant_client import QdrantClient
  3. from qdrant_client.models import Distance, VectorParams, PointStruct
  4. import requests
  5. import json
  6. import pandas as pd
  7. import sys
  8. arguments = sys.argv
  9. print('以下是你的需要存储的信息:')
  10. print('需要存入向量数据库的文件为:', arguments[1])
  11. print('存入该文件中的字段为:', arguments[2])
  12. print('向量数据库的地址为:' + 'http://' + arguments[3] + ':' + arguments[4] + '/dashboard#')
  13. print('存储的向量数据库名为:', arguments[5])
  14. def m3e_emdedding(data_input):
  15.     url = '模型地址'
  16.     headers = {
  17.         'Authorization': '模型参数',
  18.         'Content-Type': '模型参数',
  19.     }
  20.     data = {
  21.         'model': 'm3e',
  22.         'input': data_input
  23.     }
  24.     response = requests.post(url, headers=headers, json=data)
  25.     result = json.loads(response.text)
  26.     return result
  27. # 读取指定文件路径
  28. try:
  29.     df = pd.read_csv(arguments[1])
  30. except:
  31.     df = pd.read_excel(arguments[1])
  32. # 指定列列名
  33. sentences = df[arguments[2]].tolist()
  34. print('所需存入向量数据库的数量为:', len(sentences))
  35. print('数据字段转向量中。。。')
  36. try:
  37.     embedding = m3e_emdedding(sentences)
  38. except:
  39.     embedding = []
  40.     print('me3模型地址失效')
  41. print('数据字段转向量完成!')
  42. embedding = embedding.get('data')
  43. embeddings = [item['embedding'] for item in embedding]
  44. client = QdrantClient(arguments[3], port=arguments[4])
  45. # 创建向量数据库第一次执行后续千万别再执行这一条!!!!
  46. client.recreate_collection(
  47.     collection_name=arguments[5],
  48.     vectors_config=VectorParams(size=1536, distance=Distance.COSINE),
  49. )
  50. print('向量数据库创建集合完成')
  51. print('开始存入。。。')
  52. # 插入数据
  53. for i in range(len(sentences)):
  54.     str = sentences[i]
  55.     vectors = embeddings[i]
  56.     # print(f"str={str}, len(vectors)={len(vectors)}")
  57.     client.upsert(
  58.         collection_name=arguments[5],
  59.         points=[
  60.             PointStruct(
  61.                 id=i,
  62.                 vector=vectors,
  63.                 payload={"info": str}
  64.             )
  65.         ]
  66.     )
  67. print('向量数据库存入数据完成')
复制代码
        代码讲解:此代码直接读取的csv的一些字段存入向量数据库,值得注意的是m3e的embedding的size需要和向量数据库所对应否则存不进去。
        注:同一直量数据库创建实行一次即可,否则会被覆盖。存储完成后可以去到网页端查看,具体网址为:向量数据库ip:端口/dashboard#
图片实例:



向量数据库的查询

代码示例:
  1. from qdrant_client import QdrantClient
  2. import requests
  3. import json
  4. def m3e_emdedding(data_input):
  5.     url = '模型地址'
  6.     headers = {
  7.         'Authorization': '模型参数',
  8.         'Content-Type': '模型参数',
  9.     }
  10.     data = {
  11.         'model': 'm3e',
  12.         'input': data_input
  13.     }
  14.     response = requests.post(url, headers=headers, json=data)
  15.     result = json.loads(response.text)
  16.     return result
  17. # 需要匹配的词
  18. field = ['恩替卡韦', '血红蛋白']
  19. sentence_embeddings = m3e_emdedding(field).get('data')
  20. sentence_embeddings = [item['embedding'] for item in sentence_embeddings]
  21. client = QdrantClient('向量数据库ip', port=端口)
  22. current_matches = []
  23. # 循环遍历输入的每个值
  24. for i, embedding in enumerate(sentence_embeddings):
  25.     hits = client.search(
  26.         collection_name="fields",
  27.         query_vector=embedding,
  28.         limit=3   #搜寻条数
  29.     )
  30.     # 创建一个空列表,用于存储当前句子的匹配结果
  31.     current_matches = []
  32.     # 对每一次匹配的3个值循环判断
  33.     for j, item in enumerate(hits):
  34.         print(f'第{j + 1}次,{field[i]},匹配后中的得分为:{hits[j].score}, 匹配值为:{hits[j].payload.get("info")}')
  35.         if hits[j].score > 0.5:
  36.             # 将符合条件的数据添加到当前句子的匹配结果列表中
  37.             match_data = {
  38.                 "info": hits[j].payload.get("info"),
  39.                 "score": hits[j].score,
  40.                 'old': field[i]
  41.             }
  42.             current_matches.append(match_data)
  43. print(current_matches)
复制代码
结果展示:

        代码解释:此代码为查询代码,通过用户输入的中文,进行编码然后去处量数据库查询,可以通过得分和条数来进行筛选 ,具体由使命来定。

总结

在大模子中使用向量数据库具有多方面的意义,特别是在处置惩罚大规模向量数据时。以下是一些在大模子中使用向量数据库的重要意义:
总体而言,向量数据库在大模子中的使用有助于进步效率、降低资源消耗、支持实时应用,并允许模子动态地适应和更新数据。这对于处置惩罚大规模向量数据的当代应用非常重要,例如在天然语言处置惩罚、计算机视觉、推荐系统等领域。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4