5分钟上手!嵌入向量计算文本相似度的实用指南
你是否还在为如何判断两段文本的相似程度而烦恼?想知道"人工智能"和"机器学习"的语义关联有多紧密?本文将带你用最简洁的方式掌握嵌入向量(Embedding)技术,无需复杂数学知识,只需三步即可实现文本语义相似度计算。## 一、什么是嵌入向量?嵌入向量(Embedding)是将文本、图像等非结构化数据转换成的数值向量,就像给每个文本分配一个独特的"数字指纹"。这些向量能捕捉文本的深层语义,例...
5分钟上手!嵌入向量计算文本相似度的实用指南
你是否还在为如何判断两段文本的相似程度而烦恼?想知道"人工智能"和"机器学习"的语义关联有多紧密?本文将带你用最简洁的方式掌握嵌入向量(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项目将嵌入向量技术应用于工具检索系统,当用户提出问题时,系统会:
- 将用户问题转换为嵌入向量
- 与所有工具描述的嵌入向量比较相似度
- 返回最相关的工具供LLM使用
这一过程在easytool/easytool/toolbench_retrieve.py文件的retrieve_reference函数中实现,确保LLM能快速找到解决问题的合适工具。
五、常见问题与优化建议
5.1 如何提升计算速度?
- 预计算并缓存常用文本的嵌入向量,如JARVIS项目中easytool/data_toolbench/tool_instruction/API_description_embeddings.zip存储了预计算的API描述嵌入向量
- 批量处理文本,减少API调用次数
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获取帮助。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)