支持私有化部署
AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


Qwen3-Embedding 全揭秘:从技术到服务,打造高效AI产品的关键路径

发布日期:2025-08-05 05:53:16 浏览次数: 1518
作者:阿里云开发者

微信搜一搜,关注“阿里云开发者”

推荐语

阿里巴巴通义实验室最新推出的Qwen3-Embedding模型,在语义搜索和推荐系统等领域表现卓越,助你快速构建高效AI应用。

核心内容:
1. Qwen3-Embedding的核心原理与双塔训练策略
2. 在阿里云PAI和百炼平台上的快速部署指南
3. 领域数据集微调与工程链路优化实践

杨芳贤
53AI创始人/腾讯云(TVP)最具价值专家


引言:为什么你需要了解 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.pypython3.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 requestsimport numpy as npimport jsonfrom 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 可跳过)==========def get_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']
def generate_embeddings(reviews, filename='embeddings.json'):    embeddings = []    for i, review in enumerate(reviews):        print(f"Generating embedding for review {i+1}/{len(reviews)}")        emb = get_embedding(review)        embeddings.append(emb)
    with open(filename, 'w'as f:        json.dump({'reviews': reviews, 'embeddings': embeddings}, f)    print(f"Embeddings saved to {filename}")
# ========== 4. 加载向量 ==========def load_embeddings(filename='embeddings.json'):    with open(filename, 'r'as f:        data = json.load(f)    return data['reviews'], np.array(data['embeddings'])
# ========== 5. 查询最相似的评论 ==========def find_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) in enumerate(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 dashscopefrom http import HTTPStatusimport numpy as np# 计算余弦相似度(Cosine Similarity)的函数,主要用于衡量两个向量之间的相似性from sklearn.metrics.pairwise import cosine_similarity
# 配置 DashScope APIdashscope.api_key = "sk-xxxx"
# 商品描述列表,可以替换成自己的数据product_descriptions = [    "棉质宽松衬衫,适合春季通勤,透气舒适,简约百搭",    "高腰牛仔裤,修身剪裁,适合日常穿搭,耐磨耐脏",    "轻薄羽绒服,适合冬季户外活动,保暖性强且便携",    "丝绸长裙,V领设计,适合宴会和正式场合,优雅大方",    "运动速干T恤,吸汗透气,适合健身房和跑步使用",    "羊毛大衣,经典双排扣设计,适合秋冬商务场合,保暖显气质",    "连帽卫衣,连帽带抽绳,适合休闲居家,柔软舒适",    "防水冲锋衣,适合户外徒步,防风防雨,轻便耐用",    "短款马甲,适合叠穿搭配,提升层次感,适合春秋季节",    "高弹力瑜伽裤,适合健身和运动,贴合身体且透气性好"]
# 用户查询user_query = "设计简约的通勤服装,透气舒适"
inputs = product_descriptions + [user_query]
# 分批生成嵌入向量DASHSCOPE_MAX_BATCH_SIZE = 10embeddings = []
for i in range(0len(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)
# 保存向量和文本到文件with open("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) in enumerate(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()
# 保存相似度结果到文件with open("similarity_results.txt""w", encoding="utf-8"as f:    f.write(f"# 用户查询: {user_query}\n")    f.write(f"# 相似度计算结果:\n")    for idx, (desc, score) in enumerate(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 requestsimport timeimport numpy as npfrom concurrent.futures import ThreadPoolExecutor, as_completedfrom sklearn.metrics.pairwise import cosine_similarityimport 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}# ================== 核心测试函数 ==================def call_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)    }def call_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    }# ================== 基础对比测试 ==================def run_comparison():    print("开始性能对比测试(20条电影评论,取平均值)")    llm_latencies = []    llm_tokens = []    emb_latencies = []    emb_tokens = []    for i, review in enumerate(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}")# ================== 新增测试逻辑 ==================def batch_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")def long_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']}")def concurrent_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")def cost_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} 倍")# ================== 语义匹配测试 ==================def test_semantic_search():    """语义搜索测试"""    query = "这部电影剧情紧凑,演员演技在线"    results = []    print("\n 测试五:语义搜索测试")    emb_query = call_embedding(query)["vector"]    for i, review in enumerate(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 元。


点击阅读原文查看详情。


53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询