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

背景介绍

阿里云向量检索 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.mzph.cn/news/824867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

土壤多营养级分析经典思路:细菌+真菌

摘要 羊肚菌的人工栽培一直是全球研究的热点&#xff0c;了解土壤微生物生态对提高羊肚菌产量和减轻病原菌危害具有重要意义。以往的研究往往聚焦到细菌或真菌单一群落。本研究探究土壤中细菌真菌多营养级联合分析&#xff0c;更加深入的确定羊肚菌生长与土壤微生物生态之间的潜…

Netty学习——实战篇5 Netty 心跳监测/WebSocket长连接编程

1 心跳监测 MyServer.java public class MyServer {public static void main(String[] args) {NioEventLoopGroup bossGroup new NioEventLoopGroup(1);NioEventLoopGroup workerGroup new NioEventLoopGroup();try {ServerBootstrap serverBootstrap new ServerBootstrap…

SpringMVC(二)【请求与响应】

0、测试环境 我们简化开发&#xff0c;创建一个简单的环境&#xff08;因为没有其它包比如 service、dao&#xff0c;所以这里不用 Spring 容器&#xff0c;只用 SpringMVC 容器&#xff09;&#xff1a; Servelet 容器配置&#xff1a; package com.lyh.config;import org.s…

Web前端-Vue组件库Element

黑马程序员JavaWeb开发教程 文章目录 一、快速入门&#xff08;1&#xff09;什么是Element&#xff08;2&#xff09;快速入门 二、常见组件1、表格2、分页&#xff08;Pagination&#xff09;3、表单 三、案例&#xff08;1&#xff09;根据页面原型完成员工管理页面开发&…

MySql中truncate,delete有什么区别?什么情况下id会不会连续呢?

TRUNCATE和DELETE都是用来删除表中数据的SQL命令&#xff0c;但它们的工作方式和使用场景有所不同&#xff1a; DELETE命令&#xff1a;DELETE命令用于从表中删除一行、多行或所有行。你可以添加WHERE子句来指定要删除的行。例如&#xff0c;DELETE FROM table_name WHERE cond…

Python实战:打造自定义随机验证码生成器

Python实战&#xff1a;打造自定义随机验证码生成器 在许多网站中&#xff0c;验证码作为一种安全机制被广泛采用&#xff0c;用于验证用户身份、防止自动化攻击和确保数据安全。本篇教程将带领您一步步使用Python创建一个功能齐全的随机验证码生成器。我们将通过导入必要的库…

内网代理技术总结

代理技术就是解决外网和内网的通信问题&#xff0c;例如&#xff0c;我的一个外网主机想要找到另外一个网段下的一个内网主机&#xff0c;理论上是无法找到的。如果我们想要进行通信的话就要使用代理技术。我们可以找到一个与目标内网主机在容易网段下可以通信的外网主机&#…

淘宝旺旺信誉API接口

接口名称: 旺旺照妖镜 收货区间&#xff1a; {"code":0,"data":[{ "startDate":"2023-03-31", //开始日期 "endDate":"2023-08-05", //结束日期 "count":"3", //收货件数 "days":1…

FMECA对于装备通用质量特性的作用分析——SunFMEA软件

FMECA是一种在产品设计、生产和维护过程中广泛应用的质量分析工具。它通过对产品可能出现的故障模式、故障影响和故障严重度进行分析&#xff0c;为设计者提供改进设计、提高产品质量和可靠性的重要依据。在装备通用质量特性方面&#xff0c;FMECA同样发挥着重要的作用。今天Su…

万兆以太网MAC设计(4)CRC_process模块

文章目录 前言一、模块功能二、实现过程三、仿真总结 前言 上文介绍的MAC_RX模块当中增加了CRC校验和比对的功能&#xff0c;本文将根据CRC校验的结果&#xff0c;来决定将数据输出到上层用户还是丢弃。 一、模块功能 接收MAC_RX模块输出的AXIS数据&#xff0c;存入本地环形…

js new 操作符

执行过程 核心&#xff1a;原型链、this、返回 创建一个空对象obj建立构造函数与对象间的关系 原型链 将构造函数中的this绑定到新建的obj上 明确this指向将构造函数返回类型作判断&#xff0c;如果原始值被忽略&#xff0c;如果返回对象&#xff0c;需要正常处理 手写new…

rust学习(BorrowMut异常)

现象&#xff1a; 编译没有问题&#xff0c;运行时出现&#xff1a; 代码&#xff1a; pub fn do_test() {let v Arc::new(RefCell::new(100));let v1 v.try_borrow_mut().unwrap();let v2 v.try_borrow_mut().unwrap(); } 原因&#xff1a; 一个cell貌似不能同时被借用…

Qt实现XYModem协议(三)

1 概述 XMODEM协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据&#xff0c;并且每个块都使用一个校验和过程来进行错误检测。使用循环冗余校验的与XMODEM相应的一种协议称为XMODEM-CRC。还有一种是XMODEM-1K&am…

springboot项目maven引入本地包没打包进去

当在 Spring Boot 项目中引入本地的 Maven 依赖时&#xff0c;有时会遇到依赖未被正确打包进项目的情况。这可能是由于 Maven 依赖的范围&#xff08;scope&#xff09;或者构建配置问题所致。下面是一些可能的原因和解决方法&#xff0c;以及详细的代码介绍&#xff1a; 依赖范…

AcWing 798. 差分矩阵——算法基础课题解

AcWing 798. 差分矩阵 题目描述 输入一个 n 行 m 列的整数矩阵&#xff0c;再输入 q 个操作&#xff0c;每个操作包含五个整数 x1,y1,x2,y2,c&#xff0c;其中 (x1,y1) 和 (x2,y2)表示一个子矩阵的左上角坐标和右下角坐标。 每个操作都要将选中的子矩阵中的每个元素的值加上…

PostgreSQL数据库高级sql总结2

1、postgresql 数据库update 去重sql 先按重复记录fk分组找最小的记录&#xff0c;然后更新id 不在子查询中的数据 update td_f_stop_history set del_flag1 where "id" not in (select "min"("id") from td_f_stop_history where allowed_re…

香港裸机云多IP服务器都有哪些配置?

香港裸机云多IP服务器是一种高效、灵活的云计算服务&#xff0c;为用户提供了多IP地址的配置选项&#xff0c;以满足各种复杂的网络需求。这种服务器在配置上具有丰富的多样性和高度的可定制性&#xff0c;下面我们就来科普一下香港裸机云多IP服务器的主要配置。 首先&#xff…

开源模型应用落地-chatglm3-6b-模型输出违禁词检测(九)

一、前言 受限于模型本身的一些缺陷&#xff0c;任何模型均可能会生成一些不正确的输出。如何通过技术的手段去规避模型潜在的风险&#xff0c;提升推理质量是需要持续探究的过程。 如何利用第三方内容安全审核服务去检测模型输出内容的合规性&#xff0c;请查看&#xff1a;开…

【资源分享】Stata 17免费下载安装

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

LabVIEW仪器信息管理系统

LabVIEW仪器信息管理系统 在计量检测实验室的日常工作中&#xff0c;仪器检定校准是一项基础而重要的任务。随着科技的进步和实验室工作量的增加&#xff0c;传统的人工管理方式已经难以满足现代实验室对效率和准确性的要求。开发一套基于LabVIEW的仪器信息管理系统显得尤为必…