news 2026/4/15 7:37:24

Qwen3-Embedding-4B代码实例:调用Embedding API获取向量并本地计算余弦相似度

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Qwen3-Embedding-4B代码实例:调用Embedding API获取向量并本地计算余弦相似度

Qwen3-Embedding-4B代码实例:调用Embedding API获取向量并本地计算余弦相似度

1. 项目概述

Qwen3-Embedding-4B是阿里通义千问系列中的文本嵌入模型,能够将文本转换为高维向量表示。这些向量捕捉了文本的语义信息,使得我们可以通过计算向量间的相似度来实现语义搜索功能,而不仅仅是传统的关键词匹配。

与普通的关键词搜索不同,基于嵌入向量的语义搜索能够理解文本的深层含义。例如,搜索"我想吃点东西"可能会匹配到"苹果是一种很好吃的水果",尽管这两句话没有任何共同的关键词。

2. 环境准备与安装

2.1 系统要求

  • Python 3.8或更高版本
  • CUDA 11.7或更高版本(推荐使用GPU加速)
  • 至少16GB内存(处理大量文本时建议32GB以上)

2.2 安装依赖包

pip install torch transformers sentence-transformers numpy streamlit

2.3 下载模型

Qwen3-Embedding-4B模型可以通过Hugging Face的transformers库直接加载:

from transformers import AutoModel, AutoTokenizer model_name = "Qwen/Qwen3-Embedding-4B" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModel.from_pretrained(model_name).cuda() # 使用GPU加速

3. 核心功能实现

3.1 文本向量化

文本向量化是将文本转换为固定长度向量的过程。Qwen3-Embedding-4B生成的向量维度为4096。

def get_embedding(text): inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True) inputs = {k: v.cuda() for k, v in inputs.items()} # 将输入数据移动到GPU with torch.no_grad(): outputs = model(**inputs) # 获取最后一层隐藏状态并做平均池化 last_hidden_state = outputs.last_hidden_state attention_mask = inputs["attention_mask"] # 扩展attention_mask的维度以匹配hidden_state expanded_mask = attention_mask.unsqueeze(-1).expand(last_hidden_state.size()).float() # 对隐藏状态进行加权平均 sum_embeddings = torch.sum(last_hidden_state * expanded_mask, 1) sum_mask = torch.clamp(expanded_mask.sum(1), min=1e-9) embedding = sum_embeddings / sum_mask return embedding.cpu().numpy() # 将结果移回CPU并转换为numpy数组

3.2 余弦相似度计算

余弦相似度是衡量两个向量方向相似程度的指标,值域在[-1,1]之间,值越大表示越相似。

import numpy as np def cosine_similarity(vec1, vec2): # 确保向量是二维的 vec1 = np.array(vec1).reshape(1, -1) vec2 = np.array(vec2).reshape(1, -1) # 计算点积 dot_product = np.dot(vec1, vec2.T) # 计算范数 norm_vec1 = np.linalg.norm(vec1, axis=1) norm_vec2 = np.linalg.norm(vec2, axis=1) # 计算余弦相似度 similarity = dot_product / (norm_vec1 * norm_vec2) return similarity[0][0]

4. 完整语义搜索实现

4.1 构建知识库

首先,我们需要准备一个知识库,包含我们想要搜索的文本内容。

knowledge_base = [ "苹果是一种很好吃的水果", "Python是一种流行的编程语言", "深度学习需要大量的计算资源", "北京是中国的首都", "健康的饮食应该包含多种蔬菜", "定期锻炼对身体有益", "机器学习是人工智能的一个分支", "充足的睡眠对健康很重要" ]

4.2 知识库向量化

为了提高搜索效率,我们可以预先计算知识库中所有文本的向量表示。

# 预计算知识库中所有文本的嵌入向量 knowledge_embeddings = [get_embedding(text) for text in knowledge_base]

4.3 语义搜索函数

def semantic_search(query, knowledge_base, knowledge_embeddings, top_k=5): # 获取查询文本的嵌入向量 query_embedding = get_embedding(query) # 计算查询向量与知识库中所有向量的相似度 similarities = [] for emb in knowledge_embeddings: sim = cosine_similarity(query_embedding, emb) similarities.append(sim) # 将结果按相似度排序 results = sorted(zip(knowledge_base, similarities), key=lambda x: x[1], reverse=True) # 返回top_k个最相似的结果 return results[:top_k]

5. 示例应用

5.1 简单查询示例

query = "我想吃点东西" results = semantic_search(query, knowledge_base, knowledge_embeddings) print(f"查询: {query}") print("最相似的结果:") for text, sim in results: print(f"相似度: {sim:.4f} - 文本: {text}")

输出可能类似于:

查询: 我想吃点东西 最相似的结果: 相似度: 0.7523 - 文本: 苹果是一种很好吃的水果 相似度: 0.6124 - 文本: 健康的饮食应该包含多种蔬菜 相似度: 0.4321 - 文本: 充足的睡眠对健康很重要 相似度: 0.3215 - 文本: 定期锻炼对身体有益 相似度: 0.2103 - 文本: 深度学习需要大量的计算资源

5.2 不同领域的查询示例

queries = [ "编程用什么语言好", "怎么保持身体健康", "人工智能的基础是什么" ] for query in queries: print(f"\n查询: {query}") results = semantic_search(query, knowledge_base, knowledge_embeddings, top_k=3) for text, sim in results: print(f"相似度: {sim:.4f} - 文本: {text}")

6. 性能优化建议

6.1 批量处理

当处理大量文本时,可以使用批量处理来提高效率:

def get_embeddings_batch(texts, batch_size=32): all_embeddings = [] for i in range(0, len(texts), batch_size): batch = texts[i:i+batch_size] inputs = tokenizer(batch, return_tensors="pt", padding=True, truncation=True, max_length=512) inputs = {k: v.cuda() for k, v in inputs.items()} with torch.no_grad(): outputs = model(**inputs) last_hidden_state = outputs.last_hidden_state attention_mask = inputs["attention_mask"] expanded_mask = attention_mask.unsqueeze(-1).expand(last_hidden_state.size()).float() sum_embeddings = torch.sum(last_hidden_state * expanded_mask, 1) sum_mask = torch.clamp(expanded_mask.sum(1), min=1e-9) batch_embeddings = (sum_embeddings / sum_mask).cpu().numpy() all_embeddings.extend(batch_embeddings) return all_embeddings

6.2 使用FAISS加速搜索

对于大规模知识库,可以使用Facebook的FAISS库来加速相似度搜索:

import faiss # 构建FAISS索引 dimension = knowledge_embeddings[0].shape[1] index = faiss.IndexFlatIP(dimension) # 使用内积作为相似度度量 # 将向量添加到索引中 embeddings_matrix = np.vstack(knowledge_embeddings) faiss.normalize_L2(embeddings_matrix) # 归一化向量以便使用内积计算余弦相似度 index.add(embeddings_matrix) def faiss_semantic_search(query, knowledge_base, index, top_k=5): query_embedding = get_embedding(query) query_embedding = query_embedding.astype('float32') faiss.normalize_L2(query_embedding) # 搜索最相似的top_k个向量 distances, indices = index.search(query_embedding, top_k) # 返回结果 results = [] for i, idx in enumerate(indices[0]): results.append((knowledge_base[idx], distances[0][i])) return results

7. 总结

本文介绍了如何使用Qwen3-Embedding-4B模型实现语义搜索功能。关键步骤包括:

  1. 使用transformers库加载Qwen3-Embedding-4B模型
  2. 实现文本向量化函数,将文本转换为高维向量表示
  3. 使用余弦相似度计算向量间的相似程度
  4. 构建完整的语义搜索流程,包括知识库准备和查询处理
  5. 提供性能优化建议,如批量处理和FAISS索引

这种基于嵌入向量的语义搜索方法能够理解文本的深层含义,而不仅仅是表面的关键词匹配,适用于各种需要理解自然语言语义的应用场景。

获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/12 15:56:12

Qwen3-1.7B开源镜像使用指南:Jupyter环境部署教程

Qwen3-1.7B开源镜像使用指南:Jupyter环境部署教程 1. 快速上手:什么是Qwen3-1.7B? Qwen3-1.7B是通义千问系列中一款轻量但能力扎实的开源大语言模型。它属于Qwen3(千问3)家族——阿里巴巴于2025年推出的全新一代大模…

作者头像 李华
网站建设 2026/4/11 22:40:13

PDF-Extract-Kit-1.0效果展示:带水印/印章PDF中关键表格区域鲁棒性识别

PDF-Extract-Kit-1.0效果展示:带水印/印章PDF中关键表格区域鲁棒性识别 1. 核心能力概览 PDF-Extract-Kit-1.0是一款专注于PDF文档处理的工具集,特别擅长从复杂背景的PDF中提取结构化数据。其最突出的能力是在带有水印、印章等干扰元素的情况下&#x…

作者头像 李华
网站建设 2026/4/13 1:18:03

为什么VibeThinker-1.5B要用英文提问?效果提升实战分析

为什么VibeThinker-1.5B要用英文提问?效果提升实战分析 你有没有试过用中文向一个小参数模型提一个复杂的数学题,结果它绕来绕去没答到点子上?而换成英文一问,答案立刻清晰、步骤完整、甚至带上了关键推导逻辑?这不是…

作者头像 李华
网站建设 2026/4/12 18:49:04

DeerFlow行业探索:制药研发信息整合AI工具

DeerFlow行业探索:制药研发信息整合AI工具 1. 认识您的智能研究助手 想象一下,当您需要快速获取某个新药研发进展时,传统方式可能需要花费数小时甚至数天时间搜索、整理和分析各种资料。现在,DeerFlow可以把这个过程缩短到几分钟…

作者头像 李华
网站建设 2026/4/5 16:28:53

颠覆式创新教育:编程学习的沉浸式交互革命

颠覆式创新教育:编程学习的沉浸式交互革命 【免费下载链接】codecombat Game for learning how to code. 项目地址: https://gitcode.com/gh_mirrors/co/codecombat 教育数字化转型的核心矛盾与突破方向 当前编程教育正面临前所未有的挑战:学生在…

作者头像 李华