前端也可以这样零基础入门Pinecone三

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

前言

前端也可以这样零基础入门Pinecone二 - 掘金 (juejin.cn)文章中,我们在RAG应用中使用了Pinecone向量数据库。本文,继续给大家展示Pinecone擅长的应用场景。我们一起来看下推荐系统是怎么做的。

故事

我有位高中同学,是做推荐系统的大佬,在Facebook做广告系统。优秀的大学同学有很多,但这位是隔壁的他。做前端的我, 回家过年,给老妈些钱去买房。老妈约上同学他妈,一起去看楼。我妈看上了一套小三房, 他妈也看中了,不过是这个洋房的整个一单元。

这就是我,一位前端老狗的忧伤。再怎么写vue、react, 也赚不过推荐算法工程师,几十万美金+顶级大厂股票......

好了, 现在有了LLM, 前端老狗也可以搞推荐系统了。闭关一年,成为AI Nativer, 赚到新钱也给老妈买单元....

Demo

图片是虎嗅(huxiu.com)网一篇文章的相关推荐截图,我们要做的功能就类似这种。我们将下载一个新闻类的数据源,embedding向存入Pinecone。某篇文章的标题,让它在Pinecone里做相似度查询,就实现了相关内容推荐。

数据集

python 复制代码
# wget 命令下载 -q 安静模式,不输出下载相关信息  --show-progress 只展示进度信息  -O 重命名为all-the-news-3.zip  数据地址在dropbox里的all-the-news
!wget -q --show-progress -O all-the-news-3.zip https://www.dropbox.com/scl/fi/wruzj2bwyg743d0jzd7ku/all-the-news-3.zip?rlkey=rgwtwpeznbdadpv3f01sznwxa&dl=1%22

# 解压数据
!unzip all-the-news-3.zip

我是在colab环境中调试demo, 从上图可以看出all-the-news-3.zip 166.04M 挺大的。玩NLP, 要有LLM、Dataset的概念,HuggingFace就是方便的帮我们提供了这两者,所以大受欢迎!如果您是前端刚准备玩AI,建议去看在些HuggingFace相关的内容,可以快速上手。

看下数据

python 复制代码
# with 关键字, `with` 语句可以确保在执行完相应的代码块后,无论是否发生异常,都会正确、安全地关闭文件
with open('./all-the-news-3.csv', 'r') as f:
    # csv文件的首行是表头
    header = f.readline()
    # 打印表头,我们就知道了有多少列
    print(header)
sql 复制代码
# 时间、作者、标题、文章内容、url, 主题等
date,year,month,day,author,title,article,url,section,publication

pandas 读取数据

ini 复制代码
# 引入pandas数据分析框架
import pandas as pd
# 读取99特内容
df = pd.read_csv('./all-the-news-3.csv', nrows=99)
# 默认返回DataFrame的前五行数据
df.head()

读取文件和读取数据的区别,我们应该清楚了。pandas 可以直接读取csv格式的文件。下一步开个pandas的系列学习吧!

创建pinecone index表

ini 复制代码
# Pinecone 用于连接向量数据库   ServerlessSpec 云服务
from pinecone import Pinecone, ServerlessSpec
# index 名字为dl-ai
INDEX_NAME = 'dl-ai'
# PINECONE_API_KEY可以到pinecone 后台拿
pinecone = Pinecone(api_key='')
# pinecone.list_indexes 方法列出所有的数据表 
if INDEX_NAME in [index.name for index in pinecone.list_indexes()]:
    # 如果有, 先移除
  pinecone.delete_index(INDEX_NAME)
# create_index 创建index,
# 1536 是openai的向量维度
pinecone.create_index(name=INDEX_NAME, 
dimension=1536, metric='cosine',
# 亚马逊  西部2区
  spec=ServerlessSpec(cloud='aws', region='us-west-2'))
# 当前index对象,后面将用它来插入和查询
index = pinecone.Index(INDEX_NAME)

封装Embedding函数

ini 复制代码
from openai import OpenAI
#OPENAI_API_KEY 填自己的
openai_client = OpenAI(api_key='')
# 适合做embedding的模型是text-embedding-ada-002
# 这处系列的第一篇文章使用的是all-MiniLM-L6-v2 免费的,使用HuggingFace的 sentence_transformers
def get_embeddings(articles, model="text-embedding-ada-002"):
   # 调用openai 的embeddings模块的create方法 返回向量
   return openai_client.embeddings.create(input = articles, model=model)

Embedding

ini 复制代码
#引入pandas 数据分析库
import pandas as pd
# 命令行工具
from tqdm.auto import tqd
# 一批执行400个
CHUNK_SIZE=400
# 总共执行1万个, 计25次轮回
TOTAL_ROWS=10000
# tqdm 命令行工具, embedding 需要时间,tqdm 提供相关运行信息
# 等下调用它的update方法更新进度条信息
progress_bar = tqdm(total=TOTAL_ROWS)
# 逐块读取 不会一次性的读到内存, 迭代读取
chunks = pd.read_csv('./all-the-news-3.csv', chunksize=CHUNK_SIZE, 
                     nrows=TOTAL_ROWS)
# 起始为0
chunk_num = 0
# 遍历每一chunk
for chunk in chunks:
    # 取出标题 tolist将这一列的所有元素值转化为一个Python列表
    titles = chunk['title'].tolist()
    # 得到embeddings
    embeddings = get_embeddings(titles)
    # pinecone 一个数据节点的结构
    # 多个标题, 每个都加入metadata
    prepped = [{'id':str(chunk_num*CHUNK_SIZE+i), 
    # 某个标题的embedding
    'values':embeddings.data[i].embedding,
                'metadata':{'title':titles[i]},} for i in range(0,len(titles))]
    chunk_num = chunk_num + 1
    # 200 是比较合适的
    if len(prepped) >= 200:
      # 插入
      index.upsert(prepped)
      # 重置prepped 
      prepped = []
    # 更新下载进度
    progress_bar.update(len(chunk))
  • 封装推荐函数
ini 复制代码
# 参数有index 名字、关键字、 top_k 返回的数量
def get_recommendations(pinecone_index, search_term, top_k=10):
  get_embeddings 需要的是数组
  embed = get_embeddings([search_term]).data[0].embedding
  # 相似度查询
  res = pinecone_index.query(vector=embed, top_k=top_k, include_metadata=True)
  return res
  • 获得推荐结果
python 复制代码
# 查询关于obama的推荐
reco = get_recommendations(index, 'obama')
for r in reco.matches:
    print(f'{r.score} : {r.metadata["title"]}')
  • 为所有的新闻内容也做嵌入, 这个开销就大了哈
ini 复制代码
# 删除了之前的index , 重新创建了index
if INDEX_NAME in [index.name for index in pinecone.list_indexes()]:
  pinecone.delete_index(name=INDEX_NAME)

pinecone.create_index(name=INDEX_NAME, dimension=1536, metric='cosine',
  spec=ServerlessSpec(cloud='aws', region='us-west-2'))
articles_index = pinecone.Index(INDEX_NAME)
  • 重写嵌入函数
ruby 复制代码
def embed(embeddings, title, prepped, embed_num):
  for embedding in embeddings.data:
    prepped.append({'id':str(embed_num), 'values':embedding.embedding, 'metadata':{'title':title}})
    embed_num += 1
    if len(prepped) >= 100:
        articles_index.upsert(prepped)
        prepped.clear()
  return embed_num
  • 对内容做嵌入
ini 复制代码
news_data_rows_num = 100

embed_num = 0 #keep track of embedding number for 'id'
# 文本分割
text_splitter = RecursiveCharacterTextSplitter(chunk_size=400, 
    chunk_overlap=20) # how to chunk each article
prepped = []
df = pd.read_csv('./all-the-news-3.csv', nrows=news_data_rows_num)
articles_list = df['article'].tolist()
titles_list = df['title'].tolist()

for i in range(0, len(articles_list)):
    print(".",end="")
    art = articles_list[i]
    title = titles_list[i]
    if art is not None and isinstance(art, str):
      texts = text_splitter.split_text(art)
      embeddings = get_embeddings(texts)
      embed_num = embed(embeddings, title, prepped, embed_num)
  • 针对内容进行embedding
ini 复制代码
reco = get_recommendations(articles_index, 'obama', top_k=100)
seen = {}
for r in reco.matches:
    title = r.metadata['title']
    if title not in seen:
        print(f'{r.score} : {title}')
        seen[title] = '.'

总结

  • 读取文件和读取数据的区别,csv 是常用的数据文件格式,比如mysql等就可以导出为csv格式。其特点是每行一条数据,代表mysql 的 row。f.readline()读取到的就是标题行,pandas有预设置DataFrame, 可以直接做数据导入和处理。
  • pandas的逐块读取csv'
  • embedding 函数的封装

参考内容

相关推荐
985小水博一枚呀10 分钟前
【深度学习滑坡制图|论文解读3】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法
人工智能·深度学习·神经网络·cnn·transformer
AltmanChan11 分钟前
大语言模型安全威胁
人工智能·安全·语言模型
985小水博一枚呀15 分钟前
【深度学习滑坡制图|论文解读2】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法
人工智能·深度学习·神经网络·cnn·transformer·迁移学习
数据与后端架构提升之路24 分钟前
从神经元到神经网络:深度学习的进化之旅
人工智能·神经网络·学习
爱技术的小伙子30 分钟前
【ChatGPT】如何通过逐步提示提高ChatGPT的细节描写
人工智能·chatgpt
深度学习实战训练营2 小时前
基于CNN-RNN的影像报告生成
人工智能·深度学习
昨日之日20064 小时前
Moonshine - 新型开源ASR(语音识别)模型,体积小,速度快,比OpenAI Whisper快五倍 本地一键整合包下载
人工智能·whisper·语音识别
浮生如梦_4 小时前
Halcon基于laws纹理特征的SVM分类
图像处理·人工智能·算法·支持向量机·计算机视觉·分类·视觉检测
深度学习lover4 小时前
<项目代码>YOLOv8 苹果腐烂识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·苹果腐烂识别
热爱跑步的恒川5 小时前
【论文复现】基于图卷积网络的轻量化推荐模型
网络·人工智能·开源·aigc·ai编程