
引言:為什麼你需要了解 Qwen3-Embedding
在人工智慧與自然語言處理(NLP)領域,文字的語義表示(Embedding)是構建智慧應用的核心基礎能力之一。無論是搜尋引擎、推薦系統、智慧客服,還是內容理解與聚類分析,高效的文字向量化技術都是實現這些功能的關鍵。Qwen3-Embedding 作為阿里巴巴通義實驗室推出的最新一代嵌入模型,憑藉其強大的語義建模能力和靈活的適配性,已成為開發者和企業構建智慧應用的重要工具。本文旨在為您提供一份全面且實用的 Qwen3-Embedding 使用指南。
1.閱讀本文,您將獲得:
a.瞭解 Qwen3-Embedding 的核心原理、核心優勢及應用場景;
b.快速上手阿里雲 PAI 及百鍊平臺,快速部署及驗證 Qwen3-Embedding 模型;
c.掌握如何透過領域資料集微調模型,並將微調後的模型重新部署上線;
d.瞭解 LLM 及輕量 Embedding 模型的應用場景、優勢以及如何做工程鏈路最佳化。
2.閱讀建議:
a.如果您僅想了解 Qwen3-Embedding 在 PAI 或 百鍊上的部署或測試驗證,請直接跳轉至本文第二、三章;
b.如果您想了解 LLM 與 輕量 Embedding 的對比資料或應用方案,請直接跳轉至本文第四、五章。
一、Qwen3-Embedding 系列介紹
1.簡介:什麼是 Qwen3-Embedding
a.簡介:Qwen3-Embedding 是阿里巴巴通義實驗室推出的最新一代嵌入模型(Embedding Model),專為處理文字語義表示而設計。它能夠將文字轉換為高維向量(Embedding),廣泛應用於語義搜尋、推薦系統、聚類分析、文字匹配等下游任務。
b.核心原理
i.基本架構:Qwen3-Embedding 是基於 Qwen3 的語言模型進行構建,結合 instruction 機制與 MoE 設計,構建出的一種高效、多工支援的文字嵌入模型。
ii.雙塔訓練策略:Embedding 模型採用雙塔結構訓練,分別編碼查詢(query)和文件(document),提升語義匹配效率。
iii.對比學習:透過超大規模資料弱監督對比訓練,疊加高質量資料監督訓練,顯著提升模型泛化能力和魯棒性。
iv.多粒度融合:在模型訓練過程中,會生成多個 check point,每個 check point 代表了在特定訓練階段下的模型引數。透過將這些 check point 之間的引數差異視為“任務向量”,並在高維空間中尋找最優的融合路徑,從而實現更優的模型效能。
c.核心優勢
i.功能多樣:嵌入模型在廣泛的下游應用評估中達到了最先進的效能。8B 大小的嵌入模型在 MTEB 多語言排行榜上排名第 1(截至 2025 年 6 月 5 日,得分為 70.58),而重新排序模型在各種文字檢索場景中表現出色。
ii.靈活性:Qwen3-Embedding 系列提供了從 0.6B 到 8B 的全尺寸範圍,適用於優先考慮效率和效果的各種用例。開發人員可以無縫結合這兩個模組。此外,嵌入模型允許在所有維度上靈活定義向量,並且嵌入和重新排序模型都支援使用者定義的指令,以增強特定任務、語言或場景的效能。
iii.多語言支援:得益於 Qwen3 模型的多語言能力,Qwen3-Embedding 系列支援超過 100 種語言。這包括各種程式語言,並提供了強大的多語言、跨語言和程式碼檢索能力。
iv.成本最佳化:Qwen3-Embedding 相比“同性能模型”在訓練及部署成本上有大幅降低,這得益於Qwen3 的 MOE 架構,僅需啟用少量引數即可獲得強大的效能表現,這種設計使得模型在保持高效能的同時,減少了計算資源的消耗,從而降低了部署和執行成本,同時 Qwen3-Embedding 支援中間維度裁剪的 MR Loss 訓練策略,即在訓練過程中,Qwen3-Embedding 模型不僅對最終輸出維度進行訓練,還對多箇中間維度(如 32、64、128 等)進行聯合訓練,這意味著在實際應用中,使用者可以根據需求選擇較低維度的輸出,從而減少儲存和計算開銷,同時幾乎不影響模型效果。這種方式有效降低了下游任務中的資源消耗。
2.應用場景
a.Qwen3-Embedding 憑藉其強大的語義理解和泛化能力,其具有的廣泛應用能力見下表。

b.Qwen3-Embedding 具備多種強大的語義理解功能,其應用的基本邏輯見下表。

3.Qwen3-Embedding 系列模型列表:參考下方表格
a.MRL 支援:表示嵌入模型是否支援自定義最終嵌入的維度。
b.指令感知:表示嵌入或重排序模型是否支援根據不同的任務定製輸入指令。
c.我們的評估表明,對於大多數下游任務,使用指令(instruct)通常比不使用它們能提高 1% 到 5%,如需瞭解更詳細的資料,可檢視 Modelscope 上的一些評估資料,也可以從MTEB 線上排行榜獲取,因此,我們建議您為領域特定的任務和場景建立專門的指令。在多語言環境中,我們也建議您使用英語編寫指令,因為模型訓練過程中使用的大多數指令最初是用英語編寫的。

4.資源準備及部署要求
a.框架版本:如不符合版本要求可能會報錯 KeyError: 'qwen3'
i.Requires transformers>=4.51.0;
ii.Requires vllm>=0.8.5。
b.資源要求:A10 24G * 1。
二、Qwen3-Embedding on PAI
1.模型部署:如何在 PAI 上部署 Qwen3-Embedding
a.進入 PAI 控制檯 – 快速開始 – Model Gallery – 搜尋 Qwen3-Embedding – 選擇其中一個引數量級的模型(如 4B )- 點選部署。


i.點選部署後,您可以在 PAI 控制檯 – 模型部署 – 模型線上服務(EAS)- 看到您正在建立的 EAS 服務,一般建立需要幾分鐘到十幾分鐘不等,請耐心等待,也可以點選 名稱/ID 進入 EAS 服務概覽介面檢視容器狀態及日誌。


ii.部署成功後,您可以在模型線上服務(EAS)列表看到在執行中的服務,可以也可以點選 名稱/ID 進入 EAS 服務概覽介面檢視基本資訊、資源資訊、環境資訊、服務功能配置、服務接入、服務例項等資訊。


2.模型推理:如何呼叫 Qwen3-Embedding
a.獲取呼叫資訊:進入 PAI 控制檯 – 模型部署 – 模型線上服務(EAS)- 找到目標 EAS 服務,點選呼叫資訊。


i.線上除錯:進入 PAI 控制檯 – 模型部署 – 模型線上服務(EAS)- 點選進入目標 EAS 服務 – 線上除錯 – 輸入以下 Body 內容 。 注意事項:PAI-EAS 線上除錯服務給出的 URL 是有問題的,使用預設 URL 會報 {"detail":"Not Found"},需要您自己在 URL 後新增 "v1/embeddings" 才可以請求透過(見以下截圖,新增後正常輸出向量了),然後檢查呼叫資訊那裡,給出的呼叫資訊,也是缺少 "v1/embeddings" 的,需要自己新增上去 。
線上除錯 Body 示例
{
"input": [
"It 's a lovely film with lovely performances.",
"A warm , funny , engaging film."
],
"model": "Qwen3-Embedding-4B"
}


ii.透過 python 呼叫:寫一個 python 檔案(emb.py),檔案內容如下文字內容,然後呼叫,url 和 token 透過 EAS 服務列表 – 目標 EAS 服務 – 呼叫資訊獲取。
Python 呼叫程式碼示例
import requests
url = '修改為您自己的服務地址...v1/embeddings'
token = '修改為您自己的token'
request_body = {
"input": [
"It 's a lovely film with lovely performances.",
"A warm , funny , engaging film."
],
"model": "Qwen3-Embedding-4B"
}
headers = {"Authorization": token}
resp = requests.post(url=url, headers=headers, json=request_body)
print(resp.content.decode())
將程式碼寫入 emb.py 並執行
vim emb.py
python3.8 emb.py

3.模型微調:定製您的專屬 Embedding 模型
a.進入 PAI 控制檯 – 快速開始 – Model Gallery – 搜尋 Qwen3-Embedding – 選擇其中一個引數量級的模型(如 4B )- 點選訓練,您可以選擇預設資料集進行訓練,也可以自定義資料集進行訓練,訓練後模型會輸出到您配置的模型輸出路徑。


i.點選訓練後,您可以在 PAI 控制檯 – 模型開發與訓練 – 分散式訓練(DLC)- 看到您正在建立的訓練任務,一般需要等待一段時間(需要根據訓練集及模型大小來判斷),請耐心等待,也可以點選 名稱/ID 進入 DLC 服務概覽介面服務狀態或檢視日誌,方便您隨時掌控訓練進度。


ii.訓練完成後,可以看到日誌裡最終完成的 checkpoint-1705(SFT 後的模型權重在這裡)。

iii.訓練完成後,也可以對訓練後模型進行部署或再訓練:進入 PAI 控制檯 – 快速開始 – Model Gallery – 任務管理 – 訓練任務 – 點選進入目標任務 – 右上角部署或再訓練。


4.微調後的模型部署
a.注意:部署微調後的模型,需要在服務配置 – JSON 編輯 – 修改 path 欄位的值加上您微調完成後的 checkpoint 檔案地址。


i.部署成功後,您可以在模型線上服務(EAS)列表看到部署後的模型服務,其模型推理方法和本章節第 2 小節方法一樣。

5.應用場景:電影評論搜尋
a.方案:結合以上部署的 Qwen3-Embedding 模型,生成 50 條電影評論向量,再進行相似度搜索,實現電影評論搜尋功能。
b.電影評論向量生成及語義搜尋指令碼程式碼示例裡的一些注意事項:
i.修改配置資訊中的 url 及 token 為自己的資訊,可以在模型線上服務(EAS)列表 – 目標 EAS 服務 – 呼叫方式 – 呼叫資訊檢視,注意需要在 URL 後新增 "v1/embeddings"。
電影評論向量生成及語義搜尋程式碼示例
import requests
import numpy as np
import json
from sklearn.metrics.pairwise import cosine_similarity
# ========== 1. 配置資訊 ==========
url = '請輸入您自己的服務的 URL'
token = '請輸入您自己的服務的 Token'
# ========== 2. 已有電影評論列表(你可以替換為你自己的資料)==========
reviews = [
"The cinematography was breathtaking and the story deeply moving.",
"A dull plot with no character development, very disappointing.",
"This film is a masterpiece of visual storytelling and emotional depth.",
"The dialogue felt forced and the acting was painfully over-the-top.",
"An absolute joy to watch! The humor and pacing were perfect.",
"The soundtrack was the only redeeming quality in this otherwise terrible movie.",
"A gripping narrative that kept me hooked from start to finish.",
"Too many plot holes to take this film seriously.",
"The chemistry between the lead actors was electric!",
"A slow-burning bore with no payoff in the end.",
"Visually stunning but emotionally hollow.",
"This movie perfectly balances action, humor, and heartfelt moments.",
"The script was cliché-ridden and completely predictable.",
"A triumph of storytelling—every scene felt intentional and meaningful.",
"Overhyped and underwhelming. I fell asleep halfway through.",
"The director's unique vision shines through every frame of this film.",
"A chaotic mess of editing and disjointed scenes.",
"Hauntingly beautiful score that elevated the entire experience.",
"This film deserves all the awards for its technical brilliance.",
"The worst part? The characters had zero relatable motivations.",
"A fresh take on a classic genre—innovative and exciting!",
"Bland visuals and forgettable performances made this a snooze-fest.",
"The twist ending was so predictable I figured it out in Act 1.",
"A deeply moving exploration of human relationships and resilience.",
"This movie feels like a long, pretentious art school project.",
"The action sequences were thrilling but the story was paper-thin.",
"A cult classic in the making—quirky, bold, and unforgettable.",
"Dialogue fell flat and the comedic timing was painfully off.",
"Every frame is a work of art; this film redefines cinematic beauty.",
"An exhausting watch with no clear direction or purpose.",
"The lead actor's performance was raw and achingly authentic.",
"Overly reliant on CGI, sacrificing substance for flashy visuals.",
"A nostalgic gem that pays homage to classic cinema.",
"The pacing dragged for most of the film, killing any tension.",
"This film's originality and creativity left me in awe.",
"A shallow attempt at deep storytelling—felt entirely artificial.",
"The supporting cast stole the show with their impeccable performances.",
"A masterclass in tension-building and suspenseful storytelling.",
"The film's message was drowned in excessive runtime and filler scenes.",
"Darkly humorous with moments of profound philosophical insight.",
"A technically flawless production with zero emotional impact.",
"The screenplay was sharp, witty, and full of delightful surprises.",
"This movie tries too hard to be profound and fails miserably.",
"A visually arresting journey with a soulless narrative beneath.",
"The ensemble cast worked together like a perfectly orchestrated symphony.",
"A compelling concept wasted by poor execution and lazy writing.",
"This film will leave you thinking long after the credits roll.",
"The makeup and costume design were the only elements that impressed me.",
"A bold experiment in nonlinear storytelling that completely paid off.",
"Despite its flaws, the heart and passion behind this film shine through."
]
# ========== 3. 獲取向量表示(若已有 embeddings.json 可跳過)==========
defget_embedding(text):
headers = {"Authorization": token}
payload = {
"input": [text],
"model": "Qwen3-Embedding-4B"
}
response = requests.post(url, headers=headers, json=payload)
return response.json()['data'][0]['embedding']
defgenerate_embeddings(reviews, filename='embeddings.json'):
embeddings = []
for i, review inenumerate(reviews):
print(f"Generating embedding for review {i+1}/{len(reviews)}")
emb = get_embedding(review)
embeddings.append(emb)
withopen(filename, 'w') as f:
json.dump({'reviews': reviews, 'embeddings': embeddings}, f)
print(f"Embeddings saved to {filename}")
# ========== 4. 載入向量 ==========
defload_embeddings(filename='embeddings.json'):
withopen(filename, 'r') as f:
data = json.load(f)
return data['reviews'], np.array(data['embeddings'])
# ========== 5. 查詢最相似的評論 ==========
deffind_similar_reviews(query, reviews_list, embeddings_matrix, top_k=3):
query_emb = np.array(get_embedding(query)).reshape(1, -1) # 修改了這行
similarities = cosine_similarity(query_emb, embeddings_matrix)[0]
indices = np.argsort(similarities)[::-1][:top_k]
results = [(reviews_list[i], similarities[i]) for i in indices]
return results
# ========== 6. 主程式入口 ==========
if __name__ == '__main__':
# 第一次執行時取消註釋,生成並儲存向量,搜尋時關閉
generate_embeddings(reviews)
# 載入歷史評論和對應的向量
reviews_list, embeddings_matrix = load_embeddings()
# 輸入你要查詢的新評論
user_query = input("請輸入你想查詢相似評論的句子:")
# 查詢最相似的評論
similar_reviews = find_similar_reviews(user_query, reviews_list, embeddings_matrix)
print("\n 最相似的評論如下:")
for i, (review, score) inenumerate(similar_reviews):
print(f"{i+1}. [相似度: {score:.4f}] {review}")

6.注意事項
a.模型推理時,需要您自己在 URL 後新增 "v1/embeddings" 才可以請求透過,否則會報錯 Body: {"detail":"Not Found"'};
b.在部署微調後的模型時,原服務配置的 path 欄位仍可能指向原始模型路徑,需要將其修改為微調後模型所在的 checkpoint 目錄地址。
三、Qwen3-Embedding on 百鍊
在百鍊中所有的向量模型暫未開通體驗功能,所以使用 API 的形式進行呼叫。
1.通用文字向量輸入字串呼叫。
dashscope呼叫
curl --location 'https://dashscope.aliyuncs.com...修改為您自己的服務地址.../text-embedding' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "text-embedding-v4",
"input": {
"texts": [
"買的東西質量真的好不枉我等了這麼久啊,喜歡,以後還來這裡買"
]
},
"parameters": {
"dimension": 1024 # 指定向量維度(僅 text-embedding-v3及 text-embedding-v4支援該引數)
}
}'
openai相容呼叫
curl --location 'https://dashscope.aliyuncs.com/...修改為您自己的服務地址...embeddings' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "text-embedding-v4",
"input": "買的東西質量真的好不枉我等了這麼久啊,喜歡,以後還來這裡買",
"dimension": "1024", # 指定向量維度(僅 text-embedding-v3及 text-embedding-v4支援該引數)
"encoding_format": "float"
}'
2.應用場景:精準推薦
a.核心思路:
i.向量相似度計算:透過向量相似度(如餘弦相似度)篩選出最相關的商品或內容。
ii.Qwen 生成推薦理由:將篩選後的商品描述輸入 Qwen,生成自然語言的推薦理由或個性化描述。
iii.最終輸出:結合向量匹配和 Qwen 的語義理解能力,提供精準且生動的推薦。
精準推薦程式碼示例
import dashscope
from http import HTTPStatus
import numpy as np
# 計算餘弦相似度(Cosine Similarity)的函式,主要用於衡量兩個向量之間的相似性
from sklearn.metrics.pairwise import cosine_similarity
# 配置 DashScope API
dashscope.api_key = "sk-xxxx"
# 商品描述列表,可以替換成自己的資料
product_descriptions = [
"棉質寬鬆襯衫,適合春季通勤,透氣舒適,簡約百搭",
"高腰牛仔褲,修身剪裁,適合日常穿搭,耐磨耐髒",
"輕薄羽絨服,適合冬季戶外活動,保暖性強且便攜",
"絲綢長裙,V領設計,適合宴會和正式場合,優雅大方",
"運動速幹T恤,吸汗透氣,適合健身房和跑步使用",
"羊毛大衣,經典雙排扣設計,適合秋冬商務場合,保暖顯氣質",
"連帽衛衣,連帽帶抽繩,適合休閒居家,柔軟舒適",
"防水衝鋒衣,適合戶外徒步,防風防雨,輕便耐用",
"短款馬甲,適合疊穿搭配,提升層次感,適合春秋季節",
"高彈力瑜伽褲,適合健身和運動,貼合身體且透氣性好"
]
# 使用者查詢
user_query = "設計簡約的通勤服裝,透氣舒適"
inputs = product_descriptions + [user_query]
# 分批生成嵌入向量
DASHSCOPE_MAX_BATCH_SIZE = 10
embeddings = []
for i inrange(0, len(inputs), DASHSCOPE_MAX_BATCH_SIZE):
batch = inputs[i:i + DASHSCOPE_MAX_BATCH_SIZE]
resp = dashscope.TextEmbedding.call(
model="text-embedding-v4",
input=batch,
dimension=1024
)
if resp.status_code == HTTPStatus.OK:
for emb in resp.output["embeddings"]:
embeddings.append(emb["embedding"])
else:
print(f"Error: {resp.status_code}, {resp.message}")
# 如果 API 呼叫失敗,提前終止程式
exit(1)
ifnot embeddings:
print("Error: No embeddings generated. Aborting.")
exit(1)
# 儲存向量和文字到檔案
withopen("embeddings_output.txt", "w", encoding="utf-8") as f:
f.write(f"# 向量維度: 1024\n")
f.write(f"# 文字數量: {len(inputs)}\n")
f.write("# 格式: <text_index> | <text> | <vector>\n\n")
for idx, (text, vector) inenumerate(zip(inputs, embeddings)):
vector_str = ",".join(map(str, vector))
f.write(f"{idx} | {text} | {vector_str}\n")
# 提取使用者查詢向量
query_vector = np.array([embeddings[-1]])
product_vectors = np.array(embeddings[:-1])
# 計算相似度
similarities = cosine_similarity(query_vector, product_vectors).flatten()
# 儲存相似度結果到檔案
withopen("similarity_results.txt", "w", encoding="utf-8") as f:
f.write(f"# 使用者查詢: {user_query}\n")
f.write(f"# 相似度計算結果:\n")
for idx, (desc, score) inenumerate(zip(product_descriptions, similarities)):
f.write(f"{idx} | {desc} | {score:.6f}\n")
product_ranking = list(zip(product_descriptions, similarities))
product_ranking.sort(key=lambda x: x[1], reverse=True)
print("=== 推薦結果 ===")
for desc, score in product_ranking:
print(f"商品描述: {desc} | 相似度: {score:.4f}")


從相似度結果可看,商品 1 是最符合查詢條件的。可以搭配 Qwen 模型為每個商品生成推薦理由。
生成推薦理由
system_prompt = "你是一位專業的商品推薦專家,擅長結合使用者需求和商品描述生成精準的推薦理由。請為每個匹配的文字生成一段推薦理由,要求:\n1. 簡潔生動,突出商品核心優勢(如設計、功能、適用場景)。\n2. 語言自然流暢,符合使用者需求場景(如通勤、健身等)。\n3. 每段推薦理由控制在20字以內。"
user_prompt = f"""
使用者查詢:{user_query}
匹配商品描述:
1. {matched_products[0]}
2. {matched_products[1]}
3. {matched_products[2]}
請為每個商品生成推薦理由。
"""
response = dashscope.Generation.call(
model="qwen-plus",
prompt=f"{system_prompt}\n\n{user_prompt}",
# max_tokens=500
)

四、LLM vs 輕量 Embedding 對比實驗
1.宣告:本文演示的方法論及測試結果僅作為類似場景的測試參考,由於實際場景各有不同,需結合實際場景鏈路具體測試。
2.實驗場景:電影評論搜尋。
3.測試環境:
a.完整 LLM:Qwen3-32B(生成Embedding),硬體配置是 H20 96G * 1。
b.輕量 Embedding:Qwen3-Embedding-4B,硬體配置是 A10 24G * 1。
c.ECS(可選):便於模型推理測試,若使用 VPC,需和部署模型相同地域、相同 VPC。
4.模型部署
a.參照本文第二章第 1 小節的方法在 PAI 上部署 Qwen3-32B。

5.對比實驗
a.實驗方案
i.基礎效能測試對比:使用 20 條真實電影評論樣本,對 Qwen3-Embedding-4B 模型以及 Qwen3-32B 模型進行測試,並對測試資料進行對比分析。
ii.成本估算對比:若在阿里雲百鍊平臺上使用,需結合阿里雲百鍊官網顯示的模型單價資料進行成本計算與對比,若在 PAI 上面使用,可以結合使用到的卡資源進行成本估算對比。
b.測試維度:
i.平均響應時間(相同任務下不同模型)。
ii.批處理耗時(3 條)。
iii.併發測試平均延遲。
iv.長文字響應時間(約 1000 字)。
v.並 發請求延遲(5個)。
vi.Token 平均消耗。
vii.語義搜尋測試。
viii.日均呼叫成本(1萬次)。
c.樣本及單價資料查詢
i.樣本準備:20 條真實電影評論樣本。
ii.阿里雲百鍊平臺單價:Qwen3-Embedding 0.0005元/千 Tokens,Qwen-32B 輸入成本 0.002 元/千 Tokens,非思考模式下輸出成本 0.008元/Tokens,思考模式下輸出成本 0.02元/千 Tokens。
d.實驗指令碼
LLM vs Embedding 對比實驗
import requests
import time
import numpy as np
from concurrent.futures import ThreadPoolExecutor, as_completed
from sklearn.metrics.pairwise import cosine_similarity
import re
# ================== 模型服務配置 ==================
LLM_CONFIG = {
"url": "請輸入您自己服務的 URL",
"token": "請輸入您自己服務的 Token",
"model_name": "Qwen3-32B"
}
EMBEDDING_CONFIG = {
"url": "請輸入您自己服務的 URL",
"token": "請輸入您自己服務的 Token",
"model_name": "Qwen3-Embedding-4B"
}
# ================== 測試資料 ==================
LONG_TEXT = "這部電影太棒了,演員表現非常出色,劇情緊湊,特效震撼," * 40# 重複40次模擬長文字
print("列印 LONG_TEXT ===================")
print(LONG_TEXT)
# 20 條真實電影評論樣本
MOVIE_REVIEWS = [
"這是一部令人難忘的電影,情感真摯動人。",
"劇本構思巧妙,角色塑造飽滿,導演功力深厚。",
"視覺效果驚豔,但劇情略顯拖沓。",
"配樂和攝影都很棒,整體節奏把握得當。",
"演員演技線上,劇情有深度,值得回味。",
"故事主線清晰,但結尾有些倉促。",
"這部影片讓我笑中帶淚,情感共鳴強烈。",
"特效場面宏大,但人物發展不夠深入。",
"節奏緊湊,情節引人入勝,推薦一看。",
"劇情平淡無奇,缺乏新意。",
"這是我看過最無聊的電影之一。",
"毫無懸念的情節,看得我昏昏欲睡。",
"雖然小眾,但極具藝術價值。",
"幽默感十足,非常適合輕鬆觀看。",
"劇情反轉出乎意料,令人驚喜。",
"剪輯混亂,影響觀影體驗。",
"情感細膩,適合喜歡文藝片的觀眾。",
"動作設計精彩,打鬥場面酣暢淋漓。",
"這部電影讓我重新認識了人性的複雜。",
"節奏偏慢,但內涵豐富,值得深思。"
]
# 保留原始分類測試用例(用於其他測試)
TEST_QUERIES = {
"短文字": "劇情緊湊,演員演技線上",
"中等文字": "這部電影的視覺效果震撼,但故事線混亂,角色發展不足",
"長文字": LONG_TEXT
}
# ================== 核心測試函式 ==================
defcall_llm(text):
"""呼叫LLM生成響應(模擬語義理解)"""
headers = {
"Authorization": LLM_CONFIG["token"],
"Content-Type": "application/json"
}
payload = {
"model": LLM_CONFIG["model_name"],
"messages": [{"role": "user", "content": text}],
"max_tokens": 50
}
start_time = time.time()
response = requests.post(LLM_CONFIG["url"], headers=headers, json=payload)
latency = time.time() - start_time
try:
tokens = len(response.json()["choices"][0]["message"]["content"].split())
except:
tokens = 0
return {
"latency": latency,
"tokens": tokens,
"vector": np.random.rand(2560)
}
defcall_embedding(text):
"""呼叫Embedding模型生成向量"""
headers = {
"Authorization": EMBEDDING_CONFIG["token"],
"Content-Type": "application/json"
}
payload = {
"input": [text],
"model": EMBEDDING_CONFIG["model_name"]
}
start_time = time.time()
response = requests.post(EMBEDDING_CONFIG["url"], headers=headers, json=payload)
latency = time.time() - start_time
data = response.json()
vector = data.get("data", [{}])[0].get("embedding", [])
tokens = data.get("usage", {}).get("total_tokens", 0)
return {
"latency": latency,
"tokens": tokens,
"vector": vector
}
# ================== 基礎對比測試 ==================
defrun_comparison():
print("開始效能對比測試(20條電影評論,取平均值)")
llm_latencies = []
llm_tokens = []
emb_latencies = []
emb_tokens = []
for i, review inenumerate(MOVIE_REVIEWS):
print(f"\n 第 {i+1} 條影評測試:")
# LLM 測試
llm_res = call_llm(review)
print(f"LLM 響應時間: {llm_res['latency']:.2f}s | Tokens: {llm_res['tokens']}")
llm_latencies.append(llm_res["latency"])
llm_tokens.append(llm_res["tokens"])
# Embedding 測試
emb_res = call_embedding(review)
print(f"Embedding 響應時間: {emb_res['latency']:.2f}s | Tokens: {emb_res['tokens']}")
emb_latencies.append(emb_res["latency"])
emb_tokens.append(emb_res["tokens"])
# 輸出平均值
print("\n 測試一:20條影評平均效能對比")
print(f"LLM 平均響應時間: {np.mean(llm_latencies):.2f}s | 平均 Token 數: {np.mean(llm_tokens):.1f}")
print(f"Embedding 平均響應時間: {np.mean(emb_latencies):.2f}s | 平均 Token 數: {np.mean(emb_tokens):.1f}")
# ================== 新增測試邏輯 ==================
defbatch_test():
"""批次處理效率對比"""
print("\n 測試二:批次處理測試(同時處理3條文字)")
texts = list(TEST_QUERIES.values())
# LLM 批次測試
start = time.time()
with ThreadPoolExecutor() as executor:
llm_results = list(executor.map(call_llm, texts))
llm_batch_latency = time.time() - start
# Embedding 批次測試
start = time.time()
with ThreadPoolExecutor() as executor:
emb_results = list(executor.map(call_embedding, texts))
emb_batch_latency = time.time() - start
print(f"LLM 批次耗時: {llm_batch_latency:.2f}s | 單條平均: {llm_batch_latency/3:.2f}s")
print(f"Embedding 批次耗時: {emb_batch_latency:.2f}s | 單條平均: {emb_batch_latency/3:.2f}s")
deflong_text_test():
"""長文字效能衰減測試"""
print("\n 測試三:長文字效能測試(輸入長度: ~1000字元)")
llm_res = call_llm(LONG_TEXT)
emb_res = call_embedding(LONG_TEXT)
print(f"LLM 響應時間: {llm_res['latency']:.2f}s | Tokens: {llm_res['tokens']}")
print(f"Embedding 響應時間: {emb_res['latency']:.2f}s | Tokens: {emb_res['tokens']}")
defconcurrent_test(max_workers=5):
"""併發壓力測試"""
print(f"\n 測試四:併發測試({max_workers}個併發請求)")
texts = [TEST_QUERIES["中等文字"]] * max_workers
# LLM 併發測試
start = time.time()
with ThreadPoolExecutor() as executor:
futures = [executor.submit(call_llm, text) for text in texts]
llm_latencies = [future.result()["latency"] forfuture in futures]
llm_concurrent = time.time() - start
# Embedding 併發測試
start = time.time()
with ThreadPoolExecutor() as executor:
futures = [executor.submit(call_embedding, text) for text in texts]
emb_latencies = [future.result()["latency"] forfuture in futures]
emb_concurrent = time.time() - start
print(f"LLM 總耗時: {llm_concurrent:.2f}s | 平均延遲: {np.mean(llm_latencies):.2f}s")
print(f"Embedding 總耗時: {emb_concurrent:.2f}s | 平均延遲: {np.mean(emb_latencies):.2f}s")
defcost_analysis():
"""成本估算功能(使用最新單價)"""
DAILY_CALLS = 10000# 日均呼叫量
LLM_PRICE_INPUT = 0.002# LLM 輸入價格(千 token)
LLM_PRICE_OUTPUT_THINKING = 0.02# LLM 輸出價格(思考模式)
LLM_PRICE_OUTPUT_NORMAL = 0.008# LLM 輸出價格(非思考模式)
EMB_PRICE = 0.0005# Embedding 單價:¥0.0005 / 千 token
# 使用中等文字的平均token消耗
avg_emb_tokens = call_embedding(TEST_QUERIES["中等文字"])["tokens"]
# LLM 預設使用思考模式
avg_llm_input_tokens = len(TEST_QUERIES["中等文字"].split())
avg_llm_output_tokens = call_llm(TEST_QUERIES["中等文字"])["tokens"]
# 成本計算
thinking_cost = (avg_llm_input_tokens * LLM_PRICE_INPUT + avg_llm_output_tokens * LLM_PRICE_OUTPUT_THINKING) * DAILY_CALLS
normal_cost = (avg_llm_input_tokens * LLM_PRICE_INPUT + avg_llm_output_tokens * LLM_PRICE_OUTPUT_NORMAL) * DAILY_CALLS
emb_cost = (avg_emb_tokens * EMB_PRICE) * DAILY_CALLS
print("\n 測試六:LLM 思考模式 vs 非思考模式 成本估算")
print(f"思考模式日成本: ¥{thinking_cost:.2f} | 單次成本: ¥{(thinking_cost/DAILY_CALLS):.5f}")
print(f"非思考模式日成本: ¥{normal_cost:.2f} | 單次成本: ¥{(normal_cost/DAILY_CALLS):.5f}")
print(f"Embedding 日成本: ¥{emb_cost:.2f} | 單次成本: ¥{(emb_cost/DAILY_CALLS):.5f}")
print(f"思考模式成本是 Embedding 的 {(thinking_cost / emb_cost):.1f} 倍")
print(f"非思考模式成本是 Embedding 的 {(normal_cost / emb_cost):.1f} 倍")
# ================== 語義匹配測試 ==================
deftest_semantic_search():
"""語義搜尋測試"""
query = "這部電影劇情緊湊,演員演技線上"
results = []
print("\n 測試五:語義搜尋測試")
emb_query = call_embedding(query)["vector"]
for i, review inenumerate(MOVIE_REVIEWS):
emb_review = call_embedding(review)["vector"]
ifnot emb_query ornot emb_review:
continue
sim_score = cosine_similarity([emb_query], [emb_review])[0][0]
results.append((i+1, sim_score, review[:30] + "..."))
results.sort(key=lambda x: x[1], reverse=True)
print("Top-5 相似影評(基於 Embedding 向量):")
for idx, score, text in results[:5]:
print(f"第 {idx} 條影評(相似度: {score:.3f}): {text}")
# ================== 主程式入口 ==================
if __name__ == "__main__":
# 基礎測試
run_comparison()
# 新增測試
batch_test()
long_text_test()
concurrent_test(max_workers=5)
# 語義能力測試
test_semantic_search()
# 成本分析
cost_analysis()
e.結果日誌

6.實驗結果分析
a.基礎效能對比

b.從呼叫百鍊 API 角度來看成本估算(Tokens 維度)

c.從 PAI 平臺使用卡資源部署的角度來看成本估算(卡資源維度)

d.語義理解能力:Embedding 模型能夠輸出向量可直接用於相似度計算,並正確識別出高相關性影評,穩定可靠。
7.實驗總結:Qwen3-Embedding 系列模型具有低延遲(平均 < 0.1 秒)、成本低(成本僅為 LLM 的 1/5 – 1/4)的特點,常見的搜尋鏈路(如電商搜尋),如下:如果對重排要求不高,可以跳過 LLM,直接返回初篩結果,整體延遲可壓縮至 < 0.1s、成本降低 70%(實際場景中還需結合 Embedding 環節、LLM 環節等的請求量、使用的卡資源、鏈路中其他環節等來做更加精細化的成本估算)。

8.一些常見的工程鏈路最佳化技巧
a.快取高頻 Embedding:對於查詢詞、固定模板、高頻使用者輸入等場景,可以透過 Redis 快取高頻 Embedding,並定期(如每日)更新快取,減少即時計算開銷、提高響應速度;
b.自動降級:對於服務超載、請求排隊積壓、LLM 響應超時等場景,可以透過自動降級 Embedding + 分類器的方案,返回一些避免服務不可用,同時控制成本波動風險。
五、總結
Qwen3-Embedding 是一款強大且靈活的文字嵌入模型,具備出色的語義理解能力和廣泛的適用場景。無論您是從事電商推薦、內容理解、還是企業級語義搜尋,都可以藉助 Qwen3-Embedding 快速構建高效的 AI 應用。透過阿里雲 PAI 平臺的一鍵部署、微調與推理能力,亦或是透過阿里雲百鍊平臺 API 呼叫,開發者都可以輕鬆地將Qwen3-Embedding 整合進現有系統,顯著提升產品智慧化水平。未來,隨著更多模型迭代與功能拓展,Qwen3-Embedding 將成為語義理解領域的核心基礎設施之一。
參考資料:
-
Modelscope:https://modelscope.cn/models/Qwen/Qwen3-Embedding-4B
-
阿里雲百鍊:https://bailian.console.aliyun.com
-
阿里雲百鍊模型價格:https://help.aliyun.com/zh/model-studio/models
-
MTEB 線上排行榜:https://huggingface.co/spaces/mteb/leaderboard
-
PAI 控制檯:https://pai.console.aliyun.com/?regionId=cn-shanghai&spm=5176.12818093.overview_recent.1.3c102cc9PN4l5V&workspaceId=802337#/quick-start/models
-
模型線上服務(EAS):https://pai.console.aliyun.com/?regionId=cn-shanghai&spm=5176.12818093.overview_recent.1.3c102cc9PN4l5V&workspaceId=802337#/eas
通義千問3 來了,0元即刻上手
通義千問3 (Qwen3)是 Qwen 系列大型語言模型的最新成員,效能比肩頂級模型。在阿里雲,您可以快速使用 Qwen3,最快 10 分鐘,最低 0 元。
點選閱讀原文檢視詳情。