假设你和我相同在预备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,或嵌入,通常指的是将文本数据(如单词、短语或整个文档)转换为数值向量的进程。这些数值向量捕捉了文本的语义特征,使得计算机能够了解和处理言语数据。

Pinecone总结一:大模型视点

  • 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社区,有各种开源大模型、数据集,而且能够云运转这些模型,再也不用为显卡忧愁了….

Pinecone总结一:大模型视点

在上图中,源句是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的免费大模型方案仍是能够的。

# 装置依靠
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

Pinecone总结一:大模型视点

  • text-embedding-ada-002

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

运用流程如下

  • 装置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 SearchRAGRecommend SystemHybrid SearchFacial Similarity Search使命的学习,开端关注不同nlp使命选择相应的模型。

参考资料