跳转至

10 通过Embedding构建基于关键词的推荐系统

你好,我是黄佳。

今天我们来探索如何利用OpenAI的大语言模型和向量嵌入技术,构建一个智能的图书推荐系统。通过分析用户感兴趣的图书简介或图书封面,该系统就可以自动推荐主题、内容或读者群体相似的其他图书,为读者提供个性化的阅读体验。

推荐系统背后的理论基础

传统的图书推荐通常基于协同过滤(Collaborative Filtering)或基于内容(Content-based)的方法。协同过滤根据用户之间的相似性来进行推荐,而基于内容的方法则利用图书自身的特征(如作者、类别、关键词等)来寻找相似图书。

图片

协同过滤(Collaborative Filtering)

协同过滤是一种基于用户行为数据进行推荐的技术。它主要通过分析用户对物品的评价(如评分、购买、浏览等)来发现用户之间的相似性或物品之间的相似性。基于用户的协同过滤会寻找与目标用户兴趣相似的其他用户,然后推荐那些相似用户喜欢的物品;而基于物品的协同过滤则是找出与目标物品相似的其他物品,推荐给那些喜欢目标物品的用户。

协同过滤的优点是个性化强,能够根据用户的历史行为推荐用户可能感兴趣的新图书。同时具有自动适应性,就是随着用户数据的不断积累,推荐系统能够自我优化,提高推荐质量。

其局限性在于数据稀疏性,当新用户或新图书数量较多时,系统难以找到足够的相似用户或相似图书,导致推荐效果不佳。还有冷启动问题,新用户没有足够的行为记录,新图书也没有足够的用户评价,这使得系统难以进行有效推荐。此外,协同过滤倾向于推荐那些已经被多数用户认可的图书,可能会忽视一些小众但高质量的图书,这被称作流行度偏见。

基于内容的推荐(Content-based Recommendation)

基于内容的推荐系统通过分析图书的内容特征(如文本、作者、出版社、图书类别等)来寻找图书之间的相似性。这种方法利用图书的描述性信息来构建图书的特征向量,然后根据这些特征向量推荐与用户之前喜欢的图书相似的新图书。

基于内容的推荐系统的优点是,直接使用图书的内容属性来进行推荐,易于理解和实现;而且无需用户历史数据,新用户也可以得到推荐,因为推荐依据是图书的内容而不是用户的历史行为。

其局限性在于难以解析深层内容,因为基于内容的方法依赖于图书的外显特征,如关键词、类别等,难以捕捉到图书内容的深层次语义,如情感、风格、叙述深度等。而且也可能导致推荐结果局限在用户已表现出兴趣的特定类型或类别,缺乏多样性。

基于大语言模型的推荐系统

随着大语言模型(如GPT)和向量嵌入(Embedding)技术的发展,我们有了更强大的工具来理解和表示文本内容。这为构建更加智能、个性化的推荐系统提供了新的可能,也使推荐系统的实现变得更加简单。

大语言模型,如GPT,具有强大的自然语言理解和生成能力,本身就是通过在海量文本上进行预训练,GPT能够理解词汇和句子的语义,捕捉文本中蕴含的知识。我们可以利用GPT从图书描述(甚至封面图片)中提取关键信息,如主题、类别、难度等,这些信息可以作为后续推荐的重要依据。

向量嵌入技术,如 Word2Vec 和 Sentence-BERT,以及最新的大型词嵌入模型,则可以将文本转化为密集的向量表示。通过嵌入,语义相似的文本会被映射到向量空间中相近的位置。我们可以计算图书描述嵌入之间的相似度(如余弦相似度),从而快速找到内容相似的图书。

图片

将大语言模型和向量嵌入结合,我们就能构建一个简单的“理解”图书内容,并基于内容相似性进行推荐的智能系统。接下来,让我们通过代码实战,一步步构建这样一个系统。

系统设计框架

首先,我为你准备了一个非常简单的图书数据集。针对这个数据集,我们要构建一个基于大语言模型和向量嵌入的推荐系统。

图片

这个推荐系统,主要包括以下几个模块:

  • 数据预处理:加载原始图书数据,提取需要的字段,如标题、作者、内容简介等。
  • 关键词生成:使用GPT模型为每本书生成描述其主题、类别、目标读者等信息的关键词。
  • 嵌入生成:将图书的标题、作者、关键词等信息拼接,然后使用OpenAI的文本嵌入模型生成向量表示。
  • 相似度搜索:给定用户输入的查询文本,同样生成其嵌入向量,然后通过余弦相似度找出最相似的图书。
  • 图书推荐:将相似度最高的若干本图书推荐给用户。

代码实战:构建智能图书推荐系统

下面就开始代码实现。

步骤 1:加载和预处理图书数据集

先导入需要的库和模块。其中pandas用于数据处理,numpy用于数值计算。sklearn.metrics.pairwise 中的 cosine_similarity 则用于计算向量之间的余弦相似度。

接下来,我们初始化OpenAI客户端,加载原始的图书数据集,然后选取需要的列,如标题、作者、内容简介,复制到一个新的DataFrame中。

import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
from openai import OpenAI

# 初始化OpenAI客户端
client = OpenAI()

# 加载图书数据集
dataset_path = "09_gptv_multl_mod/books/图书.csv"
df = pd.read_csv(dataset_path)

# 选择需要的列
selected_columns = ['标题', '作者', '内容简介']
df = df[selected_columns].copy()

步骤 2:生成关键词并保存新数据集

在这一步,我们设计了一个详细的系统提示词,指导GPT模型为每本书生成关键词。让我们仔细看看这个提示词的内容。

你是一个专门为图书标记相关关键词的代理。这些关键词可用于在图书馆或书店搜索这些书籍。

你将获得一本书的内容简介,你的目标是为这本书提取关键词。

关键词应简洁明了。

关键词可以描述以下内容:
- 书籍类型,如"科技"、“人文”、"心理学"等
- 书籍主题,如"机器学习"、“数据分析”、"自我提升"等
- 目标读者,如"工程师"、“学生”、"普通人群"等
- 难度等级,如"初级"、“中级”、"高级"等

只有在书籍信息中明确提及时,才提取相关关键词。

以字符串数组的格式返回关键词,例如:
[‘心理学’, ‘自我提升’, ‘普通人群’, ‘初级’]

这个提示词清晰地定义了模型的角色(为图书标记关键词的代理)和目标(根据内容简介提取关键词)。它还详细说明了关键词应该包含的信息类型,如书籍类型、主题、目标读者、难度等级,并给出了具体的例子。此外,提示词强调只有在书籍信息中明确提及时才提取相关关键词,以确保关键词的准确性。最后,它指定了关键词的格式,即以字符串数组的形式返回。

这样详尽、具体的提示词设计有助于指导模型生成高质量、信息丰富的关键词,为后续的图书推荐奠定良好的基础。

接下来,生成关键词并保存数据集。

# 定义生成关键词的系统提示
keywords_system_prompt = '''
你是一个专门为图书标记相关关键词的代理。这些关键词可用于在图书馆或书店搜索这些书籍。

你将获得一本书的内容简介,你的目标是为这本书提取关键词。

关键词应简洁明了,全部小写。

关键词可以描述以下内容:  
- 书籍类型,如"科技"、"人文"、"心理学"等
- 书籍主题,如"机器学习"、"数据分析"、"自我提升"等  
- 目标读者,如"工程师"、"学生"、"普通人群"等
- 难度等级,如"初级"、"中级"、"高级"等

只有在书籍信息中明确提及时,才提取相关关键词。

以字符串数组的格式返回关键词,例如:
['心理学', '自我提升', '普通人群', '初级']
'''

# 定义生成关键词的函数
def generate_keywords(description):
    response = client.chat.completions.create(
    model="gpt-4",
    temperature=0.2,
    messages=[
        {
            "role": "system",
            "content": keywords_system_prompt
        },
        {
            "role": "user",
            "content": f"内容简介: {description}"
        }
    ],
    max_tokens=100,
    )
    return response.choices[0].message.content

# 为每本书生成关键词
df['关键词'] = df['内容简介'].apply(generate_keywords)

# 保存带有关键词的数据集
data_path = "09_gptv_multl_mod/books/TextEmbedding/books_tagged_and_captioned.csv"
df.to_csv(data_path, index=False)

代码中定义了生成关键词的函数 generate_keywords,它使用GPT-4模型和上述提示词为给定的图书内容简介生成关键词。然后,我们对每本书的内容简介应用此函数,为整个数据集生成关键词,并将带有关键词的数据集保存到CSV文件中。

图片

步骤 3:生成嵌入向量并保存

接下来,我们定义获取嵌入向量的函数get_embedding,它使用OpenAI的text-embedding-ada-002模型为给定的文本生成嵌入向量。我们将每本书的标题、作者和关键词拼接成一个字符串,然后调用此函数生成其嵌入向量。

# 定义获取嵌入向量的函数
def get_embedding(value, model="text-embedding-ada-002"):
    embeddings = client.embeddings.create(
      model=model,
      input=value,
      encoding_format="float"
    )  
    return embeddings.data[0].embedding

# 嵌入标题、作者和关键词
df['embedding'] = df.apply(lambda x: get_embedding(f"{x['标题']} {x['作者']} {x['关键词']}"), axis=1)

# 将嵌入向量转换为字符串以便保存到CSV文件
df['embedding_str'] = df['embedding'].apply(lambda x: ','.join(map(str, x)))

# 保存带有关键词和嵌入向量的数据集
data_path = "09_gptv_multl_mod/books/TextEmbedding/books_with_keywords_and_embeddings.csv"
df.to_csv(data_path, index=False)

这里,我们对DataFrame的每一行应用get_embedding函数,为每本书生成嵌入向量,将嵌入向量转换为字符串以便保存,并将带有关键词和嵌入向量的数据集保存到CSV文件中。

图片

步骤 4:加载数据并进行文本搜索

加载这个数据之后,就可以进行搜索并推荐相关书籍了。

下面,我们从CSV文件中加载带有关键词和嵌入向量的数据集,并将嵌入向量从字符串转换回列表形式。

# 从CSV文件加载带有关键词和嵌入向量的数据集
df_search = pd.read_csv(data_path)
df_search['embedding'] = df_search['embedding_str'].apply(lambda x: list(map(float, x.split(','))))

# 定义根据输入文本搜索的函数
def search_from_input_text(query, n=2):
    embedded_value = get_embedding(query)
    df_search['similarity'] = df_search['embedding'].apply(lambda x: cosine_similarity(np.array(x).reshape(1,-1), np.array(embedded_value).reshape(1, -1)))
    most_similar = df_search.sort_values('similarity', ascending=False).iloc[:n]
    return most_similar

代码中定义了根据输入文本搜索相似图书的函数 search_from_input_text。给定用户输入的查询文本,该函数首先使用 get_embedding 函数为查询文本生成嵌入向量。然后计算查询向量与数据集中每本书嵌入向量之间的余弦相似度,将结果存储在 similarity 列中,按相似度降序排列,取前n本书作为搜索结果返回。

为了测试推荐系统,我们输入一个查询文本“给我一本适合初学者入门的机器学习书”,然后调用search_from_input_text函数搜索最相似的图书。

# 测试输入文本搜索
user_input = "给我一本适合初学者入门的机器学习书"
res = search_from_input_text(user_input)
print(f"搜索词: {user_input}\n")
for index, row in res.iterrows():
    print(f"{row['标题']} ({row['作者']}) - 关键词: {row['关键词']}")

我的推荐系统成功地打印出了搜索词,以及推荐图书的标题、作者和关键词信息。

图片

总结时刻

大模型本身就是基于海量的数据训练出来的,具有理解用户的隐含需求和图书的深层内容的能力。那么,基于大语言模型,我们试图在保持推荐质量的同时,解决数据稀疏性、冷启动问题和推荐多样性的挑战。

我们探讨了如何利用OpenAI的大语言模型GPT和文本嵌入模型构建一个智能的图书推荐系统,一步步实现了数据预处理、关键词生成、嵌入生成、相似度搜索和图书推荐等模块,创建了一个简单的推荐系统。

通过GPT生成的关键词和文本嵌入向量,我们的系统就能够理解图书的深层内容,捕捉书籍之间的相似性。给定用户输入的查询文本,系统可以快速找到主题、内容最相关的图书并推荐给用户。

基于大语言模型和向量嵌入的推荐方法为构建更加智能、个性化的图书推荐系统提供了新的思路。但毫无疑问,我这个推荐系统的设计和实现都是极其简单的,仅仅是作为一种启发,向你展示如何充分利用大模型对自然语言理解和语义表示的强大能力,同时简化了推荐系统的实现流程。在具体的业务实践中,请你结合自己的业务需求,以及你所积累的推荐系统的设计技巧,同时利用大模型的知识和能力,来建立起更加强大、全面的智能推荐系统,为用户带来更好的使用体验。

思考题

  1. 这节课主要利用图书的标题、作者、内容简介等文本信息来进行推荐,请你思考下如何将图书封面图片等视觉信息也融入到推荐系统中,实现多模态推荐,甚至看到一个图书的封面就能找到相似图书?(提示:请你复习上节课的内容)
  2. 除了我们介绍的基于大语言模型和向量嵌入的推荐方法,你还能想到哪些利用深度学习或自然语言处理技术来构建推荐系统的思路?
  3. 除了图书推荐,基于大语言模型和向量嵌入的方法还可以应用于哪些其他领域的推荐任务(如电影、音乐、新闻等)?这种方法在不同领域可能有哪些需要注意和调整的地方?

期待你进一步探索这个主题,为推荐系统领域贡献自己的力量。留言区见!

精选留言(1)
  • 易轻尘 👍(3) 💬(0)

    感觉用GPT开发应用需要编程思维的一种转变

    2024-06-23