5分钟上手!嵌入向量计算文本相似度的实用指南

【免费下载链接】JARVIS JARVIS, a system to connect LLMs with ML community. Paper: https://arxiv.org/pdf/2303.17580.pdf 【免费下载链接】JARVIS 项目地址: https://gitcode.com/gh_mirrors/jarvis3/JARVIS

你是否还在为如何判断两段文本的相似程度而烦恼?想知道"人工智能"和"机器学习"的语义关联有多紧密?本文将带你用最简洁的方式掌握嵌入向量(Embedding)技术,无需复杂数学知识,只需三步即可实现文本语义相似度计算。

一、什么是嵌入向量?

嵌入向量(Embedding)是将文本、图像等非结构化数据转换成的数值向量,就像给每个文本分配一个独特的"数字指纹"。这些向量能捕捉文本的深层语义,例如"猫"和"狗"的向量会比"猫"和"汽车"的向量更相似。

在JARVIS项目中,嵌入向量技术被广泛应用于工具检索和语义匹配。项目的easytool/easytool/toolbench_retrieve.py文件实现了完整的向量生成和相似度计算功能。

二、核心原理:从文本到向量的魔法

2.1 向量生成过程

文本转向量的过程就像翻译:将人类语言翻译成计算机能理解的数字语言。JARVIS使用OpenAI的text-embedding-ada-002模型实现这一转换,代码如下:

def get_embedding(text):
    a = openai.Embedding.create(
        engine="text-embedding-ada-002",
        input=text
    )
    return a['data'][0]["embedding"]

这段代码来自easytool/easytool/toolbench_retrieve.py,它接收文本输入,返回一个长度为1536的浮点数数组,这就是文本的"数字指纹"。

2.2 相似度计算:余弦相似度

有了向量后,如何计算相似度?JARVIS采用余弦相似度(cosine similarity)算法,它通过计算两个向量夹角的余弦值来衡量相似度,结果范围在0到1之间:

  • 1表示两段文本语义完全相同
  • 0表示两段文本毫无关联

实现代码如下:

similarities = [cosine_similarity([input_embedding], [emb])[0][0] for emb in embedded_texts]

这段代码来自easytool/easytool/toolbench_retrieve.py,它计算输入文本向量与候选文本向量列表中每个向量的相似度。

三、实战教程:三步计算文本相似度

3.1 准备环境

首先确保安装必要依赖,可参考项目的easytool/requirements.txt文件,关键依赖包括:

  • openai:用于生成嵌入向量
  • scikit-learn:提供余弦相似度计算

3.2 完整实现代码

以下是一个简化的文本相似度计算工具,整合了JARVIS项目中的核心功能:

import openai
from sklearn.metrics.pairwise import cosine_similarity
import os

# 配置API密钥
openai.api_key = os.environ["OPENAI_API_KEY"]

def get_embedding(text):
    """生成文本的嵌入向量"""
    response = openai.Embedding.create(
        engine="text-embedding-ada-002",
        input=text
    )
    return response['data'][0]["embedding"]

def calculate_similarity(text1, text2):
    """计算两段文本的相似度"""
    emb1 = get_embedding(text1)
    emb2 = get_embedding(text2)
    return cosine_similarity([emb1], [emb2])[0][0]

# 示例使用
if __name__ == "__main__":
    text_a = "人工智能是研究如何使机器模拟人类智能的科学"
    text_b = "机器学习是人工智能的一个重要分支"
    text_c = "天空是蓝色的因为瑞利散射"
    
    sim_ab = calculate_similarity(text_a, text_b)
    sim_ac = calculate_similarity(text_a, text_c)
    
    print(f"文本A和文本B的相似度: {sim_ab:.4f}")  # 高相似度
    print(f"文本A和文本C的相似度: {sim_ac:.4f}")  # 低相似度

3.3 结果解读

运行上述代码,你会得到类似这样的输出:

文本A和文本B的相似度: 0.8923
文本A和文本C的相似度: 0.2156

这表明"人工智能"和"机器学习"的语义相似度很高(0.89),而"人工智能"和"天空是蓝色的"语义关联较弱(0.22)。

四、在JARVIS项目中的应用

JARVIS项目将嵌入向量技术应用于工具检索系统,当用户提出问题时,系统会:

  1. 将用户问题转换为嵌入向量
  2. 与所有工具描述的嵌入向量比较相似度
  3. 返回最相关的工具供LLM使用

这一过程在easytool/easytool/toolbench_retrieve.py文件的retrieve_reference函数中实现,确保LLM能快速找到解决问题的合适工具。

五、常见问题与优化建议

5.1 如何提升计算速度?

5.2 向量存储与管理

对于大规模应用,建议使用向量数据库如FAISS或Milvus。JARVIS项目通过 pickle 文件存储向量:

with open("data_toolbench/tool_instruction/API_description_embeddings.pkl", "rb") as file:
    embedded_texts = pickle.load(file)

这段代码来自easytool/easytool/toolbench_retrieve.py,展示了如何加载预计算的嵌入向量集合。

六、总结与展望

嵌入向量技术为文本语义理解提供了强大工具,通过本文介绍的方法,你可以轻松实现文本相似度计算。JARVIS项目在这一技术基础上构建了更复杂的工具检索和调用系统,如果你想深入了解,可以查阅项目的README.md和相关论文。

掌握嵌入向量技术后,你可以将其应用于:

  • 文本聚类与分类
  • 搜索引擎优化
  • 智能推荐系统
  • 语义分析与情感识别

尝试用本文介绍的方法分析你感兴趣的文本吧!如有疑问,欢迎查阅项目的SUPPORT.md获取帮助。

【免费下载链接】JARVIS JARVIS, a system to connect LLMs with ML community. Paper: https://arxiv.org/pdf/2303.17580.pdf 【免费下载链接】JARVIS 项目地址: https://gitcode.com/gh_mirrors/jarvis3/JARVIS

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐