假如你和我一样在准备24年的春招,在前端全栈外,再准备一些AI的内容是非常有必要的。24年是AI红利年,AIGC+各种岗位大厂机会会多些,同意的请点赞。也欢迎朋友们加我微信shunwuyu, 一起交流。
前言
年前几天,把吴恩达AI系列的Building Applications with Vector Databases – DeepLearning.AI刷完了,并写了系列学习文章。将Pinecone向量数据库用于Semantic Search
、RAG
、Recommend System
、Hybrid 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
在句式上除了最后一个词外,几乎一样。但是person
和dog
还是天差地别的, 感觉0.695的相似度太高了。或许这就是它被称为Sentence Tramsformer
的原因,维度也只有384,把它做为从文本匹配类搜索过渡到Semantic Search
的免费大模型方案还是可以的。
# 安装依赖
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)
# 向量生成
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-transformers
的384
,收集的数据特征值更多,适合商业化、更专业的知识库打造。
使用流程如下
- 安装OpenAI
!pip install openai
- 实例化
from openai import OpenAI
openai_client = OpenAI(api_key=OPENAI_API_KEY)
- 封装embedding函数
def get_embeddings(articles, model="text-embedding-ada-002"):
return openai_client.embeddings.create(input = articles, model=model)
- 调用
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的库,用于创建稀疏向量。
from pinecone_text.sparse import BM25Encoder
bm25 = BM25Encoder()
bm25.fit(metadata['productDisplayName'])
- Facenet
在Facial Similarity Search
实例中,面部识别我们用到了DeepFace的Facenet
。
该框架在人脸识别任务上表现优秀,能够进行人脸检测、对齐、特征提取以及人脸识别匹配等操作,并且支持不同场景下的身份验证和人脸识别应用。通过将多个顶级人脸识别模型集成在一起,Deepface 可以根据不同的需求和数据集选择最佳模型或策略,从而实现高达 97% 的高精度识别率。
!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
模型完成文章编写。
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.nn"+
"Context:n"
)
prompt_end = (
f"nnQuestion: {query}nAnswer:"
)
prompt = (
prompt_start + "nn---nn".join(contexts) +
prompt_end
)
print(prompt)
总结
在吴恩达AI系列的Building Applications with Vector Databases – DeepLearning.AI中,确实帮助我构建起来了多种不同用途大模型的概念和使用经验。以前对于大模型,理解是OpenAI或其它,在参数层面、模态层面、开闭源的不同。通过与嵌入向量相关的Semantic Search
、RAG
、Recommend System
、Hybrid Search
、Facial Similarity Search
任务的学习,开始关注不同nlp任务挑选相应的模型。