目录

摘要

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的基本信息:

  1. 向量数据库: Qdrant被设计为一种专门用于存储和检索向量数据的数据库。这种数据库类型适用于许多应用,如相似性搜索、推荐系统、自然语言处理等,其中数据以向量形式表示。

  2. 高性能: Qdrant注重性能,旨在支持大规模向量检索,并提供低延迟的响应时间。这对于需要快速检索相似向量的应用场景非常关键。

  3. 开源项目: Qdrant是一个开源项目,这意味着用户可以访问源代码、进行定制和贡献。它采用了开源许可证,可能是Apache License、MIT License等。

  4. 支持多维向量: Qdrant支持多维向量,这对于处理具有多个特征的数据非常重要,例如在自然语言处理中使用的词嵌入向量。

  5. API支持: Qdrant提供了一组API,使用户能够方便地插入、更新和检索向量数据。这使得与其他应用或服务集成变得更加容易。

  6. 灵活性: 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[1])
print('存入该文件中的字段为:', arguments[2])
print('向量数据库的地址为:' + 'http://' + arguments[3] + ':' + arguments[4] + '/dashboard#')
print('存储的向量数据库名为:', arguments[5])


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[1])
except:
    df = pd.read_excel(arguments[1])

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

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

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

client = QdrantClient(arguments[3], port=arguments[4])

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

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

print('向量数据库存入数据完成')

        代码讲解:此代码直接读取的csv的一些字段存入向量数据库,值得注意的是m3e的embedding的size需要和向量数据库所对应否则存不进去。

        注:同一向量数据库创建执行一次即可,否则会被覆盖。存储完成后可以去到网页端查看,具体网址为:向量数据库ip:端口/dashboard#

图片实例:


向量数据库的查询

代码示例:

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 = [item['embedding'] 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[i]},匹配后中的得分为:{hits[j].score}, 匹配值为:{hits[j].payload.get("info")}')
        if hits[j].score > 0.5:
            # 将符合条件的数据添加到当前句子的匹配结果列表中
            match_data = {
                "info": hits[j].payload.get("info"),
                "score": hits[j].score,
                'old': field[i]
            }
            current_matches.append(match_data)

print(current_matches)

效果展示:

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


总结

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

  1. 高效的相似性搜索: 大模型通常需要处理大量的向量数据,如图像、文本、语音等。通过将这些向量存储在向量数据库中,可以实现高效的相似性搜索。模型可以快速检索与查询向量相似的邻居,而不必遍历整个数据集。

  2. 降低内存和计算资源消耗: 向量数据库可以帮助模型降低内存和计算资源的消耗。相对于将所有向量加载到内存中进行搜索,向量数据库可以使用索引和高效的检索算法,从而在大规模数据集中实现更加经济高效的搜索。

  3. 支持实时应用: 对于需要实时响应的应用,如推荐系统或搜索引擎,向量数据库提供了一种快速检索相似向量的方式。这对于确保实时性能至关重要,尤其是在大规模的数据集中。

  4. 动态更新和插入: 向量数据库通常支持动态的向量更新和插入操作,这对于大模型在运行时需要不断更新或添加新数据的场景非常重要。这使得模型能够及时反映最新的数据。

  5. 横向扩展性: 随着模型和数据规模的增长,向量数据库通常提供了横向扩展的能力,允许在需要时添加更多的计算和存储资源,以应对不断增长的需求。

  6. 高度可定制性: 向量数据库通常具有可定制的配置选项,以适应不同类型的向量数据和应用场景。这使得可以根据实际需求进行调整和优化。

总体而言,向量数据库在大模型中的使用有助于提高效率、降低资源消耗、支持实时应用,并允许模型动态地适应和更新数据。这对于处理大规模向量数据的现代应用非常重要,例如在自然语言处理、计算机视觉、推荐系统等领域。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐