Pinecone总结一:大模型角度

假如你和我一样在准备24年的春招,在前端全栈外,再准备一些AI的内容是非常有必要的。24年是AI红利年,AIGC+各种岗位大厂机会会多些,同意的请点赞。也欢迎朋友们加我微信shunwuyu, 一起交流。

前言

年前几天,把吴恩达AI系列的Building Applications with Vector Databases - DeepLearning.AI刷完了,并写了系列学习文章。将Pinecone向量数据库用于Semantic SearchRAGRecommend SystemHybrid Search等实战,收获挺多的。

今天是大年初三,新年好。先预祝各位春招都去大厂,去的岗位都偏AIGC方向,把握未来最大机会。写篇Pinecone系列总结,顺便给大家拜个年。

Pinecone

Building Applications with Vector Databases - DeepLearning.AI是吴恩达与Pinecone合作的课程,向量数据库使用的是Pinecone。之前也用过chromadb、Fasis等,Pinecone最近提供了ServerlessSpec云服务,注册就送100$体验金。绝非广告,单纯薅了羊毛感谢下,可以访问Pinecone

模型

我想大部分和我一样从前端因AIGC跨到人工智能的同学,对大模型的理解大概会是从OpenAI一些文本生成(text-davinci-00X)、文本嵌入(text-embedding-ada-002)API式的学习开始,到后面接触到Hugging Face里的开源模型,再到GPT4、Gemini等最新模型,以及DALL-E等多模态模型。各家大厂几乎都推出了自家的大模型,且与OpenAI的不相上下。24年,我们做AI应用,在项目中同时使用多种大模型的能力是非常重要的。

我们来看下Pinecone系列用到了哪些模型:

嵌入模型

在自然语言处理(NLP)中,"embedding" 是一个非常关键的概念。Embedding,或嵌入,通常指的是将文本数据(如单词、短语或整个文档)转换为数值向量的过程。这些数值向量捕捉了文本的语义特征,使得计算机能够理解和处理语言数据。

  • all-MiniLM-L6-v2

Semantic Search 一节中,我们使用了HuggingFace 社区开源的all-MiniLM-L6-v2来做embedding

这是一个由微软提供的轻量级句子转换器Sentence Transformer模型,它将句子和段落映射到384维的密集向量空间,可用于聚类或语义搜索等任务。它基于 MiniLM 架构并进行了优化以生成高质量的文本向量表示。MiniLM 系列模型是为高效、快速且资源占用较小的场景设计的预训练语言模型。我们可以到它在Hugging Face上的模型页面去理解,玩下它的Examples就清楚什么叫基于句子的Transformer。如果您还没有怎么用过Hugging Face, 建议立马行动起来。它是目前最火的AI社区,有各种开源大模型、数据集,而且可以云运行这些模型,再也不用为显卡发愁了...,可用于聚类或语义搜索等任务。我们可以到它在Hugging Face上的模型页面去理解,玩下它的Examples就清楚什么叫基于句子的Transformer。如果您还没有怎么用过Hugging Face, 建议立马行动起来。它是目前最火的AI社区,有各种开源大模型、数据集,而且可以云运行这些模型,再也不用为显卡发愁了....

在上图中,源句是That is a happy person, 比较的句子中That is a happy person得分最高(0.943分),Today is a sunny day得分最低,句子几乎什么相同的。而That is a happy dog 在句式上除了最后一个词外,几乎一样。但是persondog还是天差地别的, 感觉0.695的相似度太高了。或许这就是它被称为Sentence Tramsformer的原因,维度也只有384,把它做为从文本匹配类搜索过渡到Semantic Search的免费大模型方案还是可以的。

python 复制代码
# 安装依赖
pip install -U sentence-transformers
# 引入SentenceTransformer
from sentence_transformers import SentenceTransformer
# cuda 即显卡判断,如果有,运行会快一些,否则,慢一些
device = 'cuda' if torch.cuda.is_available() else 'cpu'
if device != 'cuda':
    # 我穷,我被sorry
    print('Sorry no cuda.')
# 实例化SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2', device=device)
ini 复制代码
# 向量生成
query = 'which city is the most populated in the world?'
# 向量嵌入
xq = model.encode(query)
xq.shape
xq
  • text-embedding-ada-002

在Retrieval Augmented Generation(RAG)安全中,我们使用的嵌入模型是text-embedding-ada-002。它的维度是1536,相比sentence-transformers384,收集的数据特征值更多,适合商业化、更专业的知识库打造。

使用流程如下

  • 安装OpenAI
diff 复制代码
!pip install openai
  • 实例化
ini 复制代码
from openai import OpenAI
openai_client = OpenAI(api_key=OPENAI_API_KEY)
  • 封装embedding函数
ini 复制代码
def get_embeddings(articles, model="text-embedding-ada-002"):
   return openai_client.embeddings.create(input = articles, model=model)
  • 调用
ini 复制代码
query = "what is the berlin wall?"
embed = get_embeddings([query])
  • clip-ViT-B-32

我们在Hybrid Search项目中,使用到了sentence-transformers/clip-ViT-B-32。数据集ashraq/fashion-product-images-small里每行记录都包含一张图片,为优化搜索效果,我们对数据集进行了密集编码(Dense Vector)。

all-MiniLM-L6-v2是一个文本嵌入模型,而clip-ViT-B-32是跨模态的。它们专注于不同的自然语言处理任务和多模态学习领域。相同点是都基于Sentence Transformers库实现。

clip-ViT-B-32使用了Vison Transformer(ViT)架构作为视觉编码部分,将图像分割为小块并转化为序列进行处理。它的主要目标是将统一文本和图像表示空间,使得可以通过文本准确地检索或分类图像。

  • BM25

BM25是一种用于信息检索的排名算法,它基于词频(TF)、逆文档频率(IDF)以及其他统计特性来估计一个文档对于给定查询的相关性。

当我们将稀疏向量与BM25结合,比如在构建搜索引擎时,先用稀疏向量表示文档集合,然后利用MB25算法对这些稀疏向量进行打分,从而高效地找出与用户查询相关的文档。

我们会去安装一个pinecone叫做pinecone-text的库,用于创建稀疏向量。

css 复制代码
from pinecone_text.sparse import BM25Encoder
bm25 = BM25Encoder()
bm25.fit(metadata['productDisplayName'])
  • Facenet

Facial Similarity Search实例中,面部识别我们用到了DeepFace的Facenet

该框架在人脸识别任务上表现优秀,能够进行人脸检测、对齐、特征提取以及人脸识别匹配等操作,并且支持不同场景下的身份验证和人脸识别应用。通过将多个顶级人脸识别模型集成在一起,Deepface 可以根据不同的需求和数据集选择最佳模型或策略,从而实现高达 97% 的高精度识别率。

scss 复制代码
!pip install deepface
from deepface import DeepFace
embedding = DeepFace.represent(img_path=child_base, model_name=MODEL)[0]['embedding']
print(embedding)

生成模型

  • gpt-3.5-turbo-instruct

RAG实力中,当我们拿到检索结果后,交给gpt-3.5-turbo-instruct 生成了一篇文章。

首先,调用上面封装好的get_embeddings方法,拿到查询结果。再组织prompt,装载查询结果,交由生成类的 gpt-3.5-turbo-instruct模型完成文章编写。

ini 复制代码
query = "write an article titled: what is the berlin wall?"

res = index.query(vector=embed.data[0].embedding, top_k=3, include_metadata=True)

contexts = [
    x['metadata']['text'] for x in res['matches']
]

prompt_start = (
    "Answer the question based on the context below.\n\n"+
    "Context:\n"
)

prompt_end = (
    f"\n\nQuestion: {query}\nAnswer:"
)

prompt = (
    prompt_start + "\n\n---\n\n".join(contexts) + 
    prompt_end
)

print(prompt)

总结

在吴恩达AI系列的Building Applications with Vector Databases - DeepLearning.AI中,确实帮助我构建起来了多种不同用途大模型的概念和使用经验。以前对于大模型,理解是OpenAI或其它,在参数层面、模态层面、开闭源的不同。通过与嵌入向量相关的Semantic SearchRAGRecommend SystemHybrid SearchFacial Similarity Search任务的学习,开始关注不同nlp任务挑选相应的模型。

参考资料

相关推荐
正义的彬彬侠30 分钟前
sklearn.datasets中make_classification函数
人工智能·python·机器学习·分类·sklearn
ctrey_32 分钟前
2024-11-13 学习人工智能的Day26 sklearn(2)
人工智能·学习·sklearn
安静的_显眼包O_o33 分钟前
from sklearn.preprocessing import Imputer.处理缺失数据的工具
人工智能·python·sklearn
安静的_显眼包O_o37 分钟前
from sklearn.feature_selection import VarianceThreshold.移除低方差的特征来减少数据集中的特征数量
人工智能·python·sklearn
AI服务老曹1 小时前
不仅能够实现前后场的简单互动,而且能够实现人机结合,最终实现整个巡检流程的标准化的智慧园区开源了
大数据·人工智能·深度学习·物联网·开源
云空1 小时前
《InsCode AI IDE:编程新时代的引领者》
java·javascript·c++·ide·人工智能·python·php
正义的彬彬侠1 小时前
CatBoost 中对分类特征进行目标变量统计编码 公式解析
人工智能·机器学习·集成学习·boosting·catboost
字节跳动数据平台2 小时前
火山引擎 VeDI 平台以 AIGC 技术,助力企业提效营销、快速增长
人工智能
Chef_Chen2 小时前
从0开始学习机器学习--Day22--优化总结以及误差作业(上)
人工智能·学习·机器学习
Mr.简锋2 小时前
opencv常用api
人工智能·opencv·计算机视觉