💡 核心亮点
通过真实的API调用和实际向量数据分析,深入理解text-embedding-v3模型的工作原理和输出特征。
- 模型架构与技术原理详解
- API参数完整说明
- 真实1024维向量数据分析
- 实战代码示例
text-embedding-v3 是阿里云通义千问推出的第三代文本向量化模型。
| 属性 | 值 |
|---|---|
| 模型名称 | text-embedding-v3 |
| 向量维度 | 1024维 |
| 输入限制 | 单条文本最长8192 tokens |
| 批量处理 | 支持一次最多25条文本 |
| 输出格式 | float32浮点数数组 |
| API提供商 | 阿里云DashScope |
text-embedding-v3基于Transformer架构,采用了以下技术:
输入文本
↓
Tokenization (分词)
↓
Transformer Encoder (多层自注意力机制)
↓
Pooling (池化层)
↓
1024维向量输出
模型能够理解文本中每个词与其他词的关系:
"什么是Transformer模型?"
↓
"什么" 关注 → "是"、"Transformer"、"模型"
"Transformer" 关注 → "什么"、"模型"、"?"
↓
综合所有词的关系,生成整体语义向量
模型在海量文本上训练,包括: - 网页文本 - 书籍 - 百科知识 - 代码 - 多语言文本
from dashscope import TextEmbedding
import dashscope
# 配置API Key
dashscope.api_key = 'your-api-key-here'
# 调用模型
response = TextEmbedding.call(
model='text-embedding-v3', # 模型名称
input='什么是Transformer模型?' # 输入文本
)
response = TextEmbedding.call(
model='text-embedding-v3', # 必填:模型名称
input='文本内容', # 必填:输入文本(字符串或字符串列表)
text_type='query', # 可选:文本类型
# 'query' - 查询文本(默认)
# 'document' - 文档文本
dimension=1024, # 可选:向量维度(仅v3支持)
# 1024 - 完整维度(默认)
# 768 - 降维版本
# 512 - 更小维度
normalize=True # 可选:是否归一化(默认True)
)
# 一次处理多条文本(最多25条)
# 每条文本最长8192 tokens(约6000-8000个汉字)
response = TextEmbedding.call(
model='text-embedding-v3',
input=[
"第一条文本",
"第二条文本",
"第三条文本"
# ... 最多25条
]
)
# 返回多个向量
for embedding in response.output['embeddings']:
print(f"文本索引: {embedding['text_index']}")
print(f"向量: {embedding['embedding'][:5]}...")
批量处理优势: - 比循环调用快 25倍 - 减少网络往返次数 - 降低API调用开销
{
"status_code": 200,
"request_id": "93285804-c810-9d20-b6f0-1e95d31c0231",
"code": "",
"message": "",
"output": {
"embeddings": [
{
"embedding": [
-0.05640657618641853,
-0.017438530921936035,
-0.04113607853651047,
... (共1024个数值)
],
"text_index": 0
}
]
},
"usage": {
"total_tokens": 5
}
}
| 字段 | 类型 | 说明 |
|---|---|---|
status_code |
int | HTTP状态码,200表示成功 |
request_id |
string | 请求唯一标识,用于调试 |
code |
string | 错误码,成功时为空 |
message |
string | 错误信息,成功时为空 |
output.embeddings |
array | 向量数组 |
output.embeddings[0].embedding |
array | 1024维向量 |
output.embeddings[0].text_index |
int | 文本索引(批量处理时使用) |
usage.total_tokens |
int | 消耗的token数量 |
question = "什么是Transformer模型?"
基于实际返回的1024维向量:
import numpy as np
vector = [-0.05640657618641853, -0.017438530921936035, ...] # 1024个值
vector = np.array(vector, dtype=np.float32)
# 统计信息
print(f"向量维度: {len(vector)}")
print(f"最大值: {vector.max():.6f}")
print(f"最小值: {vector.min():.6f}")
print(f"平均值: {vector.mean():.6f}")
print(f"标准差: {vector.std():.6f}")
print(f"向量长度(模): {np.linalg.norm(vector):.6f}")
向量维度: 1024
最大值: 0.227587 (第412维)
最小值: -0.159115 (第276维)
平均值: ≈ 0.000000 (接近0)
标准差: ≈ 0.030000
向量长度: ≈ 1.000000 (已归一化)
[ 0] -0.056407
[ 1] -0.017439
[ 2] -0.041136
[ 3] +0.013480
[ 4] -0.050336
[ 5] -0.001063
[ 6] -0.003188
[ 7] +0.106328 ← 较高正值
[ 8] +0.056067
[ 9] +0.011886
[ 10] -0.051882
[ 11] +0.047433
[ 12] +0.021171
[ 13] -0.013432
[ 14] +0.016439
[ 15] -0.008206
[ 16] +0.011613
[ 17] +0.012707
[ 18] +0.044530
[ 19] -0.062289 ← 较低负值
大部分数值在 [-0.15, +0.23] 之间
正值维度: 约512个 (50%)
负值维度: 约512个 (50%)
某些维度的值特别突出(绝对值大):
第 7维: +0.106328 ← 可能表示"疑问"特征
第276维: -0.159115 ← 可能表示"技术"特征(负相关)
第412维: +0.227587 ← 最强特征,可能表示"模型"概念
这些突出的维度可能对"Transformer模型"这个概念贡献最大。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
text-embedding-v3 基础调用示例
"""
from dashscope import TextEmbedding
import dashscope
# 配置API
dashscope.api_key = 'your-api-key-here'
# 测试问题
question = "什么是Transformer模型?"
# 调用API
response = TextEmbedding.call(
model='text-embedding-v3',
input=question
)
# 检查响应
if response.status_code == 200:
# 获取向量
vector = response.output['embeddings'][0]['embedding']
print(f"✅ 向量化成功!")
print(f"📊 向量维度: {len(vector)}")
print(f"📋 前10个数值:")
for i in range(10):
print(f" [{i:2d}] {vector[i]:+.6f}")
print(f" ...")
# Token消耗
print(f"\n💰 Token消耗: {response.usage['total_tokens']}")
else:
print(f"❌ 向量化失败: {response.code} - {response.message}")
import numpy as np
from dashscope import TextEmbedding
import dashscope
dashscope.api_key = 'your-api-key-here'
# 测试文本
texts = [
"什么是Transformer模型?",
"深度学习是什么?",
"红烧肉怎么做?"
]
# 批量向量化
response = TextEmbedding.call(
model='text-embedding-v3',
input=texts
)
# 分析每个向量
for i, emb in enumerate(response.output['embeddings']):
vector = np.array(emb['embedding'], dtype=np.float32)
print(f"\n{'='*60}")
print(f"文本: {texts[i]}")
print(f"{'='*60}")
print(f"维度: {len(vector)}")
print(f"最大值: {vector.max():.6f} (第{vector.argmax()}维)")
print(f"最小值: {vector.min():.6f} (第{vector.argmin()}维)")
print(f"平均值: {vector.mean():.6f}")
print(f"标准差: {vector.std():.6f}")
print(f"向量长度: {np.linalg.norm(vector):.6f}")
import numpy as np
from dashscope import TextEmbedding
import dashscope
dashscope.api_key = 'your-api-key-here'
# 测试文本
text1 = "什么是Transformer模型?"
text2 = "深度学习是什么?"
text3 = "红烧肉怎么做?"
# 向量化
response = TextEmbedding.call(
model='text-embedding-v3',
input=[text1, text2, text3]
)
# 提取向量
v1 = np.array(response.output['embeddings'][0]['embedding'], dtype=np.float32)
v2 = np.array(response.output['embeddings'][1]['embedding'], dtype=np.float32)
v3 = np.array(response.output['embeddings'][2]['embedding'], dtype=np.float32)
# 计算余弦相似度
def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
sim_12 = cosine_similarity(v1, v2)
sim_13 = cosine_similarity(v1, v3)
sim_23 = cosine_similarity(v2, v3)
print(f"\n📊 相似度矩阵:")
print(f"Transformer vs 深度学习: {sim_12:.4f}")
print(f"Transformer vs 红烧肉: {sim_13:.4f}")
print(f"深度学习 vs 红烧肉: {sim_23:.4f}")
预期输出:
📊 相似度矩阵:
Transformer vs 深度学习: 0.7500 ← 相似(都是AI话题)
Transformer vs 红烧肉: 0.1200 ← 不相似
深度学习 vs 红烧肉: 0.0800 ← 不相似
默认情况下,模型会对向量进行L2归一化:
# 归一化后,向量长度 ≈ 1.0
np.linalg.norm(vector) ≈ 1.0
好处: - 余弦相似度计算更简单(直接点积即可) - 不同长度的文本,向量可比
# 查询文本(搜索场景)
response = TextEmbedding.call(
model='text-embedding-v3',
input='用户搜索词',
text_type='query'
)
# 文档文本(被搜索的内容)
response = TextEmbedding.call(
model='text-embedding-v3',
input='文档内容',
text_type='document'
)
区别:
- query - 优化用于搜索
- document - 优化用于被检索
# 完整维度(默认)
response = TextEmbedding.call(
model='text-embedding-v3',
input='文本',
dimension=1024
)
# 降维版本(节省存储)
response = TextEmbedding.call(
model='text-embedding-v3',
input='文本',
dimension=768 # 或 512
)
text-embedding-v3使用BPE(Byte-Pair Encoding)分词算法,智能地将文本切分为tokens。
question = "什么是Transformer模型?"
# 字符数: 13个字符
# Token数: 5个tokens
#
# 分词过程:
# "什么" → token #1 (常用双字词)
# "是" → token #2 (单字)
# "Transformer" → token #3 (英文单词)
# "模型" → token #4 (常用双字词)
# "?" → token #5 (标点符号)
#
# 压缩比: 13字符 → 5tokens (约2.6:1)
关键:BPE分词不是"一个字符一个token",而是智能合并常用词组:
| 分词单元 | 字符数 | Token数 | 说明 |
|---|---|---|---|
| "什么" | 2 | 1 | ✅ 常用词组合并 |
| "是" | 1 | 1 | 单字 |
| "Transformer" | 11 | 1 | ✅ 英文单词合并 |
| "模型" | 2 | 1 | ✅ 常用词组合并 |
| "?" | 1 | 1 | 标点 |
| 合计 | 17 | 5 | 压缩比3.4:1 |
常用词汇: 0.5-0.7 token/字 ← 高效!
"什么"、"模型"、"学习" → 2字=1token
生僻词汇: ~1 token/字
不常见的专业术语
英文单词: ~1 token/词
"AI"、"Transformer" → 1词=1token
标点符号: 1 token/个
"。"、"?"、"!" → 1个=1token
# 日常中文文本
tokens ≈ 字符数 × 0.6
# 示例验证
"什么是Transformer模型?" = 13字符 × 0.6 ≈ 5 tokens ✅
"深度学习是人工智能的分支" = 12字符 × 0.6 ≈ 7 tokens
"人工智能改变世界" = 8字符 × 0.6 ≈ 5 tokens
方法1:通过API响应
response = TextEmbedding.call(
model='text-embedding-v3',
input="什么是Transformer模型?"
)
tokens = response.usage['total_tokens']
print(f"精确Token数: {tokens}") # 输出: 5
方法2:批量测试不同文本
test_cases = [
"什么是Transformer模型?", # 5 tokens
"你好", # 1-2 tokens
"人工智能是什么?", # 4-5 tokens
"I love AI", # 4 tokens
"深度学习与机器学习的关系", # 6-7 tokens
]
for text in test_cases:
response = TextEmbedding.call(
model='text-embedding-v3',
input=text
)
tokens = response.usage['total_tokens']
print(f"文本: {text}")
print(f"字符数: {len(text)}")
print(f"Tokens: {tokens}")
print(f"比率: {tokens/len(text):.2f}")
print()
| 项目 | 价格 |
|---|---|
| 输入 | ¥0.0007 / 1000 tokens |
| 输出 | 无(只返回向量) |
一次向量化(5 tokens): ¥0.0000035
1000次向量化: ¥0.0035
10000次向量化: ¥0.035
非常便宜! 💚
| 模型 | 维度 | 速度 | 准确度 | 价格 |
|---|---|---|---|---|
| v1 | 768 | 快 | 一般 | 便宜 |
| v2 | 1536 | 中 | 好 | 中等 |
| v3 | 1024 | 快 | 最好 | 便宜 |
| 模型 | 维度 | 特点 |
|---|---|---|
| text-embedding-v3 | 1024 | 中文优化,便宜 ✅ |
| OpenAI ada-002 | 1536 | 英文优化,贵 |
| Cohere embed-v3 | 1024 | 多语言支持 |
def clean_text(text):
"""清理文本,提高向量化质量"""
# 去除多余空格
text = ' '.join(text.split())
# 去除特殊字符(可选)
# text = re.sub(r'[^\w\s\u4e00-\u9fff]', '', text)
return text
text = clean_text(" 什么是 Transformer模型? ")
# 结果: "什么是 Transformer模型?"
# 模型限制:8192 tokens
# 约等于:6000-8000个中文字符
def handle_long_text(text, max_length=8000):
"""处理长文本"""
if len(text) > max_length:
return text[:max_length]
return text
# 使用
text = handle_long_text(very_long_text)
response = TextEmbedding.call(
model='text-embedding-v3',
input=text
)
# 推荐:一次处理多条文本(最多25条)
texts = ["文本1", "文本2", ..., "文本25"]
response = TextEmbedding.call(
model='text-embedding-v3',
input=texts # 列表
)
# 比循环调用快25倍!
response = TextEmbedding.call(...)
if response.status_code == 200:
print("✅ 成功")
else:
print(f"❌ 失败")
print(f"错误码: {response.code}")
print(f"错误信息: {response.message}")
print(f"请求ID: {response.request_id}") # 用于技术支持
| 错误码 | 原因 | 解决方法 |
|---|---|---|
InvalidParameter |
输入为空 | 检查文本是否为空 |
TextLengthExceed |
文本太长 | 截断到8000字符 |
QuotaExhausted |
配额用完 | 检查账户余额 |
InternalError |
服务器错误 | 重试或联系支持 |
# 最常用配置
response = TextEmbedding.call(
model='text-embedding-v3',
input='文本内容',
text_type='query', # 或 'document'
dimension=1024, # 默认
normalize=True # 默认
)
📝 笔记创建:2026-05-18
🔄 最后更新:2026-05-18
🏷️ 标签:#text-embedding-v3 #阿里云 #向量化 #Embedding #API #深度学习