熊熊出没 发表于 2024-6-11 08:30:02

最强中文Embedding模子m3e和向量数据库Qdrant联动

目录

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

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

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


[*]Moka,此模子由 MokaAI 训练,开源和评测,训练脚本使用 uniem ,评测 BenchMark 使用 MTEB-zh
[*]Massive,此模子通过千万级 (2200w+) 的中文句对数据集进行训练
[*]Mixed,此模子支持中英双语的同质文本相似度计算,异质文本检索等功能,将来还会支持代码检索
[*]Embedding,此模子是文本嵌入模子,可以将天然语言转换成稠密的向量
向量数据库Qdrant

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

[*] 向量数据库: Qdrant被设计为一种专门用于存储和检索向量数据的数据库。这种数据库范例实用于许多应用,如相似性搜索、推荐系统、天然语言处置惩罚等,其中数据以向量形式表示。
[*] 高性能: Qdrant注意性能,旨在支持大规模向量检索,并提供低耽误的响应时间。这对于需要快速检索相似向量的应用场景非常关键。
[*] 开源项目: Qdrant是一个开源项目,这意味着用户可以访问源代码、进行定制和贡献。它采用了开源许可证,可能是Apache License、MIT License等。
[*] 支持多维向量: Qdrant支持多维向量,这对于处置惩罚具有多个特性的数据非常重要,例如在天然语言处置惩罚中使用的词嵌入向量。
[*] API支持: Qdrant提供了一组API,使用户可以或许方便地插入、更新和检索向量数据。这使得与其他应用或服务集成变得更加容易。
[*] 灵活性: Qdrant被设计为具有一定的灵活性,以适应不同范例的向量数据和使用场景。用户可以根据其需求进行设置和定制。
实际案例

代码如下:
# -*- coding: utf-8 -*-
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct
import requests
import json
import pandas as pd
import sys

arguments = sys.argv
print('以下是你的需要存储的信息:')
print('需要存入向量数据库的文件为:', arguments)
print('存入该文件中的字段为:', arguments)
print('向量数据库的地址为:' + 'http://' + arguments + ':' + arguments + '/dashboard#')
print('存储的向量数据库名为:', arguments)


def m3e_emdedding(data_input):
    url = '模型地址'
    headers = {
      'Authorization': '模型参数',
      'Content-Type': '模型参数',
    }

    data = {
      'model': 'm3e',
      'input': data_input
    }

    response = requests.post(url, headers=headers, json=data)
    result = json.loads(response.text)
    return result


# 读取指定文件路径
try:
    df = pd.read_csv(arguments)
except:
    df = pd.read_excel(arguments)

# 指定列列名
sentences = df].tolist()
print('所需存入向量数据库的数量为:', len(sentences))

print('数据字段转向量中。。。')
try:
    embedding = m3e_emdedding(sentences)
except:
    embedding = []
    print('me3模型地址失效')
print('数据字段转向量完成!')

embedding = embedding.get('data')
embeddings = for item in embedding]

client = QdrantClient(arguments, port=arguments)

# 创建向量数据库第一次执行后续千万别再执行这一条!!!!
client.recreate_collection(
    collection_name=arguments,
    vectors_config=VectorParams(size=1536, distance=Distance.COSINE),
)
print('向量数据库创建集合完成')

print('开始存入。。。')
# 插入数据
for i in range(len(sentences)):
    str = sentences
    vectors = embeddings
    # print(f"str={str}, len(vectors)={len(vectors)}")
    client.upsert(
      collection_name=arguments,
      points=[
            PointStruct(
                id=i,
                vector=vectors,
                payload={"info": str}
            )
      ]
    )

print('向量数据库存入数据完成')
        代码讲解:此代码直接读取的csv的一些字段存入向量数据库,值得注意的是m3e的embedding的size需要和向量数据库所对应否则存不进去。
        注:同一直量数据库创建实行一次即可,否则会被覆盖。存储完成后可以去到网页端查看,具体网址为:向量数据库ip:端口/dashboard#
图片实例:
https://img-blog.csdnimg.cn/direct/2a7d4655c06c4ba0937d5446bcc65565.png

向量数据库的查询

代码示例:
from qdrant_client import QdrantClient
import requests
import json


def m3e_emdedding(data_input):
    url = '模型地址'
    headers = {
      'Authorization': '模型参数',
      'Content-Type': '模型参数',
    }

    data = {
      'model': 'm3e',
      'input': data_input
    }

    response = requests.post(url, headers=headers, json=data)
    result = json.loads(response.text)

    return result


# 需要匹配的词
field = ['恩替卡韦', '血红蛋白']

sentence_embeddings = m3e_emdedding(field).get('data')
sentence_embeddings = for item in sentence_embeddings]
client = QdrantClient('向量数据库ip', port=端口)

current_matches = []

# 循环遍历输入的每个值
for i, embedding in enumerate(sentence_embeddings):
    hits = client.search(
      collection_name="fields",
      query_vector=embedding,
      limit=3   #搜寻条数
    )

    # 创建一个空列表,用于存储当前句子的匹配结果
    current_matches = []

    # 对每一次匹配的3个值循环判断
    for j, item in enumerate(hits):
      print(f'第{j + 1}次,{field},匹配后中的得分为:{hits.score}, 匹配值为:{hits.payload.get("info")}')
      if hits.score > 0.5:
            # 将符合条件的数据添加到当前句子的匹配结果列表中
            match_data = {
                "info": hits.payload.get("info"),
                "score": hits.score,
                'old': field
            }
            current_matches.append(match_data)

print(current_matches)
结果展示:
https://img-blog.csdnimg.cn/direct/399ae9b35a6440049ce7c5840fd55ae5.png
        代码解释:此代码为查询代码,通过用户输入的中文,进行编码然后去处量数据库查询,可以通过得分和条数来进行筛选 ,具体由使命来定。
总结

在大模子中使用向量数据库具有多方面的意义,特别是在处置惩罚大规模向量数据时。以下是一些在大模子中使用向量数据库的重要意义:

[*] 高效的相似性搜索: 大模子通常需要处置惩罚大量的向量数据,如图像、文本、语音等。通过将这些向量存储在向量数据库中,可以实现高效的相似性搜索。模子可以快速检索与查询向量相似的邻人,而不必遍历整个数据集。
[*] 降低内存和计算资源消耗: 向量数据库可以资助模子降低内存和计算资源的消耗。相对于将所有向量加载到内存中进行搜索,向量数据库可以使用索引和高效的检索算法,从而在大规模数据集中实现更加经济高效的搜索。
[*] 支持实时应用: 对于需要实时响应的应用,如推荐系统或搜索引擎,向量数据库提供了一种快速检索相似向量的方式。这对于确保实时性能至关重要,尤其是在大规模的数据集中。
[*] 动态更新和插入: 向量数据库通常支持动态的向量更新和插入操纵,这对于大模子在运行时需要不断更新或添加新数据的场景非常重要。这使得模子可以或许及时反映最新的数据。
[*] 横向扩展性: 随着模子和数据规模的增长,向量数据库通常提供了横向扩展的能力,允许在需要时添加更多的计算和存储资源,以应对不断增长的需求。
[*] 高度可定制性: 向量数据库通常具有可定制的设置选项,以适应不同范例的向量数据和应用场景。这使得可以根据实际需求进行调解和优化。
总体而言,向量数据库在大模子中的使用有助于进步效率、降低资源消耗、支持实时应用,并允许模子动态地适应和更新数据。这对于处置惩罚大规模向量数据的当代应用非常重要,例如在天然语言处置惩罚、计算机视觉、推荐系统等领域。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 最强中文Embedding模子m3e和向量数据库Qdrant联动