前端也可以这样零基础入门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 函数的封装

参考内容

相关推荐
星期天要睡觉16 小时前
计算机视觉(opencv)实战十八——图像透视转换
人工智能·opencv·计算机视觉
Morning的呀17 小时前
Class48 GRU
人工智能·深度学习·gru
拾零吖19 小时前
李宏毅 Deep Learning
人工智能·深度学习·机器学习
华芯邦19 小时前
广东充电芯片助力新能源汽车车载系统升级
人工智能·科技·车载系统·汽车·制造
时空无限20 小时前
说说transformer 中的掩码矩阵以及为什么能掩盖住词语
人工智能·矩阵·transformer
查里王20 小时前
AI 3D 生成工具知识库:当前产品格局与测评总结
人工智能·3d
武子康20 小时前
AI-调查研究-76-具身智能 当机器人走进生活:具身智能对就业与社会结构的深远影响
人工智能·程序人生·ai·职场和发展·机器人·生活·具身智能
小鹿清扫日记20 小时前
从蛮力清扫到 “会看路”:室外清洁机器人的文明进阶
人工智能·ai·机器人·扫地机器人·具身智能·连合直租·有鹿巡扫机器人
fanstuck21 小时前
Prompt提示工程上手指南(六):AI避免“幻觉”(Hallucination)策略下的Prompt
人工智能·语言模型·自然语言处理·nlp·prompt
zhangfeng113321 小时前
win7 R 4.4.0和RStudio1.25的版本兼容性以及系统区域设置有关 导致Plots绘图面板被禁用,但是单独页面显示
开发语言·人工智能·r语言·生物信息