微信扫码
添加专属顾问
检索增强生成 (RAG,即Retrieval Augmented Generation) 是企业级生成式 AI(GenAI)应用的热门案例之一。多数 RAG 教程演示了如何利用 OpenAI API 结合 Embedding 模型和大语言模型(LLM)来进行推理(Inference)。然而,在开发过程中,如果能使用开源工具,就可以免去访问自己数据的费用,同时也能加快迭代。
在 Embedding 步骤(即将数据转换为向量的过程)中,使用 Ray Data 取得的性能提升尤为显著。相比于使用 Pandas,采用 Ray Data 等工具对批量推理请求进行汇总处理可以显著节省资源和处理时间。例如,在一台配备 16GB RAM 的 Mac M2 笔记本电脑上,仅使用四个 worker node,Ray Data 的处理速度就比 Pandas 快了 60 倍!本文将详细介绍使用 Milvus + Ray Data 进行 Embedding inference 的性能。
我们的开源 RAG 技术栈包括:
BGM-M3 Embedding 模型:该模型能一次性生成三种类型的向量,包括稀疏向量、稠密向量和多向量。
Ray Data:高效的分布式 Embedding inference 推理工具。
AWS S3:用于临时存储推理结果。
Milvus 或 Zilliz Cloud:用作向量数据库。
示例数据来源:Kaggle 的 IMDB 海报数据集。
01.
开源RAG技术栈
BGM-M3 Embedding 模型
BGM-M3 Embedding 模型是一种强大的多功能 Embedding 工具,其特点在于能够处理多语言(Multi-Linguality)、多功能(Multi-Functionality)和多粒度(Multi-Granularity)的数据,因此得名“M3”。该模型支持超过 100 种语言,并能计算三种常见的 Embedding 类型:稀疏向量、稠密向量和多向量。它还可以处理各种长度的文本——从短句到长文档,最多可支持 8192 个 token。更多详情,请参考论文或通过 HugginFace 网站了解此模型。(https://arxiv.org/abs/2402.03216)
Milvus 2.4 版本现已集成 BGM-M3 Embedding 模型。
Ray Data
有长期运行的数据转换任务?
Ray Data 具备可扩展的数据处理能力,能够便捷和快速地在多台机器(CPU、GPU 等)上并行处理大量数据。Ray Data 尤其适用于数据可以被分割,能够并行处理的场景,例如同时进行的多个数据块切分和 Embedding 转换的任务。Ray Data 底层是一个强大的流式执行引擎,能够最大化集群中的 GPU 利用率。与使用在线服务(如 OpenAI 嵌入 API)运行嵌入相比,使用 Ray Data 进行离线嵌入作业可以节省大部分成本。
Anyscale 是 Ray 的托管平台。您可以轻松地在 Anyscale 上利用 GPU 机器扩展 Embedding 任务。
Milvus 和 Zilliz Cloud
RAG应用之所以能够迅速响应,关键在于其背后强大的向量数据库。Milvus 专为处理大规模业务和海量数据设计。与其他向量数据库不同,Milvus 能够根据数据量的增长灵活地进行扩展。Milvus 的存储、索引和查询是独立的,可以单独垂直扩展或水平扩展,这一设计让 RAG 应用能够迅速响应用户的实时查询需求,同时在收到查询前和收到查询时,Milvus 能够智能地进行离线计算。除了强大的性能外,Milvus 还提供了多种企业级重要特性,如多租户和基于角色的访问控制(RBAC)、高可用等。
Zilliz Cloud 基于开源的 Milvus 搭建的全托管向量数据库云服务。
02.
设置RAG工具
本教程中将使用 Milvus 的 Python SDK、Ray Data、Amazon S3 和 Zilliz Cloud。
开始前,请先注册 AWS 账号以使用 Amazon S3。然后前往 console.aws.amazon.com > IAM > My security credentials > Create access key。复制并保存密钥(Access key 和 secret key)。
安装所需的工具库并运行 aws config。请在文件中输入 AWS 密码。
pip install boto3 pip install awscli –force-reinstall –upgradeaws config #fill in your key and secret keymore ~/.aws/credentials #make sure this looks correct
安装 Ray Data。
pip install -U "ray[data]"
安装 Pymilvus。
pip install -U pymilvus "pymilvus[model]" langchain
PyMilvus 2.4 版本及以上已打包 BGE-M3 embedding 模型。
import ray, os, pprint, time, boto3from langchain.text_splitter import RecursiveCharacterTextSplitterimport numpy as npimport pymilvusprint(pymilvus.__version__) # must be >= 2.4.0from pymilvus.model.hybrid import BGEM3EmbeddingFunction
如需使用 Zilliz,请先注册账号并创建集群。
03.
准备数据
本文使用了 Kaggle IMDB 海报数据作为数据集,其中包含大约 48,000 部电影、影评、海报链接以及一些元数据。
我们将所有文本字段(电影名称、描述、影评文本)复制到名为‘text’的一列中,并将其保存为 Parquet 格式,因为这种文件格式比 CSV 更高效。
04.
生成Embedding模型
根据以下步骤生成 Embedding 向量:
切分数据: 将输入文本切分为片段,将语义上相关的文本片段保存在一起。
调用推理(inference)模式下的 Embedding 模型,用于生成文本片段的 Embedding 向量。
Ray Data 可以并行处理以下数据操作请求:
flat_map():切分数据(输出的行数将多于输入行数)。
map_batches():调用 Embedding 模型。
chunk_size = 512chunk_overlap = np.round(chunk_size * 0.10, 0)# Define a LangChain text splitter.text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size,chunk_overlap=chunk_overlap,length_function=len)#len is a built-in Python function# 1. Define a regular python function for chunking.def chunk_row(row, splitter=text_splitter):# Copy the row columns into metadata.metadata = row.copy()del metadata['text'] # Remove text from metadata# Split the text into chunks.chunks = splitter.create_documents(texts=[row["text"]],metadatas=[metadata])chunk_list = [{"text": chunk.page_content,**chunk.metadata} for chunk in chunks]return chunk_list# 2. Define a class with a callable method to compute embeddings.class ComputeEmbeddings:def __init__(self):# Initialize a Milvus built-in sparse-dense-late-interaction-reranking encoder.# https://huggingface.co/BAAI/bge-m3self.model = BGEM3EmbeddingFunction(use_fp16=False, device="cpu")print(f"dense_dim: {self.model.dim['dense']}")print(f"sparse_dim: {self.model.dim['sparse']}")def __call__(self, batch):# Ray data batch is a dictionary where values are array values.# BGEM3EmbeddingFunction input is docs as a list of strings.docs = list(batch['text'])# Encode the documents. bge-m3 dense embeddings are already normalized.embeddings = self.model(docs)batch['vector_dense'] = embeddings['dense']return batchif __name__ == "__main__":FILE_PATH = "s3://zilliz/kaggle_imdb.parquet"# Load and transform data.ds = ray.data.read_parquet(FILE_PATH)# Chunk the input textchunked_ds = ds.flat_map(chunk_row)# Compute embeddings with a class that calls the embeddings model.embeddings_ds = chunked_ds.map_batches(ComputeEmbeddings, concurrency=4)# Save the embeddings to S3 in a folder of parquet part files.embeddings_ds.write_parquet('s3://zilliz/kaggle_imdb_embeddings')
运行前,需要提交 Ray 任务:
将代码保存至 Python 脚本文件。本例中将文件命名为 ray_data_demo.py。
在本地运行前,请先创建一个全新的路径,路径中只可包含 .py 脚本文件和 .parquet 数据文件。本例中将这个路径命名为ray_cluster。
运行 Python 脚本以启动 Ray 集群并自动提交任务。
打开 http://127.0.0.1:8265,查看集群和任务。
05.
Embedding速度提升60倍
表格展示了在 16GB M2 笔记本电脑上 Embedding 任务的用时。示例使用了 1 个单节点 Ray 集群用于批量处理任务,并发为 4。Pandas 用时更长,原因是 Pandas 只有一个处理器。但是 Ray Data 有 4 个处理器。Pandas 和 Ray在处理大型数据时性能都更出色。
06.
将数据从S3批量插入到Milvus或Zilliz Cloud之中
Milvus 和 Zilliz Cloud都支持批量插入(bulk insert)数据,可以直接从 AWS、GCP 或 Azure 对象存储中导入 Embedding 数据。除了界面外,Zilliz Cloud 还提供 RESTful API 和 SDK。
对于大量 Embedding 数据,使用 bulk insert 可以显著节省机器资源并缩短插入时间,与普通 insert 相比更为高效。此外,通过 bulk insert 构建的向量搜索索引比普通 insert 的索引更高效。
在 Zilliz Cloud 界面上仅需轻击几次鼠标便可轻松批量插入数据。首先,在集群中创建 1 个全新的 collection。创建时,需要开启 AutoID 和动态列,添加向量列,并设置向量列的向量维度。设置完毕后,点击“创建 Collection”。
接下来,点击“导入数据”并按照界面上的提示输入 parquet 文件的路径。(请注意,如果您的 S3 存储桶为非公开链接,您还需要输入 Access Key 和 Secret Key,以便 Zilliz Cloud 读取其中的数据)。Zilliz Cloud 支持 Amazon S3、Google Cloud Storage 或 Azure Blob Storage 等对象存储服务。点击“导入”开始将所有数据导入向量数据库 collection。
导入任务完成后,您可以选择在 collection 上构建索引,加速后续的向量搜索。
07.
查询数据
为测试新导入至 Collection 中的数据,让我们基于电影数据进行提问。
def mc_run_search(question, output_fields, top_k=2, filter_expression=""):# Embed the question using the same encoder.embeddings = model_bgem3([question])query_embeddings = embeddings['dense']# Run semantic vector search using your query and the vector database.results = mc.search(COLLECTION_NAME,data=query_embeddings,search_params=SEARCH_PARAMS,output_fields=output_fields,# Milvus can utilize metadata in boolean expressions to filter search.filter=filter_expression,limit=top_k,consistency_level="Eventually")# Assemble retrieved context and context metadata.# The search result is in the variable `results[0]`, which is type# 'pymilvus.orm.search.SearchResult'.METADATA_FIELDS = [f for f in output_fields if f != 'chunk']context, context_metadata = _utils.client_assemble_retrieved_context(metadata_fields=METADATA_FIELDS, num_shot_answers=top_k)return formatted_results, context, context_metadataSAMPLE_QUESTION = "muybridge horse movie"# Return top k unique results with HNSW index.TOP_K = 2# Define output fields to return.OUTPUT_FIELDS = ["movie_id", "chunk", "PosterLink"]context, context_metadata = \mc_run_search(SAMPLE_QUESTION, OUTPUT_FIELDS, TOP_K)
以下为查询结果:
完整的 Ray Data 脚本可在https://github.com/milvus-io/bootcamp/blob/master/bootcamp/Integration/ray_data_demo.py 获取。
08.
总结
文本介绍了如何使用 Ray Data 和 Milvus/Zilliz Cloud 的批量插入功能大幅加速向量生成和加载过程。使用 Milvus 能够高效构建索引、节省计算资源、提升向量搜索速度。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-07-03
RAG 检索优化策略:从命中率到答案质量的一套工程打法
2026-07-03
RAG 落地总翻车?全球赛事冠军架构,改造适配企业级生产
2026-07-01
提升 RAG 准确率全攻略 让你的 AI 知识库 真正靠谱起来!
2026-06-30
教程:如何用AutoRAG + Milvus避免RAG 与Agent 中出现串租问题
2026-06-30
知识库不是文件堆——我把RAG准确率从60%调到了92%
2026-06-30
本体论语义建设新思路,另类RAG来解决检索问题
2026-06-30
别把RAG当架构:Ontology(本体)才是Agent的业务世界
2026-06-29
PixelRAG:伯克利团队颠覆传统 RAG,用截图代替文本检索! 28 天狂揽 3000+ Star!
2026-04-06
2026-04-27
2026-04-23
2026-04-20
2026-04-09
2026-04-12
2026-04-22
2026-04-10
2026-05-14
2026-04-30
2026-06-23
2026-06-23
2026-06-15
2026-06-10
2026-06-10
2026-05-20
2026-05-18
2026-05-11
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。