偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

聊一聊Qwen3思考模式實(shí)現(xiàn)以及背后原理探討

人工智能
Qwen3 啟用了思考功能,類似于 QwQ-32B。這意味著模型將運(yùn)用其推理能力來(lái)提升生成響應(yīng)的質(zhì)量。例如,當(dāng)在tokenizer.apply_chat_template明確設(shè)置enable_thinking=True或保留其默認(rèn)值時(shí),模型將啟動(dòng)其思考模式。

硬開(kāi)關(guān)

我們先通過(guò)官方的示例代碼來(lái)體驗(yàn)一下,如何實(shí)現(xiàn)在思考模式和非思考模式之間切換

通過(guò)tokenizer.apply_chat_template的enable_thinking參數(shù)來(lái)實(shí)現(xiàn)

默認(rèn)情況下,Qwen3 啟用了思考功能,類似于 QwQ-32B。這意味著模型將運(yùn)用其推理能力來(lái)提升生成響應(yīng)的質(zhì)量。例如,當(dāng)在tokenizer.apply_chat_template明確設(shè)置enable_thinking=True或保留其默認(rèn)值時(shí),模型將啟動(dòng)其思考模式。代碼如下:

text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True,
    enable_thinking=True  # True is the default value for enable_thinking
)

在這種模式下,模型會(huì)生成包裹在...塊中的思考內(nèi)容,然后是最終的響應(yīng)。

對(duì)于思考模式,官方提示請(qǐng)使用Temperature=0.6、TopP=0.95、TopK=20和MinP=0( 中的默認(rèn)設(shè)置generation_config.json)。請(qǐng)勿使用貪婪解碼,因?yàn)樗鼤?huì)導(dǎo)致性能下降和無(wú)休止的重復(fù)。https://huggingface.co/Qwen/Qwen3-32B

Qwen3提供了一個(gè)硬開(kāi)關(guān),可以嚴(yán)格禁用模型的思考行為,使其功能與之前的 Qwen2.5-Instruct 模型保持一致。此模式在需要禁用思考以提高效率的場(chǎng)景中尤為有用。

text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True,
    enable_thinking=False  # Setting enable_thinking=False disables thinking mode
)

在此模式下,模型不會(huì)生成任何思考內(nèi)容,也不會(huì)包含...塊。

對(duì)于非思考模式,我們建議使用Temperature=0.7、TopP=0.8、TopK=20和MinP=0。

軟開(kāi)關(guān)

Qwen3示例給了一種高級(jí)用法: 通過(guò)用戶輸入在思考模式和非思考模式之間切換,具體來(lái)說(shuō)就是通過(guò)用戶輸入層控制是否思考,提供了一種軟切換機(jī)制,允許用戶在enable_thinking=True時(shí)動(dòng)態(tài)控制模型的行為。實(shí)現(xiàn)方式就是可以在用戶提示或系統(tǒng)消息中添加/think和/no_think,以便在不同回合之間切換模型的思維模式。

在多回合對(duì)話中,模型將遵循最后一條的指令。

以下是多輪對(duì)話的示例:

from transformers import AutoModelForCausalLM, AutoTokenizer

class QwenChatbot:
    def __init__(self, model_name="Qwen/Qwen3-32B"):
        self.tokenizer = AutoTokenizer.from_pretrained(model_name)
        self.model = AutoModelForCausalLM.from_pretrained(model_name)
        self.history = []

    def generate_response(self, user_input):
        messages = self.history + [{"role": "user", "content": user_input}]

        text = self.tokenizer.apply_chat_template(
            messages,
            tokenize=False,
            add_generation_prompt=True
        )

        inputs = self.tokenizer(text, return_tensors="pt")
        response_ids = self.model.generate(**inputs, max_new_tokens=32768)[0][len(inputs.input_ids[0]):].tolist()
        response = self.tokenizer.decode(response_ids, skip_special_tokens=True)

        # Update history
        self.history.append({"role": "user", "content": user_input})
        self.history.append({"role": "assistant", "content": response})

        return response

# Example Usage
if __name__ == "__main__":
    chatbot = QwenChatbot()

    # First input (without /think or /no_think tags, thinking mode is enabled by default)
    user_input_1 = "How many r's in strawberries?"
    print(f"User: {user_input_1}")
    response_1 = chatbot.generate_response(user_input_1)
    print(f"Bot: {response_1}")
    print("----------------------")

    # Second input with /no_think
    user_input_2 = "Then, how many r's in blueberries? /no_think"
    print(f"User: {user_input_2}")
    response_2 = chatbot.generate_response(user_input_2)
    print(f"Bot: {response_2}") 
    print("----------------------")

    # Third input with /think
    user_input_3 = "Really? /think"
    print(f"User: {user_input_3}")
    response_3 = chatbot.generate_response(user_input_3)
    print(f"Bot: {response_3}")

思考模式軟硬開(kāi)關(guān)如何兼容

我們會(huì)自然想到一種情況,就是用戶即在tokenizer.apply_chat_template中設(shè)置了enable_thinking參數(shù),又在用戶輸入的時(shí)候可能加入了/think和/no_think符號(hào),這種情況軟硬開(kāi)關(guān)如何兼容呢?

為了實(shí)現(xiàn) API 兼容性,當(dāng)enable_thinking=True時(shí),無(wú)論用戶使用/think還是/no_think,模型都會(huì)始終輸出一個(gè)包裹在<think>...</think>中的塊。

但是,如果禁用思考功能,此塊內(nèi)的內(nèi)容可能為空。當(dāng)enable_thinking=False時(shí),軟開(kāi)關(guān)無(wú)效。無(wú)論用戶輸入任何/think或/no_think符號(hào),模型都不會(huì)生成思考內(nèi)容,也不會(huì)包含...塊。

我們可以看到enable_thinking的優(yōu)先級(jí)是要大于/think或/no_think的優(yōu)先級(jí)。

接下來(lái)我們通過(guò)Qwen3模型中的tokenizer_config.json來(lái)分析如何通過(guò)對(duì)話模板來(lái)如何實(shí)現(xiàn)快慢思考的?下面截圖就是:

圖片圖片

多說(shuō)一句,Chat template 是大語(yǔ)言模型(LLM)中的一個(gè)關(guān)鍵組件,它定義了如何將對(duì)話轉(zhuǎn)換為模型可以理解的格式化輸入。我將詳細(xì)解釋其原理并提供具體示例。

Qwen3的 Chat Template 原理詳解

Chat template 是大語(yǔ)言模型(LLM)中的一個(gè)關(guān)鍵組件,它定義了如何將對(duì)話轉(zhuǎn)換為模型可以理解的格式化輸入。我將詳細(xì)解釋其原理并提供具體示例。

基本原理

Chat template 本質(zhì)上是一個(gè)文本模板,使用特定語(yǔ)法(通常是 Jinja2 模板語(yǔ)法)來(lái)處理和格式化對(duì)話數(shù)據(jù)。它的主要功能是:

  1. 角色區(qū)分:明確標(biāo)識(shí)不同參與者(系統(tǒng)、用戶、助手等)的消息
  2. 特殊標(biāo)記插入:添加模型訓(xùn)練時(shí)使用的特殊標(biāo)記
  3. 結(jié)構(gòu)化表示:將多輪對(duì)話組織成模型預(yù)期的格式
  4. 功能支持:處理工具調(diào)用、思考過(guò)持等高級(jí)功能

關(guān)鍵組件解析

在 Qwen3-8B 的 chat_template 中:

  • <|im_start|> 和 <|im_end|>:標(biāo)記消息的開(kāi)始和結(jié)束
  • role:標(biāo)識(shí)消息發(fā)送者(system、user、assistant、tool)
  • <think></think>:圍繞助手的思考過(guò)程
  • <tool_call></tool_call>:包含工具調(diào)用信息
  • <tool_response></tool_response>:包含工具響應(yīng)信息

實(shí)例說(shuō)明

讓我通過(guò)幾個(gè)具體例子來(lái)說(shuō)明 chat_template 如何工作:

例子1:簡(jiǎn)單對(duì)話

假設(shè)有以下對(duì)話:

系統(tǒng):你是一個(gè)有用的助手
用戶:你好
助手:你好!有什么我可以幫助你的?

使用 Qwen3-8B 的 chat_template 處理后,會(huì)變成:

<|im_start|>system
你是一個(gè)有用的助手
<|im_end|>
<|im_start|>user
你好
<|im_end|>
<|im_start|>assistant
你好!有什么我可以幫助你的?
<|im_end|>

例子2:包含思考過(guò)程的對(duì)話

系統(tǒng):你是一個(gè)有用的助手
用戶:42+28等于多少?
助手:(思考:我需要計(jì)算42+28,42+28=70)
70

處理后:

<|im_start|>system
你是一個(gè)有用的助手
<|im_end|>
<|im_start|>user
42+28等于多少?
<|im_end|>
<|im_start|>assistant
<think>
我需要計(jì)算42+28,42+28=70
</think>

70
<|im_end|>

例子3:工具調(diào)用

系統(tǒng):你是一個(gè)有用的助手
用戶:查詢北京今天的天氣
助手:我將調(diào)用天氣API
(調(diào)用天氣工具)
工具響應(yīng):北京今天晴朗,溫度22-28度
助手:根據(jù)查詢,北京今天天氣晴朗,溫度在22-28度之間。

處理后:

<|im_start|>system
你是一個(gè)有用的助手
<|im_end|>
<|im_start|>user
查詢北京今天的天氣
<|im_end|>
<|im_start|>assistant
我將調(diào)用天氣API
<tool_call>
{"name": "weather_api", "arguments": {"city": "北京", "date": "today"}}
</tool_call>
<|im_end|>
<|im_start|>user
<tool_response>
北京今天晴朗,溫度22-28度
</tool_response>
<|im_end|>
<|im_start|>assistant
根據(jù)查詢,北京今天天氣晴朗,溫度在22-28度之間。
<|im_end|>

Chat template 在實(shí)際處理中利用了 Jinja2 模板引擎的多種功能:

  1. 條件處理:{%- if ... %} 和 {%- endif %} 用于根據(jù)消息類型選擇不同的格式化方式
  2. 循環(huán)遍歷:{%- for message in messages %} 用于處理多輪對(duì)話
  3. 變量替換:{{- message.content }} 插入實(shí)際消息內(nèi)容
  4. 命名空間:{%- set ns = namespace(...) %} 跟蹤狀態(tài)信息

Chat template 對(duì)模型使用至關(guān)重要:

  1. 訓(xùn)練一致性:確保推理時(shí)的格式與訓(xùn)練時(shí)一致
  2. 功能支持:使模型能識(shí)別并正確處理特殊功能(工具調(diào)用、思考過(guò)程)
  3. 性能優(yōu)化:正確的格式化可以顯著提高模型輸出質(zhì)量

下面一個(gè)代碼可以看到enable_thinking為False/True時(shí)不同的分詞結(jié)果

prompt = "42+28等于多少?"
messages = [
    {"role": "user", "content": prompt}
]

text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True,
    enable_thinking=True  # Setting enable_thinking=False disables thinking mode
)

圖片圖片

可以看到上面分詞之后的唯一差別的地方就是,enable_thinking=False時(shí)添加了一個(gè)<think>\n\n</think>\n,添加了一個(gè)空白思考,用來(lái)告訴模型已經(jīng)思考結(jié)束。

那么好奇問(wèn)了,如果enable_thinking=True,然后我在對(duì)話的后面添加一個(gè)<think>\n\n</think>\n會(huì)怎么樣呢,就是下面:

prompt = "42+28等于多少?"+“<think>\n\n</think>\n”
messages = [
    {"role": "user", "content": prompt}
]

text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True,
    enable_thinking=True  # Setting enable_thinking=False disables thinking mode
)

這個(gè)時(shí)候其實(shí)還是會(huì)輸出思考內(nèi)容的,大家可以試試看看

思考:Qwen3模型如何實(shí)現(xiàn)快慢思考

通過(guò)軟開(kāi)關(guān),我們可以看到Qwen3是可以通過(guò)從輸入上來(lái)控制的快慢思考的,自然而然想到的是不是在訓(xùn)練的時(shí)候加了一些策略,直覺(jué)就是:

有一部分?jǐn)?shù)據(jù)帶有思維鏈一部分沒(méi)有帶有思維鏈

  • no_think:問(wèn)題+答案
  • think:問(wèn)題+【思考內(nèi)容+答案】

在第三階段,Qwen3在一份包括長(zhǎng)思維鏈數(shù)據(jù)和常用的指令微調(diào)數(shù)據(jù)的組合數(shù)據(jù)上對(duì)模型進(jìn)行微調(diào),將非思考模式整合到思考模型中。確保了推理和快速響應(yīng)能力的無(wú)縫結(jié)合。

這個(gè)地方可以做到軟硬的實(shí)現(xiàn),一個(gè)是硬開(kāi)關(guān)優(yōu)先級(jí)的控制,可以通過(guò)強(qiáng)化學(xué)習(xí)來(lái)實(shí)現(xiàn),比如模板部分是否存在<think>\n\n</think>\n,另一個(gè)就是軟開(kāi)關(guān),可能就是不同訓(xùn)練數(shù)據(jù)混在一起訓(xùn)練,讓模型面臨簡(jiǎn)單或者復(fù)雜問(wèn)題自主決定思考的自由度。

有同學(xué)說(shuō),針對(duì)Qwen3有些模型師Moe,是不是可以:

把解碼頭改成多專家的形式,一個(gè)think一個(gè)不think,這樣可行嗎

這個(gè)是可以的,不過(guò)Qwen3 8B不是Moe

也有同學(xué)說(shuō)deepseek之前文章也是這么搞的,r1通過(guò)注入思考空指令如何不進(jìn)行思考,

或者存在一種情況

類似于在R1應(yīng)用中sys_prompt寫成:
think>用戶說(shuō)我是一個(gè)端水大師,要從aaa bbb cc方面考慮問(wèn)題,現(xiàn)在我要先做…… </think>
以期實(shí)現(xiàn)減少、甚至截?cái)嗄P驮緍easoning的部分

一些控制思考深度的研究方法

筆者收集了一些資料,在深度學(xué)習(xí)與自然語(yǔ)言處理公眾號(hào)看到一些關(guān)于大模型“過(guò)度思考”解讀的一些文章

讓模型學(xué)會(huì)「偷懶」

論文:Towards Thinking-Optimal Scaling of Test-Time Compute for LLM Reasoning 鏈接:https://arxiv.org/pdf/2502.18080

解決方案:讓模型自己決定「想多久」論文提出Thinking-Optimal Scaling(TOPS)策略,核心思想是:學(xué)會(huì)「偷懶」。

三步走實(shí)現(xiàn):

  • 模仿學(xué)習(xí):用少量樣例教模型「不同難度用不同思考長(zhǎng)度」;
  • 動(dòng)態(tài)生成:對(duì)同一問(wèn)題生成短/中/長(zhǎng)三種思考鏈;
  • 自我改進(jìn):自動(dòng)選擇最短的正確答案作為訓(xùn)練數(shù)據(jù)。

LightThinker的“思考?jí)嚎s”

論文:LightThinker: Thinking Step-by-Step Compression 鏈接:https://arxiv.org/pdf/2502.15589 項(xiàng)目:https://github.com/zjunlp/LightThinker

LightThinker的秘籍分為兩大招:何時(shí)壓縮和如何壓縮

何時(shí)壓縮?

LightThinker提供了兩種策略:

  • Token級(jí)壓縮:每生成固定數(shù)量的token就壓縮一次,簡(jiǎn)單粗暴但可能把一句話“腰斬”。
  • 思考級(jí)壓縮:等模型寫完一個(gè)完整段落(比如一段分析或一次試錯(cuò))再壓縮,保留語(yǔ)義完整性,但需要模型學(xué)會(huì)“分段”。

如何壓縮?

這里有個(gè)關(guān)鍵操作:

  • 把隱藏狀態(tài)壓縮成“要點(diǎn)token”!數(shù)據(jù)重構(gòu):訓(xùn)練時(shí)在數(shù)據(jù)中插入特殊標(biāo)記(比如觸發(fā)壓縮,[C]存儲(chǔ)壓縮內(nèi)容),教模型學(xué)會(huì)“記重點(diǎn)”。
  • 注意力掩碼:設(shè)計(jì)專屬注意力規(guī)則,讓壓縮后的token只能關(guān)注問(wèn)題描述和之前的壓縮內(nèi)容,避免“翻舊賬”。

在思考中提前預(yù)判答案

論文:Reasoning Models Know When They’re Right: Probing Hidden States for Self-Verification 鏈接:https://arxiv.org/pdf/2504.05419v1

通過(guò)訓(xùn)練一個(gè)簡(jiǎn)單的“探針”(類似體檢儀器),研究者發(fā)現(xiàn):

  • 高準(zhǔn)確率:探針預(yù)測(cè)中間答案正確性的準(zhǔn)確率超過(guò)80%(ROC-AUC >0.9)。
  • 提前預(yù)判:模型甚至在答案完全生成前,隱藏狀態(tài)就已暴露正確性信號(hào)!

研究團(tuán)隊(duì)設(shè)計(jì)了一套流程:

  • 切分推理鏈:將長(zhǎng)推理過(guò)程按關(guān)鍵詞(如“再檢查”“另一種方法”)分割成多個(gè)片段。
  • 標(biāo)注正確性:用另一個(gè)LLM(Gemini 2.0)自動(dòng)判斷每個(gè)片段的答案是否正確。
  • 訓(xùn)練探針:用兩層神經(jīng)網(wǎng)絡(luò)分析模型隱藏狀態(tài),預(yù)測(cè)答案正確性。

總結(jié)

圖片圖片

混合推理模型已經(jīng)有不少了,例如 Claude 3.7 Sonnet 和 Gemini 2.5 Flash, Qwen3 應(yīng)該是開(kāi)源且效果好的典例。未來(lái)這可能也是一個(gè)趨勢(shì),不需要特意區(qū)分普通模型和思考模型,而是同一個(gè)模型按需使用。

Claude 3.7 sonnet 的混合推理模型

Claude 3.7 sonnet 的混合推理模型(Hybrid Reasoning Model)是 LLM 和 reasoning model 的結(jié)合的新范式,之后大概率所有 AI labs 的模型發(fā)布模型都會(huì)以類似形式,社區(qū)也不會(huì)再單獨(dú)比較 base model 和 reasoning model 的能力。

使用 Claude 3.7 Sonnet 時(shí),用戶可以通過(guò)“extended thinking” 的設(shè)置選擇是否需要輸出長(zhǎng) CoT:

?  打開(kāi) extended thinking,則輸出 CoT step-by-step 思考,類似開(kāi)啟了人類的 Slow thinking 并且其思考長(zhǎng)度是可以選擇的,因此 extended thinking 并不是 0 或 1,而是一個(gè)可以拖動(dòng)的光譜,

? 關(guān)閉 extended thinking,則和 LLM 一樣直接輸出。

圖片圖片

這個(gè)設(shè)計(jì)其實(shí) Dario 很早就暗示過(guò),在他看來(lái):base model 與 reasoning model應(yīng)該是個(gè)連續(xù)光譜。Claude System Card 中提到,extended thinking 的開(kāi)關(guān)與長(zhǎng)短是通過(guò)定義 system prompt 來(lái)實(shí)現(xiàn)的。我們推測(cè)要實(shí)現(xiàn)這樣的融合模型,應(yīng)該需要在 RL 訓(xùn)練之后通過(guò) post training 讓模型學(xué)會(huì)什么時(shí)候應(yīng)該 step by step thinking,如何控制推理長(zhǎng)度。

對(duì)于這個(gè)新范式,我們的預(yù)測(cè)是:

  1. 之后的 hybrid reasoning model 需要在 fast thinking 和 slow thinking 的選擇上更加智能,模型自己具備 dynamic computing 能力,能規(guī)劃并分配解決一個(gè)問(wèn)題的算力消耗和 token 思考量。Claude 3.7 Sonnet 目前還是將 inference time 的打開(kāi)和長(zhǎng)短交由用戶自己來(lái)決定,AI 還無(wú)法判斷 query 復(fù)雜度、無(wú)法根據(jù)用戶意圖自行選擇。
  2. 之后所有頭部 research lab 發(fā)布模型都會(huì)以類似形式,不再只是發(fā) base model。

其實(shí)現(xiàn)在打開(kāi) ChatGPT 上方的模型選擇,會(huì)彈出五六個(gè)模型,其中有 4o 也有 o3,用戶需要自行選擇是用 LLM 還是 reasoning model,使用體驗(yàn)非?;靵y。因此,hybrid reasoning model 從智能能力和用戶體驗(yàn)看都是下一步的必然選擇。

圖片圖片

Gemini 2.5 Flash精細(xì)化的思維管理控制

我們知道,不同案例會(huì)以不同的方式權(quán)衡質(zhì)量、成本和延遲。為了讓開(kāi)發(fā)者具備靈活性,Gemini 2.5 Flash研發(fā)出了可供設(shè)置的思考預(yù)算功能,開(kāi)發(fā)者可借此在模型進(jìn)行思考的同時(shí),對(duì)其可以生成的最大令牌數(shù)實(shí)現(xiàn)精細(xì)控制。預(yù)算更高意味著,模型可以更深入地進(jìn)行推理,進(jìn)而提高質(zhì)量。值得注意的是,雖然預(yù)算使 2.5 Flash 的思考深度存在上限,但若提示無(wú)需深度思考,模型便不會(huì)耗盡全部預(yù)算。

圖片圖片

低推理需求提示:

示例 1:“謝謝”用西班牙語(yǔ)怎么說(shuō)?

示例 2:加拿大有多少個(gè)省份?

中等推理需求提示:

示例 1:投擲兩個(gè)骰子,點(diǎn)數(shù)之和為 7 的概率是多少?

示例 2:我所在的健身房會(huì)于周一、周三和周五的上午 9 點(diǎn)至下午 3 點(diǎn),以及周二、周六的下午 2 點(diǎn)至晚上 8 點(diǎn)開(kāi)放籃球活動(dòng)。我每周工作 5 天,工作時(shí)間為上午 9 點(diǎn)至下午 6 點(diǎn),我想在平日打 5 個(gè)小時(shí)籃球,請(qǐng)為我制定可行的時(shí)間表。

高推理需求提示:

示例 1:長(zhǎng)度 L=3m 的懸臂梁有一個(gè)矩形截面(寬度 b=0.1m,高度 h=0.2m),且由鋼 (E=200 GPa) 制成。其整個(gè)長(zhǎng)度承受 w=5 kN/m 的均勻分布載荷,自由端則承受 P=10 kN 的集中載荷。計(jì)算最大彎曲應(yīng)力 (σ_max)。

示例 2:編寫函數(shù) evaluate_cells(cells: Dict[str, str]) -> Dict[str, float],用以計(jì)算電子表格單元格值。

每個(gè)單元格包含:

一個(gè)數(shù)字(例如“3”) 或一個(gè)使用 +、-、*、/ 和其他單元格的公式,如“=A1 + B1 * 2”。 要求:

解析單元格之間的依賴關(guān)系。 遵守運(yùn)算符優(yōu)先級(jí)(*/ 優(yōu)于 +-)。 檢測(cè)循環(huán)并指出 ValueError(“在<單元格>檢測(cè)到循環(huán)”)。 無(wú) eval()。僅使用內(nèi)置庫(kù)。

責(zé)任編輯:武曉燕 來(lái)源: ChallengeHub
相關(guān)推薦

2022-11-01 08:46:20

責(zé)任鏈模式對(duì)象

2023-05-15 08:38:58

模板方法模式

2022-11-26 00:00:06

裝飾者模式Component

2022-03-06 20:35:41

并發(fā)串行CAP

2023-11-02 08:37:46

Python換行轉(zhuǎn)義

2024-09-12 10:06:21

2018-03-13 09:09:07

閃存垃圾回收

2021-08-01 09:55:57

Netty時(shí)間輪中間件

2020-01-17 09:07:14

分布式系統(tǒng)網(wǎng)絡(luò)

2023-02-07 06:42:24

Pulsar負(fù)載均衡

2022-04-13 18:01:39

CSS組件技巧

2023-09-22 17:36:37

2021-01-28 22:31:33

分組密碼算法

2020-05-22 08:16:07

PONGPONXG-PON

2021-12-09 10:17:25

部署實(shí)戰(zhàn)Linux

2023-12-14 11:35:32

.NET泄露模式

2023-02-09 10:39:15

gRPC通信模式

2022-09-26 08:03:25

VMware虛擬機(jī)

2018-06-07 13:17:12

契約測(cè)試單元測(cè)試API測(cè)試

2024-08-06 09:08:59

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)