【腾讯拥抱开源】Youtu-Embedding:基于CoDiEmb的一个协作而独特的框架,用于信息检索与语义文本相似性中的统一表征学习

作者:吴脑的键客日期:2025/10/10

🎯 简介

Youtu-Embedding 是由腾讯优图实验室开发的尖端通用文本嵌入模型。该模型在信息检索(IR)、语义文本相似度(STS)、聚类、重排序和分类等各类自然语言处理任务中均展现出卓越性能。

  • 顶尖性能表现:截至2025年9月,在权威的CMTEB(中文大规模文本嵌入基准)评测中以77.46分位列榜首,彰显其强大稳健的文本表征能力。
  • 创新训练框架:采用协同判别式微调框架,通过统一数据格式、任务差异化损失函数及动态单任务采样机制,有效解决多任务学习中的"负迁移"问题。

:您可基于自有数据轻松适配微调模型以适应领域任务,具体实现请参考训练代码。

🤗 模型下载

模型名称参数量维度序列长度下载
Youtu-Embedding2B20488KModel

🚀 使用说明

1. 使用 transformers

📦 安装

1pip install transformers==4.51.3 liger_kernel==0.5.4
2

⚙️ 用法

1import torch
2import numpy as np
3from transformers import AutoModel, AutoModelForCausalLM, AutoTokenizer
4
5
6class LLMEmbeddingModel():
7
8    def __init__(self, 
9                model_name_or_path, 
10                batch_size=128, 
11                max_length=1024, 
12                gpu_id=0):
13        self.model = AutoModel.from_pretrained(model_name_or_path, trust_remote_code=True)
14        self.tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, padding_side="right")
15
16        self.device = torch.device(f"cuda:{gpu_id}")
17        self.model.to(self.device).eval()
18
19        self.max_length = max_length
20        self.batch_size = batch_size
21
22        query_instruction = "Given a search query, retrieve passages that answer the question"
23        if query_instruction:
24            self.query_instruction = f"Instruction: {query_instruction} \nQuery:"
25        else:
26            self.query_instruction = "Query:"
27
28        self.doc_instruction = ""
29        print(f"query instruction: {[self.query_instruction]}\ndoc instruction: {[self.doc_instruction]}")
30
31    def mean_pooling(self, hidden_state, attention_mask):
32        s = torch.sum(hidden_state * attention_mask.unsqueeze(-1).float(), dim=1)
33        d = attention_mask.sum(dim=1, keepdim=True).float()
34        embedding = s / d
35        return embedding
36    
37    @torch.no_grad()
38    def encode(self, sentences_batch, instruction):
39        inputs = self.tokenizer(
40            sentences_batch,
41            padding=True,
42            truncation=True,
43            return_tensors="pt",
44            max_length=self.max_length,
45            add_special_tokens=True,
46        ).to(self.device)
47
48        with torch.no_grad():
49            outputs = self.model(**inputs)
50            last_hidden_state = outputs[0]
51
52            instruction_tokens = self.tokenizer(
53                instruction,
54                padding=False,
55                truncation=True,
56                max_length=self.max_length,
57                add_special_tokens=True,
58            )["input_ids"]
59            if len(np.shape(np.array(instruction_tokens))) == 1:
60                inputs["attention_mask"][:, :len(instruction_tokens)] = 0
61            else:
62                instruction_length = [len(item) for item in instruction_tokens]
63                assert len(instruction) == len(sentences_batch)
64                for idx in range(len(instruction_length)):
65                    inputs["attention_mask"][idx, :instruction_length[idx]] = 0
66
67            embeddings = self.mean_pooling(last_hidden_state, inputs["attention_mask"])
68            embeddings = torch.nn.functional.normalize(embeddings, dim=-1)
69        return embeddings
70
71    def encode_queries(self, queries):
72        queries = queries if isinstance(queries, list) else [queries]
73        queries = [f"{self.query_instruction}{query}" for query in queries]
74        return self.encode(queries, self.query_instruction)
75
76    def encode_passages(self, passages):
77        passages = passages if isinstance(passages, list) else [passages]
78        passages = [f"{self.doc_instruction}{passage}" for passage in passages]
79        return self.encode(passages, self.doc_instruction)
80
81    def compute_similarity_for_vectors(self, q_reps, p_reps):
82        if len(p_reps.size()) == 2:
83            return torch.matmul(q_reps, p_reps.transpose(0, 1))
84        return torch.matmul(q_reps, p_reps.transpose(-2, -1))
85
86    def compute_similarity(self, queries, passages):
87        q_reps = self.encode_queries(queries)
88        p_reps = self.encode_passages(passages)
89        scores = self.compute_similarity_for_vectors(q_reps, p_reps)
90        scores = scores.detach().cpu().tolist()
91        return scores
92
93
94queries = ["What's the weather like?"]
95passages = [
96    'The weather is lovely today.',
97    "It's so sunny outside!",
98    'He drove to the stadium.'
99]
100
101model_name_or_path = "tencent/Youtu-Embedding"
102model = LLMEmbeddingModel(model_name_or_path)
103scores = model.compute_similarity(queries, passages)
104print(f"scores: {scores}")
105
2. 使用 sentence-transformers

📦 安装

1pip install sentence-transformers==5.1.0
2

⚙️ 使用

1from sentence_transformers import SentenceTransformer
2
3model = SentenceTransformer("tencent/Youtu-Embedding", trust_remote_code=True)
4queries = ["What's the weather like?"]
5passages = [
6    'The weather is lovely today.',
7    "It's so sunny outside!",
8    'He drove to the stadium.'
9]
10queries_embeddings = model.encode_query(queries)
11passages_embeddings = model.encode_document(passages)
12
13similarities = model.similarity(queries_embeddings, passages_embeddings)
14print(similarities)
15
3. 使用 LangChain 🦜

轻松将模型集成到你的 LangChain 应用中,例如 RAG 管道。

📦 安装

1pip install langchain==0.3.27 langchain-community==0.3.29 langchain-huggingface==0.3.1 sentence-transformers==5.1.0 faiss-cpu==1.11.0
2

⚙️ 用法

1import torch
2from langchain.docstore.document import Document
3from langchain_community.vectorstores import FAISS
4from langchain_huggingface.embeddings import HuggingFaceEmbeddings
5
6model_name_or_path = "tencent/Youtu-Embedding"
7device = "cuda" if torch.cuda.is_available() else "cpu"
8
9model_kwargs = {
10    'trust_remote_code': True,
11    'device': device
12}
13
14embedder = HuggingFaceEmbeddings(
15    model_name=model_name_or_path,
16    model_kwargs=model_kwargs,
17)
18
19query_instruction = "Instruction: Given a search query, retrieve passages that answer the question \nQuery:"
20doc_instruction = ""
21
22data = [
23    "Venus is often called Earth's twin because of its similar size and proximity.",
24    "Mars, known for its reddish appearance, is often referred to as the Red Planet.",
25    "Jupiter, the largest planet in our solar system, has a prominent red spot.",
26    "Saturn, famous for its rings, is sometimes mistaken for the Red Planet."
27]
28
29documents = [Document(page_content=text, metadata={"id": i}) for i, text in enumerate(data)]
30vector_store = FAISS.from_documents(documents, embedder, distance_strategy="MAX_INNER_PRODUCT")
31
32query = "Which planet is known as the Red Planet?"
33instructed_query = query_instruction + query
34results = vector_store.similarity_search_with_score(instructed_query, k=3)
35
36print(f"Original Query: {query}\n")
37print("Results:")
38for doc, score in results:
39    print(f"- Text: {doc.page_content} (Score: {score:.4f})")
40
41
4. 使用 LlamaIndex 🦙

这非常适合将模型集成到您的 LlamaIndex 搜索和检索系统中。

📦 安装

1pip install llama-index==0.14.2 llama-index-embeddings-huggingface==0.6.1 sentence-transformers==5.1.0 llama-index-vector-stores-faiss==0.5.1
2

⚙️ 使用说明

1import faiss
2import torch
3from llama_index.core.schema import TextNode
4from llama_index.core.vector_stores import VectorStoreQuery
5from llama_index.vector_stores.faiss import FaissVectorStore
6from llama_index.embeddings.huggingface import HuggingFaceEmbedding
7
8model_name_or_path = "tencent/Youtu-Embedding"
9device = "cuda" if torch.cuda.is_available() else "cpu"
10
11embeddings = HuggingFaceEmbedding(
12    model_name=model_name_or_path,
13    trust_remote_code=True,
14    device=device,
15    query_instruction="Instruction: Given a search query, retrieve passages that answer the question \nQuery:",  
16    text_instruction=""
17)
18
19data = [
20    "Venus is often called Earth's twin because of its similar size and proximity.",
21    "Mars, known for its reddish appearance, is often referred to as the Red Planet.",
22    "Jupiter, the largest planet in our solar system, has a prominent red spot.",
23    "Saturn, famous for its rings, is sometimes mistaken for the Red Planet."
24]
25
26nodes = [TextNode(id_=str(i), text=text) for i, text in enumerate(data)]
27
28for node in nodes:
29    node.embedding = embeddings.get_text_embedding(node.get_content())
30
31embed_dim = len(nodes[0].embedding)
32store = FaissVectorStore(faiss_index=faiss.IndexFlatIP(embed_dim))
33store.add(nodes)
34
35query = "Which planet is known as the Red Planet?"
36query_embedding = embeddings.get_query_embedding(query)
37
38results = store.query(
39    VectorStoreQuery(query_embedding=query_embedding, similarity_top_k=3)
40)
41
42print(f"Query: {query}\n")
43print("Results:")
44for idx, score in zip(results.ids, results.similarities):
45    print(f"- Text: {data[int(idx)]} (Score: {score:.4f})")
46
47

📊 CMTEB

模型参数量平均(任务)平均(类型)分类聚类配对分类重排序检索语义相似度
bge-multilingual-gemma29B67.6468.5275.3159.3079.3068.2873.7355.19
ritrieve_zh_v1326M72.7173.8576.8866.5085.9872.8676.9763.92
Qwen3-Embedding-4B4B72.2773.5175.4677.8983.3466.0577.0361.26
Qwen3-Embedding-8B8B73.8475.0076.9780.0884.2366.9978.2163.53
Conan-embedding-v21.4B74.2475.9976.4768.8492.4474.4178.3165.48
Seed1.6-embedding-75.6376.6877.9873.1188.7171.6579.6968.94
QZhou-Embedding7B76.9978.5879.9970.9195.0774.8578.8071.89
Youtu-Embedding2B77.5878.8678.6584.2786.1275.1080.2168.82

注意:对比分数来自MTEB排行榜,记录日期为2025年9月28日。

🎉 Citation

1@misc{zhang2025codiemb,
2  title={CoDiEmb: A Collaborative yet Distinct Framework for Unified Representation Learning in Information Retrieval and Semantic Textual Similarity},
3  author={Zhang, Bowen and Song, Zixin and Chen, Chunquan and Zhang, Qian-Wen and Yin, Di and Sun, Xing},
4  year={2025},
5  eprint={2508.11442},
6  archivePrefix={arXiv},
7  url={https://arxiv.org/abs/2508.11442},
8}
9

【腾讯拥抱开源】Youtu-Embedding:基于CoDiEmb的一个协作而独特的框架,用于信息检索与语义文本相似性中的统一表征学习》 是转载文章,点击查看原文


相关推荐


sensitive-word:一个简单易用的敏感词过滤框架
勇哥Java实战2025/10/9

这篇文章,分享一个开源项目:sensitive-word 。 Github 地址:github.com/houbb/sensi… sensitive-word 是一个功能强大的 Java 敏感词过滤框架,它不仅提供了基础的敏感词检测功能,还支持单词标签分类分级、繁简体互换、全角半角互换、汉字转拼音、模糊搜索等高级特性。 它的核心特性如下: 🚀 高性能: 基于 DFA 算法,匹配效率极高 🏷️ 标签分类: 支持敏感词分类分级管理 🔄 字符处理: 支持繁简体、全角半角互换 🎯 模糊搜


Less resolver error:‘~antd/es/style/themes/index.less‘ wasn‘t found.
北阳AI知行录2025/10/7

记录一次使用Ant Design Pro框架时出现的bug 这是我最开始的package.json版本,然后执行npm run build(max build) 打包时会报上面的错误 { "name": "ant-design-pro", "version": "6.0.0", "private": true, "description": "An out-of-box UI solution for enterprise applications", "repo


【微服务】SpringBoot + Docker 实现微服务容器多节点负载均衡详解
小码农叔叔2025/10/6

目录 一、前言 二、前置准备 2.1 基本环境 2.2 准备一个springboot工程 2.2.1 准备几个测试接口 2.3 准备Dockerfile文件 2.4 打包上传到服务器 三、制作微服务镜像与运行服务镜像 3.1 拷贝Dockerfile文件到服务器 3.2 制作服务镜像 3.3 启动镜像服务 3.4 访问一下服务接口 四、配置负载均衡 4.1 源码包方式安装nginx 4.1.1 下载nginx安装包 4.1.2 解压安装包 4.1.3 进入解


为什么 Vue 组件中的 data 必须是一个函数?(含 Vue2/3 对比)
excel2025/10/5

在 Vue 面试或日常开发中,经常会被问到这样一个问题:为什么组件中的 data 必须是一个函数,而根实例的 data 可以是对象或函数? 本文将从 实例与组件的区别、数据污染问题、源码实现原理,以及 Vue2/3 的差异 四个角度进行深入分析。 一、实例与组件定义 data 的区别 在 Vue 根实例 中,data 属性既可以是对象,也可以是函数: // 对象格式 const app = new Vue({ el: "#app", data: { foo: "foo" }


VUE3+element plus 实现表格行合并
rggrgerj2025/10/3

基础实现方法 通过给el-table传入span-method方法可以实现合并行或列,该方法的参数包含当前行row、当前列column、当前行号rowIndex和当前列号columnIndex四个属性15。该方法可以返回包含rowspan和colspan的数组或对象,例如: javascriptCopy Code const spanMethod = ({ row, column, rowIndex, columnIndex }) => { if (columnIndex === 0


数模之路获奖总结——数据分析交流(R语言)
统计学小王子2025/10/2

目录 0、引言1、主要参赛类型2、涉及领域汇总2.1、 数据科学与人工智能前沿应用2.2、 社会经济与公共政策研究2.3、 医疗卫生与生物制药2.4、 能源环境与可持续发展2.5、工程技术与运筹优化2.6、 计算与通信基础设施2.7、 其他特色领域2.8、总结 3、主要比赛获奖总结4、写在最后的话 0、引言 自2018年1月起,开始跟着学校由徐老师负责的培训老师团队了解、入门和学习数学建模并通过选拔拿到第一张国赛入场券。时至今日(2025年9月27),已经关注和参加了大大小小的建模


阿里开源 Java 诊断神器Arthas
讓丄帝愛伱2025/10/2

支持 JDK6+,零侵入,通过 Attach 机制连接 JVM,无需重启服务即可定位问题。 CLI 支持 Tab 自动补全,并提供 Web Console。 Github | 官网文档 一、核心价值 线上问题快速定位:CPU 飙升、内存泄漏、线程阻塞动态反编译验证代码:jad 命令方法级性能分析:耗时、调用频次、异常统计热更新/日志修改:无需重启即可修改代码或日志格式 优势: 零侵入全功能 CLI多环境支持(Linux/Mac/Windows + JDK6+) 二、安装与


快学快用系列:一文学会java后端WebApi开发
百锦再@新空间10/2/2025

Web API开发基础与实践摘要 Web API是基于HTTP协议的应用接口,采用RESTful架构风格,具有无状态、可缓存等特点。本文介绍了Spring Boot开发Web API的全流程: 环境搭建:使用JDK 11+、Spring Initializr创建项目,配置MySQL数据库和 status 状态字段 架构设计:采用分层架构(Controller-Service-Repository-Model),包含DTO模块化包结构 数据模型:详细设计实体类(如User)和数据传输对象DTO(UserDTO


基于PyTorch深度学习遥感影像地物分类与目标检测、分割及遥感影像问题深度学习优化实践技术应用
AAIshangyanxiu10/1/2025

我国高分辨率对地观测系统重大专项已全面启动,高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB,遥感大数据时代已然来临。随着小卫星星座的普及,对地观测已具备3次以上的全球覆盖能力,


【Vue实现跳转页面】功能 - 总结
这是个栗子9/30/2025

在 Vue.js 中实现跳转到登录页是常见的需求,通常用于用户未登录或token 失效等场景。

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0