大家好我是小锋老师最近更新《2027版 1天学会 嵌入模型与Chroma向量数据库 AI大模型应用开发必备知识 视频教程》专辑感谢大家支持。本课程主要介绍和讲解嵌入模型与向量数据库简介Qwen3嵌入模型使用Chroma向量数据库使用Chroma安装Client-Server模式集合添加修改删除查询操作以及自定义Embedding Functions。视频教程课件源码打包下载链接https://pan.baidu.com/s/1Oo7dtFf_Zt7hJyl6aYX6TA?pwd1234提取码1234嵌入模型与Chroma向量数据库 - Qwen3嵌入模型使用 - AI大模型应用开发必备知识嵌入模型有很多我们这里选用国内用得比较多的通义千问qwen嵌入模型。我们选一个参数小一点的方便跑。Qwen3-VL-Embedding-2B。https://huggingface.co/Qwen/Qwen3-VL-Embedding-2B/tree/mainQwen3-VL-Embedding-2B简介Qwen3-VL-Embedding-2B 是阿里Qwen团队推出的一款多模态向量表示模型旨在将文本、图像、视频等多种模态的数据映射到统一的语义空间为高精度多模态检索提供第一阶段的召回能力。 核心规格项目说明模型类型多模态向量Embedding模型参数量20亿 (2B)最大上下文32K tokens适合长文档或多图/视频输入嵌入维度最高2048维支持通过MRL技术自定义裁剪如128维、512维支持模态文本、图像、视频、截图及混合模态多语言能力支持30 种语言开源协议Apache 2.0可免费商用✨ 主要技术特点统一多模态表示将文本、图像、视频等不同模态的数据映射到同一个向量空间支持“以文搜图”、“图文搜视频”等跨模态检索。支持长上下文凭借32K的上下文长度能够处理长篇文档、多张图片组合或较长的视频片段。灵活的嵌入维度 (MRL)引入“俄罗斯套娃”表示学习技术无需重新编码即可直接截取向量前缀如只取前128维用于平衡存储成本、检索速度和效果。指令感知 (Instruction Aware)允许在输入时添加自定义指令明确检索任务意图使生成的向量更贴合业务场景定义的“相关性”。️ 架构与训练模型架构基于Qwen3-VL视觉语言模型构建采用双编码器 (Bi-encoder)架构通过取输入末尾特殊token\|endoftext\|的隐藏状态作为输出向量训练方法采用多阶段训练对比预训练→多任务微调→重排器蒸馏并融合了大规模合成数据与高质量数据以保证模型性能。 性能表现在权威的多模态检索基准MMEB-V2上2B模型取得了73.2的优异成绩在同量级模型中表现突出。在包含图像分类、视频问答、文档检索等78个数据集的综合评测中总分为75.0。 典型应用场景该模型非常适合作为多模态RAG检索增强生成系统的第一阶段的向量召回模型。具体应用包括多模态搜索引擎图文、视频的相似度计算与聚类基于自然语言的零样本视频/图像分类企业级多模态知识库的构建Qwen3-VL-Embedding-2B使用首先把这个模型下载到本地然后我们用qwen嵌入模型来实现文本转成嵌入向量然后进行余弦和欧式距离计算。余弦计算结果越小越相似欧式距离也是越小越相似。我们新建项目ChromaPro然后安装下torchtransformers以及数据计算scipy库pip install torch torchvision --index-url https://download.pytorch.org/whl/cu126 pip install transformers -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com pip install scipy -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn下面是示例代码import torch from transformers import AutoTokenizer, AutoModel from scipy.spatial.distance import cosine, euclidean # 加载模型和tokenizer model_name Qwen3-VL-Embedding-2B # 替换为模型的本地路径 tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModel.from_pretrained(model_name) # 设置模型到评估模式 model.eval() def get_embedding(text): 将文本转换为嵌入向量 inputs tokenizer(text, return_tensorspt, paddingTrue, truncationTrue) with torch.no_grad(): outputs model(**inputs) # 通常我们使用[CLS] token的输出或平均pooling 对模型输出的隐藏状态进行全局平均池化将序列维度压缩为单个向量表示。 具体解释 outputs.last_hidden_state获取Transformer模型最后一层的所有token隐藏状态 .mean(dim1)在序列维度dim1上计算平均值将形状从(batch_size, sequence_length, hidden_size)变为(batch_size, hidden_size) embeddings outputs.last_hidden_state.mean(dim1) # 平均所有token的embedding return embeddings def calculate_distances(text1, text2): 计算两个文本之间的余弦和欧式距离 embedding1 get_embedding(text1).squeeze() embedding2 get_embedding(text2).squeeze() print(embedding1:, embedding1,len(embedding1)) print(embedding2:, embedding2,len(embedding2)) # 转换为numpy数组以进行距离计算 embedding1 embedding1.float().numpy() embedding2 embedding2.float().numpy() cos_distance cosine(embedding1, embedding2) euc_distance euclidean(embedding1, embedding2) return cos_distance, euc_distance # 计算距离 cosine_distance, euclidean_distance calculate_distances(我喜欢小狗, 我喜欢小猫) print(f余弦距离: {cosine_distance}) print(f欧式距离: {euclidean_distance}) # 计算距离 cosine_distance, euclidean_distance calculate_distances(我喜欢小狗, python是个好技术) print(f余弦距离: {cosine_distance}) print(f欧式距离: {euclidean_distance})运行结果embedding1: tensor([ 1.4688, 0.5000, -1.1484, ..., -0.1543, 2.0000, -2.2188], dtypetorch.bfloat16) 2048 embedding2: tensor([ 1.2891, 0.6953, 0.3984, ..., 1.7266, -0.0188, -1.0469], dtypetorch.bfloat16) 2048 余弦距离: 0.396905779838562 欧式距离: 53.95702362060547 embedding1: tensor([ 1.4688, 0.5000, -1.1484, ..., -0.1543, 2.0000, -2.2188], dtypetorch.bfloat16) 2048 embedding2: tensor([-0.1270, -0.2930, -1.0781, ..., -0.0542, 0.1348, -0.4844], dtypetorch.bfloat16) 2048 余弦距离: 0.6521354913711548 欧式距离: 71.54246520996094我们会看到余弦计算结果越小越相似欧式距离也是越小越相似。