5.通义向量模型调用

模块 1:通义向量模型核心认知

1.1 一句话讲透:通义向量模型到底是什么?

通义向量模型是阿里云通义千问团队推出的、专门针对中文语义优化的文本向量模型,是国内企业级 RAG 项目的主流选型之一,你可以把它理解成「中文语义理解能力拉满的国产向量生成工具」。

通义向量模型的核心作用也是:把中文文本转换成代表语义的固定长度数字向量,实现「语义越像、向量越近」的精准匹配,是 RAG 系统精准检索的核心底层技术。

模块 2:环境准备与账号配置

方案:零基础首选【通义千问云端向量 API】(90% 的零基础用户都选这个)

步骤1:开通通义千问服务,创建 API-KEY

通义千问管理控制台:通义千问

步骤 2:安装核心依赖包

打开终端 / 命令提示符,执行下面的命令,安装通义向量调用的核心依赖,用国内清华镜像,速度快,无包冲突:

bash 复制代码
pip install dashscope scikit-learn numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
  • dashscope:阿里云通义千问的官方 Python SDK,专门用来调用通义向量模型
  • scikit-learn/numpy:用来计算向量相似度

安装完成后,执行下面的命令,验证安装是否成功:

bash 复制代码
python -c "import dashscope; print(' dashscope安装成功,通义向量调用环境准备完成!')"

实操代码

python 复制代码
# -*- coding: utf-8 -*-
"""
@Created on : 2026/6/10 11:20
@creator : er_nao
@File :day_90.py
@Description :通义向量模型调用
"""

# 导入通义千问官方SDK
import dashscope
from dashscope import TextEmbedding
import numpy as np
from config import TONGYI_API_KEY
import json

# ====================== 核心配置:替换成你自己的API-KEY ======================
# 把你之前在阿里云控制台复制的API-KEY粘贴到这里
dashscope.api_key = TONGYI_API_KEY

# 向量结果保存路径
output_save_path = "C:\\Users\\hp\\Desktop\\NLP学习数据\\通义向量批量生成结果.json"
# ==================================================================================


"""
    # 实操 1:云端 API 单文本向量生成
    核心目标:掌握通义向量 API 的核心调用方法,给单条文本生成向量,直观看到向量的样子。
"""

# 核心函数:调用通义向量模型,给单条文本生成向量
def generate_tongyi_embedding(text: str) -> np.ndarray:
    """
        调用通义千问向量模型,给单条中文文本生成embedding向量
        :param text: 输入的中文文本
        :return: 生成的向量(numpy数组,固定长度1536维)
    """
    # 调用通义向量API
    response = TextEmbedding.call(
        model=TextEmbedding.Models.text_embedding_v2,  # 通义向量V2模型,中文效果最好
        input=text
    )
    print(f"打印response返回结果:{response}")
    # 解析API返回结果,提取向量
    if response.status_code == 200:
        # 提取向量,转成numpy数组,自动做归一化处理
        embedding = np.array(response.output["embeddings"][0]["embedding"])
        return embedding

    else:
        # 调用失败,打印错误信息
        print(f"通义向量调用失败,错误码:{response.status_code},错误信息:{response.message}")
        return None



"""
    实操 2:云端 API 批量文本向量生成(衔接 RAG 项目核心实操)
    核心目标:批量生成通义向量,输出「文本内容 + 向量 + 元数据」的结构化结果,可直接用于后续的向量库搭建。
"""

# 核心函数:批量文本向量生成
def batch_generator_tongyi_embedding(chunk_list: list) -> list:
    """
        给批量文本块生成通义向量,输出结构化结果
        :param chunk_list: 文本块列表,每个元素是一个文本字符串
        :return: 结构化结果列表,每个元素包含chunk_id、chunk_content、embedding_vector
    """
    batch_result = []
    total_count = len(chunk_list)

    print(f"开始批量生成通义向量,共 {total_count} 个文本块")

    for idx, chunk in enumerate(chunk_list):
        if not chunk.strip():
            print(f"第{idx + 1}个文本块为空,跳过")
            continue

        # 生成向量
        embedding = generate_tongyi_embedding(chunk)
        if embedding is not None:
            # 结构化保存结果
            batch_result.append({
                "chunk_id": idx + 1,
                "chunk_content": chunk,
                "embedding_vector": embedding.tolist(), # 转成列表,方便保存到JSON
                "embedding_dim": len(embedding)
            })
            # 打印进度
            if (idx + 1) % 5 == 0:
                print(f"已完成 {idx + 1}/{total_count} 个文本块的向量生成")

    print(f" 批量向量生成完成!共成功生成 {len(batch_result)} 个文本块的向量")
    return batch_result

# 核心函数:保存向量结果到JSON文件
def save_embedding_result(result_list:list, save_path: str) -> bool:

    try:
        with open(save_path, mode="w", encoding="utf-8")as f:
            json.dump(result_list,f,ensure_ascii=False,indent=2)

        print(f" 向量结果已保存至:{save_path}")
        return True
    except Exception as e:
        print(f"结果保存失败,错误信息:{str(e)}")
        return False


"""
    实操 3:向量相似度计算
    核心目标:计算不同文本之间的通义向量相似度,验证「语义越像、相似度越高」的核心规律,彻底理解通义向量的语义匹配能力。
"""
from sklearn.metrics.pairwise import cosine_similarity

# 核心函数:计算两个文本的语义相似度
def calculate_tongyi_similarity(text1: str, text2: str) -> float:
    """
        计算两个中文文本的语义相似度,返回0-1之间的数值
        数值越接近1,语义越相似;越接近0,语义越无关
    """
    # 生成两个文本的向量
    embedding1 = generate_tongyi_embedding(text1).reshape(1, -1)
    embedding2 = generate_tongyi_embedding(text2).reshape(1, -1)

    # 计算余弦相似度
    similarity = cosine_similarity(embedding1, embedding2)[0][0]
    return round(similarity, 4)




# ====================== 测试运行 ======================
if __name__ == "__main__":

    # 1:云端API单文本向量生成
    # text = "通义向量模型调用,核心目标是掌握通义向量的调用方法,完成RAG项目的文本向量化"
    # # 调用函数生成向量
    # test_embedding = generate_tongyi_embedding(text)
    #
    # if test_embedding is not None:
    #     print("通义向量生成成功!")
    #     print(f"测试文本:{text}")
    #     print(f"生成的向量维度:{len(test_embedding)} 维")
    #     print(f"向量前10个数字:{test_embedding[:10]}")
    #     print(f"向量后10个数字:{test_embedding[-10:]}")

    # 2:云端 API 批量文本向量生成
    # your_chunk_list = [
    #     "Day85的学习内容是pdfplumber安装与PDF文字提取,核心目标是掌握PDF读取,能独立提取PDF中的文字内容",
    #     "Day86的学习内容是RAG核心文本分块逻辑与全流程实操,核心目标是掌握文本分块技术,能对长文档进行合理分块",
    #     "Day87的学习内容是文档分段、切块策略,核心目标是了解文档分块,能对长文档进行合理的分块处理",
    #     "Day88的学习内容是文本切分函数封装,核心目标是将文档分段、切块逻辑封装成可复用的工程化函数",
    #     "Day89的学习内容是embedding向量概念通俗理解,核心目标是彻底搞懂embedding向量的本质、核心作用与RAG关联逻辑",
    #     "Day90的学习内容是通义向量模型调用,核心目标是掌握通义向量的调用方法,完成RAG项目的文本向量化",
    # ]
    # # 批量生成向量
    # embedding_result = batch_generator_tongyi_embedding(your_chunk_list)
    # # 保存结果到JSON文件
    # if embedding_result:
    #     save_embedding_result(embedding_result, output_save_path)


    # 3.向量相似度计算
    # 测试文本组,验证语义相似度
    test_group = [
        ("Day90的学习内容是通义向量模型调用", "今天要学的是通义向量的调用方法", "语义高度相似"),
        ("Day90的学习内容是通义向量模型调用", "RAG项目的核心是文本向量化和向量检索", "语义有一定关联"),
        ("Day90的学习内容是通义向量模型调用", "我今天吃了苹果和香蕉", "语义完全无关"),
        ("通义向量模型是中文RAG的主流选型", "BGE模型是通用中文向量模型", "同类型不同模型,语义有一定关联"),
    ]

    # 循环计算每组文本的相似度
    for text1, text2, desc in test_group:
        sim = calculate_tongyi_similarity(text1, text2)
        print(f"\n【{desc}】")
        print(f"文本1:{text1}")
        print(f"文本2:{text2}")
        print(f"通义向量语义相似度:{sim}")

补充知识点说明:

python 复制代码
为什么 
generate_tongyi_embedding(text1).reshape(1, -1) 

代码后面要写个 .reshape(1, -1)

1. 整体作用

reshape(1, -1) 是 改变数组形状,把原本一维向量,转成 二维矩阵(一行多列)。

原因:你后面用的 cosine_similarity 相似度计算函数,只接收二维数组,不接收一维数组,不加这行代码会直接报错。

2. 先看原始向量长什么样

调用 generate_tongyi_embedding(text) 得到的结果是 一维数组:

python 复制代码
# 形状:(1536,)  只有1个维度,一整行数字
emb = generate_tongyi_embedding("测试文本")
print(emb.shape)  # 输出:(1536,)

你可以理解成:一条直线上的 1536 个数字。

而 sklearn 的 cosine_similarity 要求输入格式必须是:

(样本数, 特征数) → 二维结构(有行、有列)

一维数组直接丢进去,程序识别不了,就会报错。

3. 拆解 reshape (1, -1)

3.1. 语法规则

数组.reshape(行数, 列数)

  • 第一个参数 1:指定变成 1 行
  • 第二个参数 -1:自动计算列数(不用你手动写 1536)
3.2. 举个极简小例子
python 复制代码
import numpy as np

arr = np.array([0.1, 0.2, 0.3])
print("原数组形状:", arr.shape)   # (3,) 一维

arr2 = arr.reshape(1, -1)
print("变形后形状:", arr2.shape) # (1, 3) 二维

print("原数组:", arr)        # [0.1 0.2 0.3]
print("变形后:", arr2)       # [[0.1 0.2 0.3]]  外层多了一对方括号
相关推荐
茉莉玫瑰花茶26 分钟前
综合案例 - AI 智能租房助手 [ 5 ]
服务器·数据库·人工智能·python·ai
文艺倾年32 分钟前
【强化学习】强化学习基本概念,20W字总结(一)
人工智能·python·语言模型·自然语言处理·面试·职场和发展·大模型
宸丶一36 分钟前
Day 13:持久化记忆 - 让 Agent 拥有长期记忆
jvm·python·ai
码云骑士1 小时前
13-列表append的底层真相(上)-listobject源码中的预分配策略
开发语言·python
浦信仿真大讲堂1 小时前
达索系统SIMULIA Abaqus 2026接触和约束的增强新功能介绍
人工智能·python·算法·仿真软件·达索软件
xufengzhu2 小时前
第三方 Python 库 Loguru 的进阶实战
python·loguru
极光代码工作室2 小时前
基于深度学习的手写数字识别系统
人工智能·python·深度学习·神经网络·机器学习
geovindu3 小时前
python: speech to text offline
开发语言·python·语音识别
AI创界者3 小时前
告别云端限制!Sulphur 2 本地文生视频/图生视频整合包,本地部署,解压即用,保姆级部署与工作流实战
人工智能·python·aigc·音视频
tsfy20033 小时前
Python批量调整Excel格式,并排版导出PDF
python·pdf·excel