🚀前言
在当今的 AI 时代,传统的相关内容推荐和搜索功能已经显得相对简单和低效。借助 AI 技术,我们可以实现更加智能化和个性化的内容发现体验。
本文将为大家介绍如何利用 OpenAI 的 Embedding 技术,打造出智能、高效的相关内容推荐和搜索功能。
🚀OpenAI Embedding
OpenAI Embedding 是一种将文本转化为密集型数值向量的技术,这些向量可以很好地表示文本的语义特征。其背后的核心思想是利用深度学习模型对大量文本数据进行训练,从而学习到文本的潜在语义表示。
具体来说,OpenAI 使用了一种名为 Transformer 的神经网络架构,通过自注意力机制捕捉文本中词语之间的关联性。训练完成后,Transformer 模型可以将任意长度的文本输入转换为一个固定长度的密集向量,这就是 Embedding。
这个 Embedding 向量包含了文本的语义信息,例如词义、上下文关系、情感倾向等。向量中的数值代表了文本在语义空间中的位置,相似的文本会对应到相近的位置。
因此,我们可以利用 Embedding 向量计算文本之间的语义相似度。比如说,通过计算两篇文章 Embedding 向量之间的余弦相似度,就可以得到它们在语义上的接近程度。这为实现相关内容推荐和搜索功能提供了强大的技术支持。
🚀代码实现
首先去安装对应的依赖
js 代码解读复制代码import OpenAI from "openai";
import dotenv from "dotenv";
这里dotenv的作用为可以帮助我们在开发过程中管理环境变量,我们的OPENAI_API_KEY就放在这里面
现在我们去调用embeddings接口看会得到一个什么?
js 代码解读复制代码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
js 代码解读复制代码// 模块化输出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接口,将数据向量化以后生成一个新的文件后输出
js 代码解读复制代码// 先把所有的内容计算向量
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接口将每个数据都进行了向量化
接下来要做的就是将我们要推荐的数据通过向量比较计算相似度,然后输出结果了
- 导入依赖模块:
- 从
fs/promises
导入文件系统模块的异步版本。 - 从
./app.service.mjs
导入一个名为client
的对象。
- 从
- 读取并解析 JSON 数据:
- 定义输入文件的路径
inputFilePath
。 - 使用
fs.readFile()
异步读取文件内容,并使用JSON.parse()
解析为posts
数组。
- 定义输入文件的路径
- 定义计算余弦相似度的函数:
cosineSimilarity
函数接受两个向量v1
和v2
作为参数。- 首先计算两个向量的点积,然后分别计算两个向量的长度,最后计算它们的余弦相似度。
- 生成搜索文本的嵌入向量:
- 定义要搜索的文本
searchText
为"vue组件开发"
。 - 使用
client.embeddings.create()
方法,利用预训练的文本嵌入模型"text-embedding-ada-002"
生成搜索文本的嵌入向量。 - 从响应结果中获取生成的嵌入向量
embedding
。
- 定义要搜索的文本
- 计算每个帖子与搜索文本的相似度:
- 遍历
posts
数组,使用map()
方法为每个帖子计算与搜索文本的余弦相似度。 - 将相似度值添加到新创建的对象中,并保留原有的帖子属性。
- 遍历
- 按相似度排序并取前 3 个结果:
- 使用
sort()
方法按相似度从小到大排序。 - 反转排序结果,使相似度从大到小排列。
- 使用
slice(0, 3)
取前 3 个最相似的帖子。
- 使用
- 格式化输出结果:
- 使用
map()
方法,将每个帖子的序号、标题和分类格式化为一个字符串。 - 使用
join("\n")
将格式化后的字符串连接起来,形成最终的输出结果。
- 使用
- 输出结果:
- 将格式化后的输出结果打印到控制台。
js 代码解读复制代码// 导入文件系统模块的异步版本
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技术为产品提供更加优秀的功能,这是很重要的
如何学习AI大模型?
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓