通过阿里云向量检索 Milvus 版和通义千问快速构建基于专属知识库的问答系统

news/2024/9/25 10:38:01/

背景介绍

阿里云向量检索 Milvus 版是一款 Serverless 全托管服务,确保了与开源 Milvus 的完全兼容性,并支持无缝迁移。它在开源版本的基础上增强了可扩展性,能提供大规模 AI 向量数据的相似性检索服务。凭借其开箱即用的特性、灵活的扩展能力和全链路监控告警,Milvus 云服务成为多样化 AI 应用场景的理想选择,包括多模态搜索、检索增强生成(RAG)、搜索推荐、内容风险识别等。您还可以利用开源的 Attu 工具进行可视化操作,进一步促进应用的快速开发和部署。

阿里云向量检索 Milvus 版已开启免费公测。您可以在E-MapReduce控制台,选择 EMR Serverless > Milvus,进入 Milvus 页面创建入门版的实例,公测期间您可以免费试用 Milvus 服务。

前提条件

  • 已创建 Milvus 实例。具体操作,请参见快速创建Milvus实例。

  • 已开通服务并获得 API-KEY。具体操作,请参见开通DashScope并创建API-KEY。

使用限制

请确保您的运行环境中已安装 Python 3.8或以上版本,以便顺利安装并使用 DashScope。

操作流程

▶ 准备工作

  1. 安装相关的依赖库。

pip3 install pymilvus tqdm dashscope

2. 下载所需的知识库。
本文示例使用了公开数据集CEC-Corpus。CEC-Corpus 数据集包含332篇针对各类突发事件的新闻报道,语料和标注数据,这里我们只需要提取原始的新闻稿文本,并将其向量化后入库。

git clone https://github.com/shijiebei2009/CEC-Corpus.git

▶ 步骤一:知识库向量化

1. 创建 embedding.py 文件,内容如下所示。

import os
import time
from tqdm import tqdm
import dashscope
from dashscope import TextEmbedding
from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utilitydef prepareData(path, batch_size=25):batch_docs = []for file in os.listdir(path):with open(path + '/' + file, 'r', encoding='utf-8') as f:batch_docs.append(f.read())if len(batch_docs) == batch_size:yield batch_docsbatch_docs = []if batch_docs:yield batch_docsdef getEmbedding(news):model = TextEmbedding.call(model=TextEmbedding.Models.text_embedding_v1,input=news)embeddings = [record['embedding'] for record in model.output['embeddings']]return embeddings if isinstance(news, list) else embeddings[0]if __name__ == '__main__':current_path = os.path.abspath(os.path.dirname(__file__))   # 当前目录root_path = os.path.abspath(os.path.join(current_path, '..'))   # 上级目录data_path = f'{root_path}/CEC-Corpus/raw corpus/allSourceText'  # 数据下载git clone https://github.com/shijiebei2009/CEC-Corpus.git# 配置Dashscope API KEYdashscope.api_key = '<YOUR_DASHSCOPE_API_KEY>'# 配置Milvus参数COLLECTION_NAME = 'CEC_Corpus'DIMENSION = 1536MILVUS_HOST = 'c-97a7d8038fb8****.milvus.aliyuncs.com'MILVUS_PORT = '19530'USER = 'root'PASSWORD = '<password>'connections.connect(host=MILVUS_HOST, port=MILVUS_PORT, user=USER, password=PASSWORD)# Remove collection if it already existsif utility.has_collection(COLLECTION_NAME):utility.drop_collection(COLLECTION_NAME)# Create collection which includes the id, title, and embedding.fields = [FieldSchema(name='id', dtype=DataType.INT64, descrition='Ids', is_primary=True, auto_id=False),FieldSchema(name='text', dtype=DataType.VARCHAR, description='Text', max_length=4096),FieldSchema(name='embedding', dtype=DataType.FLOAT_VECTOR, description='Embedding vectors', dim=DIMENSION)]schema = CollectionSchema(fields=fields, description='CEC Corpus Collection')collection = Collection(name=COLLECTION_NAME, schema=schema)# Create an index for the collection.index_params = {'index_type': 'IVF_FLAT','metric_type': 'L2','params': {'nlist': 1024}}collection.create_index(field_name="embedding", index_params=index_params)id = 0for news in tqdm(list(prepareData(data_path))):ids = [id + i for i, _ in enumerate(news)]id += len(news)vectors = getEmbedding(news)# insert Milvus Collectionfor id, vector, doc in zip(ids, vectors, news):insert_doc = (doc[:498] + '..') if len(doc) > 500 else docins = [[id], [insert_doc], [vector]]  # Insert the title id, the text, and the text embedding vectorcollection.insert(ins)time.sleep(2)

本文示例涉及以下参数,请您根据实际环境替换。

参数

说明

data_path

存放CEC-Corpus数据的路径。

COLLECTION_NAME

设置Miluvs Collection名称,您可以自定义。

dashscope_api_key

模型服务灵积的密钥。您可以在模型服务灵积控制台的API-KEY管理页面查看。

DIMENSION

向量维度。固定值为1536。

MILVUS_HOST

Milvus实例的公网地址。您可以在Milvus实例的实例详情页面查看。

MILVUS_PORT

Milvus实例的Proxy Port。您可以在Milvus实例的实例详情页面查看。默认为19530。

USER

配置为创建Milvus实例时,您自定义的用户。

PASSWORD

配置为创建Milvus实例时,您自定义用户的密码。

  1. 在 Attu 中您可以看到创建的 Collection,具体操作请参见Attu操作指南。

图片

在本文示例中,我们将 Embedding 向量和新闻报道文稿一起存入 Milvus 中,同时构建索引类型采用了 IVF_FLAT,在向量检索时,同时可以召回原始文稿。

▶ 步骤二:向量检索与知识问答

数据写入完成后,即可进行快速的向量检索。在通过提问搜索到相关的知识点后,我们可以按照特定的模板将“提问 + 知识点”作为 prompt 向 LLM 发起提问。在这里我们所使用的 LLM 是通义千问,这是阿里巴巴自主研发的超大规模语言模型,能够在用户自然语言输入的基础上,通过自然语言理解和语义分析,理解用户意图。通过提供尽可能清晰详细的指令(prompt),可以获得更符合预期的结果。这些能力都可以通过通义千问来获得。

本文示例设计的提问模板格式为:请基于我提供的内容回答问题。内容是{___},我的问题是{___},当然您也可以自行设计合适的模板。

创建 answer.py 文件,内容如下所示。

import os
import dashscope
from dashscope import Generation
from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection
from embedding import getEmbeddingdef getAnswer(query, context):prompt = f'''请基于```内的报道内容,回答我的问题。```{context}```我的问题是:{query}。'''rsp = Generation.call(model='qwen-turbo', prompt=prompt)return rsp.output.textdef search(text):# Search parameters for the indexsearch_params = {"metric_type": "L2"}results = collection.search(data=[getEmbedding(text)],  # Embeded search valueanns_field="embedding",  # Search across embeddingsparam=search_params,limit=1,  # Limit to five results per searchoutput_fields=['text']  # Include title field in result)ret = []for hit in results[0]:ret.append(hit.entity.get('text'))return retif __name__ == '__main__':current_path = os.path.abspath(os.path.dirname(__file__))   # 当前目录root_path = os.path.abspath(os.path.join(current_path, '..'))   # 上级目录data_path = f'{root_path}/CEC-Corpus/raw corpus/allSourceText'# 配置Dashscope API KEYdashscope.api_key = '<YOUR_DASHSCOPE_API_KEY>'# 配置Milvus参数COLLECTION_NAME = 'CEC_Corpus'DIMENSION = 1536MILVUS_HOST = 'c-97a7d8038fb8****.milvus.aliyuncs.com'MILVUS_PORT = '19530'USER = 'root'PASSWORD = '<password>'connections.connect(host=MILVUS_HOST, port=MILVUS_PORT, user=USER, password=PASSWORD)fields = [FieldSchema(name='id', dtype=DataType.INT64, descrition='Ids', is_primary=True, auto_id=False),FieldSchema(name='text', dtype=DataType.VARCHAR, description='Text', max_length=4096),FieldSchema(name='embedding', dtype=DataType.FLOAT_VECTOR, description='Embedding vectors', dim=DIMENSION)]schema = CollectionSchema(fields=fields, description='CEC Corpus Collection')collection = Collection(name=COLLECTION_NAME, schema=schema)# Load the collection into memory for searchingcollection.load()question = '北京中央电视台工地发生大火,发生在哪里?出动了多少辆消防车?人员伤亡情况如何?'context = search(question)answer = getAnswer(question, context)print(answer)

运行完成后,针对北京中央电视台工地发生大火,发生在哪里?出动了多少辆消防车?人员伤亡情况如何?的提问,会得到以下结果。

火灾发生在北京市朝阳区东三环中央电视台新址园区在建的附属文化中心大楼工地。出动了54辆消防车。目前尚无人员伤亡报告。


如有疑问,可加入向量检索 Milvus 版用户钉群 59530004993咨询。


http://www.ppmy.cn/news/1429748.html

相关文章

决策树分类任务实战(python 代码详解)

目录 一、导入库、数据集、并划分训练集和测试集 二、参数调优 (一)第一种调参方法&#xff1a;for循环 (1)单参数优化 ①单参数优化(无K折交叉验证) ②单参数K折交叉验证 优化 (2)多参数优化 ①多参数优化(无K折交叉验证) 参数介绍&#xff1a; ②多参数K折交叉验证…

Redis 中常见数据类型的基本命令以及其用法

目录 Redis通用命令 String的常见命令有&#xff1a; Hash的常见命令有&#xff1a; List的常见命令有&#xff1a; Set的常见命令有&#xff1a; SortedSet的常见命令有&#xff1a; Redis通用命令 通用指令是部分数据类型的&#xff0c;都可以使用的指令&#xff0c;常…

MAC上如何将某个目录制作成iso格式磁盘文件,iso文件本质是什么?以及挂载到ParallelDesktop中?(hdiutil makehybrid )

背景 ParallelsDesktop没有安装ParallelsTools的无法共享目录&#xff0c;可以通过ParallelsDesktop提供CD磁盘的方式共享进去 命令 # 准备文档 mkdir mytestdir cp xxx mytestdir# 生成iso hdiutil makehybrid -o output.iso mytestdir -iso -joliethdiutil是MAC提供的磁盘…

Eclipse debug时有几个常用的快捷键非常实用

Eclipse debug时&#xff0c;有几个常用的快捷键非常实用。 F5&#xff1a;Step Into&#xff0c;单步执行&#xff0c;遇到子函数就进入并且继续单步执行。简而言之&#xff0c;这个快捷键会让你进入子函数&#xff0c;详细查看所执行的每一步。 F6&#xff1a;Step Over&…

RT-Thread时钟管理

操作系统需要通过时间来规范其任务,主要介绍时钟节拍和基于时钟节拍的定时器。 时钟节拍 任何操作系统都需要提供一个时钟节拍,以供系统处理所有和时间有关的事件,如线程的延时、线程的时间片轮转调度以及定时器超时等。 RT-Thread 中,时钟节拍的长度可以根据 RT_TICK_P…

打造一套属于自己的php开发框架(一)封装Db类

一直使用thinkphp或者laravel框架&#xff0c;越到后面越发现&#xff0c;这些框架占用太大了&#xff0c;最主要的是很多东西完全用不到&#xff0c;我就想为啥不能自己封装一个&#xff1f;想到就搞&#xff0c;这个是一个Db类&#xff0c;主要封装了MySQL的增删改查方法&…

华为Pura 70系列,一种关于世界之美的可能

1874年&#xff0c;莫奈创作了《印象日出》的油画&#xff0c;在艺术界掀起了一场革命。当时的主流艺术&#xff0c;是追求细节写实&#xff0c;追求场面宏大的学院派。他们称莫奈等人是“印象派”&#xff0c;认为莫奈的画追求光影表达&#xff0c;追求描绘抽象的意境&#xf…

提升论文写作效率:ChatGPT的妙用

ChatGPT无限次数:点击直达 提升论文写作效率&#xff1a;ChatGPT的妙用 在当今信息爆炸的时代&#xff0c;高效撰写论文成为许多从事学术研究的人士面临的一项重要挑战。传统的论文写作过程繁琐耗时&#xff0c;然而&#xff0c;随着人工智能技术的不断发展&#xff0c;ChatGP…