DeepSeek v3为何爆火?如何用其集成Milvus搭建RAG?

news2025/1/7 23:06:09

c8ad6d9830d29ff028d863210a616bca.png

f77c3b9ea6defbe165e0b54ab607ee4a.png

最近,DeepSeek v3(一个MoE模型,拥有671B参数,其中37B参数被激活)模型全球爆火。

作为一款能与Claude 3.5 Sonnet,GPT-4o等模型匹敌的开源模型DeepSeek v3不仅将其算法开源,还放出一份扎实的技术报告,详尽描述了DeepSeek是如何进行大模型架构、算法工程协同设计,部署,训练,数据处理等方面的思考,堪称是一份DeepSeek给开源社区送上的年末大礼。

本篇文章,我们会对DeepSeek v3的亮点进行梳理,并对其RAG搭建流程与效果,做一个简单的示例。

01.

DeepSeek v3的亮点

6169eab7b26178f28210b33dd74831aa.png

亮点一:超低的训练成本,将带来算力的极大富余

相比于海外大厂动辄上万甚至上十万的H100集群(例如Meta使用了16K的H100训练Llama3.1 405B),DeepSeek仅仅使用了2048张丐版显卡H800就在14.8T数据上训练了一个处于第一梯队的开源模型。以下是DeepSeek v3的训练成本数据。

99dc005096cd9b1664875a933df31c8c.png

不难看出,基于以上数据,传统对大模型对算力的供需预测推演直接被推翻,过去Scaling law曲线所估算出的GPU需求数量会出现极大冗余。

那么问题来了,DeepSeek v3是如何做到的?

亮点二:颠覆GPT架构,极致的工程设计

在去年,大模型领域普遍认为模型的设计已经收敛到Decoder-only的GPT架构,但DeepSeek依然没有放弃对模型架构的进一步探索。

这一次V3的设计延用了V2提出的MLA(Multi-head Latent Attention),这是一种通过低秩压缩键值对来减少缓存需求的创新架构,以提高Transformer模型的推理效率

另外,此次的MoE模型规格也比之前大了许多(V3 671B, V2 236B),也体现出了对这个架构拥有更多的信心和经验。DeepSeek V3将除前三层外的所有 FFN 层替换为 MoE 层。每个 MoE 层包含 1 个共享专家和 256 个路由专家。在路由专家中,每个 token 将激活 8 个专家,并确保每个 token 最多会被发送到 4 个节点。

同时,论文还对如何在系统中设计将这种架构进行推理的性能优化也进行了详尽的描述。

DeepSeek V3使用了多token预测(MTP),即每个 token 除了精确预测下一个 token 外,还会预测一个额外的 token,通过投机采样的方式提高推理效率。

关于如何使用FP8进行模型训练这个各个大模型工程团队头痛的问题,DeepSeek V3也对自己的实践有细致的描述,对这部分感兴趣的朋友强烈推荐阅读论文原文。

亮点三:通过蒸馏推理模型进行后训练

自从OpenAI发布了o1模型之后,业界开始逐渐兴起了探索这种内置思维琏(CoT)的模型,它不断对中间结果探索分析的过程仿佛人的“慢思考”。DeepSeek同样也开发了类似的R1模型,在DeepSeek V3中,DeepSeek创新性地通过在后训练阶段使用R1得到的高质量答案来提高了自身的性能。这一点也非常有趣。

众所周知,类似o1的开源模型大部分都是从基础模型利用CoT结合强化学习的技巧训练出来提高了推理效果,而现在又通过蒸馏推理模型获得了下一代更好的基础模型,这一种模型和数据质量互相交织的发展模式贯穿着机器学习发展的历史,而还将继续被见证。

而以发掘非结构化数据价值的厂商Zilliz也相信对于数据和知识的高效管理,将会一直在智能化浪潮发展中扮演着重要的角色。

看到10K$的后训练成本,相信许多致力于微调专属大模型的厂商都跃跃欲试,在这里我们也来看一下DeepSeek V3的后训练过程,整个流程也比传统的SFT要复杂一些。整个过程分成了SFT阶段(监督学习)以及RL阶段(强化学习),在SFT阶段,他们将数据分成了两种类型,推理数据以及非推理数据

推理数据:

包括数学,编程这些问题,DeepSeek训练了针对性的专家模型,并使用专家模型为每一个问题生成了两种格式的学习数据。

  • <problem, original response>

  • <system prompt, problem, R1 response>

非推理数据:

对于非推理任务(如创意写作和简单问答),作者利用DeepSeek-V2.5模型生成初步响应,并聘请人工标注员对其准确性进行验证

训练的流程:

  • SFT阶段,使用基于专家模型生成的SFT样本,进行初步的监督微调。通过这些训练数据,模型学习如何根据问题和回答生成精确的推理响应。

  • RL阶段,使用高温采样来生成响应,这些响应融合了来自原始数据和R1生成数据的模式。在RL阶段,会使用LeetCode编译器来检查编程的答案,以及一些规则来去检查数学问题的答案,对于开放性问题, 会用一个奖励模型来去判断。该过程帮助模型在没有显式系统提示的情况下进行推理,经过数百次RL步骤,模型学会如何平衡准确与简洁性的答案。

  • 完成RL训练后,作者实施拒绝采样策略(过滤掉模型认为低质量的数据),以从生成的样本中挑选出高质量的SFT数据。这些数据用于最终模型的微调。

不难发现,做好一个高质量的后训练,下的功夫远远不止10k$的训练算力。

DeepSeek V3虽然拥有可以与闭源模型匹敌的性能,但是部署它依然不是一个简单的事,即使作者已经为了推理优化做了许多工作,但搭建一个DeepSeek V3的服务(考虑到它671B的参数量),成本依然不低。

02.

使用Milvus和DeepSeek搭建RAG

接下来,我们将展示如何使用Milvus和DeepSeek构建检索增强生成(RAG)pipeline。

2.1 准备

2.1.1 依赖和环境

pip install --upgrade pymilvus[model] openai requests tqdm

如果您使用的是Google Colab,要启用刚刚安装的依赖项,您可能需要重启运行环境(单击屏幕顶部的“Runtime”菜单,然后从下拉框中选择“Restart session”)。

DeepSeek启动了OpenAI风格的API。您可以登录官网并将api密钥 DEEPSEEK_API_KEY准备为环境变量。

import os

os.environ["DEEPSEEK_API_KEY"] = "***********"

2.1.2 准备数据

我们使用Milvus文档2.4. x(https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip)中的FAQ页面作为RAG中的私有知识,这是搭建一个入门RAG pipeline的优质数据源。

首先,下载zip文件并将文档解压缩到文件夹milvus_docs

! wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
! unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs

我们从文件夹milvus_docs/en/faq中加载所有markdown文件,对于每个文档,我们只需简单地使用“#”来分隔文件中的内容,就可以大致分隔markdown文件各个主要部分的内容。

from glob import glob

text_lines = []

for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    with open(file_path, "r") as file:
        file_text = file.read()

    text_lines += file_text.split("# ")

2.1.3 准备LLM和embedding模型

DeepSeek采用了类OpenAI风格的API,您可以使用相同的API并对相应的LLM进行微调。

from openai import OpenAI

deepseek_client = OpenAI(
    api_key=os.environ["DEEPSEEK_API_KEY"],
    base_url="https://api.deepseek.com",
)

选择一个embedding模型,使用milvus_model来做文本向量化。我们以DefaultEmbeddingFunction模型为例,它是一个预训练的轻量级embedding模型。

from pymilvus import model as milvus_model

embedding_model = milvus_model.DefaultEmbeddingFunction()

生成测试向量,并输出向量维度以及测试向量的前几个元素。

test_embedding = embedding_model.encode_queries(["This is a test"])[0]
embedding_dim = len(test_embedding)
print(embedding_dim)
print(test_embedding[:10])
768
[-0.04836066  0.07163023 -0.01130064 -0.03789345 -0.03320649 -0.01318448
 -0.03041712 -0.02269499 -0.02317863 -0.00426028]

2.2 将数据加载到Milvus

2.2.1 创建集合

from pymilvus import MilvusClient

milvus_client = MilvusClient(uri="./milvus_demo.db")

collection_name = "my_rag_collection"

对于MilvusClient需要说明:

  • uri设置为本地文件,例如./milvus. db,是最方便的方法,因为它会自动使用Milvus Lite将所有数据存储在此文件中。

  • 如果你有大规模数据,你可以在docker或kubernetes上设置一个更高性能的Milvus服务器。在此设置中,请使用服务器uri,例如http://localhost:19530,作为你的uri

  • 如果要使用Milvus的全托管云服务Zilliz Cloud,请调整uritoken,分别对应Zilliz Cloud中的公共端点和Api密钥。

检查集合是否已经存在,如果存在则将其删除。

if milvus_client.has_collection(collection_name):
    milvus_client.drop_collection(collection_name)

使用指定的参数创建一个新集合。

如果我们不指定任何字段信息,Milvus将自动为主键创建一个默认的id字段,并创建一个向量字段来存储向量数据。保留的JSON字段用于存储未在schema里定义的标量数据。

milvus_client.create_collection(
    collection_name=collection_name,
    dimension=embedding_dim,
    metric_type="IP",  # Inner product distance
    consistency_level="Strong",  # Strong consistency level
)

2.2.2 插入数据

逐条取出文本数据,创建嵌入,然后将数据插入Milvus。

这里有一个新的字段“text”,它是集合schema中的非定义字段,会自动添加到保留的JSON动态字段中。

from tqdm import tqdm

data = []

doc_embeddings = embedding_model.encode_documents(text_lines)

for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    data.append({"id": i, "vector": doc_embeddings[i], "text": line})

milvus_client.insert(collection_name=collection_name, data=data)
Creating embeddings:   0%|          | 0/72 [00:00<?, ?it/s]huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
To disable this warning, you can either:
        - Avoid using `tokenizers` before the fork if possible
        - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
Creating embeddings: 100%|██████████| 72/72 [00:00<00:00, 246522.36it/s]
{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}

2.3 构建RAG

2.3.1 检索查询数据

让我们指定一个关于Milvus的常见问题。

question = "How is data stored in milvus?"

在集合中搜索问题并检索语义top-3匹配项。

search_res = milvus_client.search(
    collection_name=collection_name,
    data=embedding_model.encode_queries(
        [question]
    ),  # Convert the question to an embedding vector
    limit=3,  # Return top 3 results
    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    output_fields=["text"],  # Return the text field
)

我们来看一下query的搜索结果

import json

retrieved_lines_with_distances = [
    (res["entity"]["text"], res["distance"]) for res in search_res[0]
]
print(json.dumps(retrieved_lines_with_distances, indent=4))
[
    [
        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
        0.6572665572166443
    ],
    [
        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
        0.6312146186828613
    ],
    [
        "How does Milvus handle vector data types and precision?\n\nMilvus supports Binary, Float32, Float16, and BFloat16 vector types.\n\n- Binary vectors: Store binary data as sequences of 0s and 1s, used in image processing and information retrieval.\n- Float32 vectors: Default storage with a precision of about 7 decimal digits. Even Float64 values are stored with Float32 precision, leading to potential precision loss upon retrieval.\n- Float16 and BFloat16 vectors: Offer reduced precision and memory usage. Float16 is suitable for applications with limited bandwidth and storage, while BFloat16 balances range and efficiency, commonly used in deep learning to reduce computational requirements without significantly impacting accuracy.\n\n###",
        0.6115777492523193
    ]
]

2.3.2 使用LLM获取RAG响应

将检索到的文档转换为字符串格式。

context = "\n".join(
    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
)

为LLM定义系统和用户提示。这个提示是由从Milvus检索到的文档组装而成的。

SYSTEM_PROMPT = """
Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
"""
USER_PROMPT = f"""
Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
<context>
{context}
</context>
<question>
{question}
</question>
"""

使用DeepSeek提供的deepseek-chat模型根据提示生成响应。

response = deepseek_client.chat.completions.create(
    model="deepseek-chat",
    messages=[
        {"role": "system", "content": SYSTEM_PROMPT},
        {"role": "user", "content": USER_PROMPT},
    ],
)
print(response.choices[0].message.content)
In Milvus, data is stored in two main categories: inserted data and metadata.

1. **Inserted Data**: This includes vector data, scalar data, and collection-specific schema. The inserted data is stored in persistent storage as incremental logs. Milvus supports various object storage backends for this purpose, such as MinIO, AWS S3, Google Cloud Storage (GCS), Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage (COS).

2. **Metadata**: Metadata is generated within Milvus and is specific to each Milvus module. This metadata is stored in etcd, a distributed key-value store.

Additionally, when data is inserted, it is first loaded into a message queue, and Milvus returns success at this stage. The data is then written to persistent storage as incremental logs by the data node. If the `flush()` function is called, the data node is forced to write all data in the message queue to persistent storage immediately.

太好了!现在我们已经成功使用Milvus和DeepSeek构建了一个RAG pipeline。

作者介绍

9179de2bf838150883ecf375718689ec.jpeg

王翔宇

Zilliz 算法工程师

推荐阅读

5862d267c016fa5d73eb2f8a7e4a5e1e.png

652fc60b04fb15fef1eab120cb088f94.png

6865cc4cef51962906e814a1c3321b86.png

3402131e546a2bc33ab700e024f8b1ed.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2272271.html

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

相关文章

得物基于AIGC生成测试用例的探索与实践

一、背景 随着人工智能技术的快速发展&#xff0c;尤其是在自然语言处理&#xff08;NLP&#xff09;、计算机视觉和生成对抗网络&#xff08;GANs&#xff09;等领域&#xff0c;AIGC&#xff08;AI Generated Content&#xff09;得到了广泛应用&#xff0c;这一技术的进步使…

HTML5实现好看的二十四节气网页源码

HTML5实现好看的新年春节元旦网站源码 前言一、设计来源1.1 主界面1.2 关于我们界面1.3 春季节气界面1.4 夏季节气界面1.5 秋季节气界面1.6 冬季节气界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看的二十四节气网页源码&#xff0c;春季节气&#xf…

Hadoop集群之间实现免密登录

实现虚拟机之间能够互相登录&#xff0c;比如可以在hadoop1上面登录hadoop2。 第一步&#xff1a;执行”ssh-keygen -t rsa”命令&#xff0c;生成该虚拟机的密钥 第二步&#xff1a;密钥文件存储在/root/.ssh目录&#xff0c;执行cd /root/.ssh命令进入存储密钥文件的目录&am…

国产编辑器EverEdit - 常用资源汇总

1 国产编辑器EverEdit-常用资源汇总 EverEdit是一款国产文本编辑器&#xff0c;历经超过15年的更新和维护&#xff0c;拥有不输业界顶级商业文本编辑器(EmEditor、UltraEdit)的实力&#xff0c;甚至在某些方面的功能更强(当然&#xff0c;各有千秋)&#xff0c;开发者对文本编辑…

C# 枚举格式字符串

总目录 前言 当前文章为 C# 中的格式设置(格式化字符串) 大全 中的一个小章节。 一、概述 1. 基本信息 可以使用 Enum.ToString 方法&#xff0c;新建表示枚举成员的数字值、十六进制值或字符串值的字符串对象。枚举格式说明符不区分大小写。 二、自定义数字格式说明符详解…

SQL-Server链接服务器访问Oracle数据

SQL Server 链接服务器访问 Oracle 离线安装 .NET Framework 3.5 方法一&#xff1a;使用 NetFx3.cab 文件 下载 NetFx3.cab 文件&#xff0c;并将其放置在 Windows 10 系统盘的 C:Windows 文件夹中。 以管理员身份运行命令提示符&#xff0c;输入以下命令并回车&#xff1a; …

Microi吾码|开源低代码.NET、VUE低代码项目,表单引擎介绍

Microi吾码&#xff5c;开源低代码.NET、VUE低代码项目&#xff0c;表单引擎介绍 一、摘要二、Microi吾码介绍2.1 功能介绍2.2 团队介绍2.3 上线项目案例 三、Microi吾码表单引擎是什么&#xff1f;四、Microi吾码表单引擎功能4.1 模块引擎 - 由表单引擎驱动4.2 流程引擎 - 由表…

自动化立体库安全使用管理制度完整版

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。欢迎大家到本文底部评论区留言。 新书《智能物流系统构成与技术实践》人俱乐部 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载。 以下是《…

ArcGIS中怎么把数据提取到指定范围(裁剪、掩膜提取)

最近&#xff0c;经常能收到怎么把数据提取到指定范围、栅格数据怎么裁剪、矢量数据怎么裁剪、栅格数据怎么掩膜提取的咨询。 下面是我对这个问题的解决思路&#xff1a; 对于矢量数据&#xff1a; ①首先把数据加载进来 ②软件界面上面的工具栏找到→地理处理→裁剪&#x…

stm32的掉电检测机制——PVD

有时在一些应用中&#xff0c;我们需要检测系统是否掉电了&#xff0c;或者要在掉电的瞬间需要做一些处理。 STM32内部自带PVD功能&#xff0c;用于对MCU供电电压VDD进行监控。 STM32就有这样的掉电检测机制——PVD(Programmable Voltage Detecter)&#xff0c;即可编程电压检…

QT:控件属性及常用控件(2)-----按钮类控件及显示类控件

文章目录 QT关于qrc一个蛋疼的问题一、按钮类控件1.PushButton1.1 给按钮加图标1.2 给按钮加快捷键 2.RadioButtion2.1 单选题2.2 关于状态2.3 多组单选 3.Check Box4.Tool Button 二、显示类控件1.Lable1.1 文本、图片显示1.2 Label格式1.3 设置伙伴(绑定伙伴关系) 2.LCDNumbe…

逆向入门(2)C篇-基础知识

C基础 1、在C中&#xff0c;函数的变量是从右往左传递的&#xff0c;也就是test(x,y)&#xff0c;先传入y&#xff0c;再传x。 2、变量的分类&#xff1a; &#xff08;1&#xff09;全局变量。在编译的时候就已经确定了内存地址和宽度&#xff0c;变量名就是内存地址的别名…

【C语言】_assert断言

目录 1. assert功能 2. 使用assert判指针有效性 3. assert的参数 4. NDEBUG宏与assert机制的关闭 5. Debug版本与Release版本 1. assert功能 assert ( ) 是assert.h头文件定义的宏&#xff0c;用于在运行时确保程序符合指定条件&#xff1a; 如果不符合&#xff08;条件…

在Unity中用Ab包加载资源(简单好抄)

第一步创建一个Editor文件夹 第二步编写BuildAb&#xff08;这个脚本一点要放在Editor中因为这是一个编辑器脚本&#xff0c;放在其他地方可能会报错&#xff09; using System.IO; using UnityEditor; using UnityEngine;public class BuildAb : MonoBehaviour {// 在Unity编…

【可实战】Bug的判定标准、分类、优先级、定位方法、提交Bug(包含常见面试题)

一、Bug相关概念 &#xff08;一&#xff09;bug判定标准 &#xff08;二&#xff09;常见 Bug 分类 &#xff08;三&#xff09;bug优先级 1.bug严重程度与优先级的关系 有些很严重的Bug&#xff0c;只在极端的条件下才出现&#xff0c;用户碰到的概率很低&#xff0c;这种情…

C语言:调试的概念和调试器的选择

所谓调试&#xff08;Dubug&#xff09;&#xff0c;就是跟踪程序的运行过程&#xff0c;从而发现程序的逻辑错误&#xff08;思路错误&#xff09;&#xff0c;或者隐藏的缺陷&#xff08;Bug&#xff09;。 在调试的过程中&#xff0c;我们可以监控程序的每一个细节&#xff…

30分钟搭建 Typecho 个人博客教程

Typecho是一款PHP博客程序&#xff0c;相比于WordPress&#xff0c;Typecho显得更加的轻量级和简洁。现在越来越多的人倾向于用Typecho来搭建个人博客——众所周知&#xff0c;能跑WordPress的机器都不便宜。 Typecho是一款国人团结打造的开源博客系统&#xff0c;和WordPress…

【软考网工笔记】计算机基础理论与安全——网络安全

病毒 Melissa 宏病毒 1. 是一种快速传播的能够感染那些使用MS Word 97 和MS Office 2000 的计算机宏病毒。 2. 前面有**Macro** 表示这是宏病毒&#xff1b; 3. 宏病毒可以感染后缀为.xls的文件&#xff1b;Worm 蠕虫病毒 1. 通常是通过网络或者系统漏洞进行传播。 2. 利用信…

数字图像处理 三 空间滤波

空间滤波是一种图像处理技术&#xff0c;它通过对图像像素及其邻域进行运算&#xff0c;利用均值&#xff0c;高斯&#xff0c;梯度&#xff0c;拉普拉斯等线性滤波和中值&#xff0c;最大最小&#xff0c;双边滤波等非线性滤波改变像素值&#xff0c;实现图像的平滑&#xff0…

记录一次电脑被入侵用来挖矿的过程(Trojan、Miner、Hack、turminoob)

文章目录 0、总结1、背景2、端倪3、有个微软的系统更新&#xff0c;就想着更新看看&#xff08;能否冲掉问题&#xff09;4、更新没成功&#xff0c;自动重启电脑5、风险文件&#xff08;好家伙命名还挺规范&#xff0c;一看名字就知道出问题了&#xff09;6、开机有一些注册表…