看看ChatGPT的Embedding接口都完成哪些任务

LLM(大语言模型)、Chat 大模型和 Embedding 大模型 LLM 是一种大规模的语言生成模型,通常基于 Transformer 架构,经过大量文本数据的训练,能够理解自然语言并生成高质量的文本。 阅读详情

调用Embedding接口完成文本分类

前面博客介绍了如何调用ChatGPT的Embedding接口完成文本聚类任务,实现过程入下图所示:

 除了完成文本分类,调用Embedding接口还可完成聚类任务。

调用Embedding接口完成聚类任务

聚类任务是一种无监督学习任务,其目的是将一组数据点划分成若干个类别或簇,使得同一个簇内的数据点之间的相似度尽可能高,而不同簇之间的相似度尽可能低。聚类算法可以帮助我们发现数据中的内在结构和模式,发现异常点和离群值,简化数据表示。大白话讲就是无监督学习的内容分类。下面的代码中,读取的数据文件是带向量的20_newsgroup_with_embdding.parquet数据,即调用ChatGPT的Embedding接口生成向量信息。原始的20_newsgroup是来源于“from sklearn.datasets import fetch_20newsgroups”。


import numpy as np
from sklearn.cluster import KMeans
import pandas as pd
from IPython.display import display

embedding_df = pd.read_parquet("cluster/20_newsgroup_with_embedding.parquet")

matrix = np.vstack(embedding_df.embedding.values)
num_of_clusters = 20

kmeans = KMeans(n_clusters=num_of_clusters,
                init="k-means++", n_init=10, random_state=42)
kmeans.fit(matrix)
labels = kmeans.labels_
embedding_df["cluster"] = labels
embedding_df.head()

# 统计每个cluster的数量
new_df = embedding_df.groupby(
    'cluster')['cluster'].count().reset_index(name='count')

# 统计这个cluster里最多的分类的数量
title_count = embedding_df.groupby(
    ['cluster', 'title']).size().reset_index(name='title_count')
first_titles = title_count.groupby('cluster').apply(
    lambda x: x.nlargest(1, columns=['title_count']))
first_titles = first_titles.reset_index(drop=True)
new_df = pd.merge(new_df, first_titles[[
                  'cluster', 'title', 'title_count']], on='cluster', how='left')
new_df = new_df.rename(
    columns={'title': 'rank1', 'title_count': 'rank1_count'})

# 统计这个cluster里第二多的分类的数量
second_titles = title_count[~title_count['title'].isin(first_titles['title'])]
second_titles = second_titles.groupby('cluster').apply(
    lambda x: x.nlargest(1, columns=['title_count']))
second_titles = second_titles.reset_index(drop=True)
new_df = pd.merge(new_df, second_titles[[
                  'cluster', 'title', 'title_count']], on='cluster', how='left')
new_df = new_df.rename(
    columns={'title': 'rank2', 'title_count': 'rank2_count'})
new_df['first_percentage'] = (
    new_df['rank1_count'] / new_df['count']).map(lambda x: '{:.2%}'.format(x))
# 将缺失值替换为 0
new_df.fillna(0, inplace=True)
# 输出结果
display(new_df)

上面的代码读取带向量的文本信息后,再调用比较简单的聚类算法K-means完成聚类任务,因为知道原始数据是来源于不同类型的20种news,所以调用Kmeans函数时,传入的number_of_cluster是20.后续的代码主要是验证Kmeans算法得到的聚类结果准确性。下面的表格是验证逻辑输出的结果,通过计算每种cluster中前两类类型的占比来看聚类准确率,以cluster0为例,first_percentage的占比是93%,说明聚类效果比较好。

 总结而言,调用Eembedding接口完成聚类的任务的步骤如下,和文本分类步骤很相似。

 调用Embedding接口优化检索功能

在了解如何使用Embedding接口优化检索功能时,我们先来看Elasticsearch是如何做检索。Elasticsearch是一个基于Lucene的开源搜索引擎,它提供了分布式、多租户的全文搜索引擎服务。Elasticsearch的搜索原理如下所示:

  1. 文档索引:在Elasticsearch中,所有的数据都被组织成一个或多个索引。每个索引包含一个或多个文档,每个文档都有一个唯一的ID和一个或多个字段。

  2. 分词:在搜索之前,查询语句和文档中的字段都需要进行分词处理,将它们分成一个个词语。

  3. 倒排索引:Elasticsearch使用倒排索引来加快搜索速度。倒排索引是一种数据结构,它将每个词语映射到包含该词语的所有文档中,这样就可以快速地找到包含某个词语的所有文档。

  4. 搜索:当用户发送一个查询请求时,Elasticsearch会对查询进行解析和分析,并在倒排索引中查找匹配的文档。Elasticsearch会计算每个文档的相关度分数,并将最相关的文档返回给用户。

  5. 分片:由于数据量可能非常大,Elasticsearch将索引划分为多个分片(shard),每个分片存储索引的一部分数据。当搜索请求发送到集群时,它会被发送到每个分片,然后每个分片都会返回匹配的文档。

  6. 聚合:Elasticsearch还支持聚合操作,可以对搜索结果进行统计、分组、排序等操作。聚合操作可以帮助用户更好地理解数据,提供更有价值的信息。

总结而言,Elasticsearch是通过对查询语句和文档进行分词处理,检索时进行匹配检索的。例如,“气质小清新拼接百搭双肩斜挎包”这样的商品名称,拆分成“气质”“小清新”“拼接”“百搭”“双肩”“斜挎包”。每个标题都是这样切分。然后,建立一个索引,比如“气质”这个词,出现过的标题的编号,都按编号顺序跟在气质后面。其他的词也类似。当用户搜索的时候,比如用户搜索“气质背包”,也会拆分成“气质”和“背包”两个词。然后就根据这两个词,找到包含这些词的标题,根据出现的词的数量、权重等等找出一些商品。通过分词检索可以检索到相关内容,但是如果是相近含义的词语检索可能效果就不太理想。对于这个点,Elasticsearch也提供了一些解决办法:

  1. 同义词过滤器:Elasticsearch可以使用同义词过滤器来将多个词语视为同一个词语。例如,将“汽车”、“轿车”和“车辆”视为同一个词语。

  2. 正则化:在搜索期间,Elasticsearch会对搜索词进行正则化,以便将不同形式的同一词语视为同一个词语。例如,将“running”和“ran”视为同一个词语。

  3. 模糊搜索:Elasticsearch可以使用模糊搜索来查找与搜索词相似的词语。这对于处理拼写错误或仅了解部分词汇的情况非常有用。

其中模糊检索,正则化在常规软件检索功能中也经常用到,同义词过滤的方法,需要将相关同义词都归纳进来才行,而且要完成一个复杂的检索,以电商为例,需要整合的同义词非常多。除了这些方法外,实际还可以利用自然语言处理技术,即利用自然语言处理技术中判断两个词语是否是同义词来完成同义词检索。

    因为ChatGPT开放了Eebedding接口,那么完全可以获取文本的向量信息,然后通过计算距离来确定文本相似性,从而提升相近词语检索准确度。下面的这段代码通过计算检索的内容与原有的所有product的向量见的余弦距离,来找到匹配最相近的内容。

import openai
import os
from openai.embeddings_utils import get_embedding, cosine_similarity
import pandas as pd
import numpy as np

openai.api_key = os.environ.get("OPENAI_API_KEY")
embedding_model = "text-embedding-ada-002"

# read the reviews embedding information
# load data
datafile_path = "cluster/product_with_embedding.csv"

df = pd.read_csv(datafile_path)
df["embedding"] = df.embedding.apply(eval).apply(
    np.array)  # convert string to array

# search through the reviews for a specific product
def search_product(df, query, n=3, pprint=True):
    product_embedding = get_embedding(
        query,
        engine=embedding_model
    )
    df["similarity"] = df.embedding.apply(
        lambda x: cosine_similarity(x, product_embedding))

    results = (
        df.sort_values("similarity", ascending=False)
        .head(n)
        .productname
    )
    if pprint:
        for r in results:
            print(r)
    return results

results = search_product(df, "凉快的裙子", n=3)

 代码中设置了找到最相近的三个product,当检索“凉快的裙子”的时候,原始的product文件中并没有完全相同的词语,因为采用向量间距离的方式,最终检索出了三条数据,例如清凉透气,轻盈凉爽等,和用检索的目标product很贴近。总结而言,调用Embeeding接口,优化检索能力的过程如下所示:

另外,除了上面的优化检索功能,还可以应用到推荐产品的冷启动上。

调用Embedding接口完成推荐系统的冷启动

推荐系统的“冷启动”问题是指,在推荐系统开始运行时或添加新的产品时,由于缺乏足够的用户行为数据或产品元数据,导致推荐系统无法准确预测用户喜好或推荐相应的产品。这个问题对于新产品的上线和新用户的注册都是很常见的。在这种情况下,推荐系统需要寻找其他的方式来生成个性化推荐,例如利用用户的基本信息、偏好标签等,或者采用基于内容的推荐或混合推荐方法。在有了Eebedding接口后,可以提前生成所有product的向量信息,当用户在review某个product时,可以计算review的product的向量信息与其他product的向量间的距离来推荐给用户。总结而言辅助进行冷启动的过程如下所示:

当然上面的代码只是一个demo code,因为每次检索都需要计算和所有产品的余弦距离,如果product很多的情况下,检索性能不一定高,在实际项目中可以利用一些能快速检索向量相似性的库来提升匹配性能。例如Faiss,Faiss(Facebook AI Similarity Search)是Facebook开源的一个高性能相似性搜索库,其主要作用是进行向量的相似性搜索和聚类。Faiss是基于高度优化的算法实现的,具有快速高效的搜索速度和低内存占用等优点。它支持多种相似性度量,包括欧几里得距离、内积和余弦相似度等,还提供了多种搜索算法,如精确搜索、近似搜索和聚类等。

除了Faiss,还有Pinecone、Weaviate等。Pinecone是一种托管服务,用于存储、索引和查询向量。它旨在帮助开发人员更轻松地构建、部署和管理基于向量的应用程序,如搜索、推荐和相似性匹配。Pinecone提供高性能的向量索引和查询,可以支持海量向量的存储和快速检索。同时,它还提供了简单易用的API和客户端库,可以轻松地将向量集成到应用程序中。

Weaviate是一种基于向量搜索的开源知识图谱和搜索引擎,使用GraphQL API进行查询。它支持半结构化和非结构化数据,并使用机器学习算法为实体和属性赋予向量表示。这使得Weaviate能够对数据进行相似度搜索,例如:相似问题,相似产品,相似文章等。Weaviate还具有自动化数据管理和验证功能,可以轻松地添加,更新和删除实体,属性和关系。

总结而言,通过调用ChatGPT的Embedding接口获取向量信息,存储到Pinecone或者Weaviate等服务上,通过计算输入信息也已有信息的向量距离,可以快速进行相似性度量。

从零开始构建基于ChatGPT的嵌入式(Embedding)本地医疗客服问答机器人模型(看完就会,看到最后有惊喜) 代码全部开源,GitHub地址为:前端完全也能搭建, 前端完全也能搭建, 前端完全也能搭建, 本文中我使用的是后端语言golang,来调用的所有外部接口,但它们均是restful api,所以如果你使用的是其他语言,那么是完全可以替换的,包括nodejs或者直接使用前端请求都是可以实现我的功能的。后面有机会会使用vue3来添加一个页面,现在主要通过postman或者apifox来调试接口,主要为了验证逻辑想法。接下来首先来看看embeddings到底是什么吧可以被应用于以下几种情况。 阅读详情

相关推荐

【GPT】根据embedding进行相似匹配(QA问答、redis使用、文本推荐)

QA使用的是用户的Question去匹配已有知识库,而推荐是使用用户的浏览记录去匹配。但是很明显,推荐相比QA要更复杂一些,主要包括以下几个方面: 刚开始用户没有记录时的推荐(一般行业称为冷启动问题)。 除了相似还有其他要考虑的因素:比如热门内容、新内容、内容多样性、随时间变化的兴趣变化等等。 编码(Embedding输入)问题:我们应该取标题呢,还是文章,还是简要描述或者摘要,还是都要计算。 规模问题:推荐面临的量级一般会远超QA,除了横向扩展机器,是否能从流程和算法设计上提升效率。 用户反馈对推荐系统

发现问题,并解决问题,批判性思维 4037

最新ChatGPT GPT-4 相似匹配Embedding技术详解(附ipynb与python源码及视频讲解)——开源DataWhale发布入门ChatGPT技术新手从0到1必备使用指南手册(一)

如果您想提高文本处理的效率和精度,那么Embedding技术就是您必须掌握的最重要利器。在本文中,不仅将详细介绍Embedding的基本概念,还将通过实际代码演示如何使用相关API,其中包括LMAS Embedding API和ChatGPT API等。同时还深入剖析Embedding在QA应用、聚类应用和推荐应用方面的具体应用场景。

小胡说人工智能的博客 8541

神经网络 Embedding层理解; Embedding层中使用预训练词向量

Embedding:高维稀疏特征向量到低维稠密特征向量的转换;嵌入层将正整数(下标)转换为具有固定大小的向量 Embedding 字面理解是 “嵌入”,实质是一种映射,从语义空间到向量空间的映射,同时尽可能在向量空间保持原样本在语义空间的关系,如语义接近的两个词汇在向量空间中的位置也比较接近。 应用: 在深度学习推荐系统中,Embedding主要的三个应用方向: 1、在深度学习网络中作为Embedding层,完成从高维稀疏特征向量到低维稠密特征向量的转换; 2、作为预训练的Embedding特征向量,与其

weixin_42357472的博客 1万+

调用ChatGPT的Embedding接口完成文本分类任务

采用实际demo代码的方式介绍如何调用ChatGPT的embedding接口获取文本向量,从而完成文本分类任务

qiaotl的博客 2465

ChatGPT使用指南——相似匹配

简单回顾一下,要做QA任务首先咱们得有一个QA库,这些QA就是我们的仓库,每当一个新的问题过来时,我们就用这个问题去和咱们仓库里的每一个Q去匹配,然后找到最相似的那个,接下来就把该问题的Answer当做新问题的Answer交给用户。这中间当然经历了比较多的探索,一直到如今的大模型时代,对模型输入任意一句话,它都能给我们返回一个非常不错的表示,而且依然是固定长度的向量。当然,在实际使用时,往往不会这么简单的用1/0来表示,因为每个字在句子中的作用是不一样的,所以一般会给不同的Token赋予不同的权重。

AI天才研究院 2万+

ChatGPT基础知识系列之Embeddings模型

这一节主要介绍了ChatGPT的Embeddings模型,主要包括Embeddings 的发展历程和使用方式Embeddings 的使用场景Embedding可以作为其他机器学习模型的输入。

5万+

【ChatGPT原理与应用开发】第二章:相似匹配

此处仅为学习记录和总结。

m0_65787507的博客 812

openEuler 22.03 安装及配置Gitlab容器

在 openEuler 22.03 上安装及配置Gitlab容器

轻步玉阶 3308

OpenAI:ChatGPT API 文档之 Embedding

ChatGPT API 文档之 Embedding

panjiapengfly的博客 4471

时间同步中 TOD 与GPRMC和IRIG-B的区别

时间同步中 TOD 与GPRMC和IRIG-B的区别

ftdlk的博客 1711

从永恒之蓝看内网安全:企业如何用Nmap+MSF快速检测445端口风险

本文探讨了企业如何利用Nmap和Metasploit快速检测445端口风险,防范永恒之蓝(MS17-010)漏洞攻击。通过分阶段检测流程和自动化工具组合,企业可高效识别内网风险主机,并实施紧急隔离与长效防护策略,提升整体网络安全防护能力。

weixin_30772105的博客 592

【文本特征表征(1)】什么是embedding(把物体编码为一个低维稠密向量)pytorch中nn.Embedding原理及使用,大模型的LMAS.Embedding原理及使用

使embedding空前流行的“word2vec”到了深度学习时代,我们一定会首先想到 2013 年的 Word2Vec——没错,句子是由词构成的,有了词向量,句子向量自然而然呼之欲出了。直觉看,直接对每个词的向量拼接、求和、逐元素相乘、取平均值或最大值,得到的向量都可以表示为句子向量。当然,这里面也有一些花样,比如加权重求和:权重可以根据词性、句法结构等设定一个固定值,然后对每个位置的词向量乘权重再求和;权重也可以根据输入向量来,输出向量的_每个元素_都根据输入元素向量进行加权求和。

AbiUni(YY熊) 1万+

HFSS学习笔记——Vivaldi天线仿真(一)

Vivaldi 天线HFSS仿真,HFSS中指数曲线绘制及曲面绘制。

and_future的博客 1万+

如何利用chatgpt embedding技术打造知识库

embedding 是指将单词、短语或文本转换成连续向量空间的过程。这个功能可以广泛的用在分类,搜索,推荐等场景。而且使用embedding技术可以突破chatGPT对于token的限制

lucasma的博客 785

MobaXterm结合SSH密钥对安全连接阿里云ECS的实战教程

本文详细介绍了如何使用MobaXterm结合SSH密钥对安全连接阿里云ECS的实战教程。通过对比传统密码登录的风险,重点讲解了密钥对的生成与配置、阿里云控制台的密钥绑定技巧,以及MobaXterm的高级设置和故障排查方法,帮助用户实现高效、安全的远程连接。

weixin_29208327的博客 464

深入解析Cuk、Zeta和Sepic拓扑:非隔离型开关电源的设计奥秘

本文深入解析了Cuk、Zeta和Sepic三种非隔离型开关电源拓扑的设计奥秘。它们均能实现升降压转换,但特性各异:Cuk拓扑输出反向电压,输入输出纹波极低;Sepic拓扑输出同极性电压,应用广泛;Zeta拓扑输出纹波小,适合精密供电。文章详细对比了其电路结构、工作原理、核心公式及选型指南,帮助工程师根据输入电压范围、输出极性及纹波要求,灵活选择最合适的拓扑方案。

weixin_28308325的博客 466

争取比ChatGPT多知道一点,如何创建和使用embedding?

昨天有小伙伴留言问我:问题来了,如何生成embedding呢?这个问题很简单,可以直接问ChatGPT。即使是3.5的版本,也可以得到不错的回复:我这里贴一下它给出的代码,首先是TensorFlow2版本:接着是pytorch版本:这两个版本的embedding创建过程大同小异,都有现成的api可以使用。传入的参数也类似,两个值,一个是vocab_size,表示的embedding的数量。简单理解就是你需要创建的embedding的值的数量,另外一个。

python1234567_的博客 1583

QGis二次开发 —— 5.1、基于qgis开发雷达扫描、无人机飞行跟踪等(附:源码及工程)

基于qgis开发雷达扫描、无人机飞行跟踪等

318

OpenAI ChatGPT-4开发笔记2024-06:最简Embedding

在文本摘要任务中,将输入文本嵌入为向量有助于模型理解文本的重要信息,从而更好地生成摘要。

我看故我听 931

ue 蓝图 c++ websocket 事件回调

ue 蓝图 c++ websocket 事件回调

jacke121的专栏 163

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

OpenAI ChatGPT API 文档之 Embedding

OpenAI 中的文本 Embedding 衡量文本字符串之间的相关性。

张伟的专栏 2736

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

如何通过Chatgpt+Embedding搭建私有数据FAQ

OpenAI的官方文档给出了相关的解释:Text Embeddings用于测量文本字符串之间的相关性大小,一段文字你可以看成是有限字符的有序排列,一次Embedding操作就是将一段文本转化为一个vector向量,即浮点数组。通过计算两个向量之间的距离来测量两段文字的相关性。小距离表示高相关,大距离表示低相关。“狗咬耗子”“犬类捕食啮齿动物”“我家养了只狗”那很明显1和2是类似的,即使它们之间没有任何相同的文字。那么怎么让计算机知道1和2很相似呢?

python123456_的博客 1260

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

《深入浅出Embedding》随笔

ChatGPT的核心运行机制或许是Transformer, ChatGPT的核心数据机制或许就是嵌入(Embedding)了。

Y525698136的博客 1035

ChatGPT 的 Embedding和Claude的 Embedding 转化结果一样吗

OpenAI 使用自研 BPE 分词器;Anthropic 使用自研 SentencePiece 分词;同一个中文 / 英文句子拆分出的 token 不同,模型提取语义特征的起点就不同。把同一句话交给 OpenAI 和 Claude 生成向量,好比: 同一个人,分别用两套完全不同的测绘规则测绘两套独立星球的坐标,坐标数字毫无关联,没法放在一张地图上对比远近。两家对向量的缩放、标准化处理逻辑不统一,就算语义接近的文本,向量距离分数区间完全对不上。

tongbowen_123的博客 221

ChatGPT Embedding 实战:如何高效处理大规模文本向量化

在自然语言处理(NLP)项目中,文本向量化是构建智能应用的基础。无论是构建一个智能客服系统,还是开发一个文档检索工具,我们都需要将非结构化的文本数据转化为机器可以理解的数值向量。然而,当数据量从几百条激增到百万、千万级别时,传统的向量化方法往往会成为整个系统的性能瓶颈。

2600_94959963的博客 254

ChatGPT Embedding实战:从文本向量化到语义搜索系统搭建

最近在做一个内部知识库项目,需要实现“智能搜索”功能。传统的基于关键词的搜索,比如用LIKE或者的match查询,遇到同义词或者表述方式不同就歇菜了。比如用户搜“如何配置服务器”,但文档里写的是“服务器部署指南”,关键词匹配可能就找不到了。这就是语义搜索要解决的问题。。距离越近,语义越相似。听起来很美好,但真动手做,坑可不少。

2600_94959846的博客 270
上一篇: 使用Kmeans算法完成聚类任务
下一篇: 搭建简单的chatbot并部署到HuggingFace上
taoli-qiao
博客等级 码龄19年 633粉丝 195原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

taoli-qiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值