使用向量数据库pinecone构建应用03:推荐系统 Recommender Systems

Building Applications with Vector Databases

下面是这门课的学习笔记:https://www.deeplearning.ai/short-courses/building-applications-vector-databases/

Learn to create six exciting applications of vector databases and implement them using Pinecone.

Build a hybrid search app that combines both text and images for improved multimodal search results.

Learn how to build an app that measures and ranks facial similarity.

Lesson 3 - Recommender Systems

在这里插入图片描述

Import the Needed Packages

import warnings
warnings.filterwarnings('ignore')
from langchain.text_splitter import RecursiveCharacterTextSplitter
from openai import OpenAI
from pinecone import Pinecone, ServerlessSpec
from tqdm.auto import tqdm, trange
from DLAIUtils import Utilsimport pandas as pd
import time
import os

获取api key

utils = Utils()
PINECONE_API_KEY = utils.get_pinecone_api_key()
OPENAI_API_KEY = utils.get_openai_api_key()

Load the Dataset

with open('./data/all-the-news-3.csv', 'r') as f:header = f.readline()print(header)

Output

date,year,month,day,author,title,article,url,section,publication
df = pd.read_csv('./data/all-the-news-3.csv', nrows=99)
df.head()

Output

在这里插入图片描述

Setup Pinecone

openai_client = OpenAI(api_key=OPENAI_API_KEY)
util = Utils()
INDEX_NAME = utils.create_dlai_index_name('dl-ai')
pinecone = Pinecone(api_key=PINECpONE_API_KEY)if INDEX_NAME in [index.name for index in pinecone.list_indexes()]:pinecone.delete_index(INDEX_NAME)pinecone.create_index(name=INDEX_NAME, dimension=1536, metric='cosine',spec=ServerlessSpec(cloud='aws', region='us-west-2'))index = pinecone.Index(INDEX_NAME)

1. Create Embeddings of the News Titles

通过文章标题来创建embedding

将输入的文章列表转换为嵌入向量(embeddings)

def get_embeddings(articles, model="text-embedding-ada-002"):return openai_client.embeddings.create(input = articles, model=model)

为标题生成embeddings,然后形成字典插入到pinecone索引中

CHUNK_SIZE=400
TOTAL_ROWS=10000
progress_bar = tqdm(total=TOTAL_ROWS)
chunks = pd.read_csv('./data/all-the-news-3.csv', chunksize=CHUNK_SIZE, nrows=TOTAL_ROWS)
chunk_num = 0
for chunk in chunks:titles = chunk['title'].tolist()embeddings = get_embeddings(titles)prepped = [{'id':str(chunk_num*CHUNK_SIZE+i), 'values':embeddings.data[i].embedding,'metadata':{'title':titles[i]},} for i in range(0,len(titles))]chunk_num = chunk_num + 1if len(prepped) >= 200:index.upsert(prepped)prepped = []progress_bar.update(len(chunk))

上述代码会产生总共 TOTAL_ROWS / CHUNK_SIZE 个 chunks,即数据集中总行数除以每个 chunk 的大小。在这个例子中,总行数为 10000,每个 chunk 的大小为 400,因此会产生 25 个 chunks。

这段代码的功能是:

  1. 从名为 './data/all-the-news-3.csv' 的 CSV 文件中逐个读取数据块(chunks),每个数据块包含 400 行数据,总共读取 10000 行数据。

  2. 对于每个数据块,提取其中的标题列,并将这些标题传递给一个名为 get_embeddings 的函数,以获取标题的嵌入向量。

  3. 将每个标题的嵌入向量与相应的标题一起打包成记录,并为每个记录分配一个唯一的 ID。

  4. 如果准备好的记录数量达到 200 条,则将这些记录批量插入到一个名为 index 的索引中。

  5. 在处理每个数据块时,更新进度条,以显示处理的进度。

综合起来,这段代码的主要功能是从 CSV 文件中读取数据块,并将其中的标题列转换为嵌入向量,然后将这些向量插入到一个名为 index 的索引中。

index.describe_index_stats()

Output

index.describe_index_stats()
{'dimension': 1536,'index_fullness': 0.0,'namespaces': {'': {'vector_count': 10000}},'total_vector_count': 10000}

Build the Recommender System

def get_recommendations(pinecone_index, search_term, top_k=10):embed = get_embeddings([search_term]).data[0].embedding # openai的接口res = pinecone_index.query(vector=embed, top_k=top_k, include_metadata=True) return res

下面是对embed = get_embeddings([search_term]).data[0].embedding的解释:

它等价于openai_client.embeddings.create(input = articles, model=model).data[0].embedding

一个可能的openai请求embedding的例子:

可以看到embedding是在data这个key下面的。对于上述的很多embedding,自然有很多的data,上面选择的是data[0],也可以选择data[1]等等

{"object": "list","data": [{"object": "embedding","embedding": [0.0011064255,-0.0093271292,.... (1536 floats total for ada-002)-0.0033842222,],"index": 0}],"model": "text-embedding-ada-002","usage": {"prompt_tokens": 8,"total_tokens": 8}
}

获取推荐文章的标题:含有obama的文章推荐

reco = get_recommendations(index, 'obama')
for r in reco.matches:print(f'{r.score} : {r.metadata["title"]}')

Output:前面是pinecone检索的分数,后面是文章的标题

这是通过对新闻标题进行embedding,然后检索得到的新闻标题:

0.84992218 : Barack Obama just stepped off the sidelines to defend Obamacare
0.848674893 : President Obama has a new plan to fight the opioid epidemic
0.848271608 : “Our democracy is at stake”: Obama delivers his first post-presidency campaign speech
0.848052 : Obama: if you were fine with big government until it served black people, rethink your biases
0.845821619 : President Obama: Michelle & I Are Gonna Be Renters
0.844207942 : Obama meets with national security team on Syria, Islamic State
0.843172133 : Vox Sentences: Obama got a warmer welcome in Hiroshima than the Japanese prime minister
0.84271574 : Watch President Obama dance the tango in Argentina
0.840892255 : Obama and Supreme Court Tag Team on Juvenile Justice Reform
0.839049876 : Clinton, Obama pledge unity behind Trump presidency

2. Create Embeddings of All News Content

通过文章内容来创建embedding

一些pinecone的配置,创建名为articles_index的pinecone索引

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'))
# 创建了一个名为 INDEX_NAME 的索引对象,该对象可以用于存储和检索向量数据。
articles_index = pinecone.Index(INDEX_NAME) 

embed的函数如下:

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 += 1if len(prepped) >= 100:articles_index.upsert(prepped)prepped.clear()return embed_num

(Note: news_data_rows_num = 100): In this lab, we've initially set news_data_rows_num to 100 for speedier results, allowing you to observe the outcomes faster. Once you've done an initial run, consider increasing this value to 200, 400, 700, and 1000. You'll likely notice better and more relevant results.

news_data_rows_num = 100embed_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('./data/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) # 获取文章内容的embeddingembed_num = embed(embeddings, title, prepped, embed_num) # 存入pinecone索引中

text_splitter = RecursiveCharacterTextSplitter(chunk_size=400, chunk_overlap=20)的解释:

  • chunk_size=400:这是一个参数,指定了每个文本块的大小。在这里,每个文本块的大小被设置为 400 个字符。

  • chunk_overlap=20:这是另一个参数,指定了文本块之间的重叠量。在这里,文本块之间的重叠量被设置为 20 个字符。这意味着,相邻的文本块会有部分内容重叠,以确保文本的连续性和完整性。

所以,这行代码创建了一个文本拆分器对象,该对象使用指定的参数将文章文本拆分成较小的文本块,以便进行后续处理,例如将其转换为嵌入向量。

查看向量数据库中的结果

articles_index.describe_index_stats()

Output

{'dimension': 1536,'index_fullness': 0.0,'namespaces': {'': {'vector_count': 1000}},'total_vector_count': 1000}

Build the Recommender System

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] = '.'

Output:通过文章内容进行embedding,然后检索得到的相关文章的标题

0.821158946 : Why Obama is vetting Nevada's Republican governor for the Supreme Court
0.818882763 : U.S. lawmakers ask for disclosure of number of Americans under surveillance
0.812377512 : NYPD Honcho Insulted by 'Hamilton' Star Lin-Manuel Miranda Celebrating Obama's Controversial Prisoner Release
0.806862772 : Why Jews Are Getting Themselves Arrested at ICE Centers Around the Country
0.806241512 : Trump keeping options open as Republican feud rages
of number of Americans under surveillance
0.812377512 : NYPD Honcho Insulted by 'Hamilton' Star Lin-Manuel Miranda Celebrating Obama's Controversial Prisoner Release
0.806862772 : Why Jews Are Getting Themselves Arrested at ICE Centers Around the Country
0.806241512 : Trump keeping options open as Republican feud rages

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/705391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pycharm安装Amazon CodeWhisperer 免费AI辅助编程插件教程

一、github copilot 和 Amazon CodeWhisperer区别 Copilot非常易于使用,并与所有主要的代码编辑器进行了简化集成。GitHub Copilot针对七种主要的编程语言进行了优化(详见下表),但也可以生成其他语言和各种框架的建议。 Copilot…

抖音视频批量下载工具|视频评论数据挖掘软件

这款基于C#开发的抖音视频批量下载工具,为用户提供了便捷的视频搜索和下载功能,让您可以轻松获取抖音平台上的热门视频内容。无论是通过关键词搜索抓取还是通过分享链接下载单个视频,都能满足用户快速获取视频资源的需求。 主要功能模块&…

LCR 173. 点名

解题思路&#xff1a;二分法 class Solution {public int takeAttendance(int[] records) {int i 0, j records.length - 1;while(i < j) {int m (i j) / 2;if(records[m] m) i m 1;else j m - 1;}return i;} }

TCPIP协议存在的安全隐患以及对应的防范措施

TCP/IP协议&#xff0c;作为网络通信的标准协议&#xff0c;是一组不同层次上的多个协议的组合。由于在其设计初期过分强调其开放性和便利性&#xff0c;却没有认真仔细考虑到它的安全性问题&#xff0c;因此协议中存在有诸多的安全漏洞。协议缺陷造成的安全漏洞&#xff0c;很…

二叉树的链式结构实现

二叉树的链式结构实现 1. 链式存储2. 二叉树的遍历前序遍历中序遍历后序遍历 3. 二叉树遍历的代码实现前序遍历中序遍历后序遍历 4. 二叉树各种相关函数的实现二叉树节点个数二叉树叶子节点个数二叉树的高度二叉树第k层节点个数二叉树查找值为x的节点 5. 代码验证 1. 链式存储 …

东莞IBM服务器维修之IBM x3630 M4阵列恢复

记录东莞某抖音电商公司送修一台IBM SYSTEM X3630 M4文档服务器RAID6故障导致数据丢失的恢复案例 时间&#xff1a;2024年02月20日&#xff0c; 服务器品牌&#xff1a;IBM System x3630 M4&#xff0c;阵列卡用的是DELL PERC H730P 服务器用途和用户位置&#xff1a;某抖音电…

Fastapi进阶用法,路径参数,路由分发,查询参数等详解

文章目录 1、路径操作1.路径操作装饰器1.tags 标签2.summary 接口描述的总结信息3.describe: 接口信息的详细描述4.response_description&#xff1a;响应描述5.deprecated&#xff1a;接口是否废弃&#xff0c;默认是False 2.fastapi路由分发include_router 2、请求与响应2.1、…

【java-集合框架】ArrayList类

&#x1f4e2;java基础语法&#xff0c;集合框架是什么&#xff1f;顺序表的底层模拟实现都是看本篇前的基础必会内容&#xff0c;本篇不再赘述&#xff0c;详情见评论区文章。 &#x1f4e2;编程环境&#xff1a;idea 【java-集合框架】ArrayList类 1. 先回忆一下java代码中常…

泽攸科技JS系列高精度台阶仪在半导体领域的应用

泽攸科技JS系列高精度台阶仪是一款先进的自主研发的国产台阶仪&#xff0c;采用了先进的扫描探针技术。通过扫描探针在样品表面上进行微观测量&#xff0c;台阶仪能够准确获取表面形貌信息。其工作原理基于探针与样品表面的相互作用力&#xff0c;通过测量探针的微小位移&#…

JVM相关面试题

【面试题一】谈谈JVM内存模型 JVM内存区域的划分&#xff0c;之所以划分是为了JVM更好的进行内存管理。就好比一间卧室&#xff0c;这块放床&#xff0c;这块放个电脑桌&#xff0c;每块地方各自有各自的功能&#xff0c;床用来睡觉&#xff0c;电脑桌用来办公打游戏。而JVM划…

C++——基础语法(3):内联函数、auto关键字、基于范围的for循环、空指针nullptr

6. 内联函数 在函数前加入inline修饰即可将函数变为内联函数。所谓内联函数&#xff0c;就是在编译时C编译器会将函数体在调用内联函数的地方展开&#xff0c;从而省去了调用函数的栈帧开销&#xff0c;提高程序运行效率。 inline int Add(int a, int b) {return a b; } int …

SpringBoot源码解读与原理分析(三十三)SpringBoot整合JDBC(二)声明式事务的生效原理和控制流程

文章目录 前言10.3 声明式事务的生效原理10.3.1 TransactionAutoConfiguration10.3.2 TransactionManagementConfigurationSelector10.3.3 AutoProxyRegistrar10.3.4 InfrastructureAdvisorAutoProxyCreator10.3.5 ProxyTransactionManagementConfiguration10.3.5.1 Transactio…

Datawhale-Sora技术原理分享

目录 Sora能力边界探索 Sora模型训练流程 Sora关键技术拆解 物理引擎的数据进行训练 个人思考与总结 参考 https://datawhaler.feishu.cn/file/KntHbV3QGoEPruxEql2c9lrsnOb

袁庭新ES系列12节 | Elasticsearch高级查询操作

前言 上篇文章讲了关于Elasticsearch的基本查询操作。接下来袁老师为大家带来Elasticsearch高级查询部分相关的内容。Elasticsearch是基于JSON提供完整的查询DSL&#xff08;Domain Specific Language&#xff1a;领域特定语言&#xff09;来定义查询。因此&#xff0c;我们有…

消息中间件篇之Kafka-消息不丢失

一、 正常工作流程 生产者发送消息到kafka集群&#xff0c;然后由集群发送到消费者。 但是可能中途会出现消息的丢失。下面是解决方案。 二、 生产者发送消息到Brocker丢失 1. 设置异步发送 //同步发送RecordMetadata recordMetadata kafkaProducer.send(record).get();//异…

【Java程序设计】【C00296】基于Springboot的4S车辆管理系统(有论文)

基于Springboot的4S车辆管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的4S店车辆管理系统 本系统分为销售员功能模块、管理员功能模块以及维修员功能模块。 管理员功能模块&#xff1a;管理员登录进入4S…

少儿编程热潮背后的冷思考、是不是“智商税”?

在科技飞速发展的今天&#xff0c;编程已成为一项基础技能&#xff0c;如同数学和语言一样&#xff0c;被认为是未来社会的重要通行证。随之而来的是少儿编程教育的火爆&#xff0c;各种编程班、在线课程如雨后春笋般涌现&#xff0c;吸引了无数家长的目光。然而&#xff0c;这…

测试环境搭建整套大数据系统(七:集群搭建kafka(2.13)+flink(1.14)+dinky+hudi)

一&#xff1a;搭建kafka。 1. 三台机器执行以下命令。 cd /opt wget wget https://dlcdn.apache.org/kafka/3.6.1/kafka_2.13-3.6.1.tgz tar zxvf kafka_2.13-3.6.1.tgz cd kafka_2.13-3.6.1/config vim server.properties修改以下俩内容 1.三台机器分别给予各自的broker_id…

MapGIS农业信息化解决方案(2)

农业资源采集与调查 农业各项生产活动与农业资源息息相关,对农业资源进行调查,摸清农业家底, 为构筑农业“一张图”核心数据库奠定数据基础。MapGIS 农业资源采集与调查系统集成遥感、手持终端等调查技术,为农业资源采集提供实用、简捷的采集调查和信息录入工具,实现农田…

PCB设计十大黄金准则

PCB设计十大黄金准则 控制走线长度控制走线长度&#xff0c;顾名思义&#xff0c;即短线规则&#xff0c;在进行PCB设计时应该控制布线长度尽量短&#xff0c;以免因走线过长引入不必要的干扰&#xff0c;特别是一些重要信号线&#xff0c;如时钟信号走线&#xff0c;务必将其…