Embeddings 赋能 - AI智能匹配,呈现精准内容

news2024/9/9 1:02:59

🚀前言

在当今的 AI 时代,传统的相关内容推荐和搜索功能已经显得相对简单和低效。借助 AI 技术,我们可以实现更加智能化和个性化的内容发现体验。

本文将为大家介绍如何利用 OpenAI 的 Embedding 技术,打造出智能、高效的相关内容推荐和搜索功能。

🚀OpenAI Embedding

OpenAI Embedding 是一种将文本转化为密集型数值向量的技术,这些向量可以很好地表示文本的语义特征。其背后的核心思想是利用深度学习模型对大量文本数据进行训练,从而学习到文本的潜在语义表示。

具体来说,OpenAI 使用了一种名为 Transformer 的神经网络架构,通过自注意力机制捕捉文本中词语之间的关联性。训练完成后,Transformer 模型可以将任意长度的文本输入转换为一个固定长度的密集向量,这就是 Embedding。

这个 Embedding 向量包含了文本的语义信息,例如词义、上下文关系、情感倾向等。向量中的数值代表了文本在语义空间中的位置,相似的文本会对应到相近的位置。

因此,我们可以利用 Embedding 向量计算文本之间的语义相似度。比如说,通过计算两篇文章 Embedding 向量之间的余弦相似度,就可以得到它们在语义上的接近程度。这为实现相关内容推荐和搜索功能提供了强大的技术支持。

🚀代码实现

首先去安装对应的依赖

import OpenAI from "openai";
import dotenv from "dotenv";

这里dotenv的作用为可以帮助我们在开发过程中管理环境变量,我们的OPENAI_API_KEY就放在这里面

现在我们去调用embeddings接口看会得到一个什么?

import OpenAI from "openai";
import dotenv from "dotenv";
dotenv.config({
  path: ".env",
});

const openai = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY,
  baseURL: "https://api.302.ai/v1/"
});

const response = await openai.embeddings.create({
  model: "text-embedding-ada-002",
  input: "如何创建vue组件",
});
// 1536 gpt3
console.log(response.data[0].embedding);

可以看到embeddings将对应的数据变为了向量数据,一共1436个向量

既然我们可以将数据变为一个向量数据,这表示我们可以将现有的数据都向量化,然后将我们要搜索的数据也向量化之后,通过向量的计算去匹配对应的相近的数据

我们首先将创建openai的请求client封装成一个函数,方便我们后续的调用

  • app.service.mjs
// 模块化输出client 给各项ai任务调用
import OpenAI from "openai";
import dotenv from "dotenv";
dotenv.config({
  path: ".env",
});

export const client = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY,
  baseURL: "https://api.302.ai/v1/",
});

接下来我们通过调用embeddings接口,将数据向量化以后生成一个新的文件后输出

// 先把所有的内容计算向量
import fs from "fs/promises";

import { client } from "./app.service.mjs";

// 原数据
const inputFilePath = "./data/posts.json";
// 向量化数据
const outputFilePath = "./data/posts_with_embeddings.json";
// 读取原数据
const data = await fs.readFile(inputFilePath, "utf-8");

// 数组
const posts = JSON.parse(data);

// 向量化数据数组
const postsWithEmbeddings = [];
for (const { title, category } of posts) {
  const response = await client.embeddings.create({
    model: "text-embedding-ada-002",
    // vue vue-router
    input: `标题:${title}分类:${category}`,
  });
  postsWithEmbeddings.push({
    title,
    category,
    embedding: response.data[0].embedding,
  });
}

//新文件写入
await fs.writeFile(outputFilePath, JSON.stringify(postsWithEmbeddings));

原文件

新文件

可以看到我们通过embeddings接口将每个数据都进行了向量化

接下来要做的就是将我们要推荐的数据通过向量比较计算相似度,然后输出结果了

  1. 导入依赖模块:

    • fs/promises 导入文件系统模块的异步版本。
    • ./app.service.mjs 导入一个名为 client 的对象。
  2. 读取并解析 JSON 数据:

    • 定义输入文件的路径 inputFilePath
    • 使用 fs.readFile() 异步读取文件内容,并使用 JSON.parse() 解析为 posts 数组。
  3. 定义计算余弦相似度的函数:

    • cosineSimilarity 函数接受两个向量 v1v2 作为参数。
    • 首先计算两个向量的点积,然后分别计算两个向量的长度,最后计算它们的余弦相似度。
  4. 生成搜索文本的嵌入向量:

    • 定义要搜索的文本 searchText"vue组件开发"
    • 使用 client.embeddings.create() 方法,利用预训练的文本嵌入模型 "text-embedding-ada-002" 生成搜索文本的嵌入向量。
    • 从响应结果中获取生成的嵌入向量 embedding
  5. 计算每个帖子与搜索文本的相似度:

    • 遍历 posts 数组,使用 map() 方法为每个帖子计算与搜索文本的余弦相似度。
    • 将相似度值添加到新创建的对象中,并保留原有的帖子属性。
  6. 按相似度排序并取前 3 个结果:

    • 使用 sort() 方法按相似度从小到大排序。
    • 反转排序结果,使相似度从大到小排列。
    • 使用 slice(0, 3) 取前 3 个最相似的帖子。
  7. 格式化输出结果:

    • 使用 map() 方法,将每个帖子的序号、标题和分类格式化为一个字符串。
    • 使用 join("\n") 将格式化后的字符串连接起来,形成最终的输出结果。
  8. 输出结果:

    • 将格式化后的输出结果打印到控制台。
// 导入文件系统模块的异步版本
import fs from "fs/promises";
// 导入一个名为 client 的对象
import { client } from "./app.service.mjs";

// 定义输入文件的路径
const inputFilePath = "./data/posts_with_embeddings.json";

// 从文件中读取并解析 JSON 数据,得到 posts 数组
const posts = JSON.parse(await fs.readFile(inputFilePath, "utf-8"));

// 定义一个计算余弦相似度的函数
const cosineSimilarity = (v1, v2) => {
  // 计算两个向量的点积
  const dotProduct = v1.reduce((acc, curr, i) => acc + curr * v2[i], 0);
  // 计算第一个向量的长度
  const lengthV1 = Math.sqrt(v1.reduce((acc, curr) => acc + curr * curr, 0));
  // 计算第二个向量的长度
  const lengthV2 = Math.sqrt(v2.reduce((acc, curr) => acc + curr * curr, 0));
  // 计算余弦相似度
  const similarity = dotProduct / (lengthV1 * lengthV2);
  return similarity;
};

// 定义要搜索的文本
const searchText = "vue组件开发";
// 使用 client 对象生成文本的嵌入向量
const response = await client.embeddings.create({
  model: "text-embedding-ada-002",
  input: searchText,
});
// 获取生成的嵌入向量
const { embedding } = response.data[0];

// 遍历 posts 数组,计算每个帖子与搜索文本的相似度,并按相似度排序
const results = posts
  .map((item) => ({
    // 复制 item 的所有属性
    ...item,
    // 计算相似度并添加到新对象中
    similarity: cosineSimilarity(embedding, item.embedding),
  }))
  // 按相似度从小到大排序
  .sort((a, b) => a.similarity - b.similarity)
  // 反转排序结果,使相似度从大到小
  .reverse()
  // 取前 3 个最相似的帖子
  .slice(0, 3)
  // 格式化输出字符串
  .map((item, index) => `${index + 1},${item.title},${item.category}`)
  // 用换行符连接输出字符串
  .join("\n");

// 输出结果
console.log(results);

最终我们就能在打印台上看到效果了

🚀总结

本文讲解了利用 OpenAI 的 Embedding 技术实现相关推荐以及搜索的功能,对比传统的搜索,使用AI去实现这个功能更加的高效

在当今的AI时代,紧跟AI步伐,使用AI技术为产品提供更加优秀的功能,这是很重要的

希望看到这里的你能够有所收获!!!!

读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓
在这里插入图片描述

👉AI大模型学习路线汇总👈

大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉大模型实战案例👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉大模型视频和PDF合集👈

观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉获取方式:

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1958938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UCOS-III 互斥锁接口详解

在实时操作系统uC/OS-III中,互斥锁(Mutex)是一种用于管理对共享资源的访问的同步机制。互斥锁通过保证在任何时刻只有一个任务可以持有锁,从而防止资源竞争问题。同时,uC/OS-III还实现了递归锁定和优先级继承机制&…

七款公司常用的加密软件推荐|2024年公司办公加密软件推荐

在现代企业中,加密软件是保护敏感信息、防止数据泄露和确保通信安全的关键工具。加密软件能够对数据进行加密,使其在未经授权的情况下无法被读取或篡改,本文分享七款加密软件,它们各具特色,能够满足不同的安全需求。 1…

狂赚又吸金 身心灵赛道AI玩法全解析

想必很多初入AI的小白们,小白的不能在小白了,因为在他们眼中,确实对AI一无所知。 基于他们平时刷抖音、刷视频号的习惯,有的时候会发一些传统剪辑的作品,问AI怎么做?很多人认为AI所见的视频,AI…

GeoServer发布MongoDB中的shp数据全流程梳理

目录 前言1.shp转geojson2.shp导入MongoDB3.创建空间索引4.GeoServer安装MongoDB插件5.发布6.注意事项6.1 geojson要去掉头尾6.2 MongoDB4.4以上的mongoimport工具需要额外安装6.3 空间索引是必须项 7.总结 前言 网上搜到的GeoServer发布MongoDB中的矢量数据或shp数据的文章比较…

http协议与nginx

动态页面与静态页面的差别: (1)URL不同 静态⻚⾯链接⾥没有“?” 动态⻚⾯链接⾥包含“?” (2)后缀不同 (开发语⾔不同) 静态⻚⾯⼀般以 .html .htm .xml 为后缀 动态⻚⾯⼀般以 .php .jsp .py等为后…

我国工业大模型发展中的四个反差现象

以大模型为代表的新一代人工智能技术正加速推进新型工业化的变革进程。2024年1月,国务院常务会议研究部署推动人工智能赋能新型工业化有关工作,强调以人工智能和制造业深度融合为主线,以智能制造为主攻方向,以场景应用为牵引&…

【Git从入门到精通】——知识概述及Git安装

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL&#xff0…

Google Test的使用

Google Test支持的操作系统包含下面这些: 1、Linux 2、Mac OS X 3、Windows 4、Cygwin 5、MinGW 6、Windows Mobile 7、Symbian一、google test的基本使用步骤 1、包含gtest/gtest.h头文件 2、使用TEST()宏定义测试case 3、在测试体中使用gooletest断言进行值检查…

Java从入门到精通(十四) ~ 多线程

晚上好,愿这深深的夜色给你带来安宁,让温馨的夜晚抚平你一天的疲惫,美好的梦想在这个寂静的夜晚悄悄成长。 目录 前言 一、多线程是什么? Java中的多线程 二、使用步骤 1.创建方式 1.1 Thread 线程 1.2 Runnable 任务 1.…

视创云展:重塑线上会议体验,六大核心引领数字空间新纪元

视创云展以其革命性的“数字活动”解决方案为核心,精心构建了一个超越想象的未来数字世界。通过整合六大前沿技术模块,它不仅为参会者打造了一个身临其境的线上会议环境,更让每一位参与者都能跨越物理界限,深刻感受会议的每一个瞬…

2024经济师考试报名『注册流程』图解!

⏰报名时间:8月12日—9月11日 ☑️报名注册流程 1、经济师考试报名注册网站:中国人事考试网. 2、点击考生登录栏目中的【新用户注册】按钮,进行注册。 3、进入用户注册界面,填写注册信息。 4、填写完毕确认无误后点击【提交】&…

CMS61850客户端

近一年都比较忙,很久没有更新文档了。这次抽了点时间,把CMS61850的客户端再补上。方便大家进一步的学习。当然61850相关的文档已经写的快吐了。不出意外,这应该是最后一篇关于61850的文章了。 本次提供的demo,可直接在windows上运…

【React】WeChat微信网站应用登录之wxLogin.js

以下基于wxLogin.js在React应用中使用案例 实验环境 antd:^5.14.1next:14.1.0react:^18 组件调用示例 "use client";import { useEffect, useState } from "react"; import { WechatChannel } from "./channel&qu…

【论文阅读笔记】DeepCAD: A Deep Generative Network for Computer-Aided Design Models

1 引言 现有3D生成模型: 3D点云:大量离散的3D点组成的数据表示形式; 多边形网格:一系列相连的多边形组成的3D模型; 水平集场:使用数值函数来表示物体的边界,并根据函数值的正负来确定物体内部…

示波器显示屏5个名词解释(峰峰值、平均值、频率、占空率、上升时间)

一般在使用示波器时,需要找到示波器测量的一些数据,包括峰峰值、频率等,但所显示出的所有名词可能不是很能理解,小编今天就具体介绍一下。下图是一般我们调节过后的示波器显示屏的数据显示: 1、峰-峰值 (Pe…

Clickhouse 生产集群部署(Centos 环境)

文章目录 机器环境配置安装 JDK 8安装 zookeeperClickhouse 集群安装rpm 包离线安装修改全局配置zookeeper配置Shard和Replica设置image.png添加macros配置启动 clickhouse启动 10.82.46.135 clickhouse server启动 10.82.46.163 clickhouse server启动 10.82.46.218 clickhous…

Python中的类型注解和静态类型检查使用详解

概要 Python作为一种动态类型语言,其灵活性和易用性使其广受欢迎。然而,动态类型也带来了一些问题,如代码可读性差和运行时错误等。为了提高代码质量和可维护性,Python从3.5版本开始引入了类型注解(Type Hints),并且借助第三方工具可以实现静态类型检查。本文将详细介绍…

熊猫乳品再创新高:超高温灭菌稀奶油,驱动餐饮品质升级

随着餐饮行业的蓬勃发展,乳制品在餐饮端的应用日益广泛且需求多样化。中华老字号品牌企业熊猫乳品,在近期推出了专为餐饮定制的高品质产品-熊猫乳品超高温灭菌稀奶油,凭借其卓越性能,在多项测试中脱颖而出,成为餐饮制作…

Docker入门指南:基础命令、操作容器与镜像管理,附存储、网络及Compose应用

Docker命令 下载镜像 命令命令示例docker search 镜像名检索镜像docker search nginxdocker pull 镜像名下载镜像docker pull nginxdocker images / docker image ls查看镜像列表/docker rmi 镜像名/IMAGE ID删除指定镜像docker rmi nginx / docker rmi e784f4560448 镜像名&…

【计算机网络】TCP和UDP的封装以及案例

TCP和UDP的封装以及案例 背景知识TCP实现UDP实现封装Network用NetWork再次实现TCP和UDP小知识点 背景知识 TCP:传输控制协议(Transmission Control Protocol) UDP:用户数据报协议 (User Datagram Protocol&#xff09…